From 57e677242f843895fc75104ee7f068353024bb2d Mon Sep 17 00:00:00 2001 From: Pranav C Date: Mon, 10 Jul 2023 17:18:41 +0530 Subject: [PATCH 1/4] feat: identify removed/added pk columns Signed-off-by: Pranav C --- .../nocodb/src/services/meta-diffs.service.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/nocodb/src/services/meta-diffs.service.ts b/packages/nocodb/src/services/meta-diffs.service.ts index 75f21a2229..da7fdf669e 100644 --- a/packages/nocodb/src/services/meta-diffs.service.ts +++ b/packages/nocodb/src/services/meta-diffs.service.ts @@ -17,6 +17,7 @@ export enum MetaDiffType { TABLE_REMOVE = 'TABLE_REMOVE', TABLE_COLUMN_ADD = 'TABLE_COLUMN_ADD', TABLE_COLUMN_TYPE_CHANGE = 'TABLE_COLUMN_TYPE_CHANGE', + TABLE_COLUMN_PK_CHANGED = 'TABLE_COLUMN_PK_CHANGED', TABLE_COLUMN_REMOVE = 'TABLE_COLUMN_REMOVE', VIEW_NEW = 'VIEW_NEW', VIEW_REMOVE = 'VIEW_REMOVE', @@ -103,6 +104,16 @@ type MetaDiffChange = { relationType: RelationTypes; cstn?: string; } + | { + type: MetaDiffType.TABLE_COLUMN_PK_CHANGED; + tn?: string; + model?: Model; + id?: string; + cn: string; + column: Column; + colId?: string; + status: 'removed' | 'added'; + } ); @Injectable() @@ -217,6 +228,18 @@ export class MetaDiffsService { column: oldCol, }); } + if (!!oldCol.pk !== !!column.pk) { + tableProp.detectedChanges.push({ + type: MetaDiffType.TABLE_COLUMN_PK_CHANGED, + msg: column.pk + ? `Column ${column.cn} is new primary key` + : `Column ${column.cn} is no longer primary key`, + cn: oldCol.column_name, + id: oldMeta.id, + column: oldCol, + status: column.pk ? 'added' : 'removed', + }); + } } for (const column of oldMeta.columns) { if ( @@ -688,6 +711,13 @@ export class MetaDiffsService { await Column.update(change.column.id, column); } break; + case MetaDiffType.TABLE_COLUMN_PK_CHANGED: + { + const column = change.column; + column.pk = change.status === 'added'; + await Column.update(change.column.id, column); + } + break; case MetaDiffType.TABLE_COLUMN_REMOVE: case MetaDiffType.VIEW_COLUMN_REMOVE: await change.column.delete(); From 8e3f6cb6edbf36c56cc6c4ffe5744ad77aef9a92 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Mon, 10 Jul 2023 18:00:23 +0530 Subject: [PATCH 2/4] feat: compare all boolean props Signed-off-by: Pranav C --- .../nocodb/src/services/meta-diffs.service.ts | 52 ++++++++++++++----- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/packages/nocodb/src/services/meta-diffs.service.ts b/packages/nocodb/src/services/meta-diffs.service.ts index da7fdf669e..9d1818b7b9 100644 --- a/packages/nocodb/src/services/meta-diffs.service.ts +++ b/packages/nocodb/src/services/meta-diffs.service.ts @@ -17,7 +17,7 @@ export enum MetaDiffType { TABLE_REMOVE = 'TABLE_REMOVE', TABLE_COLUMN_ADD = 'TABLE_COLUMN_ADD', TABLE_COLUMN_TYPE_CHANGE = 'TABLE_COLUMN_TYPE_CHANGE', - TABLE_COLUMN_PK_CHANGED = 'TABLE_COLUMN_PK_CHANGED', + TABLE_COLUMN_PROPS_CHANGED = 'TABLE_COLUMN_PROPS_CHANGED', TABLE_COLUMN_REMOVE = 'TABLE_COLUMN_REMOVE', VIEW_NEW = 'VIEW_NEW', VIEW_REMOVE = 'VIEW_REMOVE', @@ -105,14 +105,13 @@ type MetaDiffChange = { cstn?: string; } | { - type: MetaDiffType.TABLE_COLUMN_PK_CHANGED; + type: MetaDiffType.TABLE_COLUMN_PROPS_CHANGED; tn?: string; model?: Model; id?: string; cn: string; column: Column; colId?: string; - status: 'removed' | 'added'; } ); @@ -228,16 +227,18 @@ export class MetaDiffsService { column: oldCol, }); } - if (!!oldCol.pk !== !!column.pk) { + if ( + !!oldCol.pk !== !!column.pk || + !!oldCol.rqd !== !!column.rqd || + !!oldCol.un !== !!column.un || + !!oldCol.ai !== !!column.ai + ) { tableProp.detectedChanges.push({ - type: MetaDiffType.TABLE_COLUMN_PK_CHANGED, - msg: column.pk - ? `Column ${column.cn} is new primary key` - : `Column ${column.cn} is no longer primary key`, + type: MetaDiffType.TABLE_COLUMN_PROPS_CHANGED, + msg: `Column properties changed (${column.cn})`, cn: oldCol.column_name, id: oldMeta.id, column: oldCol, - status: column.pk ? 'added' : 'removed', }); } } @@ -711,11 +712,20 @@ export class MetaDiffsService { await Column.update(change.column.id, column); } break; - case MetaDiffType.TABLE_COLUMN_PK_CHANGED: + case MetaDiffType.TABLE_COLUMN_PROPS_CHANGED: { - const column = change.column; - column.pk = change.status === 'added'; - await Column.update(change.column.id, column); + const columns = ( + await sqlClient.columnList({ tn: table_name }) + )?.data?.list?.map((c) => ({ ...c, column_name: c.cn })); + const colMeta = columns.find((c) => c.cn === change.cn); + if (!colMeta) break; + const { pk, ai, rqd, un } = colMeta; + await Column.update(change.column.id, { + pk, + ai, + rqd, + un, + }); } break; case MetaDiffType.TABLE_COLUMN_REMOVE: @@ -914,6 +924,22 @@ export class MetaDiffsService { await Column.update(change.column.id, column); } break; + case MetaDiffType.TABLE_COLUMN_PROPS_CHANGED: + { + const columns = ( + await sqlClient.columnList({ tn: table_name }) + )?.data?.list?.map((c) => ({ ...c, column_name: c.cn })); + const colMeta = columns.find((c) => c.cn === change.cn); + if (!colMeta) break; + const { pk, ai, rqd, un } = colMeta; + await Column.update(change.column.id, { + pk, + ai, + rqd, + un, + }); + } + break; case MetaDiffType.TABLE_COLUMN_REMOVE: case MetaDiffType.VIEW_COLUMN_REMOVE: await change.column.delete(); From f4e6874ac6f621c34f326964e60a5af4adedce47 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Mon, 10 Jul 2023 18:21:20 +0530 Subject: [PATCH 3/4] fix: reset column list cache after column update Signed-off-by: Pranav C --- packages/nocodb/src/models/Column.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/nocodb/src/models/Column.ts b/packages/nocodb/src/models/Column.ts index 1695d1b4db..bbaebabe2c 100644 --- a/packages/nocodb/src/models/Column.ts +++ b/packages/nocodb/src/models/Column.ts @@ -1075,6 +1075,30 @@ export default class Column implements ColumnType { // set cache await NocoCache.set(key, o); } + + // get model column list from cache + const columnListFromCache = await NocoCache.getList(CacheScope.COLUMN, [ + oldCol.fk_model_id, + ]); + + // update column list in cache if cache exists + if (!columnListFromCache.list?.length) { + const updatedColumnList = columnListFromCache.list.map((column: any) => { + if (column.id === colId) { + return { + ...column, + ...updateObj, + }; + } + return column; + }); + await NocoCache.setList( + CacheScope.COLUMN, + [oldCol.fk_model_id], + updatedColumnList, + ); + } + // set meta await ncMeta.metaUpdate( null, From 233debeb8d8b7b9c3b8d8edd90f1b4fa477a7d65 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Tue, 11 Jul 2023 11:13:19 +0530 Subject: [PATCH 4/4] refactor: include unique prop Signed-off-by: Pranav C --- packages/nocodb/src/services/meta-diffs.service.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/nocodb/src/services/meta-diffs.service.ts b/packages/nocodb/src/services/meta-diffs.service.ts index 9d1818b7b9..6f7991a7b8 100644 --- a/packages/nocodb/src/services/meta-diffs.service.ts +++ b/packages/nocodb/src/services/meta-diffs.service.ts @@ -231,7 +231,8 @@ export class MetaDiffsService { !!oldCol.pk !== !!column.pk || !!oldCol.rqd !== !!column.rqd || !!oldCol.un !== !!column.un || - !!oldCol.ai !== !!column.ai + !!oldCol.ai !== !!column.ai || + !!oldCol.unique !== !!column.unique ) { tableProp.detectedChanges.push({ type: MetaDiffType.TABLE_COLUMN_PROPS_CHANGED, @@ -719,12 +720,13 @@ export class MetaDiffsService { )?.data?.list?.map((c) => ({ ...c, column_name: c.cn })); const colMeta = columns.find((c) => c.cn === change.cn); if (!colMeta) break; - const { pk, ai, rqd, un } = colMeta; + const { pk, ai, rqd, un, unique } = colMeta; await Column.update(change.column.id, { pk, ai, rqd, un, + unique, }); } break; @@ -931,12 +933,13 @@ export class MetaDiffsService { )?.data?.list?.map((c) => ({ ...c, column_name: c.cn })); const colMeta = columns.find((c) => c.cn === change.cn); if (!colMeta) break; - const { pk, ai, rqd, un } = colMeta; + const { pk, ai, rqd, un, unique } = colMeta; await Column.update(change.column.id, { pk, ai, rqd, un, + unique, }); } break;