Browse Source

Merge pull request #2515 from nocodb/fix/missing-LTAR-values

fix: missing LTAR values in MM cells
pull/2525/head
Pranav C 2 years ago committed by GitHub
parent
commit
4a0d026397
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 344
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts

344
packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts

@ -24,7 +24,7 @@ import {
RelationTypes,
SortType,
UITypes,
ViewTypes
ViewTypes,
} from 'nocodb-sdk';
import formSubmissionEmailTemplate from '../../../../utils/common/formSubmissionEmailTemplate';
import ejs from 'ejs';
@ -34,7 +34,7 @@ import Hook from '../../../../models/Hook';
import NcPluginMgrv2 from '../../../../meta/helpers/NcPluginMgrv2';
import {
_transformSubmittedFormDataForEmail,
invokeWebhook
invokeWebhook,
} from '../../../../meta/helpers/webhookHelpers';
import Validator from 'validator';
import { customValidators } from './customValidators';
@ -73,13 +73,13 @@ class BaseModelSqlv2 {
private config: any = {
limitDefault: Math.max(+process.env.DB_QUERY_LIMIT_DEFAULT || 25, 1),
limitMin: Math.max(+process.env.DB_QUERY_LIMIT_MIN || 1, 1),
limitMax: Math.max(+process.env.DB_QUERY_LIMIT_MAX || 1000, 1)
limitMax: Math.max(+process.env.DB_QUERY_LIMIT_MAX || 1000, 1),
};
constructor({
dbDriver,
model,
viewId
viewId,
}: {
[key: string]: any;
model: Model;
@ -135,14 +135,14 @@ class BaseModelSqlv2 {
new Filter({
children: args.filterArr || [],
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
new Filter({
children: filterObj,
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
...(args.filterArr || [])
...(args.filterArr || []),
],
qb,
this.dbDriver
@ -189,19 +189,19 @@ class BaseModelSqlv2 {
new Filter({
children:
(await Filter.rootFilterList({ viewId: this.viewId })) || [],
is_group: true
is_group: true,
}),
new Filter({
children: args.filterArr || [],
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
new Filter({
children: filterObj,
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
...(args.filterArr || [])
...(args.filterArr || []),
],
qb,
this.dbDriver
@ -219,14 +219,14 @@ class BaseModelSqlv2 {
new Filter({
children: args.filterArr || [],
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
new Filter({
children: filterObj,
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
...(args.filterArr || [])
...(args.filterArr || []),
],
qb,
this.dbDriver
@ -241,7 +241,7 @@ class BaseModelSqlv2 {
// if autogenerated string sort by created_at column if present
if (this.model.primaryKey && this.model.primaryKey.ai) {
qb.orderBy(this.model.primaryKey.column_name);
} else if (this.model.columns.find(c => c.column_name === 'created_at')) {
} else if (this.model.columns.find((c) => c.column_name === 'created_at')) {
qb.orderBy('created_at');
}
@ -249,7 +249,7 @@ class BaseModelSqlv2 {
const proto = await this.getProto();
const data = await this.extractRawQueryAndExec(qb);
return data?.map(d => {
return data?.map((d) => {
d.__proto__ = proto;
return d;
});
@ -274,19 +274,19 @@ class BaseModelSqlv2 {
new Filter({
children:
(await Filter.rootFilterList({ viewId: this.viewId })) || [],
is_group: true
is_group: true,
}),
new Filter({
children: args.filterArr || [],
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
new Filter({
children: filterObj,
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
...(args.filterArr || [])
...(args.filterArr || []),
],
qb,
this.dbDriver
@ -297,14 +297,14 @@ class BaseModelSqlv2 {
new Filter({
children: args.filterArr || [],
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
new Filter({
children: filterObj,
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
...(args.filterArr || [])
...(args.filterArr || []),
],
qb,
this.dbDriver
@ -312,7 +312,7 @@ class BaseModelSqlv2 {
}
qb.count(sanitize(this.model.primaryKey?.column_name) || '*', {
as: 'count'
as: 'count',
}).first();
const res = (await this.dbDriver.raw(unsanitize(qb.toQuery()))) as any;
return (this.isPg ? res.rows[0] : res[0][0] ?? res[0]).count;
@ -326,7 +326,7 @@ class BaseModelSqlv2 {
offset?;
sort?: string | string[];
} = {
column_name: ''
column_name: '',
}
) {
const { where, ...rest } = this._getListArgs(args as any);
@ -345,8 +345,8 @@ class BaseModelSqlv2 {
new Filter({
children: filterObj,
is_group: true,
logical_op: 'and'
})
logical_op: 'and',
}),
],
qb,
this.dbDriver
@ -364,16 +364,20 @@ class BaseModelSqlv2 {
// const { cn } = this.hasManyRelations.find(({ tn }) => tn === child) || {};
const relColumn = (await this.model.getColumns()).find(
c => c.id === colId
(c) => c.id === colId
);
const chilCol = await ((await relColumn.getColOptions()) as LinkToAnotherRecordColumn).getChildColumn();
const chilCol = await (
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn
).getChildColumn();
const childTable = await chilCol.getModel();
const parentCol = await ((await relColumn.getColOptions()) as LinkToAnotherRecordColumn).getParentColumn();
const parentCol = await (
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn
).getParentColumn();
const parentTable = await parentCol.getModel();
const childModel = await Model.getBaseModelSQL({
model: childTable,
dbDriver: this.dbDriver
dbDriver: this.dbDriver,
});
await parentTable.getColumns();
@ -383,7 +387,7 @@ class BaseModelSqlv2 {
const childQb = this.dbDriver.queryBuilder().from(
this.dbDriver
.unionAll(
ids.map(p => {
ids.map((p) => {
const query = qb
.clone()
.select(this.dbDriver.raw('? as ??', [p, GROUP_COL]))
@ -409,12 +413,12 @@ class BaseModelSqlv2 {
const proto = await (
await Model.getBaseModelSQL({
id: childTable.id,
dbDriver: this.dbDriver
dbDriver: this.dbDriver,
})
).getProto();
return _.groupBy(
children.map(c => {
children.map((c) => {
c.__proto__ = proto;
return c;
}),
@ -430,16 +434,20 @@ class BaseModelSqlv2 {
try {
// const { cn } = this.hasManyRelations.find(({ tn }) => tn === child) || {};
const relColumn = (await this.model.getColumns()).find(
c => c.id === colId
(c) => c.id === colId
);
const chilCol = await ((await relColumn.getColOptions()) as LinkToAnotherRecordColumn).getChildColumn();
const chilCol = await (
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn
).getChildColumn();
const childTable = await chilCol.getModel();
const parentCol = await ((await relColumn.getColOptions()) as LinkToAnotherRecordColumn).getParentColumn();
const parentCol = await (
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn
).getParentColumn();
const parentTable = await parentCol.getModel();
await parentTable.getColumns();
const children = await this.dbDriver.unionAll(
ids.map(p => {
ids.map((p) => {
const query = this.dbDriver(childTable.table_name)
.count(`${chilCol?.column_name} as count`)
.whereIn(
@ -468,16 +476,20 @@ class BaseModelSqlv2 {
// todo: get only required fields
const relColumn = (await this.model.getColumns()).find(
c => c.id === colId
(c) => c.id === colId
);
const chilCol = await ((await relColumn.getColOptions()) as LinkToAnotherRecordColumn).getChildColumn();
const chilCol = await (
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn
).getChildColumn();
const childTable = await chilCol.getModel();
const parentCol = await ((await relColumn.getColOptions()) as LinkToAnotherRecordColumn).getParentColumn();
const parentCol = await (
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn
).getParentColumn();
const parentTable = await parentCol.getModel();
const childModel = await Model.getBaseModelSQL({
model: childTable,
dbDriver: this.dbDriver
dbDriver: this.dbDriver,
});
await parentTable.getColumns();
@ -501,11 +513,11 @@ class BaseModelSqlv2 {
const proto = await (
await Model.getBaseModelSQL({
id: childTable.id,
dbDriver: this.dbDriver
dbDriver: this.dbDriver,
})
).getProto();
return children.map(c => {
return children.map((c) => {
c.__proto__ = proto;
return c;
});
@ -519,11 +531,15 @@ class BaseModelSqlv2 {
try {
// const { cn } = this.hasManyRelations.find(({ tn }) => tn === child) || {};
const relColumn = (await this.model.getColumns()).find(
c => c.id === colId
(c) => c.id === colId
);
const chilCol = await ((await relColumn.getColOptions()) as LinkToAnotherRecordColumn).getChildColumn();
const chilCol = await (
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn
).getChildColumn();
const childTable = await chilCol.getModel();
const parentCol = await ((await relColumn.getColOptions()) as LinkToAnotherRecordColumn).getParentColumn();
const parentCol = await (
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn
).getParentColumn();
const parentTable = await parentCol.getModel();
await parentTable.getColumns();
@ -546,8 +562,11 @@ class BaseModelSqlv2 {
}
public async multipleMmList({ colId, parentIds }, args?: { limit; offset }) {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
// const tn = this.model.tn;
// const cn = (await relColOptions.getChildColumn()).title;
@ -561,7 +580,7 @@ class BaseModelSqlv2 {
await parentTable.getColumns();
const childModel = await Model.getBaseModelSQL({
dbDriver: this.dbDriver,
model: childTable
model: childTable,
});
const rtn = childTable.table_name;
const rtnId = childTable.id;
@ -570,7 +589,7 @@ class BaseModelSqlv2 {
await childModel.selectObject({ qb });
const finalQb = this.dbDriver.unionAll(
parentIds.map(id => {
parentIds.map((id) => {
const query = qb
.clone()
.whereIn(
@ -591,26 +610,32 @@ class BaseModelSqlv2 {
!this.isSqlite
);
const children = await this.extractRawQueryAndExec(finalQb);
let children = await this.extractRawQueryAndExec(finalQb);
if (this.isMySQL) {
children = children[0];
}
const proto = await (
await Model.getBaseModelSQL({
id: rtnId,
dbDriver: this.dbDriver
dbDriver: this.dbDriver,
})
).getProto();
const gs = _.groupBy(
children.map(c => {
children.map((c) => {
c.__proto__ = proto;
return c;
}),
GROUP_COL
);
return parentIds.map(id => gs[id] || []);
return parentIds.map((id) => gs[id] || []);
}
public async mmList({ colId, parentId }, args?: { limit; offset }) {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
// const tn = this.model.tn;
// const cn = (await relColOptions.getChildColumn()).title;
@ -624,7 +649,7 @@ class BaseModelSqlv2 {
await parentTable.getColumns();
const childModel = await Model.getBaseModelSQL({
dbDriver: this.dbDriver,
model: childTable
model: childTable,
});
const rtn = childTable.table_name;
const rtnId = childTable.id;
@ -649,15 +674,18 @@ class BaseModelSqlv2 {
await Model.getBaseModelSQL({ id: rtnId, dbDriver: this.dbDriver })
).getProto();
return children.map(c => {
return children.map((c) => {
c.__proto__ = proto;
return c;
});
}
public async multipleMmListCount({ colId, parentIds }) {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const vtn = (await relColOptions.getMMModel()).table_name;
const vcn = (await relColOptions.getMMChildColumn()).column_name;
@ -678,7 +706,7 @@ class BaseModelSqlv2 {
// await childModel.selectObject({ qb });
const children = await this.dbDriver.unionAll(
parentIds.map(id => {
parentIds.map((id) => {
const query = qb
.clone()
.whereIn(
@ -696,12 +724,15 @@ class BaseModelSqlv2 {
);
const gs = _.groupBy(children, GROUP_COL);
return parentIds.map(id => gs?.[id]?.[0] || []);
return parentIds.map((id) => gs?.[id]?.[0] || []);
}
public async mmListCount({ colId, parentId }) {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const vtn = (await relColOptions.getMMModel()).table_name;
const vcn = (await relColOptions.getMMChildColumn()).column_name;
@ -738,8 +769,11 @@ class BaseModelSqlv2 {
{ colId, pid = null },
args
): Promise<any> {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const vtn = (await relColOptions.getMMModel()).table_name;
const vcn = (await relColOptions.getMMChildColumn()).column_name;
@ -752,7 +786,7 @@ class BaseModelSqlv2 {
const rtn = childTable.table_name;
const qb = this.dbDriver(rtn)
.count(`*`, { as: 'count' })
.where(qb => {
.where((qb) => {
qb.whereNotIn(
rcn,
this.dbDriver(rtn)
@ -780,8 +814,11 @@ class BaseModelSqlv2 {
{ colId, pid = null },
args
): Promise<any> {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const vtn = (await relColOptions.getMMModel()).table_name;
const vcn = (await relColOptions.getMMChildColumn()).column_name;
@ -791,13 +828,13 @@ class BaseModelSqlv2 {
const childTable = await (await relColOptions.getParentColumn()).getModel();
const childModel = await Model.getBaseModelSQL({
dbDriver: this.dbDriver,
model: childTable
model: childTable,
});
const parentTable = await (await relColOptions.getChildColumn()).getModel();
await parentTable.getColumns();
const rtn = childTable.table_name;
const qb = this.dbDriver(rtn).where(qb =>
const qb = this.dbDriver(rtn).where((qb) =>
qb
.whereNotIn(
rcn,
@ -825,7 +862,7 @@ class BaseModelSqlv2 {
const proto = await childModel.getProto();
return (await qb).map(c => {
return (await qb).map((c) => {
c.__proto__ = proto;
return c;
});
@ -836,8 +873,11 @@ class BaseModelSqlv2 {
{ colId, pid = null },
args
): Promise<any> {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const cn = (await relColOptions.getChildColumn()).column_name;
const rcn = (await relColOptions.getParentColumn()).column_name;
@ -851,7 +891,7 @@ class BaseModelSqlv2 {
const qb = this.dbDriver(tn)
.count(`*`, { as: 'count' })
.where(qb => {
.where((qb) => {
qb.whereNotIn(
cn,
this.dbDriver(rtn)
@ -874,8 +914,11 @@ class BaseModelSqlv2 {
{ colId, pid = null },
args
): Promise<any> {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const cn = (await relColOptions.getChildColumn()).column_name;
const rcn = (await relColOptions.getParentColumn()).column_name;
@ -885,14 +928,14 @@ class BaseModelSqlv2 {
).getModel();
const childModel = await Model.getBaseModelSQL({
dbDriver: this.dbDriver,
model: childTable
model: childTable,
});
await parentTable.getColumns();
const tn = childTable.table_name;
const rtn = parentTable.table_name;
const qb = this.dbDriver(tn).where(qb => {
const qb = this.dbDriver(tn).where((qb) => {
qb.whereNotIn(
cn,
this.dbDriver(rtn)
@ -912,7 +955,7 @@ class BaseModelSqlv2 {
const proto = await childModel.getProto();
return (await this.extractRawQueryAndExec(qb)).map(c => {
return (await this.extractRawQueryAndExec(qb)).map((c) => {
c.__proto__ = proto;
return c;
});
@ -923,8 +966,11 @@ class BaseModelSqlv2 {
{ colId, cid = null },
args
): Promise<any> {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const rcn = (await relColOptions.getParentColumn()).column_name;
const parentTable = await (
@ -938,7 +984,7 @@ class BaseModelSqlv2 {
await childTable.getColumns();
const qb = this.dbDriver(rtn)
.where(qb => {
.where((qb) => {
qb.whereNotIn(
rcn,
this.dbDriver(tn)
@ -961,8 +1007,11 @@ class BaseModelSqlv2 {
{ colId, cid = null },
args
): Promise<any> {
const relColumn = (await this.model.getColumns()).find(c => c.id === colId);
const relColOptions = (await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const relColumn = (await this.model.getColumns()).find(
(c) => c.id === colId
);
const relColOptions =
(await relColumn.getColOptions()) as LinkToAnotherRecordColumn;
const rcn = (await relColOptions.getParentColumn()).column_name;
const parentTable = await (
@ -972,13 +1021,13 @@ class BaseModelSqlv2 {
const childTable = await (await relColOptions.getChildColumn()).getModel();
const parentModel = await Model.getBaseModelSQL({
dbDriver: this.dbDriver,
model: parentTable
model: parentTable,
});
const rtn = parentTable.table_name;
const tn = childTable.table_name;
await childTable.getColumns();
const qb = this.dbDriver(rtn).where(qb => {
const qb = this.dbDriver(rtn).where((qb) => {
qb.whereNotIn(
rcn,
this.dbDriver(tn)
@ -998,7 +1047,7 @@ class BaseModelSqlv2 {
applyPaginate(qb, args);
const proto = await parentModel.getProto();
return (await this.extractRawQueryAndExec(qb)).map(c => {
return (await this.extractRawQueryAndExec(qb)).map((c) => {
c.__proto__ = proto;
return c;
});
@ -1028,15 +1077,16 @@ class BaseModelSqlv2 {
(await Column.get({ colId: colOptions.fk_relation_column_id }))
?.title,
(await Column.get({ colId: colOptions.fk_lookup_column_id }))
?.title
]
?.title,
],
};
}
break;
case UITypes.LinkToAnotherRecord:
{
this._columns[column.title] = column;
const colOptions = (await column.getColOptions()) as LinkToAnotherRecordColumn;
const colOptions =
(await column.getColOptions()) as LinkToAnotherRecordColumn;
// const parentColumn = await colOptions.getParentColumn();
if (colOptions?.type === 'hm') {
@ -1046,7 +1096,7 @@ class BaseModelSqlv2 {
const data = await this.multipleHmList(
{
colId: column.id,
ids
ids,
},
(listLoader as any).args
);
@ -1056,10 +1106,10 @@ class BaseModelSqlv2 {
await this.hmList(
{
colId: column.id,
id: ids[0]
id: ids[0],
},
(listLoader as any).args
)
),
];
}
} catch (e) {
@ -1090,7 +1140,7 @@ class BaseModelSqlv2 {
const data = await this.multipleMmList(
{
parentIds: ids,
colId: column.id
colId: column.id,
},
(listLoader as any).args
);
@ -1101,10 +1151,10 @@ class BaseModelSqlv2 {
await this.mmList(
{
parentId: ids[0],
colId: column.id
colId: column.id,
},
(listLoader as any).args
)
),
];
}
} catch (e) {
@ -1123,24 +1173,25 @@ class BaseModelSqlv2 {
};
} else if (colOptions.type === 'bt') {
// @ts-ignore
const colOptions = (await column.getColOptions()) as LinkToAnotherRecordColumn;
const colOptions =
(await column.getColOptions()) as LinkToAnotherRecordColumn;
const pCol = await Column.get({
colId: colOptions.fk_parent_column_id
colId: colOptions.fk_parent_column_id,
});
const cCol = await Column.get({
colId: colOptions.fk_child_column_id
colId: colOptions.fk_child_column_id,
});
const readLoader = new DataLoader(async (ids: string[]) => {
try {
const data = await (
await Model.getBaseModelSQL({
id: pCol.fk_model_id,
dbDriver: this.dbDriver
dbDriver: this.dbDriver,
})
).list(
{
// limit: ids.length,
where: `(${pCol.column_name},in,${ids.join(',')})`
where: `(${pCol.column_name},in,${ids.join(',')})`,
},
true
);
@ -1214,7 +1265,7 @@ class BaseModelSqlv2 {
qb.select(
this.dbDriver.raw(`?? as ??`, [
selectQb.builder,
sanitize(column.title)
sanitize(column.title),
])
);
}
@ -1226,7 +1277,7 @@ class BaseModelSqlv2 {
// tn: this.title,
knex: this.dbDriver,
// column,
columnOptions: (await column.getColOptions()) as RollupColumn
columnOptions: (await column.getColOptions()) as RollupColumn,
})
).builder.as(sanitize(column.title))
);
@ -1269,7 +1320,7 @@ class BaseModelSqlv2 {
response = await this.extractRawQueryAndExec(query);
}
const ai = this.model.columns.find(c => c.ai);
const ai = this.model.columns.find((c) => c.ai);
if (
!response ||
(typeof response?.[0] !== 'object' && response?.[0] !== null)
@ -1397,14 +1448,13 @@ class BaseModelSqlv2 {
const postInsertOps = [];
const nestedCols = (await this.model.getColumns()).filter(
c => c.uidt === UITypes.LinkToAnotherRecord
(c) => c.uidt === UITypes.LinkToAnotherRecord
);
for (const col of nestedCols) {
if (col.title in data) {
const colOptions = await col.getColOptions<
LinkToAnotherRecordColumn
>();
const colOptions =
await col.getColOptions<LinkToAnotherRecordColumn>();
// parse data if it's JSON string
const nestedData =
@ -1429,11 +1479,11 @@ class BaseModelSqlv2 {
postInsertOps.push(async () => {
await this.dbDriver(childModel.table_name)
.update({
[childCol.column_name]: rowId
[childCol.column_name]: rowId,
})
.whereIn(
childModel.primaryKey.column_name,
nestedData?.map(r => r[childModel.primaryKey.title])
nestedData?.map((r) => r[childModel.primaryKey.title])
);
});
}
@ -1442,15 +1492,15 @@ class BaseModelSqlv2 {
postInsertOps.push(async () => {
const parentModel = await colOptions
.getParentColumn()
.then(c => c.getModel());
.then((c) => c.getModel());
await parentModel.getColumns();
const parentMMCol = await colOptions.getMMParentColumn();
const childMMCol = await colOptions.getMMChildColumn();
const mmModel = await colOptions.getMMModel();
const rows = nestedData.map(r => ({
const rows = nestedData.map((r) => ({
[parentMMCol.column_name]: r[parentModel.primaryKey.title],
[childMMCol.column_name]: rowId
[childMMCol.column_name]: rowId,
}));
await this.dbDriver(mmModel.table_name).insert(rows);
});
@ -1473,7 +1523,7 @@ class BaseModelSqlv2 {
response = await query;
}
const ai = this.model.columns.find(c => c.ai);
const ai = this.model.columns.find((c) => c.ai);
if (
!response ||
(typeof response?.[0] !== 'object' && response?.[0] !== null)
@ -1503,7 +1553,7 @@ class BaseModelSqlv2 {
rowId =
response[this.model.primaryKey.title] ||
response[this.model.primaryKey.column_name];
await Promise.all(postInsertOps.map(f => f()));
await Promise.all(postInsertOps.map((f) => f()));
// if (!trx) {
// await driver.commit();
@ -1525,14 +1575,14 @@ class BaseModelSqlv2 {
async bulkInsert(
datas: any[],
{
chunkSize: _chunkSize = 100
chunkSize: _chunkSize = 100,
}: {
chunkSize?: number;
} = {}
) {
try {
const insertDatas = await Promise.all(
datas.map(async d => {
datas.map(async (d) => {
await populatePk(this.model, d);
return this.model.mapAliasToColumn(d);
})
@ -1571,7 +1621,7 @@ class BaseModelSqlv2 {
let transaction;
try {
const updateDatas = await Promise.all(
datas.map(d => this.model.mapAliasToColumn(d))
datas.map((d) => this.model.mapAliasToColumn(d))
);
transaction = await this.dbDriver.transaction();
@ -1627,14 +1677,14 @@ class BaseModelSqlv2 {
new Filter({
children: args.filterArr || [],
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
new Filter({
children: filterObj,
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
...(args.filterArr || [])
...(args.filterArr || []),
],
qb,
this.dbDriver
@ -1689,14 +1739,14 @@ class BaseModelSqlv2 {
new Filter({
children: args.filterArr || [],
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
new Filter({
children: filterObj,
is_group: true,
logical_op: 'and'
logical_op: 'and',
}),
...(args.filterArr || [])
...(args.filterArr || []),
],
qb,
this.dbDriver
@ -1730,7 +1780,7 @@ class BaseModelSqlv2 {
),
// details: JSON.stringify(data),
ip: req?.clientIp,
user: req?.user?.email
user: req?.user?.email,
});
// }
}
@ -1774,7 +1824,7 @@ class BaseModelSqlv2 {
description: DOMPurify.sanitize(`${id} deleted from ${this.model.title}`),
// details: JSON.stringify(data),
ip: req?.clientIp,
user: req?.user?.email
user: req?.user?.email,
});
// }
await this.handleHooks('After.delete', data, req);
@ -1790,8 +1840,8 @@ class BaseModelSqlv2 {
try {
const formView = await view.getView<FormView>();
const emails = Object.entries(JSON.parse(formView?.email) || {})
.filter(a => a[1])
.map(a => a[0]);
.filter((a) => a[1])
.map((a) => a[0]);
if (emails?.length) {
const transformedData = _transformSubmittedFormDataForEmail(
data,
@ -1805,8 +1855,8 @@ class BaseModelSqlv2 {
html: ejs.render(formSubmissionEmailTemplate, {
data: transformedData,
tn: this.model.table_name,
_tn: this.model.title
})
_tn: this.model.title,
}),
});
}
} catch (e) {
@ -1819,7 +1869,7 @@ class BaseModelSqlv2 {
const hooks = await Hook.list({
fk_model_id: this.model.id,
event,
operation
operation,
});
for (const hook of hooks) {
invokeWebhook(hook, this.model, data, req?.user);
@ -1889,14 +1939,14 @@ class BaseModelSqlv2 {
async addChild({
colId,
rowId,
childId
childId,
}: {
colId: string;
rowId: string;
childId: string;
}) {
const columns = await this.model.getColumns();
const column = columns.find(c => c.id === colId);
const column = columns.find((c) => c.id === colId);
if (!column || column.uidt !== UITypes.LinkToAnotherRecord)
NcError.notFound('Column not found');
@ -1925,7 +1975,7 @@ class BaseModelSqlv2 {
[vChildCol.column_name]: this.dbDriver(childTable.table_name)
.select(childColumn.column_name)
.where(_wherePk(childTable.primaryKeys, rowId))
.first()
.first(),
});
}
break;
@ -1939,7 +1989,7 @@ class BaseModelSqlv2 {
.where(_wherePk(parentTable.primaryKeys, rowId))
.first()
.as('___cn_alias')
)
),
})
.where(_wherePk(childTable.primaryKeys, childId));
}
@ -1954,7 +2004,7 @@ class BaseModelSqlv2 {
.where(_wherePk(parentTable.primaryKeys, childId))
.first()
.as('___cn_alias')
)
),
})
.where(_wherePk(childTable.primaryKeys, rowId));
}
@ -1965,14 +2015,14 @@ class BaseModelSqlv2 {
async removeChild({
colId,
rowId,
childId
childId,
}: {
colId: string;
rowId: string;
childId: string;
}) {
const columns = await this.model.getColumns();
const column = columns.find(c => c.id === colId);
const column = columns.find((c) => c.id === colId);
if (!column || column.uidt !== UITypes.LinkToAnotherRecord)
NcError.notFound('Column not found');
@ -2002,7 +2052,7 @@ class BaseModelSqlv2 {
[vChildCol.column_name]: this.dbDriver(childTable.table_name)
.select(childColumn.column_name)
.where(_wherePk(childTable.primaryKeys, rowId))
.first()
.first(),
})
.delete();
}
@ -2063,7 +2113,7 @@ function extractSortsObject(
if (!Array.isArray(sorts)) sorts = sorts.split(',');
return sorts.map(s => {
return sorts.map((s) => {
const sort: SortType = { direction: 'asc' };
if (s.startsWith('-')) {
sort.direction = 'desc';
@ -2133,7 +2183,7 @@ function extractFilterFromXwhere(
children: extractFilterFromXwhere(
str.substring(openIndex + 1, closingIndex + 1),
aliasColObjMap
)
),
}),
// RHS of nested query(recursion)
...extractFilterFromXwhere(str.substring(closingIndex + 2), aliasColObjMap)
@ -2142,7 +2192,7 @@ function extractFilterFromXwhere(
}
function extractCondition(nestedArrayConditions, aliasColObjMap) {
return nestedArrayConditions?.map(str => {
return nestedArrayConditions?.map((str) => {
// eslint-disable-next-line prefer-const
let [logicOp, alias, op, value] =
str.match(/(?:~(and|or|not))?\((.*?),(\w+),(.*)\)/)?.slice(1) || [];
@ -2152,7 +2202,7 @@ function extractCondition(nestedArrayConditions, aliasColObjMap) {
comparison_op: op,
fk_column_id: aliasColObjMap[alias]?.id,
logical_op: logicOp,
value
value,
});
});
}
@ -2162,7 +2212,7 @@ function applyPaginate(
{
limit = 20,
offset = 0,
ignoreLimit = false
ignoreLimit = false,
}: XcFilter & { ignoreLimit?: boolean }
) {
query.offset(offset);
@ -2181,7 +2231,7 @@ function _wherePk(primaryKeys: Column[], id) {
}
function getCompositePk(primaryKeys: Column[], row) {
return primaryKeys.map(c => row[c.title]).join('___');
return primaryKeys.map((c) => row[c.title]).join('___');
}
export { BaseModelSqlv2 };

Loading…
Cancel
Save