Fix(wren-ai): relation should generate column in related models (#34)

* fix(wren-ai): relation should generate column in related models

* rename function
This commit is contained in:
Andy Yen
2024-03-25 19:38:15 +08:00
committed by GitHub
parent d7ab444737
commit e73cf7acbc
3 changed files with 70 additions and 3 deletions
+55 -3
View File
@@ -133,11 +133,29 @@ export class MDLBuilder implements IMDLBuilder {
public addRelation(): void {
this.manifest.relationships = this.relations.map(
(relation: RelationInfo) => {
const {
name,
joinType,
fromModelName,
fromColumnName,
toModelName,
toColumnName,
} = relation;
const condition = this.getRelationCondition(relation);
this.addRelationColumn(fromModelName, {
modelReferenceName: toModelName,
columnReferenceName: toColumnName,
relation: name,
});
this.addRelationColumn(toModelName, {
modelReferenceName: fromModelName,
columnReferenceName: fromColumnName,
relation: name,
});
return {
name: relation.name,
models: [relation.fromModelName, relation.toModelName],
joinType: relation.joinType,
name: name,
models: [fromModelName, toModelName],
joinType: joinType,
condition,
};
},
@@ -149,6 +167,40 @@ export class MDLBuilder implements IMDLBuilder {
this.manifest.catalog = this.project.catalog;
}
protected addRelationColumn(
modelName: string,
columnData: {
modelReferenceName: string;
columnReferenceName: string;
relation: string;
},
) {
const model = this.manifest.models.find(
(model: any) => model.name === modelName,
);
if (!model) {
logger.debug(`Can not find model "${modelName}" to add relation column`);
return;
}
if (!model.columns) {
model.columns = [];
}
// check if the modelReferenceName is already in the model column
const modelNameDuplicated = model.columns.find(
(column: any) => column.name === columnData.modelReferenceName,
);
model.columns.push({
name: modelNameDuplicated
? `${columnData.modelReferenceName}_${columnData.columnReferenceName}`
: columnData.modelReferenceName,
type: columnData.modelReferenceName,
relationship: columnData.relation,
isCalculated: false,
notNull: false,
});
}
protected getColumnExpression(column: ModelColumn): string {
if (column.isCalculated) {
// calculated field
@@ -137,6 +137,13 @@ describe('MDLBuilder', () => {
notNull: true,
properties: { description: 'bar' },
},
{
name: 'customer',
type: 'customer',
isCalculated: false,
relationship: 'OrderCustomer',
notNull: false,
},
],
cached: false,
refreshTime: null,
@@ -155,6 +162,13 @@ describe('MDLBuilder', () => {
notNull: true,
properties: null,
},
{
name: 'order',
type: 'order',
isCalculated: false,
relationship: 'OrderCustomer',
notNull: false,
},
],
primaryKey: '',
cached: false,
+1
View File
@@ -3,6 +3,7 @@ export interface ColumnMDL {
type?: string; // eg: "integer", "string", "relationName"
isCalculated: boolean; // eg: true, false
notNull?: boolean; // eg: true, false
relationship?: string; //eg: OrdersCustomer
properties?: {
description?: string; // eg: "the key of each order"
};