Browse Source

feat: lookup and rollup parsing

Signed-off-by: Pranav C <pranavxc@gmail.com>
pull/760/head
Pranav C 3 years ago
parent
commit
35b0398a83
  1. 8
      packages/nocodb/src/lib/dataMapper/lib/sql/BaseModelSql.ts
  2. 24
      packages/nocodb/src/lib/dataMapper/lib/sql/genRollupSelect.ts
  3. 87
      packages/nocodb/src/lib/templateParser/NcTemplateParser.ts

8
packages/nocodb/src/lib/dataMapper/lib/sql/BaseModelSql.ts

@ -2407,7 +2407,13 @@ class BaseModelSql extends BaseModel {
return (this.virtualColumns || [])?.reduce((arr, v) => { return (this.virtualColumns || [])?.reduce((arr, v) => {
if (v.rl) { if (v.rl) {
arr.push( arr.push(
genRollupSelect({ knex: this.dbDriver, rollup: v.rl }).as(v._cn) genRollupSelect({
tn: this.tn,
knex: this.dbDriver,
rollup: v.rl,
hasMany: this.hasManyRelations,
manyToMany: this.manyToManyRelations
}).as(v._cn)
); );
} }
return arr; return arr;

24
packages/nocodb/src/lib/dataMapper/lib/sql/genRollupSelect.ts

@ -1,8 +1,24 @@
import Knex from 'knex'; import Knex from 'knex';
export default function({ knex, rollup }: { knex: Knex; rollup: any }) { export default function({
knex,
rollup: _rollup,
hasMany,
manyToMany
}: {
tn: string;
knex: Knex;
rollup: any;
hasMany: any[];
manyToMany: any[];
}) {
let rollup = _rollup;
switch (rollup.type) { switch (rollup.type) {
case 'hm': case 'hm':
if (!rollup.tn || !rollup.rtn) {
rollup = { ...rollup, ...hasMany.find(hm => hm.tn === rollup.rltn) };
}
return knex(rollup.rltn) return knex(rollup.rltn)
[rollup.fn]?.(knex.ref(`${rollup.rltn}.${rollup.rlcn}`)) [rollup.fn]?.(knex.ref(`${rollup.rltn}.${rollup.rlcn}`))
.where( .where(
@ -12,6 +28,12 @@ export default function({ knex, rollup }: { knex: Knex; rollup: any }) {
); );
break; break;
case 'mm': case 'mm':
if (!rollup.tn || !rollup.rtn || !rollup.vtn) {
rollup = {
...rollup,
...manyToMany.find(mm => mm.rtn === rollup.rltn)
};
}
return knex(rollup.rltn) return knex(rollup.rltn)
[rollup.fn]?.(knex.ref(`${rollup.rltn}.${rollup.rlcn}`)) [rollup.fn]?.(knex.ref(`${rollup.rltn}.${rollup.rlcn}`))
.innerJoin( .innerJoin(

87
packages/nocodb/src/lib/templateParser/NcTemplateParser.ts

@ -24,11 +24,11 @@ export default class NcTemplateParser {
private prefix: string; private prefix: string;
private template: any; private template: any;
constructor({client, template, prefix = ''}) { constructor({ client, template, prefix = '' }) {
this.client = client; this.client = client;
this.sqlUi = SqlUiFactory.create({client}); this.sqlUi = SqlUiFactory.create({ client });
this.template = template; this.template = template;
this.prefix = prefix this.prefix = prefix;
} }
public parse(template?: any): any { public parse(template?: any): any {
@ -39,11 +39,11 @@ export default class NcTemplateParser {
...tableTemplate, ...tableTemplate,
tn: this.getTable(tableTemplate.tn), tn: this.getTable(tableTemplate.tn),
_tn: tableTemplate._tn || tableTemplate.tn _tn: tableTemplate._tn || tableTemplate.tn
} };
const table = this.extractTable(t); const table = this.extractTable(t);
tables.push(table); tables.push(table);
return t return t;
}) });
this._tables = tables; this._tables = tables;
@ -73,7 +73,7 @@ export default class NcTemplateParser {
columns: [ columns: [
defaultColumns[0], defaultColumns[0],
...this.extractTableColumns(tableTemplate.columns), ...this.extractTableColumns(tableTemplate.columns),
...defaultColumns.slice(1), ...defaultColumns.slice(1)
] ]
}; };
} }
@ -95,22 +95,24 @@ export default class NcTemplateParser {
// // this.extractRelations(tableColumn, 'mm'); // // this.extractRelations(tableColumn, 'mm');
// break; // break;
default: default:
const colProp = this.sqlUi.getDataTypeForUiType(tableColumn); {
columns.push({ const colProp = this.sqlUi.getDataTypeForUiType(tableColumn);
...this.sqlUi.getNewColumn(''), columns.push({
rqd: false, ...this.sqlUi.getNewColumn(''),
pk: false, rqd: false,
ai: false, pk: false,
cdf: null, ai: false,
un: false, cdf: null,
dtx: 'specificType', un: false,
dtxp: this.sqlUi.getDefaultLengthForDatatype(colProp.dt), dtx: 'specificType',
dtxs: this.sqlUi.getDefaultScaleForDatatype(colProp.dt), dtxp: this.sqlUi.getDefaultLengthForDatatype(colProp.dt),
cn: tableColumn.cn, dtxs: this.sqlUi.getDefaultScaleForDatatype(colProp.dt),
_cn: tableColumn.cn, cn: tableColumn.cn,
uidt: tableColumn.uidt, _cn: tableColumn.cn,
...colProp uidt: tableColumn.uidt,
}); ...colProp
});
}
break; break;
} }
} }
@ -121,7 +123,9 @@ export default class NcTemplateParser {
if (!this._relations) this._relations = []; if (!this._relations) this._relations = [];
if (!this._m2mRelations) this._m2mRelations = []; if (!this._m2mRelations) this._m2mRelations = [];
for (const hasMany of tableTemplate.hasMany || []) { for (const hasMany of tableTemplate.hasMany || []) {
const childTable = this.tables.find(table => table.tn === this.getTable(hasMany.tn)); const childTable = this.tables.find(
table => table.tn === this.getTable(hasMany.tn)
);
const parentTable = this.tables.find( const parentTable = this.tables.find(
table => table.tn === tableTemplate.tn table => table.tn === tableTemplate.tn
); );
@ -160,7 +164,9 @@ export default class NcTemplateParser {
} }
for (const manyToMany of tableTemplate.manyToMany || []) { for (const manyToMany of tableTemplate.manyToMany || []) {
// @ts-ignore // @ts-ignore
const childTable = this.tables.find(table => table.tn === this.getTable(manyToMany.rtn)); const childTable = this.tables.find(
table => table.tn === this.getTable(manyToMany.rtn)
);
const parentTable = this.tables.find( const parentTable = this.tables.find(
table => table.tn === tableTemplate.tn table => table.tn === tableTemplate.tn
); );
@ -189,27 +195,18 @@ export default class NcTemplateParser {
private extractVirtualColumns(tableMeta) { private extractVirtualColumns(tableMeta) {
if (!this._virtualColumns) this._virtualColumns = {}; if (!this._virtualColumns) this._virtualColumns = {};
const virtualColumns = []; const virtualColumns = [];
for (const v of (tableMeta.v || [])) { for (const v of tableMeta.v || []) {
const v1 = {...v} const v1 = { ...v };
let type, prop;
if (v.rl) {
switch (v.uidt) { v1.rl.rlttn = v1.rl.rltn;
case UITypes.Rollup: v1.rl.rltn = this.getTable(v1.rl.rltn);
type = v.rl.type } else if (v.lk) {
prop = 'rl' v1.lk._ltn = v1.lk.ltn;
break; v1.lk.ltn = this.getTable(v1.lk.ltn);
case UITypes.Lookup:
type = v.lk.type
prop = 'lk'
break;
}
if (type && prop) {
// todo: extract relation data
} else {
virtualColumns.push(v1)
} }
virtualColumns.push(v1);
} }
this.virtualColumns[tableMeta.tn] = virtualColumns; this.virtualColumns[tableMeta.tn] = virtualColumns;
} }
@ -231,6 +228,6 @@ export default class NcTemplateParser {
} }
private getTable(tn) { private getTable(tn) {
return `${this.prefix}${tn}` return `${this.prefix}${tn}`;
} }
} }

Loading…
Cancel
Save