Skip to content

Commit 7d532a3

Browse files
committed
perf: add root level filtering to all queries
1 parent c4e1fb1 commit 7d532a3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+273
-277
lines changed

src/lib/PostgresMetaConfig.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CONFIG_SQL } from './sql/index.js'
1+
import { CONFIG_SQL } from './sql/config.sql.js'
22
import { PostgresMetaResult, PostgresConfig } from './types.js'
33

44
export default class PostgresMetaConfig {
@@ -15,7 +15,7 @@ export default class PostgresMetaConfig {
1515
limit?: number
1616
offset?: number
1717
} = {}): Promise<PostgresMetaResult<PostgresConfig[]>> {
18-
let sql = CONFIG_SQL({ limit, offset })
18+
const sql = CONFIG_SQL({ limit, offset })
1919
return await this.query(sql)
2020
}
2121
}

src/lib/PostgresMetaExtensions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ident, literal } from 'pg-format'
22
import { PostgresMetaResult, PostgresExtension } from './types.js'
3-
import { EXTENSIONS_SQL } from './sql/index.js'
3+
import { EXTENSIONS_SQL } from './sql/extensions.sql.js'
44
import { filterByValue } from './helpers.js'
55

66
export default class PostgresMetaExtensions {

src/lib/PostgresMetaForeignTables.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,8 @@ export default class PostgresMetaForeignTables {
3737
offset?: number
3838
includeColumns?: boolean
3939
} = {}): Promise<PostgresMetaResult<PostgresForeignTable[]>> {
40-
const filter = filterByList(includedSchemas, excludedSchemas)
41-
let sql = generateEnrichedForeignTablesSql({ includeColumns, schemaFilter: filter })
42-
if (limit) {
43-
sql += ` limit ${limit}`
44-
}
45-
if (offset) {
46-
sql += ` offset ${offset}`
47-
}
40+
const schemaFilter = filterByList(includedSchemas, excludedSchemas)
41+
const sql = generateEnrichedForeignTablesSql({ includeColumns, schemaFilter, limit, offset })
4842
return await this.query(sql)
4943
}
5044

