diff --git a/wren-ui/src/apollo/server/resolvers.ts b/wren-ui/src/apollo/server/resolvers.ts index 8e463c27f..18d8e78f5 100644 --- a/wren-ui/src/apollo/server/resolvers.ts +++ b/wren-ui/src/apollo/server/resolvers.ts @@ -59,6 +59,9 @@ const resolvers = { updateCalculatedField: modelResolver.updateCalculatedField, deleteCalculatedField: modelResolver.deleteCalculatedField, + // calculated field + createCalculatedField: modelResolver.createCalculatedField, + // Ask createAskingTask: askingResolver.createAskingTask, cancelAskingTask: askingResolver.cancelAskingTask, diff --git a/wren-ui/src/apollo/server/services/modelService.ts b/wren-ui/src/apollo/server/services/modelService.ts index 7c1e2e7fb..e181be4ed 100644 --- a/wren-ui/src/apollo/server/services/modelService.ts +++ b/wren-ui/src/apollo/server/services/modelService.ts @@ -200,6 +200,44 @@ export class ModelService implements IModelService { return updatedColumn; } + public async createCalculatedField( + data: CreateCalculatedFieldData, + ): Promise { + const { modelId, name, expression, lineage } = data; + const model = await this.modelRepository.findOneBy({ + id: modelId, + }); + if (!model) { + throw new Error('Model not found'); + } + const { valid, message } = await this.validateCalculatedField( + name, + modelId, + ); + if (!valid) { + throw new Error(message); + } + const inputFieldId = lineage[lineage.length - 1]; + const dataType = await this.inferCalculatedFieldDataType( + expression, + inputFieldId, + ); + const column = await this.modelColumnRepository.createOne({ + modelId, + displayName: name, + sourceColumnName: name, + referenceName: name, + type: dataType, + isCalculated: true, + isPk: false, + notNull: false, + aggregation: expression, + lineage: JSON.stringify(lineage), + properties: JSON.stringify({ description: '' }), + }); + return column; + } + public async batchUpdateModelProperties(tables: SampleDatasetTable[]) { logger.debug('start batch update model description'); const project = await this.projectService.getCurrentProject();