Skip to content

Commit e1cfc6e

Browse files
committed
feat(tables, views, foreign-tables): make columns optional
1 parent 189aee7 commit e1cfc6e

File tree

8 files changed

+108
-46
lines changed

8 files changed

+108
-46
lines changed

src/lib/PostgresMetaForeignTables.ts

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,44 @@ export default class PostgresMetaForeignTables {
99
this.query = query
1010
}
1111

12+
async list(options: {
13+
limit?: number
14+
offset?: number
15+
includeColumns: false
16+
}): Promise<PostgresMetaResult<(PostgresForeignTable & { columns: never })[]>>
17+
async list(options?: {
18+
limit?: number
19+
offset?: number
20+
includeColumns?: boolean
21+
}): Promise<PostgresMetaResult<(PostgresForeignTable & { columns: unknown[] })[]>>
1222
async list({
1323
limit,
1424
offset,
25+
includeColumns = true,
1526
}: {
1627
limit?: number
1728
offset?: number
29+
includeColumns?: boolean
1830
} = {}): Promise<PostgresMetaResult<PostgresForeignTable[]>> {
19-
let sql = enrichedForeignTablesSql
31+
let sql = generateEnrichedForeignTablesSql({ includeColumns })
2032
if (limit) {
21-
sql = `${sql} LIMIT ${limit}`
33+
sql += ` limit ${limit}`
2234
}
2335
if (offset) {
24-
sql = `${sql} OFFSET ${offset}`
36+
sql += ` offset ${offset}`
2537
}
2638
return await this.query(sql)
2739
}
2840
}
2941

30-
const enrichedForeignTablesSql = `
31-
WITH foreign_tables AS (${foreignTablesSql}),
32-
columns AS (${columnsSql})
33-
SELECT
34-
*,
35-
${coalesceRowsToArray('columns', 'columns.table_id = foreign_tables.id')}
36-
FROM foreign_tables`
42+
const generateEnrichedForeignTablesSql = ({ includeColumns }: { includeColumns: boolean }) => `
43+
with foreign_tables as (${foreignTablesSql})
44+
${includeColumns ? `, columns as (${columnsSql})` : ''}
45+
select
46+
*
47+
${
48+
includeColumns
49+
? `, ${coalesceRowsToArray('columns', 'columns.table_id = foreign_tables.id')}`
50+
: ''
51+
}
52+
from foreign_tables`

src/lib/PostgresMetaTables.ts

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,51 @@ export default class PostgresMetaTables {
1616
this.query = query
1717
}
1818

