@antelopejs/postgres 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/config.d.ts +5 -0
  2. package/dist/config.js +1 -0
  3. package/dist/config.js.map +1 -1
  4. package/dist/implementations/catalog/index.d.ts +7 -0
  5. package/dist/implementations/catalog/index.js +60 -0
  6. package/dist/implementations/catalog/index.js.map +1 -0
  7. package/dist/implementations/database/ddl.d.ts +1 -0
  8. package/dist/implementations/database/ddl.js +13 -4
  9. package/dist/implementations/database/ddl.js.map +1 -1
  10. package/dist/implementations/database/duplicate-key.d.ts +2 -0
  11. package/dist/implementations/database/duplicate-key.js +49 -0
  12. package/dist/implementations/database/duplicate-key.js.map +1 -0
  13. package/dist/implementations/database/external-catalog.d.ts +15 -0
  14. package/dist/implementations/database/external-catalog.js +22 -8
  15. package/dist/implementations/database/external-catalog.js.map +1 -1
  16. package/dist/implementations/database/external-column-profile.d.ts +18 -0
  17. package/dist/implementations/database/external-column-profile.js +223 -0
  18. package/dist/implementations/database/external-column-profile.js.map +1 -0
  19. package/dist/implementations/database/external-declarations.d.ts +9 -0
  20. package/dist/implementations/database/external-declarations.js +67 -0
  21. package/dist/implementations/database/external-declarations.js.map +1 -0
  22. package/dist/implementations/database/external-discovery.d.ts +39 -0
  23. package/dist/implementations/database/external-discovery.js +219 -0
  24. package/dist/implementations/database/external-discovery.js.map +1 -0
  25. package/dist/implementations/database/external-measures.d.ts +11 -0
  26. package/dist/implementations/database/external-measures.js +82 -0
  27. package/dist/implementations/database/external-measures.js.map +1 -0
  28. package/dist/implementations/database/external-profile.d.ts +4 -0
  29. package/dist/implementations/database/external-profile.js +129 -0
  30. package/dist/implementations/database/external-profile.js.map +1 -0
  31. package/dist/implementations/database/external-reference.d.ts +2 -0
  32. package/dist/implementations/database/external-reference.js +49 -0
  33. package/dist/implementations/database/external-reference.js.map +1 -0
  34. package/dist/implementations/database/external-rows.d.ts +2 -0
  35. package/dist/implementations/database/external-rows.js +81 -0
  36. package/dist/implementations/database/external-rows.js.map +1 -0
  37. package/dist/implementations/database/external-sample.d.ts +9 -0
  38. package/dist/implementations/database/external-sample.js +29 -0
  39. package/dist/implementations/database/external-sample.js.map +1 -0
  40. package/dist/implementations/database/external-schema.js +1 -11
  41. package/dist/implementations/database/external-schema.js.map +1 -1
  42. package/dist/implementations/database/external-types.d.ts +9 -1
  43. package/dist/implementations/database/external-types.js +14 -0
  44. package/dist/implementations/database/external-types.js.map +1 -1
  45. package/dist/implementations/database/query.js +16 -6
  46. package/dist/implementations/database/query.js.map +1 -1
  47. package/dist/implementations/database/schema.d.ts +1 -0
  48. package/dist/implementations/database/schema.js +16 -0
  49. package/dist/implementations/database/schema.js.map +1 -1
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.js +1 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/test/antelope.test.js +1 -0
  54. package/dist/test/antelope.test.js.map +1 -1
  55. package/dist/test/catalog-owned.test.d.ts +1 -0
  56. package/dist/test/catalog-owned.test.js +17 -0
  57. package/dist/test/catalog-owned.test.js.map +1 -0
  58. package/dist/test/duplicate-key.test.d.ts +1 -0
  59. package/dist/test/duplicate-key.test.js +100 -0
  60. package/dist/test/duplicate-key.test.js.map +1 -0
  61. package/dist/test/unit/ddl.spec.js +39 -0
  62. package/dist/test/unit/ddl.spec.js.map +1 -1
  63. package/dist/test/unit/external-comparisons.spec.js +2 -0
  64. package/dist/test/unit/external-comparisons.spec.js.map +1 -1
  65. package/dist/test/unit/external-types.spec.js +37 -0
  66. package/dist/test/unit/external-types.spec.js.map +1 -1
  67. package/dist/test-external/catalog.test.d.ts +1 -0
  68. package/dist/test-external/catalog.test.js +348 -0
  69. package/dist/test-external/catalog.test.js.map +1 -0
  70. package/dist/test-external/fixture.d.ts +1 -0
  71. package/dist/test-external/fixture.js +28 -1
  72. package/dist/test-external/fixture.js.map +1 -1
  73. package/package.json +5 -3
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Profiled = Profiled;
4
+ exports.ProfileColumn = ProfileColumn;
5
+ const external_measures_1 = require("./external-measures");
6
+ const external_sample_1 = require("./external-sample");
7
+ const external_declarations_1 = require("./external-declarations");
8
+ const external_types_1 = require("./external-types");
9
+ const sql_1 = require("./sql");
10
+ const CATEGORY_LIMIT = 25;
11
+ const CATEGORY_MIN_ROWS = 5;
12
+ const ENUM_LIKE_MIN_ROWS = 100;
13
+ const MONTH_LIMIT = 36;
14
+ const LABEL_DISTINCT_SHARE = 0.9;
15
+ const LABEL_MAX_LENGTH = 80;
16
+ const TIME_AXIS_FILLED_SHARE = 0.9;
17
+ const TIME_AXIS_MIN_MONTHS = 3;
18
+ const MONTHS_PER_YEAR = 12;
19
+ const TEXT_FAMILIES = ["text", "citext", "bpchar"];
20
+ const CATEGORY_FAMILIES = [
21
+ ...TEXT_FAMILIES,
22
+ "enum",
23
+ "int",
24
+ "int8",
25
+ "bool",
26
+ ];
27
+ const RANGED_KINDS = ["float", "timestamp"];
28
+ const DISTINCT_KINDS = [
29
+ "text",
30
+ "float",
31
+ "bool",
32
+ "timestamp",
33
+ ];
34
+ function Profiled(column) {
35
+ const family = (0, external_types_1.FamilyOf)(column);
36
+ const [proposed] = (0, external_declarations_1.AcceptedDeclarations)(column);
37
+ if (!family || !proposed) {
38
+ return undefined;
39
+ }
40
+ return {
41
+ name: column.name,
42
+ family,
43
+ kind: proposed.kind,
44
+ quoted: `${external_sample_1.SOURCE_ALIAS}.${(0, sql_1.QuoteIdentifier)(column.name)}`,
45
+ };
46
+ }
47
+ function RangeExpression(column) {
48
+ if (column.family === "enum") {
49
+ return `(${column.quoted})`;
50
+ }
51
+ if (!RANGED_KINDS.includes(column.kind.kind)) {
52
+ return undefined;
53
+ }
54
+ return column.kind.kind === "timestamp"
55
+ ? InstantExpression(column)
56
+ : `(${column.quoted})::float8`;
57
+ }
58
+ const INSTANTS = {
59
+ timestamptz: (column) => column,
60
+ timestamp: (column) => `(${column} AT TIME ZONE 'UTC')`,
61
+ date: (column) => `((${column})::timestamp AT TIME ZONE 'UTC')`,
62
+ };
63
+ function InstantExpression(column) {
64
+ return (INSTANTS[column.family] ?? ((value) => value))(column.quoted);
65
+ }
66
+ function BaseSql(column, source) {
67
+ const range = RangeExpression(column);
68
+ const isText = TEXT_FAMILIES.includes(column.family);
69
+ const length = `length(${column.quoted})`;
70
+ return `SELECT (count(*) - count(${column.quoted}))::float8 AS nulls,
71
+ ${range ? `min(${range})` : "NULL"} AS min, ${range ? `max(${range})` : "NULL"} AS max,
72
+ ${isText ? `min(${length})` : "NULL"}::float8 AS "minLength",
73
+ ${isText ? `avg(${length})` : "NULL"}::float8 AS "avgLength",
74
+ ${isText ? `max(${length})` : "NULL"}::float8 AS "maxLength"
75
+ FROM ${source.from}`;
76
+ }
77
+ function RangeValue(column, row) {
78
+ if (row.min === null || row.max === null) {
79
+ return undefined;
80
+ }
81
+ return { min: RangeEnd(row.min), max: RangeEnd(row.max) };
82
+ }
83
+ function RangeEnd(value) {
84
+ return value instanceof Date ? value.toISOString() : value;
85
+ }
86
+ function LengthValue(row) {
87
+ if (row.minLength === null ||
88
+ row.avgLength === null ||
89
+ row.maxLength === null) {
90
+ return undefined;
91
+ }
92
+ return { min: row.minLength, avg: row.avgLength, max: row.maxLength };
93
+ }
94
+ async function MeasureBase(session, column, source) {
95
+ const measured = await session.measure(BaseSql(column, source));
96
+ const base = { nulls: (0, external_measures_1.FirstRow)(measured, (row) => row.nulls) };
97
+ const row = (0, external_measures_1.ValueOf)(measured)?.[0];
98
+ if (RangeExpression(column)) {
99
+ base.range =
100
+ measured.status === "ok"
101
+ ? Present(row && RangeValue(column, row))
102
+ : measured;
103
+ }
104
+ if (TEXT_FAMILIES.includes(column.family)) {
105
+ base.length =
106
+ measured.status === "ok" ? Present(row && LengthValue(row)) : measured;
107
+ }
108
+ return base;
109
+ }
110
+ function Present(value) {
111
+ return value === undefined
112
+ ? { status: "error", code: "empty" }
113
+ : { status: "ok", value };
114
+ }
115
+ async function MeasureDistinct(session, column, source) {
116
+ if (!DISTINCT_KINDS.includes(column.kind.kind)) {
117
+ return undefined;
118
+ }
119
+ const measured = await session.measure(`SELECT count(DISTINCT ${column.quoted})::float8 AS distinct FROM ${source.from}`);
120
+ return (0, external_measures_1.FirstRow)(measured, (row) => row.distinct);
121
+ }
122
+ const CATEGORY_VALUES = {
123
+ int: (column) => `(${column})::float8`,
124
+ int8: (column) => `(${column})::float8`,
125
+ bool: (column) => column,
126
+ };
127
+ function CategoryValue(column) {
128
+ return (CATEGORY_VALUES[column.family] ?? ((value) => `(${value})::text`))(column.quoted);
129
+ }
130
+ function AsCategories(rows) {
131
+ const named = rows.filter((row) => row.rows >= CATEGORY_MIN_ROWS);
132
+ const other = rows
133
+ .filter((row) => row.rows < CATEGORY_MIN_ROWS)
134
+ .reduce((total, row) => total + row.rows, 0);
135
+ return {
136
+ values: named.map(({ value, rows: count }) => ({ value, rows: count })),
137
+ other,
138
+ };
139
+ }
140
+ async function MeasureCategories(session, column, source, distinct) {
141
+ const isCategorical = column.family === "enum" || (distinct ?? Infinity) <= CATEGORY_LIMIT;
142
+ if (!CATEGORY_FAMILIES.includes(column.family) || !isCategorical) {
143
+ return undefined;
144
+ }
145
+ const measured = await session.measure(`SELECT ${CategoryValue(column)} AS value, count(*)::float8 AS rows FROM ${source.from}
146
+ WHERE ${column.quoted} IS NOT NULL GROUP BY 1 ORDER BY 2 DESC, 1 LIMIT ${CATEGORY_LIMIT + 1}`);
147
+ return (0, external_measures_1.Mapped)(measured, AsCategories);
148
+ }
149
+ async function MeasureMonths(session, column, source) {
150
+ if (column.kind.kind !== "timestamp") {
151
+ return undefined;
152
+ }
153
+ const measured = await session.measure(`SELECT to_char(date_trunc('month', ${InstantExpression(column)} AT TIME ZONE 'UTC'), 'YYYY-MM') AS month,
154
+ count(*)::float8 AS rows FROM ${source.from}
155
+ WHERE ${column.quoted} IS NOT NULL GROUP BY 1 ORDER BY 1 DESC LIMIT ${MONTH_LIMIT}`);
156
+ return (0, external_measures_1.Mapped)(measured, (rows) => rows.reverse());
157
+ }
158
+ function MonthsSpanned(range) {
159
+ const start = new Date(String(range.min));
160
+ const end = new Date(String(range.max));
161
+ return ((end.getUTCFullYear() - start.getUTCFullYear()) * MONTHS_PER_YEAR +
162
+ end.getUTCMonth() -
163
+ start.getUTCMonth() +
164
+ 1);
165
+ }
166
+ function Filled(facts) {
167
+ const nulls = (0, external_measures_1.ValueOf)(facts.profile.nulls);
168
+ return facts.rows === undefined || nulls === undefined
169
+ ? undefined
170
+ : facts.rows - nulls;
171
+ }
172
+ const TRAIT_RULES = {
173
+ "enum-like": (facts) => facts.column.family === "enum" ||
174
+ (CATEGORY_FAMILIES.includes(facts.column.family) &&
175
+ ((0, external_measures_1.ValueOf)(facts.profile.distinct) ?? Infinity) <= CATEGORY_LIMIT &&
176
+ (facts.rows ?? 0) >= ENUM_LIKE_MIN_ROWS),
177
+ "identifier-like": (facts) => (facts.rows ?? 0) > 0 &&
178
+ (0, external_measures_1.ValueOf)(facts.profile.nulls) === 0 &&
179
+ (0, external_measures_1.ValueOf)(facts.profile.distinct) === facts.rows,
180
+ "label-candidate": (facts) => {
181
+ const filled = Filled(facts) ?? 0;
182
+ const distinct = (0, external_measures_1.ValueOf)(facts.profile.distinct) ?? 0;
183
+ const length = (0, external_measures_1.ValueOf)(facts.profile.length);
184
+ return (TEXT_FAMILIES.includes(facts.column.family) &&
185
+ filled > 0 &&
186
+ distinct >= LABEL_DISTINCT_SHARE * filled &&
187
+ length !== undefined &&
188
+ length.avg <= LABEL_MAX_LENGTH);
189
+ },
190
+ "time-axis": (facts) => {
191
+ const range = (0, external_measures_1.ValueOf)(facts.profile.range);
192
+ return (facts.column.kind.kind === "timestamp" &&
193
+ range !== undefined &&
194
+ (Filled(facts) ?? 0) >=
195
+ TIME_AXIS_FILLED_SHARE * (facts.rows ?? Infinity) &&
196
+ MonthsSpanned(range) >= TIME_AXIS_MIN_MONTHS);
197
+ },
198
+ measure: (facts) => facts.column.kind.kind === "float" &&
199
+ !facts.roles.keys.has(facts.column.name) &&
200
+ !facts.roles.references.has(facts.column.name),
201
+ };
202
+ function TraitsOf(facts) {
203
+ return Object.keys(TRAIT_RULES).filter((trait) => TRAIT_RULES[trait](facts));
204
+ }
205
+ async function ProfileColumn(session, column, source, rows, roles) {
206
+ const base = await MeasureBase(session, column, source);
207
+ const distinct = await MeasureDistinct(session, column, source);
208
+ const categories = await MeasureCategories(session, column, source, (0, external_measures_1.ValueOf)(distinct));
209
+ const months = await MeasureMonths(session, column, source);
210
+ const profile = { name: column.name, ...base, traits: [] };
211
+ if (distinct) {
212
+ profile.distinct = distinct;
213
+ }
214
+ if (categories) {
215
+ profile.categories = categories;
216
+ }
217
+ if (months) {
218
+ profile.months = months;
219
+ }
220
+ profile.traits = TraitsOf({ column, profile, rows, roles });
221
+ return profile;
222
+ }
223
+ //# sourceMappingURL=external-column-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-column-profile.js","sourceRoot":"","sources":["../../../src/implementations/database/external-column-profile.ts"],"names":[],"mappings":";;AAkFA,4BAYC;AAuPD,sCA4BC;AAtWD,2DAK6B;AAC7B,uDAA8D;AAC9D,mEAA+D;AAC/D,qDAA+D;AAC/D,+BAAwC;AAIxC,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAM,aAAa,GAA4B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC5E,MAAM,iBAAiB,GAA4B;IACjD,GAAG,aAAa;IAChB,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;CACP,CAAC;AACF,MAAM,YAAY,GAA+B,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxE,MAAM,cAAc,GAA+B;IACjD,MAAM;IACN,OAAO;IACP,MAAM;IACN,WAAW;CACZ,CAAC;AAiCF,SAAgB,QAAQ,CAAC,MAAqB;IAC5C,MAAM,MAAM,GAAG,IAAA,yBAAQ,EAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAA,4CAAoB,EAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM;QACN,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,GAAG,8BAAY,IAAI,IAAA,qBAAe,EAAC,MAAM,CAAC,IAAI,CAAC,EAAE;KAC1D,CAAC;AACJ,CAAC;AAGD,SAAS,eAAe,CAAC,MAAsB;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW;QACrC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC;AACnC,CAAC;AAED,MAAM,QAAQ,GAA8D;IAC1E,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM;IAC/B,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,sBAAsB;IACvD,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,kCAAkC;CAChE,CAAC;AAEF,SAAS,iBAAiB,CAAC,MAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,OAAO,CAAC,MAAsB,EAAE,MAAc;IACrD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,UAAU,MAAM,CAAC,MAAM,GAAG,CAAC;IAC1C,OAAO,4BAA4B,MAAM,CAAC,MAAM;MAC5C,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM;MAC5E,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;MAClC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;MAClC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;WAC7B,MAAM,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,UAAU,CACjB,MAAsB,EACtB,GAAY;IAEZ,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,QAAQ,CAAC,KAA6B;IAC7C,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,IACE,GAAG,CAAC,SAAS,KAAK,IAAI;QACtB,GAAG,CAAC,SAAS,KAAK,IAAI;QACtB,GAAG,CAAC,SAAS,KAAK,IAAI,EACtB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;AACxE,CAAC;AAQD,KAAK,UAAU,WAAW,CACxB,OAAuB,EACvB,MAAsB,EACtB,MAAc;IAEd,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAU,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,MAAM,IAAI,GAAiB,EAAE,KAAK,EAAE,IAAA,4BAAQ,EAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7E,MAAM,GAAG,GAAG,IAAA,2BAAO,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK;YACR,QAAQ,CAAC,MAAM,KAAK,IAAI;gBACtB,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACzC,CAAC,CAAC,QAAQ,CAAC;IACjB,CAAC;IACD,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM;YACT,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAI,KAAoB;IACtC,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;QACpC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAuB,EACvB,MAAsB,EACtB,MAAc;IAEd,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CACpC,yBAAyB,MAAM,CAAC,MAAM,8BAA8B,MAAM,CAAC,IAAI,EAAE,CAClF,CAAC;IACF,OAAO,IAAA,4BAAQ,EAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,eAAe,GAEjB;IACF,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,WAAW;IACtC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,WAAW;IACvC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM;CACzB,CAAC;AAEF,SAAS,aAAa,CAAC,MAAsB;IAC3C,OAAO,CACL,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAC1E,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC;AAGD,SAAS,YAAY,CAAC,IAAgB;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,iBAAiB,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI;SACf,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,iBAAiB,CAAC;SAC7C,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/C,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,KAAK;KACN,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAuB,EACvB,MAAsB,EACtB,MAAc,EACd,QAA4B;IAE5B,MAAM,aAAa,GACjB,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,cAAc,CAAC;IACvE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CACpC,UAAU,aAAa,CAAC,MAAM,CAAC,4CAA4C,MAAM,CAAC,IAAI;cAC5E,MAAM,CAAC,MAAM,oDAAoD,cAAc,GAAG,CAAC,EAAE,CAChG,CAAC;IACF,OAAO,IAAA,0BAAM,EAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAuB,EACvB,MAAsB,EACtB,MAAc;IAEd,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CACpC,sCAAsC,iBAAiB,CAAC,MAAM,CAAC;sCAC7B,MAAM,CAAC,IAAI;cACnC,MAAM,CAAC,MAAM,iDAAiD,WAAW,EAAE,CACtF,CAAC;IACF,OAAO,IAAA,0BAAM,EAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC;AAGD,SAAS,aAAa,CAAC,KAAiB;IACtC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,OAAO,CACL,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,eAAe;QACjE,GAAG,CAAC,WAAW,EAAE;QACjB,KAAK,CAAC,WAAW,EAAE;QACnB,CAAC,CACF,CAAC;AACJ,CAAC;AAiBD,SAAS,MAAM,CAAC,KAAiB;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAO,EAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;QACpD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;AACzB,CAAC;AAED,MAAM,WAAW,GAAmC;IAClD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CACrB,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM;QAC9B,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAC9C,CAAC,IAAA,2BAAO,EAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,cAAc;YAC/D,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,kBAAkB,CAAC;IAC5C,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC3B,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC;QACrB,IAAA,2BAAO,EAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,IAAA,2BAAO,EAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,IAAI;IAChD,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAA,2BAAO,EAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAA,2BAAO,EAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,CACL,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3C,MAAM,GAAG,CAAC;YACV,QAAQ,IAAI,oBAAoB,GAAG,MAAM;YACzC,MAAM,KAAK,SAAS;YACpB,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAC/B,CAAC;IACJ,CAAC;IACD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,IAAA,2BAAO,EAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW;YACtC,KAAK,KAAK,SAAS;YACnB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,sBAAsB,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC;YACnD,aAAa,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAC7C,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO;QAClC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;QACxC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;CACjD,CAAC;AAEF,SAAS,QAAQ,CAAC,KAAiB;IACjC,OAAQ,MAAM,CAAC,IAAI,CAAC,WAAW,CAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAClE,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAC1B,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,OAAuB,EACvB,MAAsB,EACtB,MAAc,EACd,IAAwB,EACxB,KAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACxC,OAAO,EACP,MAAM,EACN,MAAM,EACN,IAAA,2BAAO,EAAC,QAAQ,CAAC,CAClB,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAkB,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC1E,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CatalogColumn } from "./external-catalog";
2
+ import { type SqlType } from "./types";
3
+ export interface AcceptedDeclaration {
4
+ declared: string;
5
+ kind: SqlType;
6
+ lossy?: string;
7
+ }
8
+ export declare function AcceptedDeclarations(column: CatalogColumn): AcceptedDeclaration[];
9
+ export declare function UnsupportedReason(column: CatalogColumn): string;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AcceptedDeclarations = AcceptedDeclarations;
4
+ exports.UnsupportedReason = UnsupportedReason;
5
+ const external_types_1 = require("./external-types");
6
+ const types_1 = require("./types");
7
+ const PROPOSED_KIND = {
8
+ text: types_1.TEXT,
9
+ citext: types_1.TEXT,
10
+ bpchar: types_1.TEXT,
11
+ uuid: types_1.TEXT,
12
+ enum: types_1.TEXT,
13
+ rendered: types_1.TEXT,
14
+ int: types_1.FLOAT,
15
+ int8: types_1.FLOAT,
16
+ numeric: types_1.FLOAT,
17
+ float4: types_1.FLOAT,
18
+ float8: types_1.FLOAT,
19
+ bool: types_1.BOOL,
20
+ timestamptz: types_1.TIMESTAMP,
21
+ timestamp: types_1.TIMESTAMP,
22
+ date: types_1.TIMESTAMP,
23
+ jsonb: types_1.OPAQUE,
24
+ json: types_1.OPAQUE,
25
+ };
26
+ const SCALAR_KINDS = [types_1.TEXT, types_1.FLOAT, types_1.BOOL, types_1.TIMESTAMP, types_1.OPAQUE];
27
+ const FIELD_TOKENS = {
28
+ text: "string",
29
+ float: "number",
30
+ bool: "boolean",
31
+ timestamp: "date",
32
+ json: "object",
33
+ };
34
+ const ARRAY_SUFFIX = "[]";
35
+ function FieldToken(kind) {
36
+ return kind.kind === "array"
37
+ ? `${FieldToken(kind.elem)}${ARRAY_SUFFIX}`
38
+ : FIELD_TOKENS[kind.kind];
39
+ }
40
+ function ProposedFirst(kinds, proposed) {
41
+ return [
42
+ ...kinds.filter((kind) => kind === proposed),
43
+ ...kinds.filter((kind) => kind !== proposed),
44
+ ];
45
+ }
46
+ function CandidateKinds(column) {
47
+ const family = (0, external_types_1.FamilyOf)(column);
48
+ if (family === "array") {
49
+ const element = (0, external_types_1.ElementFamily)(column);
50
+ const proposed = element && element !== "array" ? PROPOSED_KIND[element] : undefined;
51
+ return ProposedFirst([...SCALAR_KINDS], proposed ?? types_1.TEXT).map(types_1.ArrayOf);
52
+ }
53
+ return family ? ProposedFirst([...SCALAR_KINDS], PROPOSED_KIND[family]) : [];
54
+ }
55
+ function AcceptedDeclarations(column) {
56
+ const family = (0, external_types_1.FamilyOf)(column);
57
+ return CandidateKinds(column).flatMap((kind) => {
58
+ const reading = (0, external_types_1.ReadingOf)(kind, family, column);
59
+ return reading
60
+ ? [{ declared: FieldToken(kind), kind, lossy: reading.lossy }]
61
+ : [];
62
+ });
63
+ }
64
+ function UnsupportedReason(column) {
65
+ return `no field type reads a ${column.native} column`;
66
+ }
67
+ //# sourceMappingURL=external-declarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-declarations.js","sourceRoot":"","sources":["../../../src/implementations/database/external-declarations.ts"],"names":[],"mappings":";;AAsFA,oDAUC;AAGD,8CAEC;AApGD,qDAK0B;AAC1B,mCAQiB;AAGjB,MAAM,aAAa,GAAoD;IACrE,IAAI,EAAE,YAAI;IACV,MAAM,EAAE,YAAI;IACZ,MAAM,EAAE,YAAI;IACZ,IAAI,EAAE,YAAI;IACV,IAAI,EAAE,YAAI;IACV,QAAQ,EAAE,YAAI;IACd,GAAG,EAAE,aAAK;IACV,IAAI,EAAE,aAAK;IACX,OAAO,EAAE,aAAK;IACd,MAAM,EAAE,aAAK;IACb,MAAM,EAAE,aAAK;IACb,IAAI,EAAE,YAAI;IACV,WAAW,EAAE,iBAAS;IACtB,SAAS,EAAE,iBAAS;IACpB,IAAI,EAAE,iBAAS;IACf,KAAK,EAAE,cAAM;IACb,IAAI,EAAE,cAAM;CACb,CAAC;AAEF,MAAM,YAAY,GAAuB,CAAC,YAAI,EAAE,aAAK,EAAE,YAAI,EAAE,iBAAS,EAAE,cAAM,CAAC,CAAC;AAEhF,MAAM,YAAY,GAAsD;IACtE,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,QAAQ;CACf,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,CAAC;AAS1B,SAAS,UAAU,CAAC,IAAa;IAC/B,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO;QAC1B,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,EAAE;QAC3C,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB,EAAE,QAAiB;IACxD,OAAO;QACL,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC5C,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAqB;IAC3C,MAAM,MAAM,GAAG,IAAA,yBAAQ,EAAC,MAAM,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAA,8BAAa,EAAC,MAAM,CAAC,CAAC;QACtC,MAAM,QAAQ,GACZ,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,OAAO,aAAa,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,QAAQ,IAAI,YAAI,CAAC,CAAC,GAAG,CAAC,eAAO,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAOD,SAAgB,oBAAoB,CAClC,MAAqB;IAErB,MAAM,MAAM,GAAG,IAAA,yBAAQ,EAAC,MAAM,CAAC,CAAC;IAChC,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,IAAA,0BAAS,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,OAAO;YACZ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YAC9D,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAGD,SAAgB,iBAAiB,CAAC,MAAqB;IACrD,OAAO,yBAAyB,MAAM,CAAC,MAAM,SAAS,CAAC;AACzD,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { CatalogInfo, EstimateSource, Reference, RelationDescription, RelationKey, RelationSummary } from "@antelopejs/interface-database-catalog";
2
+ import { type CatalogColumn, type CatalogIndex } from "./external-catalog";
3
+ export interface RelationRow {
4
+ oid: number;
5
+ schema: string;
6
+ name: string;
7
+ kind: string;
8
+ readable: boolean;
9
+ someColumns: boolean;
10
+ insert: boolean;
11
+ update: boolean;
12
+ delete: boolean;
13
+ analyzed: boolean;
14
+ statistics: number | null;
15
+ liveTuples: number | null;
16
+ comment: string | null;
17
+ }
18
+ interface ReferenceRow {
19
+ name: string;
20
+ fromRelation: string;
21
+ fromColumns: string[];
22
+ toRelation: string;
23
+ toColumns: string[];
24
+ }
25
+ export declare function RelationName(row: RelationRow): string;
26
+ export declare function ReadInfo(): Promise<CatalogInfo>;
27
+ export declare function ReadRelationRows(schemas?: string[]): Promise<RelationRow[]>;
28
+ export declare function ReadNamedRelationRows(relations: string[]): Promise<RelationRow[]>;
29
+ interface Estimate {
30
+ estimatedRows: number | null;
31
+ estimate: EstimateSource | null;
32
+ }
33
+ export declare function EstimateOf(row: RelationRow): Promise<Estimate>;
34
+ export declare function KeyFrom(indexes: CatalogIndex[], columns: CatalogColumn[]): RelationKey | null;
35
+ export declare function Summarize(row: RelationRow): Promise<RelationSummary>;
36
+ export declare function ReferenceOf(row: ReferenceRow): Reference;
37
+ export declare function ReadReferences(oid: number): Promise<ReferenceRow[]>;
38
+ export declare function DescribeRow(row: RelationRow): Promise<RelationDescription>;
39
+ export {};
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelationName = RelationName;
4
+ exports.ReadInfo = ReadInfo;
5
+ exports.ReadRelationRows = ReadRelationRows;
6
+ exports.ReadNamedRelationRows = ReadNamedRelationRows;
7
+ exports.EstimateOf = EstimateOf;
8
+ exports.KeyFrom = KeyFrom;
9
+ exports.Summarize = Summarize;
10
+ exports.ReferenceOf = ReferenceOf;
11
+ exports.ReadReferences = ReadReferences;
12
+ exports.DescribeRow = DescribeRow;
13
+ const connection_1 = require("../../connection");
14
+ const external_catalog_1 = require("./external-catalog");
15
+ const external_declarations_1 = require("./external-declarations");
16
+ const external_types_1 = require("./external-types");
17
+ const identifier_1 = require("./identifier");
18
+ const ENGINE = "postgresql";
19
+ const SYSTEM_SCHEMAS = "('pg_catalog', 'information_schema')";
20
+ const RELATIONS_SQL = `
21
+ WITH leaves AS (
22
+ SELECT c.oid, coalesce(sum(CASE WHEN l.reltuples >= 0 THEN l.reltuples END), 0) AS statistics,
23
+ coalesce(sum(s.n_live_tup), 0) AS live, bool_and(l.reltuples >= 0) AS analyzed
24
+ FROM pg_class c
25
+ JOIN LATERAL pg_partition_tree(c.oid) t ON t.isleaf
26
+ JOIN pg_class l ON l.oid = t.relid
27
+ LEFT JOIN pg_stat_all_tables s ON s.relid = l.oid
28
+ WHERE c.relkind = 'p'
29
+ GROUP BY c.oid
30
+ )
31
+ SELECT c.oid, n.nspname AS schema, c.relname AS name, c.relkind AS kind,
32
+ has_table_privilege(c.oid, 'SELECT') AS readable,
33
+ has_any_column_privilege(c.oid, 'SELECT') AS "someColumns",
34
+ has_table_privilege(c.oid, 'INSERT') AS insert,
35
+ has_table_privilege(c.oid, 'UPDATE') AS update,
36
+ has_table_privilege(c.oid, 'DELETE') AS delete,
37
+ coalesce(p.analyzed, c.reltuples >= 0) AS analyzed,
38
+ coalesce(p.statistics, CASE WHEN c.reltuples >= 0 THEN c.reltuples END)::float8 AS statistics,
39
+ coalesce(p.live, s.n_live_tup)::float8 AS "liveTuples",
40
+ obj_description(c.oid, 'pg_class') AS comment
41
+ FROM pg_class c
42
+ JOIN pg_namespace n ON n.oid = c.relnamespace
43
+ LEFT JOIN pg_stat_all_tables s ON s.relid = c.oid
44
+ LEFT JOIN leaves p ON p.oid = c.oid
45
+ WHERE c.relkind IN ${external_catalog_1.RELATION_KINDS} AND NOT c.relispartition
46
+ AND n.nspname NOT IN ${SYSTEM_SCHEMAS}
47
+ AND n.nspname NOT LIKE 'pg\\_%'
48
+ AND has_schema_privilege(n.oid, 'USAGE')
49
+ AND ($1::text[] IS NULL OR n.nspname = ANY($1::text[]))
50
+ ORDER BY n.nspname, c.relname`;
51
+ const NAMED_RELATIONS_SQL = RELATIONS_SQL.replace("AND ($1::text[] IS NULL OR n.nspname = ANY($1::text[]))", "AND (n.nspname || '.' || c.relname) = ANY($1::text[])");
52
+ const COLUMN_LIST = (relation, keys) => `ARRAY(
53
+ SELECT a.attname::text FROM unnest(con.${keys}) WITH ORDINALITY k(n, o)
54
+ JOIN pg_attribute a ON a.attrelid = con.${relation} AND a.attnum = k.n
55
+ ORDER BY k.o
56
+ )`;
57
+ const REFERENCES_SQL = `
58
+ SELECT con.conname AS name,
59
+ fn.nspname || '.' || fc.relname AS "fromRelation", ${COLUMN_LIST("conrelid", "conkey")} AS "fromColumns",
60
+ tn.nspname || '.' || tc.relname AS "toRelation", ${COLUMN_LIST("confrelid", "confkey")} AS "toColumns"
61
+ FROM pg_constraint con
62
+ JOIN pg_class fc ON fc.oid = con.conrelid
63
+ JOIN pg_namespace fn ON fn.oid = fc.relnamespace
64
+ JOIN pg_class tc ON tc.oid = con.confrelid
65
+ JOIN pg_namespace tn ON tn.oid = tc.relnamespace
66
+ WHERE con.contype = 'f' AND con.conparentid = 0 AND (con.conrelid = $1 OR con.confrelid = $1)
67
+ ORDER BY con.conname`;
68
+ const INFO_SQL = `
69
+ SELECT current_setting('server_version') AS version, current_database() AS database,
70
+ current_user AS role`;
71
+ const KINDS = {
72
+ r: "table",
73
+ p: "partitioned",
74
+ v: "view",
75
+ m: "materialized",
76
+ f: "foreign",
77
+ };
78
+ const PARTIAL_GRANTS = "SELECT is granted on some of its columns only";
79
+ const NOT_READABLE = "the connected role cannot SELECT from it";
80
+ function RelationName(row) {
81
+ return `${row.schema}.${row.name}`;
82
+ }
83
+ async function ReadInfo() {
84
+ const [row] = (await (0, connection_1.Query)(INFO_SQL)).rows;
85
+ return { engine: ENGINE, ...row };
86
+ }
87
+ async function ReadRelationRows(schemas) {
88
+ return (await (0, connection_1.Query)(RELATIONS_SQL, [schemas ?? null])).rows;
89
+ }
90
+ async function ReadNamedRelationRows(relations) {
91
+ return (await (0, connection_1.Query)(NAMED_RELATIONS_SQL, [relations])).rows;
92
+ }
93
+ async function PlannedRows(row) {
94
+ try {
95
+ const sql = `EXPLAIN (FORMAT JSON) SELECT * FROM ${(0, identifier_1.QualifiedName)(row.schema, row.name)}`;
96
+ const [plan] = (await (0, connection_1.Query)(sql)).rows;
97
+ return plan["QUERY PLAN"][0].Plan["Plan Rows"];
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ async function EstimateOf(row) {
104
+ if (row.analyzed && row.statistics !== null) {
105
+ return { estimatedRows: row.statistics, estimate: "statistics" };
106
+ }
107
+ if (row.liveTuples !== null) {
108
+ return { estimatedRows: row.liveTuples, estimate: "live-tuples" };
109
+ }
110
+ if (!row.readable) {
111
+ return { estimatedRows: null, estimate: null };
112
+ }
113
+ const planned = await PlannedRows(row);
114
+ return planned === null
115
+ ? { estimatedRows: null, estimate: null }
116
+ : { estimatedRows: planned, estimate: "plan" };
117
+ }
118
+ function UnmappableReason(row) {
119
+ if (row.readable) {
120
+ return undefined;
121
+ }
122
+ return row.someColumns ? PARTIAL_GRANTS : NOT_READABLE;
123
+ }
124
+ function KeyFrom(indexes, columns) {
125
+ const key = (0, external_catalog_1.KeyOf)(indexes);
126
+ const byName = new Map(columns.map((column) => [column.name, column]));
127
+ if (!key || !(0, external_types_1.DescribeKeyColumns)(key.columns, byName)) {
128
+ return null;
129
+ }
130
+ return { columns: key.columns, source: key.primary ? "primary" : "unique" };
131
+ }
132
+ async function SummaryOf(row, key) {
133
+ return {
134
+ schema: row.schema,
135
+ name: row.name,
136
+ kind: KINDS[row.kind],
137
+ ...(await EstimateOf(row)),
138
+ key,
139
+ unmappable: UnmappableReason(row),
140
+ writes: { insert: row.insert, update: row.update, delete: row.delete },
141
+ comment: row.comment,
142
+ };
143
+ }
144
+ async function Summarize(row) {
145
+ const [columns, indexes] = await Promise.all([
146
+ (0, external_catalog_1.ReadColumns)(row.oid),
147
+ (0, external_catalog_1.ReadIndexes)(row.oid),
148
+ ]);
149
+ return SummaryOf(row, KeyFrom(indexes, columns));
150
+ }
151
+ function ReadOnlyOf(column, path) {
152
+ const [proposed] = (0, external_declarations_1.AcceptedDeclarations)(column);
153
+ if (!proposed) {
154
+ return undefined;
155
+ }
156
+ const descriptor = (0, external_types_1.Describe)(column.name, proposed.kind, column, path);
157
+ return (0, external_types_1.IsReadOnly)(descriptor) ? (0, external_types_1.ReadOnlyReason)(descriptor) : undefined;
158
+ }
159
+ const IDENTITIES = {
160
+ a: "always",
161
+ d: "by default",
162
+ };
163
+ function DescribeColumn(column, relation) {
164
+ const accepts = (0, external_declarations_1.AcceptedDeclarations)(column).map(({ declared, lossy }) => lossy ? { declared, lossy } : { declared });
165
+ const described = {
166
+ name: column.name,
167
+ native: column.native,
168
+ nullable: !column.notNull,
169
+ hasDefault: column.hasDefault,
170
+ generated: column.generated,
171
+ identity: IDENTITIES[column.identity] ?? null,
172
+ accepts,
173
+ comment: column.comment,
174
+ };
175
+ if (column.enumLabels) {
176
+ described.enumLabels = column.enumLabels;
177
+ }
178
+ if (accepts.length === 0) {
179
+ described.unsupported = (0, external_declarations_1.UnsupportedReason)(column);
180
+ }
181
+ const readOnly = ReadOnlyOf(column, `${relation}.${column.name}`);
182
+ if (readOnly) {
183
+ described.readOnly = readOnly;
184
+ }
185
+ return described;
186
+ }
187
+ function IndexOf(index) {
188
+ return { name: index.name, columns: index.columns, unique: index.unique };
189
+ }
190
+ function ReferenceOf(row) {
191
+ return {
192
+ name: row.name,
193
+ from: { relation: row.fromRelation, columns: row.fromColumns },
194
+ to: { relation: row.toRelation, columns: row.toColumns },
195
+ };
196
+ }
197
+ async function ReadReferences(oid) {
198
+ return (await (0, connection_1.Query)(REFERENCES_SQL, [oid])).rows;
199
+ }
200
+ async function DescribeRow(row) {
201
+ const relation = RelationName(row);
202
+ const [columns, indexes, references] = await Promise.all([
203
+ (0, external_catalog_1.ReadColumns)(row.oid),
204
+ (0, external_catalog_1.ReadIndexes)(row.oid),
205
+ ReadReferences(row.oid),
206
+ ]);
207
+ return {
208
+ ...(await SummaryOf(row, KeyFrom(indexes, columns))),
209
+ columns: columns.map((column) => DescribeColumn(column, relation)),
210
+ indexes: indexes.filter((index) => index.columns.length > 0).map(IndexOf),
211
+ references: references
212
+ .filter((reference) => reference.fromRelation === relation)
213
+ .map(ReferenceOf),
214
+ referencedBy: references
215
+ .filter((reference) => reference.toRelation === relation)
216
+ .map(ReferenceOf),
217
+ };
218
+ }
219
+ //# sourceMappingURL=external-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-discovery.js","sourceRoot":"","sources":["../../../src/implementations/database/external-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Measure } from "@antelopejs/interface-database-catalog";
2
+ import type { QueryResultRow } from "pg";
3
+ export declare function SetMeasureTimeoutForTests(ms?: number): void;
4
+ export interface MeasureSession {
5
+ measure<T extends QueryResultRow>(sql: string, params?: unknown[]): Promise<Measure<T[]>>;
6
+ }
7
+ export declare function WithMeasures<T>(work: (session: MeasureSession) => Promise<T>): Promise<T>;
8
+ export declare function FirstRow<T, R>(measured: Measure<T[]>, read: (row: T) => R): Measure<R>;
9
+ export declare function Mapped<T, R>(measured: Measure<T>, read: (value: T) => R): Measure<R>;
10
+ export declare function ValueOf<T>(measured: Measure<T> | undefined): T | undefined;
11
+ export declare function Sequentially<T, R>(items: T[], work: (item: T) => Promise<R>): Promise<R[]>;