From 988091e8076bd24d6b49cc5ad34604b05a2472a2 Mon Sep 17 00:00:00 2001 From: yahya Date: Wed, 2 Mar 2022 12:31:20 +0100 Subject: [PATCH] Copy answers ke data to temporary tables Co-authored-by: Pierre Top --- ...ke-data-to-temporary-tables-with-bigint.js | 60 ++++++++++++++++ ...ta-to-temporary-tables-with-bigint_test.js | 68 +++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 api/scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint.js create mode 100644 api/tests/acceptance/scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint_test.js diff --git a/api/scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint.js b/api/scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint.js new file mode 100644 index 00000000000..cbe4d33ce29 --- /dev/null +++ b/api/scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint.js @@ -0,0 +1,60 @@ +require('dotenv').config(); +const { performance } = require('perf_hooks'); +const { knex } = require('../../../db/knex-database-connection'); +const logger = require('../../../lib/infrastructure/logger'); + +const copyAnswerKeDataToTemporaryTables = async () => { + logger.debug('Start copy answers and knowledge-elements data'); + const startTime = performance.now(); + + await knex.transaction(async (trx) => { + await knex + .raw( + `INSERT INTO "answers_bigint" + (id, value, result, "assessmentId", "challengeId", timeout, "resultDetails", "timeSpent", "isFocusedOut") + SELECT + a.id, a.value, a.result, a."assessmentId", a."challengeId", a.timeout, a."resultDetails", a."timeSpent", a."isFocusedOut" + FROM "answers" a` + ) + .transacting(trx); + + await knex + .raw( + `INSERT INTO "knowledge-elements_bigint" + ( id, source, status, "createdAt", "answerId", "assessmentId", "skillId", "earnedPix", "userId", "competenceId") + SELECT + ke.id, ke.source, ke.status, ke."createdAt", ke."answerId", ke."assessmentId", ke."skillId", ke."earnedPix", ke."userId", ke."competenceId" + FROM "knowledge-elements" ke` + ) + .transacting(trx); + }); + const endTime = performance.now(); + + logger.debug(`Call to copyAnswerKeDataToTemporaryTables took ${endTime - startTime} milliseconds`); + logger.debug('Finish copy'); +}; + +const isLaunchedFromCommandLine = require.main === module; + +async function main() { + try { + logger.debug('Start script... '); + await copyAnswerKeDataToTemporaryTables(); + logger.debug('End script: copy done successfully.'); + } catch (error) { + logger.error(error); + process.exit(1); + } +} + +if (isLaunchedFromCommandLine) { + main().then( + () => process.exit(0), + (err) => { + logger.error(err); + process.exit(1); + } + ); +} + +module.exports = { copyAnswerKeDataToTemporaryTables }; diff --git a/api/tests/acceptance/scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint_test.js b/api/tests/acceptance/scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint_test.js new file mode 100644 index 00000000000..2f27da7082c --- /dev/null +++ b/api/tests/acceptance/scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint_test.js @@ -0,0 +1,68 @@ +const { + createAnswersBigintMigrationDatabaseStructures, +} = require('../../../../../scripts/bigint/answer/create-migration-database-structure'); +const { + copyAnswerKeDataToTemporaryTables, +} = require('../../../../../scripts/bigint/answer/copy-answers-ke-data-to-temporary-tables-with-bigint'); +const { expect, knex } = require('../../../../test-helper'); + +const DatabaseBuilder = require('../../../../../db/database-builder/database-builder'); +const databaseBuilder = new DatabaseBuilder({ knex }); + +describe('#copyAnswerKeDataToTemporaryTables', function () { + it('should copy data from tables to temporary tables', async function () { + // given + await knex.raw('DROP TABLE IF EXISTS "bigint-migration-settings"'); + await knex.raw('DROP TABLE IF EXISTS "knowledge-elements_bigint"'); + await knex.raw('DROP TABLE IF EXISTS "answers_bigint"'); + await createAnswersBigintMigrationDatabaseStructures(knex); + + const { id: assessmentId } = databaseBuilder.factory.buildAssessment(); + const { id: firstAnswerId } = databaseBuilder.factory.buildAnswer({ assessmentId }); + databaseBuilder.factory.buildKnowledgeElement({ assessmentId, answerId: firstAnswerId }); + const { id: secondAnswerId } = databaseBuilder.factory.buildAnswer({ assessmentId }); + databaseBuilder.factory.buildKnowledgeElement({ assessmentId, answerId: secondAnswerId }); + + await databaseBuilder.commit(); + + // when + await copyAnswerKeDataToTemporaryTables(); + + // then + const { rows: answersBigintCount } = await knex.raw(`SELECT COUNT(1) FROM "answers_bigint"`); + expect(answersBigintCount[0].count).to.equal(2); + const { rows: knowledgeElementsBigintCount } = await knex.raw(`SELECT COUNT(1) FROM "knowledge-elements_bigint"`); + expect(knowledgeElementsBigintCount[0].count).to.equal(2); + }); + it('should copy both tables or nothing', async function () { + // given + await knex.raw('DROP TABLE IF EXISTS "bigint-migration-settings"'); + await knex.raw('DROP TABLE IF EXISTS "knowledge-elements_bigint"'); + await knex.raw('DROP TABLE IF EXISTS "answers_bigint"'); + await createAnswersBigintMigrationDatabaseStructures(knex); + await knex.raw('DROP TABLE IF EXISTS "knowledge-elements_bigint"'); + + const { id: assessmentId } = databaseBuilder.factory.buildAssessment(); + databaseBuilder.factory.buildAnswer({ assessmentId }); + await databaseBuilder.commit(); + + // when + let error; + try { + await copyAnswerKeDataToTemporaryTables(); + } catch (err) { + error = err; + } + + // then + expect(error.message).to.have.string('relation "knowledge-elements_bigint" does not exist'); + const { rows: answersBigintCount } = await knex.raw(`SELECT COUNT(1) FROM "answers_bigint"`); + expect(answersBigintCount[0].count).to.equal(0); + }); + + afterEach(async function () { + await knex('knowledge-elements').delete(); + await knex('answers').delete(); + await knex('assessments').delete(); + }); +});