From 95dc87272dc4870218bc9e582510b5e2ef1391f2 Mon Sep 17 00:00:00 2001 From: mertmit Date: Wed, 30 Nov 2022 14:34:25 +0300 Subject: [PATCH 1/6] feat: sqlite alter table change column Signed-off-by: mertmit --- .../db/sql-client/lib/sqlite/SqliteClient.ts | 52 ++++++++++++++----- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts index 6fa8d075fe..01ce1982b3 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts @@ -1552,7 +1552,22 @@ class SqliteClient extends KnexClient { ); //downQuery += alterTablePK(args.originalColumns, args.columns, downQuery); - await this.sqlClient.raw(upQuery); + const trx = await this.sqlClient.transaction(); + + try { + const queries = upQuery.split(';'); + for (let i = 0; i < queries.length; i++) { + if (queries[i].trim() !== '') { + await trx.raw(queries[i]); + } + } + + await trx.commit(); + } catch (e) { + await trx.rollback(); + log.ppe(e, _func); + throw e; + } console.log(upQuery); @@ -1950,30 +1965,43 @@ class SqliteClient extends KnexClient { const defaultValue = getDefaultValue(n); let shouldSanitize = true; if (change === 2) { - query += this.genQuery( - `ALTER TABLE ?? RENAME COLUMN ?? TO ??`, - [t, o.cn, n.cn], + let dropFkRestrictionQuery = this.genQuery('PRAGMA foreign_keys = OFF;'); + + let backupOldColumnQuery = this.genQuery( + `ALTER TABLE ?? RENAME COLUMN ?? TO ??;`, + [t, o.cn, `${o.cno}_nc_backup`], shouldSanitize ); + + let addNewColumnQuery = '' + addNewColumnQuery += this.genQuery(` ADD ?? ${n.dt}`, [n.cn], shouldSanitize); + addNewColumnQuery += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : ''; + addNewColumnQuery += n.cdf ? ` DEFAULT ${n.cdf}` : !n.rqd ? ' ' : ` DEFAULT ''`; + addNewColumnQuery += n.rqd ? ` NOT NULL` : ' '; + addNewColumnQuery = this.genQuery(`ALTER TABLE ?? ${addNewColumnQuery};`, [t], shouldSanitize); + + let updateNewColumnQuery = this.genQuery(`UPDATE ?? SET ?? = ??;`, [t, n.cn, `${o.cno}_nc_backup`], shouldSanitize); + + let dropOldColumnQuery = this.genQuery(`ALTER TABLE ?? DROP COLUMN ??;`, [t, `${o.cno}_nc_backup`], shouldSanitize); + + let restoreFkRestrictionQuery = this.genQuery('PRAGMA foreign_keys = ON;'); + + query = `${dropFkRestrictionQuery}${backupOldColumnQuery}${addNewColumnQuery}${updateNewColumnQuery}${dropOldColumnQuery}${restoreFkRestrictionQuery}`; } else if (change === 0) { query = existingQuery ? ',' : ''; query += this.genQuery(`?? ${n.dt}`, [n.cn], shouldSanitize); query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : ''; query += n.cdf - ? n.cdf.includes(',') - ? ` DEFAULT ('${n.cdf}')` - : ` DEFAULT ${n.cdf}` - : ' '; + ? ` DEFAULT ${n.cdf}` + : !n.rqd ? ' ' : ` DEFAULT ''`; query += n.rqd ? ` NOT NULL` : ' '; } else if (change === 1) { shouldSanitize = true; query += this.genQuery(` ADD ?? ${n.dt}`, [n.cn], shouldSanitize); query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : ''; query += n.cdf - ? n.cdf.includes(',') - ? ` DEFAULT ('${n.cdf}')` - : ` DEFAULT ${n.cdf}` - : ' '; + ? ` DEFAULT ${n.cdf}` + : !n.rqd ? ' ' : ` DEFAULT ''`; query += n.rqd ? ` NOT NULL` : ' '; query = this.genQuery(`ALTER TABLE ?? ${query};`, [t], shouldSanitize); } else { From db70140ef15f1733a352c064adcb0bc0c34a8bce Mon Sep 17 00:00:00 2001 From: mertmit Date: Wed, 30 Nov 2022 16:19:13 +0300 Subject: [PATCH 2/6] fix: primary key operations for sqlite Signed-off-by: mertmit --- .../db/sql-client/lib/sqlite/SqliteClient.ts | 97 +++++++++++-------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts index 01ce1982b3..549486c767 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts @@ -1495,7 +1495,7 @@ class SqliteClient extends KnexClient { cn: args.columns[i].cno, }); - if (args.columns[i].altered & 4) { + if (!args.columns[i].pk && args.columns[i].altered & 4) { // col remove upQuery += this.alterTableRemoveColumn( args.table, @@ -1544,13 +1544,7 @@ class SqliteClient extends KnexClient { } } - upQuery += this.alterTablePK( - args.columns, - args.originalColumns, - upQuery, - this.sqlClient - ); - //downQuery += alterTablePK(args.originalColumns, args.columns, downQuery); + const pkQuery = this.alterTablePK(args.columns, args.originalColumns, upQuery); const trx = await this.sqlClient.transaction(); @@ -1562,6 +1556,22 @@ class SqliteClient extends KnexClient { } } + if (pkQuery) { + await trx.schema.alterTable(args.table, (table) => { + for (const pk of pkQuery.oldPks.filter((el) => !pkQuery.newPks.includes(el))) { + table.dropPrimary(pk); + } + + for (const pk of pkQuery.dropPks) { + table.dropColumn(pk); + } + + if (pkQuery.newPks.length) { + table.primary(pkQuery.newPks); + } + }); + } + await trx.commit(); } catch (e) { await trx.rollback(); @@ -1876,50 +1886,61 @@ class SqliteClient extends KnexClient { return result; } - alterTablePK(n, o, _existingQuery, createTable = false) { - const numOfPksInOriginal = []; - const numOfPksInNew = []; - let pksChanged = 0; + createTablePK(n, _existingQuery) { + const newPks = []; + + for (let i = 0; i < n.length; ++i) { + if (n[i].pk) { + if (n[i].altered !== 4) newPks.push(n[i].cn); + } + } + + let query = ''; + if (newPks.length) { + query += this.genQuery(`, PRIMARY KEY(??)`, [newPks]); + } + + return query; + } + + alterTablePK(n, o, _existingQuery) { + const newPks = []; + const oldPks = []; + const dropPks = []; + let pksChanged = false; for (let i = 0; i < n.length; ++i) { if (n[i].pk) { - if (n[i].altered !== 4) numOfPksInNew.push(n[i].cn); + if (n[i].altered !== 4) { + newPks.push(n[i].cn); + } else { + dropPks.push(n[i].cn); + } + pksChanged = true; } } for (let i = 0; i < o.length; ++i) { if (o[i].pk) { - numOfPksInOriginal.push(o[i].cn); + oldPks.push(o[i].cn); } } - if (numOfPksInNew.length === numOfPksInOriginal.length) { - for (let i = 0; i < numOfPksInNew.length; ++i) { - if (numOfPksInOriginal[i] !== numOfPksInNew[i]) { - pksChanged = 1; - break; - } + if (newPks.length === oldPks.length) { + if (newPks.every((pk) => oldPks.includes(pk)) && dropPks.length === 0) { + pksChanged = false; } - } else { - pksChanged = numOfPksInNew.length - numOfPksInOriginal.length; } - let query = ''; - if (!numOfPksInNew.length && !numOfPksInOriginal.length) { - // do nothing - } else if (pksChanged) { - query += numOfPksInOriginal.length ? ',DROP PRIMARY KEY' : ''; - - if (numOfPksInNew.length) { - if (createTable) { - query += this.genQuery(`, PRIMARY KEY(??)`, [numOfPksInNew]); - } else { - query += this.genQuery(`, ADD PRIMARY KEY(??)`, [numOfPksInNew]); - } + if (pksChanged) { + return { + newPks, + oldPks, + dropPks, } + } else { + return false; } - - return query; } alterTableRemoveColumn(t, n, _o, existingQuery) { @@ -1952,7 +1973,7 @@ class SqliteClient extends KnexClient { query += this.createTableColumn(table, args.columns[i], null, query); } - query += this.alterTablePK(args.columns, [], query, true); + query += this.createTablePK(args.columns, query); query = this.genQuery(`CREATE TABLE ?? (${query});`, [args.tn]); @@ -1993,7 +2014,7 @@ class SqliteClient extends KnexClient { query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : ''; query += n.cdf ? ` DEFAULT ${n.cdf}` - : !n.rqd ? ' ' : ` DEFAULT ''`; + : ' '; query += n.rqd ? ` NOT NULL` : ' '; } else if (change === 1) { shouldSanitize = true; From 9b3296343932ccafd26de241e4faeedb3e342091 Mon Sep 17 00:00:00 2001 From: mertmit Date: Thu, 1 Dec 2022 02:53:05 +0300 Subject: [PATCH 3/6] fix: handle foreign key and view restrictions Signed-off-by: mertmit --- .../db/sql-client/lib/sqlite/SqliteClient.ts | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts index 549486c767..098981a496 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts @@ -7,6 +7,9 @@ import Result from '../../../util/Result'; import queries from './sqlite.queries'; import lodash from 'lodash'; import _ from 'lodash'; +import { customAlphabet } from 'nanoid'; + +const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz_', 6); const log = new Debug('SqliteClient'); @@ -1546,6 +1549,9 @@ class SqliteClient extends KnexClient { const pkQuery = this.alterTablePK(args.columns, args.originalColumns, upQuery); + await this.sqlClient.raw('PRAGMA foreign_keys = OFF;'); + await this.sqlClient.raw('PRAGMA legacy_alter_table = ON;'); + const trx = await this.sqlClient.transaction(); try { @@ -1577,6 +1583,9 @@ class SqliteClient extends KnexClient { await trx.rollback(); log.ppe(e, _func); throw e; + } finally { + await this.sqlClient.raw('PRAGMA foreign_keys = ON;'); + await this.sqlClient.raw('PRAGMA legacy_alter_table = OFF;'); } console.log(upQuery); @@ -1986,11 +1995,11 @@ class SqliteClient extends KnexClient { const defaultValue = getDefaultValue(n); let shouldSanitize = true; if (change === 2) { - let dropFkRestrictionQuery = this.genQuery('PRAGMA foreign_keys = OFF;'); + const suffix = nanoid(); let backupOldColumnQuery = this.genQuery( `ALTER TABLE ?? RENAME COLUMN ?? TO ??;`, - [t, o.cn, `${o.cno}_nc_backup`], + [t, o.cn, `${o.cno}_nc_${suffix}`], shouldSanitize ); @@ -2001,13 +2010,11 @@ class SqliteClient extends KnexClient { addNewColumnQuery += n.rqd ? ` NOT NULL` : ' '; addNewColumnQuery = this.genQuery(`ALTER TABLE ?? ${addNewColumnQuery};`, [t], shouldSanitize); - let updateNewColumnQuery = this.genQuery(`UPDATE ?? SET ?? = ??;`, [t, n.cn, `${o.cno}_nc_backup`], shouldSanitize); - - let dropOldColumnQuery = this.genQuery(`ALTER TABLE ?? DROP COLUMN ??;`, [t, `${o.cno}_nc_backup`], shouldSanitize); + let updateNewColumnQuery = this.genQuery(`UPDATE ?? SET ?? = ??;`, [t, n.cn, `${o.cno}_nc_${suffix}`], shouldSanitize); - let restoreFkRestrictionQuery = this.genQuery('PRAGMA foreign_keys = ON;'); + let dropOldColumnQuery = this.genQuery(`ALTER TABLE ?? DROP COLUMN ??;`, [t, `${o.cno}_nc_${suffix}`], shouldSanitize); - query = `${dropFkRestrictionQuery}${backupOldColumnQuery}${addNewColumnQuery}${updateNewColumnQuery}${dropOldColumnQuery}${restoreFkRestrictionQuery}`; + query = `${backupOldColumnQuery}${addNewColumnQuery}${updateNewColumnQuery}${dropOldColumnQuery}`; } else if (change === 0) { query = existingQuery ? ',' : ''; query += this.genQuery(`?? ${n.dt}`, [n.cn], shouldSanitize); From b3cd12482eda01324871b1137833e5c115266f63 Mon Sep 17 00:00:00 2001 From: mertmit Date: Thu, 1 Dec 2022 02:58:11 +0300 Subject: [PATCH 4/6] fix(test): drop view restricting column edit for sqlite Signed-off-by: mertmit --- tests/playwright/tests/viewKanban.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/playwright/tests/viewKanban.spec.ts b/tests/playwright/tests/viewKanban.spec.ts index b220e1e2d9..1bbb31e7e8 100644 --- a/tests/playwright/tests/viewKanban.spec.ts +++ b/tests/playwright/tests/viewKanban.spec.ts @@ -19,6 +19,10 @@ test.describe('View', () => { // close 'Team & Auth' tab await dashboard.closeTab({ title: 'Team & Auth' }); await dashboard.treeView.openTable({ title: 'Film' }); + + if (isSqlite(context)) { + await dashboard.treeView.deleteTable({ title: 'FilmList' }); + } if (isPg(context)) { // Since these view depend on the Ratings column of the Film table From 24a8f25d5dade975ea2104b9d37784aab363e5d4 Mon Sep 17 00:00:00 2001 From: mertmit Date: Thu, 1 Dec 2022 08:12:57 +0300 Subject: [PATCH 5/6] feat: tree-shaking lodash in sqlClients Signed-off-by: mertmit --- .../src/lib/db/sql-client/lib/KnexClient.ts | 25 ++++++------ .../db/sql-client/lib/mssql/MssqlClient.ts | 4 +- .../db/sql-client/lib/mysql/MysqlClient.ts | 32 ++++++++-------- .../db/sql-client/lib/oracle/OracleClient.ts | 38 +++++++++---------- .../src/lib/db/sql-client/lib/pg/PgClient.ts | 11 +++--- .../db/sql-client/lib/sqlite/SqliteClient.ts | 17 +++++---- 6 files changed, 66 insertions(+), 61 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts index 78270235c7..2d17336b59 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts @@ -5,7 +5,8 @@ import Debug from '../../util/Debug'; import Emit from '../../util/emit'; import Result from '../../util/Result'; -import lodash from 'lodash'; +import findIndex from 'lodash/findIndex'; +import find from 'lodash/find'; import fs from 'fs'; import { promisify } from 'util'; import jsonfile from 'jsonfile'; @@ -685,7 +686,7 @@ class KnexClient extends SqlClient { } _isColumnForeignKey(tableObj, cn) { - if (lodash.findIndex(tableObj.foreignKeys, { cn: cn }) === -1) { + if (findIndex(tableObj.foreignKeys, { cn: cn }) === -1) { return false; } return true; @@ -699,7 +700,7 @@ class KnexClient extends SqlClient { ) { if (tableObj.primaryKeys.length > 1) { if ( - lodash.findIndex(tableObj.primaryKeys, { + findIndex(tableObj.primaryKeys, { cn: columnObj.cn, }) > 0 ) { @@ -763,7 +764,7 @@ class KnexClient extends SqlClient { if (tableObj.primaryKeys.length) { const dt = this.getKnexDataTypeMock(pk.ct); - const col = lodash.find(tableObj.columns, { + const col = find(tableObj.columns, { cn: pk.cn, }); @@ -778,7 +779,7 @@ class KnexClient extends SqlClient { let max1 = 10000; let searchFrom = 0; - let foundIndex = lodash.findIndex( + let foundIndex = findIndex( tableObj.columns, { ck: 'UNI' }, searchFrom @@ -798,7 +799,7 @@ class KnexClient extends SqlClient { } searchFrom = foundIndex; - foundIndex = lodash.findIndex( + foundIndex = findIndex( tableObj.columns, { ck: 'UNI' }, searchFrom + 1 @@ -807,7 +808,7 @@ class KnexClient extends SqlClient { let max2 = 10000; searchFrom = 0; - foundIndex = lodash.findIndex(tableObj.columns, { ck: 'MUL' }, searchFrom); + foundIndex = findIndex(tableObj.columns, { ck: 'MUL' }, searchFrom); while (foundIndex !== -1) { const col = tableObj.columns[foundIndex]; @@ -823,7 +824,7 @@ class KnexClient extends SqlClient { } searchFrom = foundIndex; - foundIndex = lodash.findIndex( + foundIndex = findIndex( tableObj.columns, { ck: 'MUL' }, searchFrom + 1 @@ -1895,7 +1896,7 @@ class KnexClient extends SqlClient { // let downQuery = ""; // // for (let i = 0; i < args.columns.length; ++i) { - // const oldColumn = lodash.find(originalColumns, { + // const oldColumn = find(originalColumns, { // cn: args.columns[i].cno // }); // @@ -2046,7 +2047,7 @@ class KnexClient extends SqlClient { pkUpdate(table, args.columns, args.originalColumns); } else { for (let i = 0; i < args.columns.length; ++i) { - const column = lodash.find(originalColumns, { + const column = find(originalColumns, { cn: args.columns[i].cno, }); @@ -2090,7 +2091,7 @@ class KnexClient extends SqlClient { pkUpdate(table, args.columns, args.originalColumns); } else { for (let i = 0; i < args.columns.length; ++i) { - const column = lodash.find(originalColumns, { + const column = find(originalColumns, { cn: args.columns[i].cno, }); if (args.columns[i].altered & 8) { @@ -2124,7 +2125,7 @@ class KnexClient extends SqlClient { pkUpdate(table, args.columns, args.originalColumns); } else { for (let i = 0; i < args.columns.length; ++i) { - const column = lodash.find(originalColumns, { + const column = find(originalColumns, { cn: args.columns[i].cno, }); if (args.columns[i].altered & 8) { diff --git a/packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts index 14c3af08be..27feafb56b 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts @@ -4,7 +4,7 @@ import knex from 'knex'; import KnexClient from '../KnexClient'; import Debug from '../../../util/Debug'; import Result from '../../../util/Result'; -import lodash from 'lodash'; +import find from 'lodash/find'; const log = new Debug('MssqlClient'); @@ -1964,7 +1964,7 @@ class MssqlClient extends KnexClient { let downQuery = ''; for (let i = 0; i < args.columns.length; ++i) { - const oldColumn = lodash.find(originalColumns, { + const oldColumn = find(originalColumns, { cn: args.columns[i].cno, }); diff --git a/packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts index 06fa275e63..bb5c56e338 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts @@ -1,6 +1,8 @@ import knex from 'knex'; -import lodash from 'lodash'; +import isEmpty from 'lodash/isEmpty'; +import mapKeys from 'lodash/mapKeys'; +import find from 'lodash/find'; import Debug from '../../../util/Debug'; import Emit from '../../../util/emit'; import Result from '../../../util/Result'; @@ -551,7 +553,7 @@ class MysqlClient extends KnexClient { ); if (response.length === 2) { result.data.list = response[0].map((v) => - lodash.mapKeys(v, (_, k) => k.toLowerCase()) + mapKeys(v, (_, k) => k.toLowerCase()) ); } else { log.debug('Unknown response for schemaList:', result.data.list.length); @@ -620,7 +622,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { const column: any = {}; - response[0][i] = lodash.mapKeys(response[0][i], (_v, k) => + response[0][i] = mapKeys(response[0][i], (_v, k) => k.toLowerCase() ); @@ -753,7 +755,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let index = response[0][i]; - index = lodash.mapKeys(index, function (_v, k) { + index = mapKeys(index, function (_v, k) { return k.toLowerCase(); }); index.cn = index.column_name; @@ -810,7 +812,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let index = response[0][i]; - index = lodash.mapKeys(index, function (_v, k) { + index = mapKeys(index, function (_v, k) { return k.toLowerCase(); }); indexes.push(index); @@ -868,7 +870,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let relation = response[0][i]; - relation = lodash.mapKeys(relation, function (_v, k) { + relation = mapKeys(relation, function (_v, k) { return k.toLowerCase(); }); relations.push(relation); @@ -923,7 +925,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let relation = response[0][i]; - relation = lodash.mapKeys(relation, function (_v, k) { + relation = mapKeys(relation, function (_v, k) { return k.toLowerCase(); }); relations.push(relation); @@ -985,7 +987,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let trigger = response[0][i]; - trigger = lodash.mapKeys(trigger, function (_v, k) { + trigger = mapKeys(trigger, function (_v, k) { return k.toLowerCase(); }); trigger.trigger_name = trigger.trigger; @@ -1040,7 +1042,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let fn = response[0][i]; - fn = lodash.mapKeys(fn, function (_v, k) { + fn = mapKeys(fn, function (_v, k) { return k.toLowerCase(); }); fn.function_name = fn.name; @@ -1099,7 +1101,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let procedure = response[0][i]; - procedure = lodash.mapKeys(procedure, function (_v, k) { + procedure = mapKeys(procedure, function (_v, k) { return k.toLowerCase(); }); procedure.procedure_name = procedure.name; @@ -1205,7 +1207,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let _function = response[0][i]; - _function = lodash.mapKeys(_function, function (_v, k) { + _function = mapKeys(_function, function (_v, k) { return k.toLowerCase(); }); @@ -1259,7 +1261,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let procedure = response[0][i]; - procedure = lodash.mapKeys(procedure, function (_v, k) { + procedure = mapKeys(procedure, function (_v, k) { return k.toLowerCase(); }); @@ -1311,7 +1313,7 @@ class MysqlClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let view = response[0][i]; - view = lodash.mapKeys(view, function (_v, k) { + view = mapKeys(view, function (_v, k) { return k.toLowerCase(); }); @@ -1847,7 +1849,7 @@ class MysqlClient extends KnexClient { */ async _getQuery(args) { try { - if (lodash.isEmpty(this._version)) { + if (isEmpty(this._version)) { const result = await this.version(); this._version = result.data.object; log.debug( @@ -2085,7 +2087,7 @@ class MysqlClient extends KnexClient { let downQuery = ''; for (let i = 0; i < args.columns.length; ++i) { - const oldColumn = lodash.find(originalColumns, { + const oldColumn = find(originalColumns, { cn: args.columns[i].cno, }); diff --git a/packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts index 990ecf94e7..34779ebbe8 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts @@ -1,9 +1,9 @@ import knex from 'knex'; -import _ from 'lodash'; import KnexClient from '../KnexClient'; import Debug from '../../../util/Debug'; import Result from '../../../util/Result'; -import lodash from 'lodash'; +import mapKeys from 'lodash/mapKeys'; +import find from 'lodash/find'; const log = new Debug('OracleClient'); @@ -127,7 +127,7 @@ class OracleClient extends KnexClient { result.data.object = {}; let versionDetails = rows[0]; - versionDetails = _.mapKeys(versionDetails, (_v, k) => k.toLowerCase()); + versionDetails = mapKeys(versionDetails, (_v, k) => k.toLowerCase()); const version = versionDetails.version.split('.'); result.data.object.version = versionDetails.version; result.data.object.primary = version[0]; @@ -399,7 +399,7 @@ class OracleClient extends KnexClient { ); for (let i = 0; i < rows.length; i++) { let el = rows[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); rows[i] = el; } @@ -431,7 +431,7 @@ class OracleClient extends KnexClient { ); for (let i = 0; i < rows.length; i++) { let el = rows[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); rows[i] = el; } @@ -567,7 +567,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.np = el.data_precision; el.pk = el.ck === 'P'; el.nrqd = el.nrqd === 'Y'; @@ -639,7 +639,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.table = el.tn; el.non_unique = el.uniqueness === 'NONUNIQUE' ? 1 : 0; el.non_unique_original = el.uniqueness === 'NONUNIQUE' ? 1 : 0; @@ -686,7 +686,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.table = el.tn; if (el.cst === 'P') el.cst = 'Primary Key'; if (el.cst === 'U') el.cst = 'Unique'; @@ -758,7 +758,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.rtn = el.r_table_name; el.rcn = el.r_column_name; el.non_unique = el.uniqueness === 'NONUNIQUE'; @@ -811,7 +811,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.rtn = el.r_table_name; el.rcn = el.r_column_name; el.non_unique = el.uniqueness === 'NONUNIQUE'; @@ -862,7 +862,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.trigger = el.trigger_name; el.table = el.object_name; el.event = el.triggering_event; @@ -910,7 +910,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.function_name = el.object_name; el.type = el.object_type; response[i] = el; @@ -956,7 +956,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.procedure_name = el.object_name; el.type = el.object_type; response[i] = el; @@ -996,7 +996,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.view_name = el.object_name; response[i] = el; } @@ -1038,7 +1038,7 @@ class OracleClient extends KnexClient { let script = ''; for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.function_name = el.name; response[i] = el; script += el.text; @@ -1084,7 +1084,7 @@ class OracleClient extends KnexClient { let script = ''; for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.procedure_name = el.name; response[i] = el; script += el.text; @@ -1124,7 +1124,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.view_name = el.object_name; el.view_definition = el.text; response[i] = el; @@ -1157,7 +1157,7 @@ class OracleClient extends KnexClient { for (let i = 0; i < response.length; i++) { let el = response[i]; - el = _.mapKeys(el, (_v, k) => k.toLowerCase()); + el = mapKeys(el, (_v, k) => k.toLowerCase()); el.trigger = el.trigger_name; el.table = el.object_name; el.event = el.triggering_event; @@ -1622,7 +1622,7 @@ class OracleClient extends KnexClient { let downQuery = ''; for (let i = 0; i < args.columns.length; ++i) { - const oldColumn = lodash.find(originalColumns, { + const oldColumn = find(originalColumns, { cn: args.columns[i].cno, }); diff --git a/packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts index 29e1d422a3..90e0ec9b1d 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts @@ -1,12 +1,13 @@ import { nanoid } from 'nanoid'; import knex from 'knex'; -import _ from 'lodash'; import KnexClient from '../KnexClient'; import Debug from '../../../util/Debug'; import Result from '../../../util/Result'; import queries from './pg.queries'; -import lodash from 'lodash'; +import isEmpty from 'lodash/isEmpty'; +import mapKeys from 'lodash/mapKeys'; +import find from 'lodash/find'; const log = new Debug('PGClient'); class PGClient extends KnexClient { @@ -1429,7 +1430,7 @@ class PGClient extends KnexClient { if (response.length === 2) { for (let i = 0; i < response[0].length; ++i) { let procedure = response[0][i]; - procedure = _.mapKeys(procedure, (_v, k) => k.toLowerCase()); + procedure = mapKeys(procedure, (_v, k) => k.toLowerCase()); procedure.create_procedure = procedure['create procedure']; rows.push(procedure); } @@ -1642,7 +1643,7 @@ class PGClient extends KnexClient { */ async _getQuery(args) { try { - if (_.isEmpty(this._version)) { + if (isEmpty(this._version)) { const result = await this.version(); this._version = result.data.object; log.debug( @@ -2204,7 +2205,7 @@ class PGClient extends KnexClient { let downQuery = ''; for (let i = 0; i < args.columns.length; ++i) { - const oldColumn = lodash.find(originalColumns, { + const oldColumn = find(originalColumns, { cn: args.columns[i].cno, }); diff --git a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts index 098981a496..2e77a44df0 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts @@ -5,8 +5,9 @@ import KnexClient from '../KnexClient'; import Debug from '../../../util/Debug'; import Result from '../../../util/Result'; import queries from './sqlite.queries'; -import lodash from 'lodash'; -import _ from 'lodash'; +import isEmpty from 'lodash/isEmpty'; +import mapKeys from 'lodash/mapKeys'; +import find from 'lodash/find'; import { customAlphabet } from 'nanoid'; const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz_', 6); @@ -681,7 +682,7 @@ class SqliteClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let fn = response[0][i]; - fn = _.mapKeys(fn, function (_v, k) { + fn = mapKeys(fn, function (_v, k) { return k.toLowerCase(); }); fn.function_name = fn.name; @@ -735,7 +736,7 @@ class SqliteClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let procedure = response[0][i]; - procedure = _.mapKeys(procedure, function (_v, k) { + procedure = mapKeys(procedure, function (_v, k) { return k.toLowerCase(); }); procedure.procedure_name = procedure.name; @@ -819,7 +820,7 @@ class SqliteClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let _function = response[0][i]; - _function = _.mapKeys(_function, function (_v, k) { + _function = mapKeys(_function, function (_v, k) { return k.toLowerCase(); }); @@ -871,7 +872,7 @@ class SqliteClient extends KnexClient { for (let i = 0; i < response[0].length; ++i) { let procedure = response[0][i]; - procedure = _.mapKeys(procedure, function (_v, k) { + procedure = mapKeys(procedure, function (_v, k) { return k.toLowerCase(); }); @@ -1034,7 +1035,7 @@ class SqliteClient extends KnexClient { */ async _getQuery(args) { try { - if (_.isEmpty(this._version)) { + if (isEmpty(this._version)) { const result = await this.version(); this._version = result.data.object; log.debug( @@ -1494,7 +1495,7 @@ class SqliteClient extends KnexClient { let downQuery = ''; for (let i = 0; i < args.columns.length; ++i) { - const oldColumn = lodash.find(originalColumns, { + const oldColumn = find(originalColumns, { cn: args.columns[i].cno, }); From 25d399bdcbd70fc4aa2be7bda7ebe946c97e9eb7 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Thu, 1 Dec 2022 10:59:58 +0530 Subject: [PATCH 6/6] feat(playwright): Fixed issue with stress test --- tests/playwright/scripts/stressTestNewlyAddedTest.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/playwright/scripts/stressTestNewlyAddedTest.js b/tests/playwright/scripts/stressTestNewlyAddedTest.js index 5af08d6cb8..4850b006fc 100644 --- a/tests/playwright/scripts/stressTestNewlyAddedTest.js +++ b/tests/playwright/scripts/stressTestNewlyAddedTest.js @@ -7,7 +7,10 @@ const exec = util.promisify(require('child_process').exec); void (async () => { const { stdout: allFileNames } = await exec('git diff --name-only origin/develop'); // return if no changed file ends with .js - const testFilesInChangedFiles = allFileNames.split('\n').filter(fileName => fileName.endsWith('.spec.ts')); + const testFilesInChangedFiles = allFileNames + .split('\n') + .filter(fileName => fileName.endsWith('.spec.ts')) + .filter(fileName => fileName.startsWith('+')); // Only get newly added files if (testFilesInChangedFiles.length === 0) { console.log('No test file changed, skipping stress test'); return;