@@ -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