-
-
Notifications
You must be signed in to change notification settings - Fork 137
/
Copy pathPostgresMetaIndexes.ts
85 lines (80 loc) · 2.07 KB
/
PostgresMetaIndexes.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import { ident, literal } from 'pg-format'
import { DEFAULT_SYSTEM_SCHEMAS } from './constants.js'
import { filterByList } from './helpers.js'
import indexesSql from './sql/indexes.sql'
import { PostgresMetaResult, PostgresIndex } from './types.js'
export default class PostgresMetaFunctions {
query: (sql: string) => Promise<PostgresMetaResult<any>>
constructor(query: (sql: string) => Promise<PostgresMetaResult<any>>) {
this.query = query
}
async list({
includeSystemSchemas = false,
includedSchemas,
excludedSchemas,
limit,
offset,
}: {
includeSystemSchemas?: boolean
includedSchemas?: string[]
excludedSchemas?: string[]
limit?: number
offset?: number
} = {}): Promise<PostgresMetaResult<PostgresIndex[]>> {
let sql = enrichedSql
const filter = filterByList(
includedSchemas,
excludedSchemas,
!includeSystemSchemas ? DEFAULT_SYSTEM_SCHEMAS : undefined
)
if (filter) {
sql += ` WHERE schema ${filter}`
}
if (limit) {
sql = `${sql} LIMIT ${limit}`
}
if (offset) {
sql = `${sql} OFFSET ${offset}`
}
return await this.query(sql)
}
async retrieve({ id }: { id: number }): Promise<PostgresMetaResult<PostgresIndex>>
async retrieve({
name,
schema,
args,
}: {
name: string
schema: string
args: string[]
}): Promise<PostgresMetaResult<PostgresIndex>>
async retrieve({
id,
args = [],
}: {
id?: number
args?: string[]
}): Promise<PostgresMetaResult<PostgresIndex>> {
if (id) {
const sql = `${enrichedSql} WHERE id = ${literal(id)};`
const { data, error } = await this.query(sql)
if (error) {
return { data, error }
} else if (data.length === 0) {
return { data: null, error: { message: `Cannot find a index with ID ${id}` } }
} else {
return { data: data[0], error }
}
} else {
return { data: null, error: { message: 'Invalid parameters on function retrieve' } }
}
}
}
const enrichedSql = `
WITH x AS (
${indexesSql}
)
SELECT
x.*
FROM x
`