19+
async list(options: {
20+
includeSystemSchemas?: boolean
21+
includedSchemas?: string[]
22+
excludedSchemas?: string[]
23+
limit?: number
24+
offset?: number
25+
includeColumns: false
26+
}): Promise<PostgresMetaResult<(PostgresTable & { columns: never })[]>>
27+
async list(options?: {
28+
includeSystemSchemas?: boolean
29+
includedSchemas?: string[]
30+
excludedSchemas?: string[]
31+
limit?: number
32+
offset?: number
33+
includeColumns?: boolean
34+
}): Promise<PostgresMetaResult<(PostgresTable & { columns: unknown[] })[]>>
1935
async list({
2036
includeSystemSchemas = false,
2137
includedSchemas,
2238
excludedSchemas,
2339
limit,
2440
offset,
41+
includeColumns = true,
2542
}: {
2643
includeSystemSchemas?: boolean
2744
includedSchemas?: string[]
2845
excludedSchemas?: string[]
2946
limit?: number
3047
offset?: number
48+
includeColumns?: boolean
3149
} = {}): Promise<PostgresMetaResult<PostgresTable[]>> {
32-
let sql = enrichedTablesSql
50+
let sql = generateEnrichedTablesSql({ includeColumns })
3351
const filter = filterByList(
3452
includedSchemas,
3553
excludedSchemas,
3654
!includeSystemSchemas ? DEFAULT_SYSTEM_SCHEMAS : undefined
3755
)
3856
if (filter) {
39-
sql += ` WHERE schema ${filter}`
57+
sql += ` where schema ${filter}`
4058
}
4159
if (limit) {
42-
sql = `${sql} LIMIT ${limit}`
60+
sql += ` limit ${limit}`
4361
}
4462
if (offset) {
45-
sql = `${sql} OFFSET ${offset}`
63+
sql += ` offset ${offset}`
4664
}
4765
return await this.query(sql)
4866
}
@@ -65,7 +83,9 @@ export default class PostgresMetaTables {
6583
schema?: string
6684
}): Promise<PostgresMetaResult<PostgresTable>> {
6785
if (id) {
68-
const sql = `${enrichedTablesSql} WHERE tables.id = ${literal(id)};`
86+
const sql = `${generateEnrichedTablesSql({
87+
includeColumns: true,
88+
})} where tables.id = ${literal(id)};`
6989
const { data, error } = await this.query(sql)
7090
if (error) {
7191
return { data, error }
@@ -75,9 +95,9 @@ export default class PostgresMetaTables {
7595
return { data: data[0], error }
7696
}
7797
} else if (name) {
78-
const sql = `${enrichedTablesSql} WHERE tables.name = ${literal(
79-
name
80-
)} AND tables.schema = ${literal(schema)};`
98+
const sql = `${generateEnrichedTablesSql({
99+
includeColumns: true,
100+
})} where tables.name = ${literal(name)} and tables.schema = ${literal(schema)};`
81101
const { data, error } = await this.query(sql)
82102
if (error) {
83103
return { data, error }
@@ -227,18 +247,18 @@ COMMIT;`
227247
}
228248
}
229249

230-
const enrichedTablesSql = `
231-
WITH tables AS (${tablesSql}),
232-
columns AS (${columnsSql}),
233-
primary_keys AS (${primaryKeysSql}),
234-
relationships AS (${relationshipsSql})
235-
SELECT
236-
*,
237-
${coalesceRowsToArray('columns', 'columns.table_id = tables.id')},
238-
${coalesceRowsToArray('primary_keys', 'primary_keys.table_id = tables.id')},
239-
${coalesceRowsToArray(
250+
const generateEnrichedTablesSql = ({ includeColumns }: { includeColumns: boolean }) => `
251+
with tables as (${tablesSql})
252+
${includeColumns ? `, columns as (${columnsSql})` : ''}
253+
, primary_keys as (${primaryKeysSql})
254+
, relationships as (${relationshipsSql})
255+
select
256+
*
257+
${includeColumns ? `, ${coalesceRowsToArray('columns', 'columns.table_id = tables.id')}` : ''}
258+
, ${coalesceRowsToArray('primary_keys', 'primary_keys.table_id = tables.id')}
259+
, ${coalesceRowsToArray(
240260
'relationships',
241261
`(relationships.source_schema = tables.schema AND relationships.source_table_name = tables.name)
242262
OR (relationships.target_table_schema = tables.schema AND relationships.target_table_name = tables.name)`
243263
)}
244-
FROM tables`
264+
from tables`

src/lib/PostgresMetaViews.ts

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,60 @@ export default class PostgresMetaViews {
1010
this.query = query
1111
}
1212

13+
async list(options: {
14+
includeSystemSchemas?: boolean
15+
includedSchemas?: string[]
16+
excludedSchemas?: string[]
17+
limit?: number
18+
offset?: number
19+
includeColumns: false
20+
}): Promise<PostgresMetaResult<(PostgresView & { columns: never })[]>>
21+
async list(options?: {
22+
includeSystemSchemas?: boolean
23+
includedSchemas?: string[]
24+
excludedSchemas?: string[]
25+
limit?: number
26+
offset?: number
27+
includeColumns?: boolean
28+
}): Promise<PostgresMetaResult<(PostgresView & { columns: unknown[] })[]>>
1329
async list({
1430
includeSystemSchemas = false,
1531
includedSchemas,
1632
excludedSchemas,
1733
limit,
1834
offset,
35+
includeColumns = true,
1936
}: {
2037
includeSystemSchemas?: boolean
2138
includedSchemas?: string[]
2239
excludedSchemas?: string[]
2340
limit?: number
2441
offset?: number
42+
includeColumns?: boolean
2543
} = {}): Promise<PostgresMetaResult<PostgresView[]>> {
26-
let sql = enrichedViewsSql
44+
let sql = generateEnrichedViewsSql({ includeColumns })
2745
const filter = filterByList(
2846
includedSchemas,
2947
excludedSchemas,
3048
!includeSystemSchemas ? DEFAULT_SYSTEM_SCHEMAS : undefined
3149
)
3250
if (filter) {
33-
sql += ` WHERE schema ${filter}`
51+
sql += ` where schema ${filter}`
3452
}
3553
if (limit) {
36-
sql = `${sql} LIMIT ${limit}`
54+
sql += ` limit ${limit}`
3755
}
3856
if (offset) {
39-
sql = `${sql} OFFSET ${offset}`
57+
sql += ` offset ${offset}`
4058
}
4159
return await this.query(sql)
4260
}
4361
}
4462

45-
const enrichedViewsSql = `
46-
WITH views AS (${viewsSql}),
47-
columns AS (${columnsSql})
48-
SELECT
49-
*,
50-
${coalesceRowsToArray('columns', 'columns.table_id = views.id')}
51-
FROM views`
63+
const generateEnrichedViewsSql = ({ includeColumns }: { includeColumns: boolean }) => `
64+
with views as (${viewsSql})
65+
${includeColumns ? `, columns as (${columnsSql})` : ''}
66+
select
67+
*
68+
${includeColumns ? `, ${coalesceRowsToArray('columns', 'columns.table_id = views.id')}` : ''}
69+
from views`

src/lib/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export const postgresForeignTableSchema = Type.Object({
8080
schema: Type.String(),
8181
name: Type.String(),
8282
comment: Type.Union([Type.String(), Type.Null()]),
83-
columns: Type.Array(postgresColumnSchema),
83+
columns: Type.Optional(Type.Array(postgresColumnSchema)),
8484
})
8585
export type PostgresForeignTable = Static<typeof postgresForeignTableSchema>
8686

@@ -289,7 +289,7 @@ export const postgresTableSchema = Type.Object({
289289
live_rows_estimate: Type.Integer(),
290290
dead_rows_estimate: Type.Integer(),
291291
comment: Type.Union([Type.String(), Type.Null()]),
292-
columns: Type.Array(postgresColumnSchema),
292+
columns: Type.Optional(Type.Array(postgresColumnSchema)),
293293
primary_keys: Type.Array(postgresPrimaryKeySchema),
294294
relationships: Type.Array(postgresRelationshipSchema),
295295
})
@@ -377,6 +377,6 @@ export const postgresViewSchema = Type.Object({
377377
name: Type.String(),
378378
is_updatable: Type.Boolean(),
379379
comment: Type.Union([Type.String(), Type.Null()]),
380-
columns: Type.Array(postgresColumnSchema),
380+
columns: Type.Optional(Type.Array(postgresColumnSchema)),
381381
})
382382
export type PostgresView = Static<typeof postgresViewSchema>

src/server/routes/foreign-tables.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const route: FastifyPluginAsyncTypebox = async (fastify) => {
1616
querystring: Type.Object({
1717
limit: Type.Optional(Type.Integer()),
1818
offset: Type.Optional(Type.Integer()),
19+
include_columns: Type.Optional(Type.Boolean()),
1920
}),
2021
response: {
2122
200: Type.Array(postgresForeignTableSchema),
@@ -29,9 +30,10 @@ const route: FastifyPluginAsyncTypebox = async (fastify) => {
2930
const connectionString = request.headers.pg
3031
const limit = request.query.limit
3132
const offset = request.query.offset
33+
const includeColumns = request.query.include_columns
3234

3335
const pgMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
34-
const { data, error } = await pgMeta.foreignTables.list({ limit, offset })
36+
const { data, error } = await pgMeta.foreignTables.list({ limit, offset, includeColumns })
3537
await pgMeta.end()
3638
if (error) {
3739
request.log.error({ error, request: extractRequestForLogging(request) })

src/server/routes/tables.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const route: FastifyPluginAsyncTypebox = async (fastify) => {
2424
excluded_schemas: Type.Optional(Type.String()),
2525
limit: Type.Optional(Type.Integer()),
2626
offset: Type.Optional(Type.Integer()),
27+
include_columns: Type.Optional(Type.Boolean()),
2728
}),
2829
response: {
2930
200: Type.Array(postgresTableSchema),
@@ -40,6 +41,7 @@ const route: FastifyPluginAsyncTypebox = async (fastify) => {
4041
const excludedSchemas = request.query.excluded_schemas?.split(',')
4142
const limit = request.query.limit
4243
const offset = request.query.offset
44+
const includeColumns = request.query.include_columns
4345

4446
const pgMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
4547
const { data, error } = await pgMeta.tables.list({
@@ -48,6 +50,7 @@ const route: FastifyPluginAsyncTypebox = async (fastify) => {
4850
excludedSchemas,
4951
limit,
5052
offset,
53+
includeColumns,
5154
})
5255
await pgMeta.end()
5356
if (error) {

src/server/routes/views.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const route: FastifyPluginAsyncTypebox = async (fastify) => {
2020
excluded_schemas: Type.Optional(Type.String()),
2121
limit: Type.Optional(Type.Integer()),
2222
offset: Type.Optional(Type.Integer()),
23+
include_columns: Type.Optional(Type.Boolean()),
2324
}),
2425
response: {
2526
200: Type.Array(postgresViewSchema),
@@ -36,6 +37,7 @@ const route: FastifyPluginAsyncTypebox = async (fastify) => {
3637
const excludedSchemas = request.query.excluded_schemas?.split(',')
3738
const limit = request.query.limit
3839
const offset = request.query.offset
40+
const includeColumns = request.query.include_columns
3941

4042
const pgMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
4143
const { data, error } = await pgMeta.views.list({
@@ -44,6 +46,7 @@ const route: FastifyPluginAsyncTypebox = async (fastify) => {
4446
excludedSchemas,
4547
limit,
4648
offset,
49+
includeColumns,
4750
})
4851
await pgMeta.end()
4952
if (error) {

src/server/templates/typescript.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export const apply = ({
1616
arrayTypes,
1717
}: {
1818
schemas: PostgresSchema[]
19-
tables: PostgresTable[]
20-
views: PostgresView[]
19+
tables: (PostgresTable & { columns: unknown[] })[]
20+
views: (PostgresView & { columns: unknown[] })[]
2121
functions: PostgresFunction[]
2222
types: PostgresType[]
2323
arrayTypes: PostgresType[]

0 commit comments

Comments
 (0)