diff --git a/packages/nocodb/src/helpers/columnHelpers.ts b/packages/nocodb/src/helpers/columnHelpers.ts index 99c46ee305..c606b973dd 100644 --- a/packages/nocodb/src/helpers/columnHelpers.ts +++ b/packages/nocodb/src/helpers/columnHelpers.ts @@ -1,5 +1,6 @@ import { customAlphabet } from 'nanoid'; import { UITypes } from 'nocodb-sdk'; +import { GridViewColumn, RollupColumn } from '../models' import Column from '../models/Column'; import { getUniqueColumnAliasName } from '../helpers/getUniqueName'; import validateParams from '../helpers/validateParams'; @@ -61,7 +62,7 @@ export async function createHmAndBtColumn( await parent.getColumns(), type === 'hm' ? alias : `${child.title} List`, ); - await Column.insert({ + const col = await Column.insert({ title, fk_model_id: parent.id, uidt: UITypes.LinkToAnotherRecord, @@ -74,6 +75,11 @@ export async function createHmAndBtColumn( fk_col_name: fkColName, fk_index_name: fkColName, }); + + if (!isSystemCol) + await populateRollupForLTAR({ + column: col, + }); } } @@ -206,3 +212,35 @@ export const generateFkName = (parent: TableType, child: TableType) => { .slice(0, 10)}_${randomID(15)}`; return constraintName; }; + + + +export async function populateRollupForLTAR({ column }: { column: Column }) { + const model = await column.getModel(); + + const views = await model.getViews(); + + const relatedModel = await column + .getColOptions() + .then((colOpt) => colOpt.getRelatedTable()); + await relatedModel.getColumns(); + const pkId = + relatedModel.primaryKey?.id || (await relatedModel.getColumns())[0]?.id; + + await Column.insert({ + uidt: 'Rollup', + title: getUniqueColumnAliasName( + await model.getColumns(), + `${relatedModel.title} Count`, + ), + fk_rollup_column_id: pkId, + fk_model_id: model.id, + rollup_function: 'count', + fk_relation_column_id: column.id, + }); + + const viewCol = await GridViewColumn.list(views[0].id).then((cols) => + cols.find((c) => c.fk_column_id === column.id), + ); + await GridViewColumn.update(viewCol.id, { show: false }); +} diff --git a/packages/nocodb/src/services/columns.service.ts b/packages/nocodb/src/services/columns.service.ts index 3c73a88770..487c4adae1 100644 --- a/packages/nocodb/src/services/columns.service.ts +++ b/packages/nocodb/src/services/columns.service.ts @@ -12,13 +12,13 @@ import formulaQueryBuilderv2 from '../db/formulav2/formulaQueryBuilderv2'; import ProjectMgrv2 from '../db/sql-mgr/v2/ProjectMgrv2'; import { createHmAndBtColumn, - generateFkName, + generateFkName, populateRollupForLTAR, randomID, validateLookupPayload, validatePayload, validateRequiredField, validateRollupPayload, -} from '../helpers'; +} from '../helpers' import { NcError } from '../helpers/catchError'; import getColumnPropsFromUIDT from '../helpers/getColumnPropsFromUIDT'; import { @@ -32,6 +32,7 @@ import { Base, Column, FormulaColumn, + GridViewColumn, KanbanView, Model, } from '../models'; @@ -39,7 +40,11 @@ import Noco from '../Noco'; import NcConnectionMgrv2 from '../utils/common/NcConnectionMgrv2'; import { MetaTable } from '../utils/globals'; import { MetaService } from '../meta/meta.service'; -import type { LinkToAnotherRecordColumn, Project } from '../models'; +import type { + LinkToAnotherRecordColumn, + Project, + RollupColumn, +} from '../models'; import type SqlMgrv2 from '../db/sql-mgr/v2/SqlMgrv2'; import type { ColumnReqType, @@ -1759,7 +1764,7 @@ export class ColumnsService { true, ); - await Column.insert({ + const col1 = await Column.insert({ title: getUniqueColumnAliasName( await child.getColumns(), `${parent.title} List`, @@ -1780,7 +1785,7 @@ export class ColumnsService { fk_related_model_id: parent.id, virtual: (param.column as LinkToAnotherColumnReqType).virtual, }); - await Column.insert({ + const col2 = await Column.insert({ title: getUniqueColumnAliasName( await parent.getColumns(), param.column.title ?? `${child.title} List`, @@ -1801,6 +1806,13 @@ export class ColumnsService { virtual: (param.column as LinkToAnotherColumnReqType).virtual, }); + await populateRollupForLTAR({ + column: col1, + }) + await populateRollupForLTAR({ + column: col2, + }) + // todo: create index for virtual relations as well // create index for foreign key in pg if (param.base.type === 'pg') { @@ -1869,4 +1881,5 @@ export class ColumnsService { await Column.update(column.id, colBody); } } + }