From 1430d0a9cfbc3a99c1f8c5dd33175db37fabe302 Mon Sep 17 00:00:00 2001 From: Arnaud Moncel Date: Thu, 26 Nov 2020 11:53:35 +0100 Subject: [PATCH 1/3] fix: fix database type detection --- src/utils/database.js | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/utils/database.js b/src/utils/database.js index e5068cbe..f6d34a13 100644 --- a/src/utils/database.js +++ b/src/utils/database.js @@ -1,21 +1,10 @@ -function optionsInvalid(options) { - // TODO: This function only works with the connection 0, we should add a index - // parameter in case of multiple database with different dialect. - return !(options && options.connections && options.connections[0] - && options.connections[0].options && options.connections[0].options.dialect); +function getConnectionDialect(options) { + const connection = Object.values(options.connections)[0]; + return connection.options.dialect; } -exports.isMySQL = (options) => { - if (optionsInvalid(options)) { return false; } - return ['mysql', 'mariadb'].indexOf(options.connections[0].options.dialect) > -1; -}; +exports.isMySQL = (options) => ['mysql', 'mariadb'].includes(getConnectionDialect(options)); -exports.isMSSQL = (options) => { - if (optionsInvalid(options)) { return false; } - return options.connections[0].options.dialect === 'mssql'; -}; +exports.isMSSQL = (options) => getConnectionDialect(options) === 'mssql'; -exports.isSQLite = (options) => { - if (optionsInvalid(options)) { return false; } - return options.connections[0].options.dialect === 'sqlite'; -}; +exports.isSQLite = (options) => getConnectionDialect(options) === 'sqlite'; From 741f1047fec7102201c52f8fb98966d9509fc054 Mon Sep 17 00:00:00 2001 From: Arnaud Moncel Date: Thu, 26 Nov 2020 14:29:32 +0100 Subject: [PATCH 2/3] fix: add all missing forgotten connections trasformations --- src/services/leaderboard-stat-getter.js | 2 +- src/services/resources-getter.js | 2 +- test/adapters/sequelize.test.js | 2 +- test/index.test.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/leaderboard-stat-getter.js b/src/services/leaderboard-stat-getter.js index 5fd2cf7b..71fcafc6 100644 --- a/src/services/leaderboard-stat-getter.js +++ b/src/services/leaderboard-stat-getter.js @@ -55,7 +55,7 @@ function LeaderboardStatGetter(model, modelRelationship, params, options) { `; - this.perform = () => options.connections[0].query(query, { + this.perform = () => Object.values(options.connections)[0].query(query, { type: options.Sequelize.QueryTypes.SELECT, }) .then((records) => ({ value: records })); diff --git a/src/services/resources-getter.js b/src/services/resources-getter.js index a00b8883..733a3ff8 100644 --- a/src/services/resources-getter.js +++ b/src/services/resources-getter.js @@ -87,7 +87,7 @@ function ResourcesGetter(model, options, params) { // WARNING: Choosing the first connection might generate issues if the model does not // belongs to this database. try { - const results = await options.connections[0] + const results = await Object.values(options.connections)[0] .query(queryToFilterRecords, { type: options.Sequelize.QueryTypes.SELECT, }); diff --git a/test/adapters/sequelize.test.js b/test/adapters/sequelize.test.js index 57a12109..f6a80210 100644 --- a/test/adapters/sequelize.test.js +++ b/test/adapters/sequelize.test.js @@ -11,7 +11,7 @@ function getField(schema, name) { const models = {}; const sequelizeOptions = { Sequelize, - connections: [sequelize], + connections: { sequelize }, }; models.user = sequelize.define('user', { diff --git a/test/index.test.js b/test/index.test.js index 2b33dcae..93aec198 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -19,7 +19,7 @@ const HasManyDissociator = require('../src/services/has-many-dissociator'); const models = {}; const sequelizeOptions = { Sequelize, - connections: [sequelize], + connections: { sequelize }, }; models.user = sequelize.define('user', { From 66228b90c597755c1335a4d0996636ccb037caa0 Mon Sep 17 00:00:00 2001 From: Arnaud Moncel Date: Thu, 26 Nov 2020 15:46:04 +0100 Subject: [PATCH 3/3] chore: fix connection issue --- src/services/leaderboard-stat-getter.js | 4 ++-- src/services/line-stat-getter.js | 12 ++++++------ src/services/pie-stat-getter.js | 2 +- src/services/resources-getter.js | 8 ++++---- src/services/search-builder.js | 2 +- src/utils/database.js | 9 ++++----- test/databases.js | 4 ++-- test/index.test.js | 4 ++-- 8 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/services/leaderboard-stat-getter.js b/src/services/leaderboard-stat-getter.js index 71fcafc6..8f309cf7 100644 --- a/src/services/leaderboard-stat-getter.js +++ b/src/services/leaderboard-stat-getter.js @@ -54,8 +54,8 @@ function LeaderboardStatGetter(model, modelRelationship, params, options) { LIMIT ${limit} `; - - this.perform = () => Object.values(options.connections)[0].query(query, { + const connection = model.sequelize; + this.perform = () => connection.query(query, { type: options.Sequelize.QueryTypes.SELECT, }) .then((records) => ({ value: records })); diff --git a/src/services/line-stat-getter.js b/src/services/line-stat-getter.js index 4a69f221..8ae47359 100644 --- a/src/services/line-stat-getter.js +++ b/src/services/line-stat-getter.js @@ -120,13 +120,13 @@ ${groupByDateFieldFormated}), 'yyyy-MM-dd 00:00:00')`); } function getGroupByDateInterval() { - if (isMySQL(options)) { + if (isMySQL(model.sequelize)) { return [getGroupByDateFieldFormatedForMySQL(timeRange), 'date']; } - if (isMSSQL(options)) { + if (isMSSQL(model.sequelize)) { return [getGroupByDateFieldFormatedForMSSQL(timeRange), 'date']; } - if (isSQLite(options)) { + if (isSQLite(model.sequelize)) { return [getGroupByDateFieldFormatedForSQLite(timeRange), 'date']; } return [ @@ -156,7 +156,7 @@ ${groupByDateFieldFormated}), 'yyyy-MM-dd 00:00:00')`); function fillEmptyDateInterval(records) { if (records.length) { let sqlFormat = 'YYYY-MM-DD 00:00:00'; - if (isSQLite(options) && timeRange === 'week') { + if (isSQLite(model.sequelize) && timeRange === 'week') { sqlFormat = 'YYYY-WW'; } @@ -205,11 +205,11 @@ ${groupByDateFieldFormated}), 'yyyy-MM-dd 00:00:00')`); } function getGroupBy() { - return isMSSQL(options) ? [getGroupByDateFieldFormatedForMSSQL(timeRange)] : [options.Sequelize.literal('1')]; + return isMSSQL(model.sequelize) ? [getGroupByDateFieldFormatedForMSSQL(timeRange)] : [options.Sequelize.literal('1')]; } function getOrder() { - return isMSSQL(options) ? [getGroupByDateFieldFormatedForMSSQL(timeRange)] : [options.Sequelize.literal('1')]; + return isMSSQL(model.sequelize) ? [getGroupByDateFieldFormatedForMSSQL(timeRange)] : [options.Sequelize.literal('1')]; } this.perform = async () => { diff --git a/src/services/pie-stat-getter.js b/src/services/pie-stat-getter.js index 29b8a737..97a1edbf 100644 --- a/src/services/pie-stat-getter.js +++ b/src/services/pie-stat-getter.js @@ -71,7 +71,7 @@ function PieStatGetter(model, params, options) { } function getGroupBy() { - return isMSSQL(options) ? [options.Sequelize.col(groupByField)] : [ALIAS_GROUP_BY]; + return isMSSQL(model.sequelize) ? [options.Sequelize.col(groupByField)] : [ALIAS_GROUP_BY]; } function formatResults(records) { diff --git a/src/services/resources-getter.js b/src/services/resources-getter.js index 733a3ff8..2cf8acfd 100644 --- a/src/services/resources-getter.js +++ b/src/services/resources-getter.js @@ -87,10 +87,10 @@ function ResourcesGetter(model, options, params) { // WARNING: Choosing the first connection might generate issues if the model does not // belongs to this database. try { - const results = await Object.values(options.connections)[0] - .query(queryToFilterRecords, { - type: options.Sequelize.QueryTypes.SELECT, - }); + const connection = model.sequelize; + const results = await connection.query(queryToFilterRecords, { + type: options.Sequelize.QueryTypes.SELECT, + }); const recordIds = results.map((result) => result[primaryKey] || result.id); const condition = { [primaryKey]: {} }; diff --git a/src/services/search-builder.js b/src/services/search-builder.js index 194c8ae0..1187fae2 100644 --- a/src/services/search-builder.js +++ b/src/services/search-builder.js @@ -20,7 +20,7 @@ function SearchBuilder(model, opts, params, fieldNamesRequested) { function lowerIfNecessary(entry) { // NOTICE: MSSQL search is natively case insensitive, do not use the "lower" function for // performance optimization. - if (Database.isMSSQL(opts)) { return entry; } + if (Database.isMSSQL(model.sequelize)) { return entry; } return opts.Sequelize.fn('lower', entry); } diff --git a/src/utils/database.js b/src/utils/database.js index f6d34a13..4e1b2b79 100644 --- a/src/utils/database.js +++ b/src/utils/database.js @@ -1,10 +1,9 @@ -function getConnectionDialect(options) { - const connection = Object.values(options.connections)[0]; +function getConnectionDialect(connection) { return connection.options.dialect; } -exports.isMySQL = (options) => ['mysql', 'mariadb'].includes(getConnectionDialect(options)); +exports.isMySQL = (connection) => ['mysql', 'mariadb'].includes(getConnectionDialect(connection)); -exports.isMSSQL = (options) => getConnectionDialect(options) === 'mssql'; +exports.isMSSQL = (connection) => getConnectionDialect(connection) === 'mssql'; -exports.isSQLite = (options) => getConnectionDialect(options) === 'sqlite'; +exports.isSQLite = (connection) => getConnectionDialect(connection) === 'sqlite'; diff --git a/test/databases.js b/test/databases.js index 4668f378..12ee2af5 100644 --- a/test/databases.js +++ b/test/databases.js @@ -11,11 +11,11 @@ class ConnectionManager { } getDialect() { - return this.connection && this.connection.options && this.connection.options.dialect; + return /^(\w+):\/\//g.exec(this.connectionString)[1]; } getPort() { - return this.connection && this.connection.options && this.connection.options.port; + return /:(\d+)\//g.exec(this.connectionString)[1]; } createConnection() { diff --git a/test/index.test.js b/test/index.test.js index 93aec198..c3ee1d45 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -1767,7 +1767,7 @@ const HasManyDissociator = require('../src/services/has-many-dissociator'); fields: { user: 'id,firstName,lastName,username,password,createdAt,updatedAt,resetPasswordToken', }, - page: { number: '2', size: '50' }, + page: { number: '1', size: '50' }, sort: '-id', segmentQuery: 'select * from users\nwhere id in (100, 102);', timezone: 'Europe/Paris', @@ -1775,7 +1775,7 @@ const HasManyDissociator = require('../src/services/has-many-dissociator'); try { const result = await new ResourcesGetter(models.user, sequelizeOptions, params) .perform(); - expect(result).toHaveLength(2); + expect(result[0]).toHaveLength(2); } finally { connectionManager.closeConnection(); }