@@ -65,7 +59,6 @@ export default class PostgresMetaForeignTables {
6559
name?: string
6660
schema?: string
6761
}): Promise<PostgresMetaResult<PostgresForeignTable>> {
68-
const schemaFilter = schema ? filterByList([schema], []) : undefined
6962
if (id) {
7063
const idsFilter = filterByValue([`${id}`])
7164
const sql = generateEnrichedForeignTablesSql({
@@ -84,7 +77,6 @@ export default class PostgresMetaForeignTables {
8477
const nameFilter = filterByValue([`${schema}.${name}`])
8578
const sql = generateEnrichedForeignTablesSql({
8679
includeColumns: true,
87-
schemaFilter,
8880
tableIdentifierFilter: nameFilter,
8981
})
9082
const { data, error } = await this.query(sql)
@@ -109,13 +101,17 @@ const generateEnrichedForeignTablesSql = ({
109101
schemaFilter,
110102
idsFilter,
111103
tableIdentifierFilter,
104+
limit,
105+
offset,
112106
}: {
113107
includeColumns: boolean
114108
schemaFilter?: string
115109
idsFilter?: string
116110
tableIdentifierFilter?: string
111+
limit?: number
112+
offset?: number
117113
}) => `
118-
with foreign_tables as (${FOREIGN_TABLES_SQL({ schemaFilter, tableIdentifierFilter })})
114+
with foreign_tables as (${FOREIGN_TABLES_SQL({ schemaFilter, tableIdentifierFilter, limit, offset })})
119115
${includeColumns ? `, columns as (${COLUMNS_SQL({ schemaFilter, tableIdentifierFilter, tableIdFilter: idsFilter })})` : ''}
120116
select
121117
*

src/lib/PostgresMetaFunctions.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ident, literal } from 'pg-format'
22
import { DEFAULT_SYSTEM_SCHEMAS } from './constants.js'
33
import { filterByList, filterByValue } from './helpers.js'
44
import { PostgresMetaResult, PostgresFunction, PostgresFunctionCreate } from './types.js'
5-
import { FUNCTIONS_SQL } from './sql/index.js'
5+
import { FUNCTIONS_SQL } from './sql/functions.sql.js'
66

77
export default class PostgresMetaFunctions {
88
query: (sql: string) => Promise<PostgresMetaResult<any>>
@@ -29,7 +29,7 @@ export default class PostgresMetaFunctions {
2929
excludedSchemas,
3030
!includeSystemSchemas ? DEFAULT_SYSTEM_SCHEMAS : undefined
3131
)
32-
let sql = FUNCTIONS_SQL({ schemaFilter, limit, offset })
32+
const sql = FUNCTIONS_SQL({ schemaFilter, limit, offset })
3333
return await this.query(sql)
3434
}
3535

@@ -56,7 +56,7 @@ export default class PostgresMetaFunctions {
5656
}): Promise<PostgresMetaResult<PostgresFunction>> {
5757
const schemaFilter = schema ? filterByList([schema], []) : undefined
5858
if (id) {
59-
const idsFilter = filterByValue([`${id}`])
59+
const idsFilter = filterByValue([id])
6060
const sql = FUNCTIONS_SQL({ idsFilter })
6161
const { data, error } = await this.query(sql)
6262
if (error) {

src/lib/PostgresMetaIndexes.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { literal } from 'pg-format'
21
import { DEFAULT_SYSTEM_SCHEMAS } from './constants.js'
3-
import { filterByList } from './helpers.js'
2+
import { filterByList, filterByValue } from './helpers.js'
43
import { PostgresMetaResult, PostgresIndex } from './types.js'
5-
import { INDEXES_SQL } from './sql/index.js'
4+
import { INDEXES_SQL } from './sql/indexes.sql.js'
65

76
export default class PostgresMetaIndexes {
87
query: (sql: string) => Promise<PostgresMetaResult<any>>
@@ -29,7 +28,7 @@ export default class PostgresMetaIndexes {
2928
excludedSchemas,
3029
!includeSystemSchemas ? DEFAULT_SYSTEM_SCHEMAS : undefined
3130
)
32-
let sql = INDEXES_SQL({ schemaFilter, limit, offset })
31+
const sql = INDEXES_SQL({ schemaFilter, limit, offset })
3332
return await this.query(sql)
3433
}
3534

@@ -45,13 +44,13 @@ export default class PostgresMetaIndexes {
4544
}): Promise<PostgresMetaResult<PostgresIndex>>
4645
async retrieve({
4746
id,
48-
args = [],
4947
}: {
5048
id?: number
5149
args?: string[]
5250
}): Promise<PostgresMetaResult<PostgresIndex>> {
5351
if (id) {
54-
const sql = `${INDEXES_SQL({})} WHERE id = ${literal(id)};`
52+
const idsFilter = filterByValue([id])
53+
const sql = INDEXES_SQL({ idsFilter })
5554
const { data, error } = await this.query(sql)
5655
if (error) {
5756
return { data, error }

src/lib/PostgresMetaMaterializedViews.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { literal } from 'pg-format'
2-
import { filterByList, coalesceRowsToArray } from './helpers.js'
1+
import { filterByList, coalesceRowsToArray, filterByValue } from './helpers.js'
32
import { PostgresMetaResult, PostgresMaterializedView } from './types.js'
4-
import { MATERIALIZED_VIEWS_SQL, COLUMNS_SQL } from './sql/index.js'
3+
import { MATERIALIZED_VIEWS_SQL } from './sql/materialized_views.sql.js'
4+
import { COLUMNS_SQL } from './sql/columns.sql.js'
55

66
export default class PostgresMetaMaterializedViews {
77
query: (sql: string) => Promise<PostgresMetaResult<any>>
@@ -45,12 +45,12 @@ export default class PostgresMetaMaterializedViews {
4545
name?: string
4646
schema?: string
4747
}): Promise<PostgresMetaResult<PostgresMaterializedView>> {
48-
const schemaFilter = schema ? filterByList([schema], []) : undefined
4948
if (id) {
50-
const sql = `${generateEnrichedMaterializedViewsSql({
49+
const idsFilter = filterByValue([id])
50+
const sql = generateEnrichedMaterializedViewsSql({
5151
includeColumns: true,
52-
schemaFilter,
53-
})} where materialized_views.id = ${literal(id)};`
52+
idsFilter,
53+
})
5454
const { data, error } = await this.query(sql)
5555
if (error) {
5656
return { data, error }
@@ -60,12 +60,11 @@ export default class PostgresMetaMaterializedViews {
6060
return { data: data[0], error }
6161
}
6262
} else if (name) {
63-
const sql = `${generateEnrichedMaterializedViewsSql({
63+
const materializedViewIdentifierFilter = filterByValue([`${schema}.${name}`])
64+
const sql = generateEnrichedMaterializedViewsSql({
6465
includeColumns: true,
65-
schemaFilter,
66-
})} where materialized_views.name = ${literal(
67-
name
68-
)} and materialized_views.schema = ${literal(schema)};`
66+
materializedViewIdentifierFilter,
67+
})
6968
const { data, error } = await this.query(sql)
7069
if (error) {
7170
return { data, error }
@@ -86,16 +85,20 @@ export default class PostgresMetaMaterializedViews {
8685
const generateEnrichedMaterializedViewsSql = ({
8786
includeColumns,
8887
schemaFilter,
88+
materializedViewIdentifierFilter,
89+
idsFilter,
8990
limit,
9091
offset,
9192
}: {
9293
includeColumns: boolean
9394
schemaFilter?: string
95+
materializedViewIdentifierFilter?: string
96+
idsFilter?: string
9497
limit?: number
9598
offset?: number
9699
}) => `
97-
with materialized_views as (${MATERIALIZED_VIEWS_SQL({ schemaFilter, limit, offset })})
98-
${includeColumns ? `, columns as (${COLUMNS_SQL({ schemaFilter, limit, offset })}` : ''}
100+
with materialized_views as (${MATERIALIZED_VIEWS_SQL({ schemaFilter, limit, offset, materializedViewIdentifierFilter, idsFilter })})
101+
${includeColumns ? `, columns as (${COLUMNS_SQL({ schemaFilter, limit, offset, tableIdentifierFilter: materializedViewIdentifierFilter, tableIdFilter: idsFilter })})` : ''}
99102
select
100103
*
101104
${

src/lib/PostgresMetaPolicies.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ident } from 'pg-format'
22
import { DEFAULT_SYSTEM_SCHEMAS } from './constants.js'
33
import { filterByList, filterByValue } from './helpers.js'
44
import { PostgresMetaResult, PostgresPolicy } from './types.js'
5-
import { POLICIES_SQL } from './sql/index.js'
5+
import { POLICIES_SQL } from './sql/policies.sql.js'
66

77
export default class PostgresMetaPolicies {
88
query: (sql: string) => Promise<PostgresMetaResult<any>>

src/lib/PostgresMetaPublications.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ident, literal } from 'pg-format'
22
import { PostgresMetaResult, PostgresPublication } from './types.js'
3-
import { PUBLICATIONS_SQL } from './sql/index.js'
3+
import { PUBLICATIONS_SQL } from './sql/publications.sql.js'
4+
import { filterByValue } from './helpers.js'
45

56
export default class PostgresMetaPublications {
67
query: (sql: string) => Promise<PostgresMetaResult<any>>
@@ -30,7 +31,8 @@ export default class PostgresMetaPublications {
3031
name?: string
3132
}): Promise<PostgresMetaResult<PostgresPublication>> {
3233
if (id) {
33-
const sql = `${PUBLICATIONS_SQL({})} WHERE p.oid = ${literal(id)};`
34+
const idsFilter = filterByValue([id])
35+
const sql = PUBLICATIONS_SQL({ idsFilter })
3436
const { data, error } = await this.query(sql)
3537
if (error) {
3638
return { data, error }
@@ -40,7 +42,8 @@ export default class PostgresMetaPublications {
4042
return { data: data[0], error }
4143
}
4244
} else if (name) {
43-
const sql = `${PUBLICATIONS_SQL({})} WHERE p.pubname = ${literal(name)};`
45+
const nameFilter = filterByValue([name])
46+
const sql = PUBLICATIONS_SQL({ nameFilter })
4447
const { data, error } = await this.query(sql)
4548
if (error) {
4649
return { data, error }

src/lib/PostgresMetaRelationships.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ export default class PostgresMetaRelationships {
2424
includedSchemas?: string[]
2525
excludedSchemas?: string[]
2626
} = {}): Promise<PostgresMetaResult<PostgresRelationship[]>> {
27-
const filter = filterByList(
27+
const schemaFilter = filterByList(
2828
includedSchemas,
2929
excludedSchemas,
3030
!includeSystemSchemas ? DEFAULT_SYSTEM_SCHEMAS : undefined
3131
)
3232
let allTableM2oAndO2oRelationships: PostgresRelationship[]
3333
{
34-
const sql = TABLE_RELATIONSHIPS_SQL(filter)
34+
const sql = TABLE_RELATIONSHIPS_SQL({ schemaFilter })
3535
const { data, error } = (await this.query(sql)) as PostgresMetaResult<PostgresRelationship[]>
3636
if (error) {
3737
return { data: null, error }
@@ -59,8 +59,9 @@ export default class PostgresMetaRelationships {
5959
column_dependencies: ColDep[]
6060
}
6161

62+
const viewsKeyDependenciesSql = VIEWS_KEY_DEPENDENCIES_SQL({ schemaFilter })
6263
const { data: viewsKeyDependencies, error } = (await this.query(
63-
VIEWS_KEY_DEPENDENCIES_SQL(filter)
64+
viewsKeyDependenciesSql
6465
)) as PostgresMetaResult<KeyDep[]>
6566
if (error) {
6667
return { data: null, error }

src/lib/PostgresMetaRoles.ts

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { ident, literal } from 'pg-format'
2-
import { ROLES_SQL } from './sql/index.js'
2+
import { ROLES_SQL } from './sql/roles.sql.js'
33
import {
44
PostgresMetaResult,
55
PostgresRole,
66
PostgresRoleCreate,
77
PostgresRoleUpdate,
88
} from './types.js'
9+
import { filterByValue } from './helpers.js'
910
export function changeRoleConfig2Object(config: string[]) {
1011
if (!config) {
1112
return null
@@ -32,26 +33,7 @@ export default class PostgresMetaRoles {
3233
limit?: number
3334
offset?: number
3435
} = {}): Promise<PostgresMetaResult<PostgresRole[]>> {
35-
let sql = `
36-
WITH
37-
roles AS (${ROLES_SQL({ limit, offset })})
38-
SELECT
39-
*
40-
FROM
41-
roles
42-
WHERE
43-
true`
44-
if (!includeDefaultRoles) {
45-
// All default/predefined roles start with pg_: https://www.postgresql.org/docs/15/predefined-roles.html
46-
// The pg_ prefix is also reserved:
47-
//
48-
// ```
49-
// postgres=# create role pg_mytmp;
50-
// ERROR: role name "pg_mytmp" is reserved
51-
// DETAIL: Role names starting with "pg_" are reserved.
52-
// ```
53-
sql += ` AND NOT pg_catalog.starts_with(name, 'pg_')`
54-
}
36+
const sql = ROLES_SQL({ limit, offset, includeDefaultRoles })
5537
const result = await this.query(sql)
5638
if (result.data) {
5739
result.data = result.data.map((role: any) => {
@@ -72,7 +54,8 @@ WHERE
7254
name?: string
7355
}): Promise<PostgresMetaResult<PostgresRole>> {
7456
if (id) {
75-
const sql = `${ROLES_SQL({})} WHERE oid = ${literal(id)};`
57+
const idsFilter = filterByValue([id])
58+
const sql = ROLES_SQL({ idsFilter })
7659
const { data, error } = await this.query(sql)
7760

7861
if (error) {
@@ -84,7 +67,8 @@ WHERE
8467
return { data: data[0], error }
8568
}
8669
} else if (name) {
87-
const sql = `${ROLES_SQL({})} WHERE rolname = ${literal(name)};`
70+
const nameFilter = filterByValue([name])
71+
const sql = ROLES_SQL({ nameFilter })
8872
const { data, error } = await this.query(sql)
8973
if (error) {
9074
return { data, error }

0 commit comments

Comments
 (0)