Skip to content

Commit 83ea4ea

Browse files
committed
feat(relationships): include is_one_to_one
1 parent 1745435 commit 83ea4ea

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed

src/lib/PostgresMetaRelationships.ts

+3
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export default class PostgresMetaRelationships {
9292
schema: vtkd.view_schema,
9393
relation: vtkd.view_name,
9494
columns: viewColumns,
95+
is_one_to_one: r.is_one_to_one,
9596
referenced_schema: r.referenced_schema,
9697
referenced_relation: r.referenced_relation,
9798
referenced_columns: r.referenced_columns,
@@ -104,6 +105,7 @@ export default class PostgresMetaRelationships {
104105
schema: r.schema,
105106
relation: r.relation,
106107
columns: r.columns,
108+
is_one_to_one: r.is_one_to_one,
107109
referenced_schema: tvkd.view_schema,
108110
referenced_relation: tvkd.view_name,
109111
referenced_columns: viewColumns,
@@ -119,6 +121,7 @@ export default class PostgresMetaRelationships {
119121
schema: vtkd.view_schema,
120122
relation: vtkd.view_name,
121123
columns: viewColumns,
124+
is_one_to_one: r.is_one_to_one,
122125
referenced_schema: tvkd.view_schema,
123126
referenced_relation: tvkd.view_name,
124127
referenced_columns: referencedViewColumns,

src/lib/sql/table_relationships.sql

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,31 @@
11
-- Adapted from
22
-- https://github.com/PostgREST/postgrest/blob/f9f0f79fa914ac00c11fbf7f4c558e14821e67e2/src/PostgREST/SchemaCache.hs#L722
3+
WITH
4+
pks_uniques_cols AS (
5+
SELECT
6+
connamespace,
7+
conrelid,
8+
jsonb_agg(column_info.cols) as cols
9+
FROM pg_constraint
10+
JOIN lateral (
11+
SELECT array_agg(cols.attname order by cols.attnum) as cols
12+
FROM ( select unnest(conkey) as col) _
13+
JOIN pg_attribute cols on cols.attrelid = conrelid and cols.attnum = col
14+
) column_info ON TRUE
15+
WHERE
16+
contype IN ('p', 'u') and
17+
connamespace::regnamespace::text <> 'pg_catalog'
18+
GROUP BY connamespace, conrelid
19+
)
320
SELECT
421
traint.conname AS foreign_key_name,
522
ns1.nspname AS schema,
623
tab.relname AS relation,
724
column_info.cols AS columns,
825
ns2.nspname AS referenced_schema,
926
other.relname AS referenced_relation,
10-
column_info.refs AS referenced_columns
27+
column_info.refs AS referenced_columns,
28+
(column_info.cols IN (SELECT * FROM jsonb_array_elements(pks_uqs.cols))) AS is_one_to_one
1129
FROM pg_constraint traint
1230
JOIN LATERAL (
1331
SELECT
@@ -21,4 +39,6 @@ JOIN pg_namespace ns1 ON ns1.oid = traint.connamespace
2139
JOIN pg_class tab ON tab.oid = traint.conrelid
2240
JOIN pg_class other ON other.oid = traint.confrelid
2341
JOIN pg_namespace ns2 ON ns2.oid = other.relnamespace
42+
LEFT JOIN pks_uniques_cols pks_uqs ON pks_uqs.connamespace = traint.connamespace AND pks_uqs.conrelid = traint.conrelid
2443
WHERE traint.contype = 'f'
44+
AND traint.conparentid = 0

src/lib/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ export const postgresRelationshipSchema = Type.Object({
239239
schema: Type.String(),
240240
relation: Type.String(),
241241
columns: Type.Array(Type.String()),
242+
is_one_to_one: Type.Boolean(),
242243
referenced_schema: Type.String(),
243244
referenced_relation: Type.String(),
244245
referenced_columns: Type.Array(Type.String()),

src/server/templates/typescript.ts

+2
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ export interface Database {
167167
(relationship) => `{
168168
foreignKeyName: ${JSON.stringify(relationship.foreign_key_name)}
169169
columns: ${JSON.stringify(relationship.columns)}
170+
isOneToOne: ${relationship.is_one_to_one}
170171
referencedRelation: ${JSON.stringify(relationship.referenced_relation)}
171172
referencedColumns: ${JSON.stringify(relationship.referenced_columns)}
172173
}`
@@ -235,6 +236,7 @@ export interface Database {
235236
(relationship) => `{
236237
foreignKeyName: ${JSON.stringify(relationship.foreign_key_name)}
237238
columns: ${JSON.stringify(relationship.columns)}
239+
isOneToOne: ${relationship.is_one_to_one}
238240
referencedRelation: ${JSON.stringify(relationship.referenced_relation)}
239241
referencedColumns: ${JSON.stringify(relationship.referenced_columns)}
240242
}`

0 commit comments

Comments
 (0)