Skip to content

Commit 21ce3cc

Browse files
refactor: Improve relationship sorting with more robust comparison logic
1 parent 47026d1 commit 21ce3cc

File tree

1 file changed

+54
-12
lines changed

1 file changed

+54
-12
lines changed

src/server/templates/typescript.ts

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,33 @@ export type Database = {
154154
relationship.referenced_schema === table.schema &&
155155
relationship.relation === table.name
156156
)
157-
.sort(
158-
(a, b) =>
159-
a.foreign_key_name.localeCompare(b.foreign_key_name) ||
160-
a.referenced_relation.localeCompare(b.referenced_relation) ||
161-
a.referenced_columns[0].localeCompare(b.referenced_columns[0])
162-
)
157+
.sort((a, b) => {
158+
// First try to sort by foreign key name.
159+
const foreignKeyCompare = a.foreign_key_name.localeCompare(
160+
b.foreign_key_name
161+
)
162+
if (foreignKeyCompare !== 0) return foreignKeyCompare
163+
164+
// Then try to sort by referenced relation.
165+
const referencedRelationCompare = a.referenced_relation.localeCompare(
166+
b.referenced_relation
167+
)
168+
if (referencedRelationCompare !== 0) return referencedRelationCompare
169+
170+
// Then try to sort by referenced columns, finding the first difference.
171+
for (
172+
let i = 0;
173+
i < Math.min(a.referenced_columns.length, b.referenced_columns.length);
174+
i++
175+
) {
176+
const refColCompare = a.referenced_columns[i].localeCompare(
177+
b.referenced_columns[i]
178+
)
179+
if (refColCompare !== 0) return refColCompare
180+
}
181+
// If all referenced columns are the same, sort by the number of referenced columns.
182+
return a.referenced_columns.length - b.referenced_columns.length
183+
})
163184
.map(
164185
(relationship) => `{
165186
foreignKeyName: ${JSON.stringify(relationship.foreign_key_name)}
@@ -232,12 +253,33 @@ export type Database = {
232253
relationship.referenced_schema === view.schema &&
233254
relationship.relation === view.name
234255
)
235-
.sort(
236-
(a, b) =>
237-
a.foreign_key_name.localeCompare(b.foreign_key_name) ||
238-
a.referenced_relation.localeCompare(b.referenced_relation) ||
239-
a.referenced_columns[0].localeCompare(b.referenced_columns[0])
240-
)
256+
.sort((a, b) => {
257+
// First try to sort by foreign key name.
258+
const foreignKeyCompare = a.foreign_key_name.localeCompare(
259+
b.foreign_key_name
260+
)
261+
if (foreignKeyCompare !== 0) return foreignKeyCompare
262+
263+
// Then try to sort by referenced relation.
264+
const referencedRelationCompare = a.referenced_relation.localeCompare(
265+
b.referenced_relation
266+
)
267+
if (referencedRelationCompare !== 0) return referencedRelationCompare
268+
269+
// Then try to sort by referenced columns, finding the first difference.
270+
for (
271+
let i = 0;
272+
i < Math.min(a.referenced_columns.length, b.referenced_columns.length);
273+
i++
274+
) {
275+
const refColCompare = a.referenced_columns[i].localeCompare(
276+
b.referenced_columns[i]
277+
)
278+
if (refColCompare !== 0) return refColCompare
279+
}
280+
// If all referenced columns are the same, sort by the number of referenced columns.
281+
return a.referenced_columns.length - b.referenced_columns.length
282+
})
241283
.map(
242284
(relationship) => `{
243285
foreignKeyName: ${JSON.stringify(relationship.foreign_key_name)}

0 commit comments

Comments
 (0)