@antelopejs/postgres 0.2.0 → 0.2.1
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.
- package/dist/config.d.ts +5 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/implementations/catalog/index.d.ts +7 -0
- package/dist/implementations/catalog/index.js +60 -0
- package/dist/implementations/catalog/index.js.map +1 -0
- package/dist/implementations/database/external-catalog.d.ts +15 -0
- package/dist/implementations/database/external-catalog.js +22 -8
- package/dist/implementations/database/external-catalog.js.map +1 -1
- package/dist/implementations/database/external-column-profile.d.ts +18 -0
- package/dist/implementations/database/external-column-profile.js +223 -0
- package/dist/implementations/database/external-column-profile.js.map +1 -0
- package/dist/implementations/database/external-declarations.d.ts +9 -0
- package/dist/implementations/database/external-declarations.js +67 -0
- package/dist/implementations/database/external-declarations.js.map +1 -0
- package/dist/implementations/database/external-discovery.d.ts +39 -0
- package/dist/implementations/database/external-discovery.js +219 -0
- package/dist/implementations/database/external-discovery.js.map +1 -0
- package/dist/implementations/database/external-measures.d.ts +11 -0
- package/dist/implementations/database/external-measures.js +82 -0
- package/dist/implementations/database/external-measures.js.map +1 -0
- package/dist/implementations/database/external-profile.d.ts +4 -0
- package/dist/implementations/database/external-profile.js +129 -0
- package/dist/implementations/database/external-profile.js.map +1 -0
- package/dist/implementations/database/external-reference.d.ts +2 -0
- package/dist/implementations/database/external-reference.js +49 -0
- package/dist/implementations/database/external-reference.js.map +1 -0
- package/dist/implementations/database/external-rows.d.ts +2 -0
- package/dist/implementations/database/external-rows.js +81 -0
- package/dist/implementations/database/external-rows.js.map +1 -0
- package/dist/implementations/database/external-sample.d.ts +9 -0
- package/dist/implementations/database/external-sample.js +29 -0
- package/dist/implementations/database/external-sample.js.map +1 -0
- package/dist/implementations/database/external-schema.js +1 -11
- package/dist/implementations/database/external-schema.js.map +1 -1
- package/dist/implementations/database/external-types.d.ts +9 -1
- package/dist/implementations/database/external-types.js +14 -0
- package/dist/implementations/database/external-types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/test/antelope.test.js +1 -0
- package/dist/test/antelope.test.js.map +1 -1
- package/dist/test/catalog-owned.test.d.ts +1 -0
- package/dist/test/catalog-owned.test.js +17 -0
- package/dist/test/catalog-owned.test.js.map +1 -0
- package/dist/test/unit/external-comparisons.spec.js +2 -0
- package/dist/test/unit/external-comparisons.spec.js.map +1 -1
- package/dist/test/unit/external-types.spec.js +37 -0
- package/dist/test/unit/external-types.spec.js.map +1 -1
- package/dist/test-external/catalog.test.d.ts +1 -0
- package/dist/test-external/catalog.test.js +348 -0
- package/dist/test-external/catalog.test.js.map +1 -0
- package/dist/test-external/fixture.d.ts +1 -0
- package/dist/test-external/fixture.js +28 -1
- package/dist/test-external/fixture.js.map +1 -1
- package/package.json +4 -2
package/dist/config.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { PoolConfig } from "pg";
|
|
2
2
|
export type MigrationMode = "safe" | "destructive";
|
|
3
3
|
export type Mode = "owned" | "external";
|
|
4
|
+
export interface CatalogOptions {
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
}
|
|
4
7
|
export interface Options {
|
|
5
8
|
mode?: Mode;
|
|
6
9
|
url?: string;
|
|
@@ -13,6 +16,7 @@ export interface Options {
|
|
|
13
16
|
changeRetentionMs?: number;
|
|
14
17
|
changeBatchSize?: number;
|
|
15
18
|
changePollIntervalMs?: number;
|
|
19
|
+
catalog?: CatalogOptions;
|
|
16
20
|
}
|
|
17
21
|
export interface ResolvedOptions {
|
|
18
22
|
mode: Mode;
|
|
@@ -26,6 +30,7 @@ export interface ResolvedOptions {
|
|
|
26
30
|
changeRetentionMs: number;
|
|
27
31
|
changeBatchSize: number;
|
|
28
32
|
changePollIntervalMs: number;
|
|
33
|
+
catalog: CatalogOptions;
|
|
29
34
|
}
|
|
30
35
|
export declare function SetOptions(options?: Options): ResolvedOptions;
|
|
31
36
|
export declare function GetOptions(): ResolvedOptions;
|
package/dist/config.js
CHANGED
|
@@ -72,6 +72,7 @@ function SetOptions(options) {
|
|
|
72
72
|
changeRetentionMs: PositiveSafeInteger("changeRetentionMs", options?.changeRetentionMs, DEFAULT_CHANGE_RETENTION_MS),
|
|
73
73
|
changeBatchSize: PositiveSafeInteger("changeBatchSize", options?.changeBatchSize, DEFAULT_CHANGE_BATCH_SIZE),
|
|
74
74
|
changePollIntervalMs: PositiveSafeInteger("changePollIntervalMs", options?.changePollIntervalMs, DEFAULT_CHANGE_POLL_INTERVAL_MS),
|
|
75
|
+
catalog: options?.catalog ?? {},
|
|
75
76
|
};
|
|
76
77
|
return resolved;
|
|
77
78
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CatalogInfo, Measure, ProfileRequest, ReferenceCheck, ReferenceMatch, RelationDescription, RelationProfile, RelationSummary, RowSample, SampleRequest } from "@antelopejs/interface-database-catalog";
|
|
2
|
+
export declare function Info(): Promise<CatalogInfo>;
|
|
3
|
+
export declare function ListRelations(schemas?: string[]): Promise<RelationSummary[]>;
|
|
4
|
+
export declare function DescribeRelations(relations: string[]): Promise<RelationDescription[]>;
|
|
5
|
+
export declare function Profile(request: ProfileRequest): Promise<RelationProfile>;
|
|
6
|
+
export declare function CheckReference(check: ReferenceCheck): Promise<Measure<ReferenceMatch>>;
|
|
7
|
+
export declare function SampleRows(request: SampleRequest): Promise<RowSample>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Info = Info;
|
|
4
|
+
exports.ListRelations = ListRelations;
|
|
5
|
+
exports.DescribeRelations = DescribeRelations;
|
|
6
|
+
exports.Profile = Profile;
|
|
7
|
+
exports.CheckReference = CheckReference;
|
|
8
|
+
exports.SampleRows = SampleRows;
|
|
9
|
+
const runtime_1 = require("@antelopejs/interface-core/runtime");
|
|
10
|
+
const config_1 = require("../../config");
|
|
11
|
+
const external_discovery_1 = require("../database/external-discovery");
|
|
12
|
+
const external_measures_1 = require("../database/external-measures");
|
|
13
|
+
const external_profile_1 = require("../database/external-profile");
|
|
14
|
+
const external_reference_1 = require("../database/external-reference");
|
|
15
|
+
const external_rows_1 = require("../database/external-rows");
|
|
16
|
+
const OWNED_REFUSAL = "the catalog describes a database an external instance was pointed at; this instance owns its tables";
|
|
17
|
+
const DEVELOPMENT_REFUSAL = "the catalog is a development tool: it answers under ajs project dev or run, or with catalog.enabled";
|
|
18
|
+
async function IsEnabled() {
|
|
19
|
+
const configured = (0, config_1.GetOptions)().catalog.enabled;
|
|
20
|
+
return configured ?? (await (0, runtime_1.GetRuntimeInfo)()).dev;
|
|
21
|
+
}
|
|
22
|
+
async function Guard() {
|
|
23
|
+
if (!(0, config_1.IsExternal)()) {
|
|
24
|
+
throw new Error(OWNED_REFUSAL);
|
|
25
|
+
}
|
|
26
|
+
if (!(await IsEnabled())) {
|
|
27
|
+
throw new Error(DEVELOPMENT_REFUSAL);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function Info() {
|
|
31
|
+
await Guard();
|
|
32
|
+
return (0, external_discovery_1.ReadInfo)();
|
|
33
|
+
}
|
|
34
|
+
async function ListRelations(schemas) {
|
|
35
|
+
await Guard();
|
|
36
|
+
return (0, external_measures_1.Sequentially)(await (0, external_discovery_1.ReadRelationRows)(schemas), external_discovery_1.Summarize);
|
|
37
|
+
}
|
|
38
|
+
async function DescribeRelations(relations) {
|
|
39
|
+
await Guard();
|
|
40
|
+
const rows = await (0, external_discovery_1.ReadNamedRelationRows)(relations);
|
|
41
|
+
const found = new Set(rows.map(external_discovery_1.RelationName));
|
|
42
|
+
const missing = relations.filter((relation) => !found.has(relation));
|
|
43
|
+
if (missing.length > 0) {
|
|
44
|
+
throw new Error(`No relation ${missing.join(", ")} that the connected role can see`);
|
|
45
|
+
}
|
|
46
|
+
return (0, external_measures_1.Sequentially)(rows, external_discovery_1.DescribeRow);
|
|
47
|
+
}
|
|
48
|
+
async function Profile(request) {
|
|
49
|
+
await Guard();
|
|
50
|
+
return (0, external_profile_1.ProfileRelation)(request);
|
|
51
|
+
}
|
|
52
|
+
async function CheckReference(check) {
|
|
53
|
+
await Guard();
|
|
54
|
+
return (0, external_reference_1.CheckColumnReference)(check);
|
|
55
|
+
}
|
|
56
|
+
async function SampleRows(request) {
|
|
57
|
+
await Guard();
|
|
58
|
+
return (0, external_rows_1.SampleRelationRows)(request);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/implementations/catalog/index.ts"],"names":[],"mappings":";;AAgDA,oBAGC;AAED,sCAKC;AAED,8CAaC;AAED,0BAKC;AAED,wCAKC;AAED,gCAGC;AA5FD,gEAAoE;AAcpE,yCAAsD;AACtD,uEAOwC;AACxC,qEAA6D;AAC7D,mEAA+D;AAC/D,uEAAsE;AACtE,6DAA+D;AAE/D,MAAM,aAAa,GACjB,qGAAqG,CAAC;AACxG,MAAM,mBAAmB,GACvB,qGAAqG,CAAC;AAExG,KAAK,UAAU,SAAS;IACtB,MAAM,UAAU,GAAG,IAAA,mBAAU,GAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAChD,OAAO,UAAU,IAAI,CAAC,MAAM,IAAA,wBAAc,GAAE,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAGD,KAAK,UAAU,KAAK;IAClB,IAAI,CAAC,IAAA,mBAAU,GAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,IAAI;IACxB,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,6BAAQ,GAAE,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,OAAkB;IAElB,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,gCAAY,EAAC,MAAM,IAAA,qCAAgB,EAAC,OAAO,CAAC,EAAE,8BAAS,CAAC,CAAC;AAClE,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,SAAmB;IAEnB,MAAM,KAAK,EAAE,CAAC;IACd,MAAM,IAAI,GAAG,MAAM,IAAA,0CAAqB,EAAC,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,iCAAY,CAAC,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,eAAe,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,IAAA,gCAAY,EAAC,IAAI,EAAE,gCAAW,CAAC,CAAC;AACzC,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,OAAuB;IAEvB,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,kCAAe,EAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,KAAqB;IAErB,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,yCAAoB,EAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,OAAsB;IACrD,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,kCAAkB,EAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -10,6 +10,17 @@ export interface CatalogColumn {
|
|
|
10
10
|
hasDefault: boolean;
|
|
11
11
|
generated: boolean;
|
|
12
12
|
identity: string;
|
|
13
|
+
comment: string | null;
|
|
14
|
+
enumLabels: string[] | null;
|
|
15
|
+
}
|
|
16
|
+
export interface CatalogIndex {
|
|
17
|
+
name: string;
|
|
18
|
+
primary: boolean;
|
|
19
|
+
unique: boolean;
|
|
20
|
+
btree: boolean;
|
|
21
|
+
total: boolean;
|
|
22
|
+
notNull: boolean;
|
|
23
|
+
columns: string[];
|
|
13
24
|
}
|
|
14
25
|
export interface CatalogRelation {
|
|
15
26
|
kind: string;
|
|
@@ -19,4 +30,8 @@ export interface CatalogRelation {
|
|
|
19
30
|
keyName?: string;
|
|
20
31
|
indexes: string[][];
|
|
21
32
|
}
|
|
33
|
+
export declare const RELATION_KINDS = "('r', 'p', 'v', 'm', 'f')";
|
|
34
|
+
export declare function KeyOf(indexes: CatalogIndex[]): CatalogIndex | undefined;
|
|
35
|
+
export declare function ReadColumns(oid: number): Promise<CatalogColumn[]>;
|
|
36
|
+
export declare function ReadIndexes(oid: number): Promise<CatalogIndex[]>;
|
|
22
37
|
export declare function ReadRelation(schemaName: string, relationName: string): Promise<CatalogRelation | undefined>;
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RELATION_KINDS = void 0;
|
|
4
|
+
exports.KeyOf = KeyOf;
|
|
5
|
+
exports.ReadColumns = ReadColumns;
|
|
6
|
+
exports.ReadIndexes = ReadIndexes;
|
|
3
7
|
exports.ReadRelation = ReadRelation;
|
|
4
8
|
const connection_1 = require("../../connection");
|
|
5
|
-
|
|
9
|
+
exports.RELATION_KINDS = "('r', 'p', 'v', 'm', 'f')";
|
|
6
10
|
const RELATION_SQL = `
|
|
7
11
|
SELECT c.oid, c.relkind AS kind, has_table_privilege(c.oid, 'SELECT') AS readable
|
|
8
12
|
FROM pg_class c
|
|
9
13
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
10
|
-
WHERE n.nspname = $1 AND c.relname = $2 AND c.relkind IN ${RELATION_KINDS}`;
|
|
14
|
+
WHERE n.nspname = $1 AND c.relname = $2 AND c.relkind IN ${exports.RELATION_KINDS}`;
|
|
11
15
|
const COLUMNS_SQL = `
|
|
12
16
|
SELECT a.attname AS name, format_type(a.atttypid, a.atttypmod) AS native,
|
|
13
17
|
b.typname, format_type(b.oid, NULL) AS "castType", b.typtype, b.typcategory AS category,
|
|
14
18
|
e.typname AS element, a.attnotnull AS "notNull", a.atthasdef AS "hasDefault",
|
|
15
|
-
a.attgenerated <> '' AS generated, a.attidentity AS identity
|
|
19
|
+
a.attgenerated <> '' AS generated, a.attidentity AS identity,
|
|
20
|
+
col_description(a.attrelid, a.attnum) AS comment,
|
|
21
|
+
CASE WHEN b.typtype = 'e' THEN ARRAY(
|
|
22
|
+
SELECT l.enumlabel::text FROM pg_enum l WHERE l.enumtypid = b.oid ORDER BY l.enumsortorder
|
|
23
|
+
) END AS "enumLabels"
|
|
16
24
|
FROM pg_attribute a
|
|
17
25
|
JOIN pg_type t ON t.oid = a.atttypid
|
|
18
26
|
JOIN pg_type b ON b.oid = CASE WHEN t.typtype = 'd' THEN t.typbasetype ELSE t.oid END
|
|
@@ -58,6 +66,12 @@ function ServingIndexes(indexes) {
|
|
|
58
66
|
.filter((index) => index.btree && index.total)
|
|
59
67
|
.map((index) => index.columns);
|
|
60
68
|
}
|
|
69
|
+
async function ReadColumns(oid) {
|
|
70
|
+
return (await (0, connection_1.Query)(COLUMNS_SQL, [oid])).rows;
|
|
71
|
+
}
|
|
72
|
+
async function ReadIndexes(oid) {
|
|
73
|
+
return (await (0, connection_1.Query)(INDEXES_SQL, [oid])).rows;
|
|
74
|
+
}
|
|
61
75
|
async function ReadRelation(schemaName, relationName) {
|
|
62
76
|
const found = await (0, connection_1.Query)(RELATION_SQL, [
|
|
63
77
|
schemaName,
|
|
@@ -67,16 +81,16 @@ async function ReadRelation(schemaName, relationName) {
|
|
|
67
81
|
return undefined;
|
|
68
82
|
}
|
|
69
83
|
const relation = found.rows[0];
|
|
70
|
-
const columns = await (
|
|
71
|
-
const indexes = await (
|
|
72
|
-
const key = KeyOf(indexes
|
|
84
|
+
const columns = await ReadColumns(relation.oid);
|
|
85
|
+
const indexes = await ReadIndexes(relation.oid);
|
|
86
|
+
const key = KeyOf(indexes);
|
|
73
87
|
return {
|
|
74
88
|
kind: relation.kind,
|
|
75
89
|
readable: relation.readable,
|
|
76
|
-
columns
|
|
90
|
+
columns,
|
|
77
91
|
key: key?.columns,
|
|
78
92
|
keyName: key?.name,
|
|
79
|
-
indexes: ServingIndexes(indexes
|
|
93
|
+
indexes: ServingIndexes(indexes),
|
|
80
94
|
};
|
|
81
95
|
}
|
|
82
96
|
//# sourceMappingURL=external-catalog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-catalog.js","sourceRoot":"","sources":["../../../src/implementations/database/external-catalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"external-catalog.js","sourceRoot":"","sources":["../../../src/implementations/database/external-catalog.ts"],"names":[],"mappings":";;;AAiHA,sBAMC;AAYD,kCAEC;AAED,kCAEC;AAED,oCAuBC;AAlKD,iDAAyC;AAwD5B,QAAA,cAAc,GAAG,2BAA2B,CAAC;AAE1D,MAAM,YAAY,GAAG;;;;6DAIwC,sBAAc,EAAE,CAAC;AAE9E,MAAM,WAAW,GAAG;;;;;;;;;;;;;;oBAcA,CAAC;AAErB,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;qBAmBC,CAAC;AAGtB,SAAS,cAAc,CAAC,KAAmB;IACzC,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;AACtD,CAAC;AAGD,SAAS,eAAe,CAAC,IAAkB,EAAE,KAAmB;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IACzD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAGD,SAAgB,KAAK,CAAC,OAAuB;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,OAAuB;IAC7C,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;SAC7C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAMM,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,OAAO,CAAC,MAAM,IAAA,kBAAK,EAAgB,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,OAAO,CAAC,MAAM,IAAA,kBAAK,EAAe,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,YAAoB;IAEpB,MAAM,KAAK,GAAG,MAAM,IAAA,kBAAK,EAAc,YAAY,EAAE;QACnD,UAAU;QACV,YAAY;KACb,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,OAAO;QACP,GAAG,EAAE,GAAG,EAAE,OAAO;QACjB,OAAO,EAAE,GAAG,EAAE,IAAI;QAClB,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ColumnProfile } from "@antelopejs/interface-database-catalog";
|
|
2
|
+
import type { CatalogColumn } from "./external-catalog";
|
|
3
|
+
import { type MeasureSession } from "./external-measures";
|
|
4
|
+
import { type Source } from "./external-sample";
|
|
5
|
+
import { type NativeFamily } from "./external-types";
|
|
6
|
+
import type { SqlType } from "./types";
|
|
7
|
+
export interface ProfiledColumn {
|
|
8
|
+
name: string;
|
|
9
|
+
family: NativeFamily;
|
|
10
|
+
kind: SqlType;
|
|
11
|
+
quoted: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function Profiled(column: CatalogColumn): ProfiledColumn | undefined;
|
|
14
|
+
export interface ColumnRoles {
|
|
15
|
+
keys: Set<string>;
|
|
16
|
+
references: Set<string>;
|
|
17
|
+
}
|
|
18
|
+
export declare function ProfileColumn(session: MeasureSession, column: ProfiledColumn, source: Source, rows: number | undefined, roles: ColumnRoles): Promise<ColumnProfile>;
|
|
@@ -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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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 {};
|