Skip to content
This repository was archived by the owner on Mar 1, 2026. It is now read-only.

Commit aaed097

Browse files
committed
fix(cli): refine attribute generation in db pull
1 parent 6e62512 commit aaed097

1 file changed

Lines changed: 22 additions & 25 deletions

File tree

packages/cli/src/actions/pull/index.ts

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,10 @@ export function syncTable({
252252
return typeBuilder;
253253
});
254254

255+
if (column.pk && !multiPk) {
256+
builder.addAttribute((b) => b.setDecl(idAttribute));
257+
}
258+
255259
if (column.default) {
256260
const defaultValuesAttrs = provider.getDefaultValue({
257261
fieldName: column.name,
@@ -262,10 +266,6 @@ export function syncTable({
262266
defaultValuesAttrs.forEach(builder.addAttribute.bind(builder));
263267
}
264268

265-
if (column.pk && !multiPk) {
266-
builder.addAttribute((b) => b.setDecl(idAttribute));
267-
}
268-
269269
if (column.unique && !column.pk) {
270270
builder.addAttribute((b) => {
271271
b.setDecl(uniqueAttribute);
@@ -320,22 +320,8 @@ export function syncTable({
320320
);
321321
}
322322

323-
const uniqueColumns = table.columns.filter((c) => c.unique && !c.pk).map((c) => c.name);
324-
if (uniqueColumns.length > 0) {
325-
modelFactory.addAttribute((builder) =>
326-
builder.setDecl(modelUniqueAttribute).addArg((argBuilder) => {
327-
const arrayExpr = argBuilder.ArrayExpr;
328-
uniqueColumns.forEach((c) => {
329-
const ref = modelFactory.node.fields.find((f) => getDbName(f) === c);
330-
if (!ref) {
331-
throw new Error(`Field ${c} not found`);
332-
}
333-
arrayExpr.addItem((itemBuilder) => itemBuilder.ReferenceExpr.setTarget(ref));
334-
});
335-
return arrayExpr;
336-
}),
337-
);
338-
} else {
323+
const uniqueColumns = table.columns.filter((c) => c.unique);
324+
if(uniqueColumns.length === 0) {
339325
modelFactory.addAttribute((a) => a.setDecl(getAttributeRef('@@ignore', services)));
340326
modelFactory.comments.push(
341327
'/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Zenstack Client.',
@@ -361,13 +347,15 @@ export function syncTable({
361347
return;
362348
}
363349

364-
if (index.columns.length === 1 && index.columns.find((c) => pkColumns.includes(c.name))) {
365-
//skip primary key
350+
if (index.columns.length === 1 && index.columns.find((c) => pkColumns.includes(c.name))
351+
|| index.columns.length === 1 && index.unique) {
352+
//skip primary key or unique constraints as they are already handled
366353
return;
367354
}
368355

369356
modelFactory.addAttribute((builder) =>
370-
builder
357+
{
358+
const attr = builder
371359
.setDecl(index.unique ? modelUniqueAttribute : modelindexAttribute)
372360
.addArg((argBuilder) => {
373361
const arrayExpr = argBuilder.ArrayExpr;
@@ -385,8 +373,17 @@ export function syncTable({
385373
});
386374
});
387375
return arrayExpr;
388-
})
389-
.addArg((argBuilder) => argBuilder.StringLiteral.setValue(index.name), 'map'),
376+
});
377+
378+
const suffix = index.unique ? '_key' : '_idx';
379+
380+
if(index.name !== `${table.name}_${index.columns.map(c => c.name).join('_')}${suffix}`){
381+
attr.addArg((argBuilder) => argBuilder.StringLiteral.setValue(index.name), 'map');
382+
}
383+
384+
return attr
385+
}
386+
390387
);
391388
});
392389
if (table.schema && table.schema !== '' && table.schema !== defaultSchema) {

0 commit comments

Comments
 (0)