From 6e615fe0dbeb04d9c284df8546d502fc98be06bf Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 18 Apr 2021 16:48:49 +0300 Subject: [PATCH 01/20] add potential migration for moving checkbox stuff --- ...418130328_checkbox_quiz_item_migrations.ts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts new file mode 100644 index 00000000..3abf99ad --- /dev/null +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -0,0 +1,40 @@ +import * as Knex from "knex" + +const moveQuizOptionAnswerRows = ` + WITH moved_quiz_option_answer_rows AS ( + DELETE FROM quiz_option_answer qoa + USING quiz_item_answer qia + WHERE qia.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox'); + # return old option id, and quiz_answer_id and quiz_item_if from item answer + RETURNING qoa.id, qia.quiz_answer_id, qoa.quiz_option_id + ) + + INSERT INTO quiz_item_answer (id, quiz_answer_id, quiz_item_id) + SELECT * FROM moved_quiz_option_answer_rows; +` + +const moveQuizOptionRows = ` + WITH moved_quiz_option_rows AS ( + DELETE FROM quiz_option qo + USING quiz_item qi + WHERE qi.type = 'checkbox' + RETURNING qo.id qo."order", qo.deleted, 'checkbox'::quiz_item_type_enum, qi.quiz_id + ) + + INSERT INTO quiz_item (id, "order", deleted, type, quiz_id) + SELECT * FROM moved_quiz_option_rows; +` +const deleteQuizOptionChildren = ` + DELETE FROM quiz_option_translation qot + USING quiz_item qi, quiz_option qo + WHERE qi.type = 'checkbox'::quiz_item_type_enum + AND qo.id IN (SELECT id FROM qi) +` + +export async function up(knex: Knex): Promise { + await knex.raw(moveQuizOptionAnswerRows) + await knex.raw(deleteQuizOptionChildren) + await knex.raw(moveQuizOptionRows) +} + +export async function down(knex: Knex): Promise {} From e4ed93a08d75752d62d735afab7b1e45942e73d0 Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 18 Apr 2021 16:52:46 +0300 Subject: [PATCH 02/20] rm comment --- .../migrations/20210418130328_checkbox_quiz_item_migrations.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 3abf99ad..e8dd0c94 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -5,7 +5,6 @@ const moveQuizOptionAnswerRows = ` DELETE FROM quiz_option_answer qoa USING quiz_item_answer qia WHERE qia.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox'); - # return old option id, and quiz_answer_id and quiz_item_if from item answer RETURNING qoa.id, qia.quiz_answer_id, qoa.quiz_option_id ) From e400b2aa016019dceb313381925129ebdbdca238 Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 18 Apr 2021 18:15:12 +0300 Subject: [PATCH 03/20] fix delete query --- .../20210418130328_checkbox_quiz_item_migrations.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index e8dd0c94..25d9e119 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -25,9 +25,8 @@ const moveQuizOptionRows = ` ` const deleteQuizOptionChildren = ` DELETE FROM quiz_option_translation qot - USING quiz_item qi, quiz_option qo - WHERE qi.type = 'checkbox'::quiz_item_type_enum - AND qo.id IN (SELECT id FROM qi) + USING quiz_item qi, quiz_option qo + WHERE qo.id IN (SELECT id FROM quiz_item WHERE type = 'checkbox'::quiz_item_type_enum); ` export async function up(knex: Knex): Promise { From 191004e581a46352a96a600133a19d9c5117c9ce Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 18 Apr 2021 18:19:11 +0300 Subject: [PATCH 04/20] fix --- .../migrations/20210418130328_checkbox_quiz_item_migrations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 25d9e119..e7a69e99 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -17,7 +17,7 @@ const moveQuizOptionRows = ` DELETE FROM quiz_option qo USING quiz_item qi WHERE qi.type = 'checkbox' - RETURNING qo.id qo."order", qo.deleted, 'checkbox'::quiz_item_type_enum, qi.quiz_id + RETURNING qo.id, qo."order", qo.deleted, 'checkbox'::quiz_item_type_enum, qi.quiz_id ) INSERT INTO quiz_item (id, "order", deleted, type, quiz_id) From 2aae36c588f32946f86570ca9b27f7f636a4756c Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 18 Apr 2021 18:38:14 +0300 Subject: [PATCH 05/20] fix syntax --- .../migrations/20210418130328_checkbox_quiz_item_migrations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index e7a69e99..73ed8a01 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -4,7 +4,7 @@ const moveQuizOptionAnswerRows = ` WITH moved_quiz_option_answer_rows AS ( DELETE FROM quiz_option_answer qoa USING quiz_item_answer qia - WHERE qia.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox'); + WHERE qia.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox') RETURNING qoa.id, qia.quiz_answer_id, qoa.quiz_option_id ) From 693ea843d68612267587afb5a73d29bd6493e466 Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 18 Apr 2021 18:56:49 +0300 Subject: [PATCH 06/20] try speed up delete --- ...418130328_checkbox_quiz_item_migrations.ts | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 73ed8a01..8aea01be 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -1,5 +1,26 @@ import * as Knex from "knex" +// indexes on the foreign key fields in referencing tables +const createAnswerIdIndexQia = ` + CREATE INDEX quiz_item_answer_quiz_answer_id + ON quiz_item_answer(quiz_answer_id); +` +const createItemIdIndexQia = ` + CREATE INDEX quiz_item_answer_quiz_item_id + ON quiz_item_answer(quiz_item_id); +` + +const createItemIdIndexQo = ` + CREATE INDEX quiz_option_quiz_item_id + ON quiz_option(quiz_item_id); +` + +const dropIndexes = ` + DROP INDEX quiz_item_answer_quiz_answer_id; + DROP INDEX quiz_item_answer_quiz_item_id; + DROP INDEX quiz_option_quiz_item_id; +` + const moveQuizOptionAnswerRows = ` WITH moved_quiz_option_answer_rows AS ( DELETE FROM quiz_option_answer qoa @@ -30,9 +51,14 @@ const deleteQuizOptionChildren = ` ` export async function up(knex: Knex): Promise { + await knex.raw(createAnswerIdIndexQia) + await knex.raw(createItemIdIndexQia) + await knex.raw(createItemIdIndexQo) await knex.raw(moveQuizOptionAnswerRows) await knex.raw(deleteQuizOptionChildren) await knex.raw(moveQuizOptionRows) } -export async function down(knex: Knex): Promise {} +export async function down(knex: Knex): Promise { + await knex.raw(dropIndexes) +} From 251030f804ab04531acf29b85110797e55cf71a7 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 19 Apr 2021 12:14:24 +0300 Subject: [PATCH 07/20] disable triggers during migration --- ...418130328_checkbox_quiz_item_migrations.ts | 47 ++++++++----------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 8aea01be..2f9c28ee 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -1,26 +1,5 @@ import * as Knex from "knex" -// indexes on the foreign key fields in referencing tables -const createAnswerIdIndexQia = ` - CREATE INDEX quiz_item_answer_quiz_answer_id - ON quiz_item_answer(quiz_answer_id); -` -const createItemIdIndexQia = ` - CREATE INDEX quiz_item_answer_quiz_item_id - ON quiz_item_answer(quiz_item_id); -` - -const createItemIdIndexQo = ` - CREATE INDEX quiz_option_quiz_item_id - ON quiz_option(quiz_item_id); -` - -const dropIndexes = ` - DROP INDEX quiz_item_answer_quiz_answer_id; - DROP INDEX quiz_item_answer_quiz_item_id; - DROP INDEX quiz_option_quiz_item_id; -` - const moveQuizOptionAnswerRows = ` WITH moved_quiz_option_answer_rows AS ( DELETE FROM quiz_option_answer qoa @@ -28,9 +7,10 @@ const moveQuizOptionAnswerRows = ` WHERE qia.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox') RETURNING qoa.id, qia.quiz_answer_id, qoa.quiz_option_id ) - + INSERT INTO quiz_item_answer (id, quiz_answer_id, quiz_item_id) - SELECT * FROM moved_quiz_option_answer_rows; + SELECT * FROM moved_quiz_option_answer_rows + ` const moveQuizOptionRows = ` @@ -42,23 +22,34 @@ const moveQuizOptionRows = ` ) INSERT INTO quiz_item (id, "order", deleted, type, quiz_id) - SELECT * FROM moved_quiz_option_rows; + SELECT * FROM moved_quiz_option_rows + ` + const deleteQuizOptionChildren = ` DELETE FROM quiz_option_translation qot USING quiz_item qi, quiz_option qo WHERE qo.id IN (SELECT id FROM quiz_item WHERE type = 'checkbox'::quiz_item_type_enum); ` +const reEnableTableTriggers = ` +ALTER TABLE quiz_option_answer ENABLE TRIGGER ALL +ALTER TABLE quiz_option ENABLE TRIGGER ALL +` + +const disableTableTriggers = ` +ALTER TABLE quiz_option_answer DISABLE TRIGGER ALL +ALTER TABLE quiz_option DISABLE TRIGGER ALL + +` + export async function up(knex: Knex): Promise { - await knex.raw(createAnswerIdIndexQia) - await knex.raw(createItemIdIndexQia) - await knex.raw(createItemIdIndexQo) + await knex.raw(disableTableTriggers) await knex.raw(moveQuizOptionAnswerRows) await knex.raw(deleteQuizOptionChildren) await knex.raw(moveQuizOptionRows) } export async function down(knex: Knex): Promise { - await knex.raw(dropIndexes) + await knex.raw(reEnableTableTriggers) } From d4f33b0ef40f4f8b4fa14f02a6299c0fba814a81 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 19 Apr 2021 12:30:15 +0300 Subject: [PATCH 08/20] move quiz option translation rows --- ...418130328_checkbox_quiz_item_migrations.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 2f9c28ee..c44ffba3 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -12,6 +12,17 @@ const moveQuizOptionAnswerRows = ` SELECT * FROM moved_quiz_option_answer_rows ` +const moveQuizOptionTranslationRows = ` + WITH moved_quiz_option_translation_rows AS ( + DELETE FROM quiz_option_translation qot + USING quiz_option qo + WHERE qo.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox') + RETURNING qot.quiz_option_id, qot.language_id, qot.title, qot.body, qot.success_message, qot.failure_message + ) + + INSERT INTO quiz_item_translation (quiz_item_id, language_id, title, body, success_message, failure_message) + SELECT * FROM moved_quiz_option_translation_rows +` const moveQuizOptionRows = ` WITH moved_quiz_option_rows AS ( @@ -35,17 +46,26 @@ const deleteQuizOptionChildren = ` const reEnableTableTriggers = ` ALTER TABLE quiz_option_answer ENABLE TRIGGER ALL ALTER TABLE quiz_option ENABLE TRIGGER ALL +ALTER TABLE quiz_item ENABLE TRIGGER ALL +ALTER TABLE quiz_item_answer ENABLE TRIGGER ALL +ALTER TABLE quiz_option_translation ENABLE TRIGGER ALL +ALTER TABLE quiz_item_translation ENABLE TRIGGER ALL ` const disableTableTriggers = ` ALTER TABLE quiz_option_answer DISABLE TRIGGER ALL ALTER TABLE quiz_option DISABLE TRIGGER ALL +ALTER TABLE quiz_item DISABLE TRIGGER ALL +ALTER TABLE quiz_item_answer DISABLE TRIGGER ALL +ALTER TABLE quiz_option_translation DISABLE TRIGGER ALL +ALTER TABLE quiz_item_translation DISABLE TRIGGER ALL ` export async function up(knex: Knex): Promise { await knex.raw(disableTableTriggers) await knex.raw(moveQuizOptionAnswerRows) + await knex.raw(moveQuizOptionTranslationRows) await knex.raw(deleteQuizOptionChildren) await knex.raw(moveQuizOptionRows) } From c0741d075d2c7e020d2c2702275c197266447a07 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 19 Apr 2021 12:57:13 +0300 Subject: [PATCH 09/20] separate statements --- ...418130328_checkbox_quiz_item_migrations.ts | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index c44ffba3..d266157f 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -34,7 +34,6 @@ const moveQuizOptionRows = ` INSERT INTO quiz_item (id, "order", deleted, type, quiz_id) SELECT * FROM moved_quiz_option_rows - ` const deleteQuizOptionChildren = ` @@ -44,22 +43,21 @@ const deleteQuizOptionChildren = ` ` const reEnableTableTriggers = ` -ALTER TABLE quiz_option_answer ENABLE TRIGGER ALL -ALTER TABLE quiz_option ENABLE TRIGGER ALL -ALTER TABLE quiz_item ENABLE TRIGGER ALL -ALTER TABLE quiz_item_answer ENABLE TRIGGER ALL -ALTER TABLE quiz_option_translation ENABLE TRIGGER ALL -ALTER TABLE quiz_item_translation ENABLE TRIGGER ALL +ALTER TABLE quiz_option_answer ENABLE TRIGGER ALL; +ALTER TABLE quiz_option ENABLE TRIGGER ALL; +ALTER TABLE quiz_item ENABLE TRIGGER ALL; +ALTER TABLE quiz_item_answer ENABLE TRIGGER ALL; +ALTER TABLE quiz_option_translation ENABLE TRIGGER ALL; +ALTER TABLE quiz_item_translation ENABLE TRIGGER ALL; ` const disableTableTriggers = ` -ALTER TABLE quiz_option_answer DISABLE TRIGGER ALL -ALTER TABLE quiz_option DISABLE TRIGGER ALL -ALTER TABLE quiz_item DISABLE TRIGGER ALL -ALTER TABLE quiz_item_answer DISABLE TRIGGER ALL -ALTER TABLE quiz_option_translation DISABLE TRIGGER ALL -ALTER TABLE quiz_item_translation DISABLE TRIGGER ALL - +ALTER TABLE quiz_option_answer DISABLE TRIGGER ALL; +ALTER TABLE quiz_option DISABLE TRIGGER ALL; +ALTER TABLE quiz_item DISABLE TRIGGER ALL; +ALTER TABLE quiz_item_answer DISABLE TRIGGER ALL; +ALTER TABLE quiz_option_translation DISABLE TRIGGER ALL; +ALTER TABLE quiz_item_translation DISABLE TRIGGER ALL; ` export async function up(knex: Knex): Promise { From d2e4f74333865b46bc570750c7c8219e278662aa Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 26 Apr 2021 00:23:45 +0300 Subject: [PATCH 10/20] more optimal way to move quiz option answer rows --- ...418130328_checkbox_quiz_item_migrations.ts | 80 +++++++++++-------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index d266157f..5f6b3ed0 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -1,17 +1,40 @@ import * as Knex from "knex" const moveQuizOptionAnswerRows = ` - WITH moved_quiz_option_answer_rows AS ( - DELETE FROM quiz_option_answer qoa - USING quiz_item_answer qia - WHERE qia.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox') - RETURNING qoa.id, qia.quiz_answer_id, qoa.quiz_option_id - ) - - INSERT INTO quiz_item_answer (id, quiz_answer_id, quiz_item_id) - SELECT * FROM moved_quiz_option_answer_rows + DROP INDEX idx_fts_answer; + DROP INDEX trgm_idx; + DROP INDEX quiz_option_answer_sort_order; + + SET random_page_cost = 1.1; + + INSERT + INTO quiz_item_answer as qia (id, quiz_answer_id, quiz_item_id, created_at, updated_at) + SELECT qoa.id, qia.quiz_answer_id, qoa.quiz_option_id, qoa.created_at, qoa.updated_at + FROM quiz_option_answer as qoa + JOIN quiz_item_answer qia on qia.id = qoa.quiz_item_answer_id + JOIN quiz_item qi on qi.id = qia.quiz_item_id + WHERE qi.type = 'checkbox'; + + DELETE + FROM quiz_option_answer as qoa + WHERE id IN (SELECT qoa.id + from quiz_option_answer qoa + join quiz_option qo on qo.id = qoa.quiz_option_id + join quiz_item qi on qi.id = qo.quiz_item_id + where qi.type = 'checkbox'); + SET random_page_cost = 4; + + create index trgm_idx + on quiz_item_answer using gin (text_data gin_trgm_ops); + + create index idx_fts_answer + on quiz_item_answer using gin (to_tsvector('english'::regconfig, COALESCE(text_data, ''::text))); + + create index quiz_item_answer_sort_order + on quiz_item_answer (quiz_answer_id, created_at); ` + const moveQuizOptionTranslationRows = ` WITH moved_quiz_option_translation_rows AS ( DELETE FROM quiz_option_translation qot @@ -36,38 +59,29 @@ const moveQuizOptionRows = ` SELECT * FROM moved_quiz_option_rows ` -const deleteQuizOptionChildren = ` - DELETE FROM quiz_option_translation qot - USING quiz_item qi, quiz_option qo - WHERE qo.id IN (SELECT id FROM quiz_item WHERE type = 'checkbox'::quiz_item_type_enum); +const disableTableTriggers = ` +ALTER TABLE quiz_option_answer + DISABLE TRIGGER ALL; +ALTER TABLE quiz_item + DISABLE TRIGGER ALL; +ALTER TABLE quiz_item_answer + DISABLE TRIGGER ALL; ` - const reEnableTableTriggers = ` -ALTER TABLE quiz_option_answer ENABLE TRIGGER ALL; -ALTER TABLE quiz_option ENABLE TRIGGER ALL; -ALTER TABLE quiz_item ENABLE TRIGGER ALL; -ALTER TABLE quiz_item_answer ENABLE TRIGGER ALL; -ALTER TABLE quiz_option_translation ENABLE TRIGGER ALL; -ALTER TABLE quiz_item_translation ENABLE TRIGGER ALL; -` - -const disableTableTriggers = ` -ALTER TABLE quiz_option_answer DISABLE TRIGGER ALL; -ALTER TABLE quiz_option DISABLE TRIGGER ALL; -ALTER TABLE quiz_item DISABLE TRIGGER ALL; -ALTER TABLE quiz_item_answer DISABLE TRIGGER ALL; -ALTER TABLE quiz_option_translation DISABLE TRIGGER ALL; -ALTER TABLE quiz_item_translation DISABLE TRIGGER ALL; +ALTER TABLE quiz_option_answer + ENABLE TRIGGER ALL; +ALTER TABLE quiz_item + ENABLE TRIGGER ALL; +ALTER TABLE quiz_item_answer + ENABLE TRIGGER ALL; ` export async function up(knex: Knex): Promise { await knex.raw(disableTableTriggers) await knex.raw(moveQuizOptionAnswerRows) await knex.raw(moveQuizOptionTranslationRows) - await knex.raw(deleteQuizOptionChildren) await knex.raw(moveQuizOptionRows) -} - -export async function down(knex: Knex): Promise { await knex.raw(reEnableTableTriggers) } + +export async function down(knex: Knex): Promise {} From e8fd52278350f12f523ae6c5bf87566cb7e1cbbb Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 26 Apr 2021 12:56:33 +0300 Subject: [PATCH 11/20] change rest of migration --- ...418130328_checkbox_quiz_item_migrations.ts | 114 +++++++++++------- 1 file changed, 68 insertions(+), 46 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 5f6b3ed0..ae360a6e 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -1,12 +1,17 @@ import * as Knex from "knex" const moveQuizOptionAnswerRows = ` - DROP INDEX idx_fts_answer; - DROP INDEX trgm_idx; - DROP INDEX quiz_option_answer_sort_order; + ALTER TABLE quiz_item_answer + DISABLE TRIGGER ALL; + ALTER TABLE quiz_option_answer + DISABLE TRIGGER ALL; SET random_page_cost = 1.1; + DROP INDEX idx_fts_answer; + DROP INDEX quiz_item_answer_sort_order; + DROP INDEX trgm_idx; + INSERT INTO quiz_item_answer as qia (id, quiz_answer_id, quiz_item_id, created_at, updated_at) SELECT qoa.id, qia.quiz_answer_id, qoa.quiz_option_id, qoa.created_at, qoa.updated_at @@ -14,6 +19,7 @@ const moveQuizOptionAnswerRows = ` JOIN quiz_item_answer qia on qia.id = qoa.quiz_item_answer_id JOIN quiz_item qi on qi.id = qia.quiz_item_id WHERE qi.type = 'checkbox'; + DELETE FROM quiz_option_answer as qoa @@ -25,63 +31,79 @@ const moveQuizOptionAnswerRows = ` SET random_page_cost = 4; - create index trgm_idx - on quiz_item_answer using gin (text_data gin_trgm_ops); + ALTER TABLE quiz_item_answer + ENABLE TRIGGER ALL; + ALTER TABLE quiz_option_answer + ENABLE TRIGGER ALL; - create index idx_fts_answer - on quiz_item_answer using gin (to_tsvector('english'::regconfig, COALESCE(text_data, ''::text))); - - create index quiz_item_answer_sort_order - on quiz_item_answer (quiz_answer_id, created_at); ` const moveQuizOptionTranslationRows = ` - WITH moved_quiz_option_translation_rows AS ( - DELETE FROM quiz_option_translation qot - USING quiz_option qo - WHERE qo.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox') - RETURNING qot.quiz_option_id, qot.language_id, qot.title, qot.body, qot.success_message, qot.failure_message - ) - - INSERT INTO quiz_item_translation (quiz_item_id, language_id, title, body, success_message, failure_message) - SELECT * FROM moved_quiz_option_translation_rows + ALTER TABLE quiz_item_translation + DISABLE TRIGGER ALL; + + INSERT + INTO quiz_item_translation as qia (quiz_item_id, language_id, title, body, success_message, failure_message, created_at, + updated_at) + SELECT qot.quiz_option_id, + qot.language_id, + qot.title, + qot.body, + qot.success_message, + qot.failure_message, + qot.created_at, + qot.updated_at + FROM quiz_option_translation as qot + JOIN quiz_option qo on qot.quiz_option_id = qo.id + WHERE qo.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox'); + + DELETE + FROM quiz_option_translation qot + USING quiz_option qo + WHERE qo.quiz_item_id IN (SELECT id FROM quiz_item WHERE type = 'checkbox'); + + ALTER TABLE quiz_item_translation + ENABLE TRIGGER ALL; ` const moveQuizOptionRows = ` - WITH moved_quiz_option_rows AS ( - DELETE FROM quiz_option qo - USING quiz_item qi - WHERE qi.type = 'checkbox' - RETURNING qo.id, qo."order", qo.deleted, 'checkbox'::quiz_item_type_enum, qi.quiz_id - ) - - INSERT INTO quiz_item (id, "order", deleted, type, quiz_id) - SELECT * FROM moved_quiz_option_rows -` + INSERT + INTO quiz_item (id, "order", deleted, type, quiz_id, created_at, updated_at) + SELECT qo.id, qo."order", qo.deleted, 'checkbox'::quiz_item_type_enum, qi.quiz_id, qo.created_at, qo.updated_at + FROM quiz_option qo + JOIN quiz_item qi ON qo.quiz_item_id = qi.id + WHERE qi.type = 'checkbox'; + + ALTER TABLE quiz_option + DISABLE TRIGGER ALL; + + DELETE + FROM quiz_option qo + USING quiz_item qi + WHERE qi.type = 'checkbox'; -const disableTableTriggers = ` -ALTER TABLE quiz_option_answer - DISABLE TRIGGER ALL; -ALTER TABLE quiz_item - DISABLE TRIGGER ALL; -ALTER TABLE quiz_item_answer - DISABLE TRIGGER ALL; + ALTER TABLE quiz_option + ENABLE TRIGGER ALL; ` -const reEnableTableTriggers = ` -ALTER TABLE quiz_option_answer - ENABLE TRIGGER ALL; -ALTER TABLE quiz_item - ENABLE TRIGGER ALL; -ALTER TABLE quiz_item_answer - ENABLE TRIGGER ALL; + +const reCreateIndexes = ` +create index trgm_idx + on quiz_item_answer using gin (text_data gin_trgm_ops); + +create index idx_fts_answer + on quiz_item_answer using gin (to_tsvector('english'::regconfig, COALESCE(text_data, ''::text))); + +create index quiz_item_answer_sort_order + on quiz_item_answer (quiz_answer_id, created_at); + ` export async function up(knex: Knex): Promise { - await knex.raw(disableTableTriggers) await knex.raw(moveQuizOptionAnswerRows) await knex.raw(moveQuizOptionTranslationRows) await knex.raw(moveQuizOptionRows) - await knex.raw(reEnableTableTriggers) } -export async function down(knex: Knex): Promise {} +export async function down(knex: Knex): Promise { + await knex.raw(reCreateIndexes) +} From e2cbea8c850e882ad904e31a3493b6cd6ca967f3 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 26 Apr 2021 12:59:48 +0300 Subject: [PATCH 12/20] fix --- ...0418130328_checkbox_quiz_item_migrations.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index ae360a6e..4fe532fd 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -8,9 +8,9 @@ const moveQuizOptionAnswerRows = ` SET random_page_cost = 1.1; - DROP INDEX idx_fts_answer; - DROP INDEX quiz_item_answer_sort_order; - DROP INDEX trgm_idx; + DROP INDEX IF EXISTS idx_fts_answer; + DROP INDEX IF EXISTS quiz_item_answer_sort_order; + DROP INDEX IF EXISTS trgm_idx; INSERT INTO quiz_item_answer as qia (id, quiz_answer_id, quiz_item_id, created_at, updated_at) @@ -87,14 +87,14 @@ const moveQuizOptionRows = ` ` const reCreateIndexes = ` -create index trgm_idx - on quiz_item_answer using gin (text_data gin_trgm_ops); +CREATE INDEX trgm_idx + ON quiz_item_answer using gin (text_data gin_trgm_ops); -create index idx_fts_answer - on quiz_item_answer using gin (to_tsvector('english'::regconfig, COALESCE(text_data, ''::text))); +CREATE INDEX idx_fts_answer + ON quiz_item_answer using gin (to_tsvector('english'::regconfig, COALESCE(text_data, ''::text))); -create index quiz_item_answer_sort_order - on quiz_item_answer (quiz_answer_id, created_at); +CREATE INDEX quiz_item_answer_sort_order + ON quiz_item_answer (quiz_answer_id, created_at); ` From 3dd41f65793d16fdf3a2d437df168fba8be598ef Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 26 Apr 2021 14:47:55 +0300 Subject: [PATCH 13/20] mark checkboxes as checked --- .../20210418130328_checkbox_quiz_item_migrations.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 4fe532fd..e96e9eb9 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -13,8 +13,8 @@ const moveQuizOptionAnswerRows = ` DROP INDEX IF EXISTS trgm_idx; INSERT - INTO quiz_item_answer as qia (id, quiz_answer_id, quiz_item_id, created_at, updated_at) - SELECT qoa.id, qia.quiz_answer_id, qoa.quiz_option_id, qoa.created_at, qoa.updated_at + INTO quiz_item_answer as qia (id, quiz_answer_id, quiz_item_id, int_data, created_at, updated_at) + SELECT qoa.id, qia.quiz_answer_id, qoa.quiz_option_id, 1, qoa.created_at, qoa.updated_at FROM quiz_option_answer as qoa JOIN quiz_item_answer qia on qia.id = qoa.quiz_item_answer_id JOIN quiz_item qi on qi.id = qia.quiz_item_id @@ -35,7 +35,6 @@ const moveQuizOptionAnswerRows = ` ENABLE TRIGGER ALL; ALTER TABLE quiz_option_answer ENABLE TRIGGER ALL; - ` const moveQuizOptionTranslationRows = ` @@ -95,7 +94,6 @@ CREATE INDEX idx_fts_answer CREATE INDEX quiz_item_answer_sort_order ON quiz_item_answer (quiz_answer_id, created_at); - ` export async function up(knex: Knex): Promise { From 477d25975366305c7fa3221365071257e0fad9e9 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 26 Apr 2021 15:16:45 +0300 Subject: [PATCH 14/20] remove empty quiz items and quiz item answers --- ...418130328_checkbox_quiz_item_migrations.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index e96e9eb9..9434d2c2 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -31,6 +31,10 @@ const moveQuizOptionAnswerRows = ` SET random_page_cost = 4; + DELETE + FROM quiz_item_answer qia + WHERE id IN (SELECT id from qia_to_delete); + ALTER TABLE quiz_item_answer ENABLE TRIGGER ALL; ALTER TABLE quiz_option_answer @@ -81,6 +85,11 @@ const moveQuizOptionRows = ` USING quiz_item qi WHERE qi.type = 'checkbox'; + DELETE + FROM quiz_item qi + WHERE qi.id IN (SELECT id FROM qi_to_delete); + + ALTER TABLE quiz_option ENABLE TRIGGER ALL; ` @@ -96,12 +105,41 @@ CREATE INDEX quiz_item_answer_sort_order ON quiz_item_answer (quiz_answer_id, created_at); ` +const createTempTables = ` +CREATE TEMP TABLE qia_to_delete( + id uuid +); + +CREATE TEMP TABLE qi_to_delete( + id uuid +); + +insert into qia_to_delete (select qia.id + from quiz_item_answer qia + join quiz_item qi on qi.id = qia.quiz_item_id + join quiz_option_answer qoa on qoa.quiz_item_answer_id = qia.id) + where qi.type ='checkbox'; + +insert into qi_to_delete (select qi.id + from quiz_item qi + join quiz_option qo on qo.quiz_item_id = qi.id + join quiz_option_answer qoa on qoa.quiz_option_id = qo.id) + where qi.type ='checkbox'; +` + +const dropTempTables = ` + DROP TABLE IF EXISTS qia_to_delete; + DROP TABLE IF EXISTS qi_to_delete; +` + export async function up(knex: Knex): Promise { + await knex.raw(createTempTables) await knex.raw(moveQuizOptionAnswerRows) await knex.raw(moveQuizOptionTranslationRows) await knex.raw(moveQuizOptionRows) } export async function down(knex: Knex): Promise { + await knex.raw(dropTempTables) await knex.raw(reCreateIndexes) } From 1156ad3f7b10ea4015336ffd02bd2e81e1d4190c Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 26 Apr 2021 15:32:45 +0300 Subject: [PATCH 15/20] fix typo From 97238ec2bf1fb0d9733417de46f73a641886f2b6 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 26 Apr 2021 15:33:15 +0300 Subject: [PATCH 16/20] fix typo --- .../20210418130328_checkbox_quiz_item_migrations.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 9434d2c2..6d3cdae2 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -28,7 +28,6 @@ const moveQuizOptionAnswerRows = ` join quiz_option qo on qo.id = qoa.quiz_option_id join quiz_item qi on qi.id = qo.quiz_item_id where qi.type = 'checkbox'); - SET random_page_cost = 4; DELETE @@ -117,14 +116,14 @@ CREATE TEMP TABLE qi_to_delete( insert into qia_to_delete (select qia.id from quiz_item_answer qia join quiz_item qi on qi.id = qia.quiz_item_id - join quiz_option_answer qoa on qoa.quiz_item_answer_id = qia.id) - where qi.type ='checkbox'; + join quiz_option_answer qoa on qoa.quiz_item_answer_id = qia.id + where qi.type ='checkbox'); insert into qi_to_delete (select qi.id from quiz_item qi join quiz_option qo on qo.quiz_item_id = qi.id - join quiz_option_answer qoa on qoa.quiz_option_id = qo.id) - where qi.type ='checkbox'; + join quiz_option_answer qoa on qoa.quiz_option_id = qo.id + where qi.type ='checkbox'); ` const dropTempTables = ` From fd0f16779008818348fc194d90506dad445d114d Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 1 May 2021 17:36:35 +0300 Subject: [PATCH 17/20] correct migration --- .../migrations/20210418130328_checkbox_quiz_item_migrations.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 6d3cdae2..a2499b31 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -122,7 +122,6 @@ insert into qia_to_delete (select qia.id insert into qi_to_delete (select qi.id from quiz_item qi join quiz_option qo on qo.quiz_item_id = qi.id - join quiz_option_answer qoa on qoa.quiz_option_id = qo.id where qi.type ='checkbox'); ` From 6beedc6c6bdccb80a343b1ef612e2f4a92e23f4e Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 1 May 2021 18:15:28 +0300 Subject: [PATCH 18/20] disable trigger --- .../20210418130328_checkbox_quiz_item_migrations.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index a2499b31..543d4e72 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -78,6 +78,9 @@ const moveQuizOptionRows = ` ALTER TABLE quiz_option DISABLE TRIGGER ALL; + + ALTER TABLE quiz_item + DISABLE TRIGGER ALL; DELETE FROM quiz_option qo @@ -91,6 +94,9 @@ const moveQuizOptionRows = ` ALTER TABLE quiz_option ENABLE TRIGGER ALL; + + ALTER TABLE quiz_item + ENABLE TRIGGER ALL; ` const reCreateIndexes = ` From bce545883ee1f4d1365aa52ede2ad35ababe507d Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 2 May 2021 13:06:39 +0300 Subject: [PATCH 19/20] fix --- .../20210418130328_checkbox_quiz_item_migrations.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 543d4e72..0d238309 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -141,9 +141,8 @@ export async function up(knex: Knex): Promise { await knex.raw(moveQuizOptionAnswerRows) await knex.raw(moveQuizOptionTranslationRows) await knex.raw(moveQuizOptionRows) -} - -export async function down(knex: Knex): Promise { await knex.raw(dropTempTables) await knex.raw(reCreateIndexes) } + +export async function down(knex: Knex): Promise {} From 8750debad49ccd60c3ad788c12874759703a41d6 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 3 May 2021 17:25:48 +0300 Subject: [PATCH 20/20] move trgm index recreate --- .../migrations/20210418130328_checkbox_quiz_item_migrations.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts index 0d238309..606ff285 100644 --- a/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts +++ b/packages/backendv2/database/migrations/20210418130328_checkbox_quiz_item_migrations.ts @@ -100,8 +100,6 @@ const moveQuizOptionRows = ` ` const reCreateIndexes = ` -CREATE INDEX trgm_idx - ON quiz_item_answer using gin (text_data gin_trgm_ops); CREATE INDEX idx_fts_answer ON quiz_item_answer using gin (to_tsvector('english'::regconfig, COALESCE(text_data, ''::text)));