mirror of
https://github.com/Canner/WrenAI.git
synced 2026-10-31 02:57:15 +08:00
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:
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user