@sixb/ducklake 0.1.7 → 0.1.9
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/README.md +60 -5
- package/dist/ducklake-storage.d.ts +3 -1
- package/dist/ducklake-storage.d.ts.map +1 -1
- package/dist/index.js +1963 -480
- package/dist/index.js.map +25 -15
- package/dist/internal/dataset-row-commit.d.ts +10 -0
- package/dist/internal/dataset-row-commit.d.ts.map +1 -1
- package/dist/internal/dataset-row-merge.d.ts.map +1 -1
- package/dist/internal/ducklake-dataset-catalog.d.ts +20 -3
- package/dist/internal/ducklake-dataset-catalog.d.ts.map +1 -1
- package/dist/internal/ducklake-dataset-table-ref.d.ts +13 -0
- package/dist/internal/ducklake-dataset-table-ref.d.ts.map +1 -1
- package/dist/internal/ducklake-maintenance.d.ts +21 -1
- package/dist/internal/ducklake-maintenance.d.ts.map +1 -1
- package/dist/internal/ducklake-snapshot-reader.d.ts +81 -9
- package/dist/internal/ducklake-snapshot-reader.d.ts.map +1 -1
- package/dist/internal/ducklake-sql-executor.d.ts +9 -1
- package/dist/internal/ducklake-sql-executor.d.ts.map +1 -1
- package/dist/internal/ducklake-version-transaction.d.ts +54 -0
- package/dist/internal/ducklake-version-transaction.d.ts.map +1 -0
- package/dist/internal/ducklake-write-coordinator.d.ts +30 -3
- package/dist/internal/ducklake-write-coordinator.d.ts.map +1 -1
- package/dist/internal/lineage-encoding.d.ts +8 -0
- package/dist/internal/lineage-encoding.d.ts.map +1 -0
- package/dist/internal/sql-lineage/analysis.d.ts +32 -0
- package/dist/internal/sql-lineage/analysis.d.ts.map +1 -0
- package/dist/internal/sql-lineage/expressions.d.ts +9 -0
- package/dist/internal/sql-lineage/expressions.d.ts.map +1 -0
- package/dist/internal/sql-lineage/plan-json.d.ts +34 -0
- package/dist/internal/sql-lineage/plan-json.d.ts.map +1 -0
- package/dist/internal/sql-lineage/plan-relation.d.ts +28 -0
- package/dist/internal/sql-lineage/plan-relation.d.ts.map +1 -0
- package/dist/internal/sql-lineage/plan-walker.d.ts +18 -0
- package/dist/internal/sql-lineage/plan-walker.d.ts.map +1 -0
- package/dist/internal/sql-lineage/rejection.d.ts +11 -0
- package/dist/internal/sql-lineage/rejection.d.ts.map +1 -0
- package/dist/internal/sql-lineage/statement-gate.d.ts +21 -0
- package/dist/internal/sql-lineage/statement-gate.d.ts.map +1 -0
- package/dist/internal/sql-lineage/table-functions.d.ts +6 -0
- package/dist/internal/sql-lineage/table-functions.d.ts.map +1 -0
- package/dist/internal/sql-transform-relations.d.ts +20 -5
- package/dist/internal/sql-transform-relations.d.ts.map +1 -1
- package/dist/internal/sql.d.ts +11 -2
- package/dist/internal/sql.d.ts.map +1 -1
- package/dist/internal/versions.d.ts +10 -1
- package/dist/internal/versions.d.ts.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/ducklake-storage.ts +17 -2
- package/src/internal/dataset-row-commit.ts +28 -2
- package/src/internal/dataset-row-merge.ts +4 -0
- package/src/internal/ducklake-dataset-catalog.ts +162 -49
- package/src/internal/ducklake-dataset-table-ref.ts +75 -17
- package/src/internal/ducklake-maintenance.ts +110 -48
- package/src/internal/ducklake-snapshot-reader.ts +549 -254
- package/src/internal/ducklake-sql-executor.ts +214 -14
- package/src/internal/ducklake-version-transaction.ts +224 -0
- package/src/internal/ducklake-write-coordinator.ts +226 -148
- package/src/internal/lineage-encoding.ts +136 -0
- package/src/internal/sql-lineage/analysis.ts +257 -0
- package/src/internal/sql-lineage/expressions.ts +208 -0
- package/src/internal/sql-lineage/plan-json.ts +130 -0
- package/src/internal/sql-lineage/plan-relation.ts +59 -0
- package/src/internal/sql-lineage/plan-walker.ts +727 -0
- package/src/internal/sql-lineage/rejection.ts +16 -0
- package/src/internal/sql-lineage/statement-gate.ts +164 -0
- package/src/internal/sql-lineage/table-functions.ts +11 -0
- package/src/internal/sql-transform-relations.ts +90 -40
- package/src/internal/sql.ts +35 -6
- package/src/internal/versions.ts +37 -14
- package/src/types.ts +11 -1
|
@@ -12,6 +12,16 @@ export interface ApplyDatasetRowsResult {
|
|
|
12
12
|
readonly dataChangeExpected: boolean;
|
|
13
13
|
readonly sourceRowCount: number;
|
|
14
14
|
readonly resultingRowCount: CommitRowCount;
|
|
15
|
+
/**
|
|
16
|
+
* The table held no rows when this transaction read it. A write into an empty table deletes
|
|
17
|
+
* nothing, so DuckLake lets it commit alongside a concurrent one that also read the table empty.
|
|
18
|
+
*/
|
|
19
|
+
readonly targetWasEmpty: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* The write inserted or deleted rows of the dataset table, which DuckLake checks against
|
|
22
|
+
* concurrent changes to the table. A merge that only advances source ordering changes none.
|
|
23
|
+
*/
|
|
24
|
+
readonly changedTableRows: boolean;
|
|
15
25
|
}
|
|
16
26
|
export declare function assertDatasetWriteMode(mode: unknown, operation: string): asserts mode is DatasetWriteMode;
|
|
17
27
|
export declare function applyDatasetRowsFromRelation(input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-row-commit.d.ts","sourceRoot":"","sources":["../../src/internal/dataset-row-commit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAK1D,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAEhC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAA;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"dataset-row-commit.d.ts","sourceRoot":"","sources":["../../src/internal/dataset-row-commit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAK1D,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAEhC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAA;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,cAAc,CAAA;IAC1C;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;CACnC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAMlC;AAED,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA+ElC;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-row-merge.d.ts","sourceRoot":"","sources":["../../src/internal/dataset-row-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAQnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,KAAK,sBAAsB,EAA8B,MAAM,sBAAsB,CAAA;AAE9F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAK1D,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACxD;AAQD,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"dataset-row-merge.d.ts","sourceRoot":"","sources":["../../src/internal/dataset-row-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAQnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,KAAK,sBAAsB,EAA8B,MAAM,sBAAsB,CAAA;AAE9F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAK1D,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACxD;AAQD,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,sBAAsB,CAAC,CA6EjC"}
|
|
@@ -2,6 +2,18 @@ import type { DatasetDefinition, DatasetSchema } from "@sixb/core";
|
|
|
2
2
|
import type { DuckLakeStorageOptions } from "../types";
|
|
3
3
|
import type { DuckDbQueryRuntime } from "./duckdb-runtime";
|
|
4
4
|
import type { DuckLakeConnectionManager } from "./ducklake-connection-manager";
|
|
5
|
+
import type { DatasetTableRef } from "./ducklake-dataset-table-ref";
|
|
6
|
+
import type { DuckLakeVersionSummary } from "./ducklake-snapshot-reader";
|
|
7
|
+
import { type LatestVersionAtSnapshot } from "./ducklake-version-transaction";
|
|
8
|
+
/**
|
|
9
|
+
* Reads the latest version of a dataset, which a schema change keeps the rows of, as
|
|
10
|
+
* `BeginVersionTransactionInput.readLatestVersion`.
|
|
11
|
+
*/
|
|
12
|
+
export type LatestDatasetVersionReader = (runtime: DuckDbQueryRuntime, definition: DatasetDefinition) => Promise<LatestVersionAtSnapshot<DuckLakeVersionSummary>>;
|
|
13
|
+
export interface DatasetSchemaAtSnapshotRequest {
|
|
14
|
+
readonly table: DatasetTableRef;
|
|
15
|
+
readonly snapshotId: string;
|
|
16
|
+
}
|
|
5
17
|
/**
|
|
6
18
|
* Translates between Sixb dataset definitions and DuckLake table metadata.
|
|
7
19
|
*
|
|
@@ -13,14 +25,19 @@ export declare class DuckLakeDatasetCatalog {
|
|
|
13
25
|
private readonly options;
|
|
14
26
|
private readonly connections;
|
|
15
27
|
constructor(options: DuckLakeStorageOptions, connections: DuckLakeConnectionManager);
|
|
16
|
-
createDataset(definition: DatasetDefinition): Promise<DatasetDefinition>;
|
|
28
|
+
createDataset(definition: DatasetDefinition, readLatestVersion: LatestDatasetVersionReader): Promise<DatasetDefinition>;
|
|
17
29
|
assertDatasetDefinitionsCompatible(definitions: readonly DatasetDefinition[]): Promise<void>;
|
|
18
30
|
getDataset(datasetId: string): Promise<DatasetDefinition | null>;
|
|
19
31
|
getDatasetOnRuntime(runtime: DuckDbQueryRuntime, datasetId: string): Promise<DatasetDefinition | null>;
|
|
20
32
|
listDatasets(): Promise<readonly DatasetDefinition[]>;
|
|
21
33
|
private readCurrentDatasetDefinitions;
|
|
22
34
|
private readCurrentDatasetDefinitionsOnRuntime;
|
|
23
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Dataset schemas at DuckLake snapshots, in request order, from one catalog read: a column row
|
|
37
|
+
* is visible from its begin_snapshot until its end_snapshot, so the rows alive anywhere between
|
|
38
|
+
* the oldest and the newest requested snapshot answer every request.
|
|
39
|
+
*/
|
|
40
|
+
getDatasetSchemasAtSnapshots(runtime: DuckDbQueryRuntime, requests: readonly DatasetSchemaAtSnapshotRequest[]): Promise<readonly DatasetSchema[]>;
|
|
24
41
|
assertSchema(definition: DatasetDefinition): void;
|
|
25
42
|
private applyExistingDatasetUpdate;
|
|
26
43
|
private applySchemaEvolutionDdl;
|
|
@@ -29,6 +46,6 @@ export declare class DuckLakeDatasetCatalog {
|
|
|
29
46
|
private applyPrimaryKey;
|
|
30
47
|
private setSchemaEvolutionCommitMetadata;
|
|
31
48
|
private rollbackTransaction;
|
|
32
|
-
private
|
|
49
|
+
private readDatasetColumnsBetweenSnapshots;
|
|
33
50
|
}
|
|
34
51
|
//# sourceMappingURL=ducklake-dataset-catalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-dataset-catalog.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-dataset-catalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"ducklake-dataset-catalog.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-dataset-catalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAYlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAO1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,gCAAgC,CAAA;AAYvC;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACvC,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,iBAAiB,KAC1B,OAAO,CAAC,uBAAuB,CAAC,sBAAsB,CAAC,CAAC,CAAA;AAE7D,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAUD;;;;;;GAMG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,yBAAyB;IAGnD,aAAa,CACjB,UAAU,EAAE,iBAAiB,EAC7B,iBAAiB,EAAE,0BAA0B,GAC5C,OAAO,CAAC,iBAAiB,CAAC;IAiFvB,kCAAkC,CACtC,WAAW,EAAE,SAAS,iBAAiB,EAAE,GACxC,OAAO,CAAC,IAAI,CAAC;IAwCV,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAQhE,mBAAmB,CACvB,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAU9B,YAAY,IAAI,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC;YAU7C,6BAA6B;YAY7B,sCAAsC;IAWpD;;;;OAIG;IACG,4BAA4B,CAChC,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,SAAS,8BAA8B,EAAE,GAClD,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC;IAsCpC,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;YAOnC,0BAA0B;YAoD1B,uBAAuB;YAYvB,kBAAkB;YAmBlB,gBAAgB;YA0BhB,eAAe;YAoBf,gCAAgC;YA0BhC,mBAAmB;YASnB,kCAAkC;CAwCjD"}
|
|
@@ -4,6 +4,19 @@ export interface DatasetTableRef {
|
|
|
4
4
|
readonly datasetId: string;
|
|
5
5
|
readonly tableName: string;
|
|
6
6
|
readonly tableId: bigint;
|
|
7
|
+
/** The table a sequenced dataset keeps its source ordering in, which merges also change. */
|
|
8
|
+
readonly sequenceTableId?: bigint;
|
|
7
9
|
}
|
|
8
10
|
export declare function resolveDatasetTableRef(options: DuckLakeStorageOptions, runtime: DuckDbQueryRuntime, datasetId: string): Promise<DatasetTableRef | null>;
|
|
11
|
+
/**
|
|
12
|
+
* The dataset's tables and the lake's current snapshot, in one catalog read. Inside a
|
|
13
|
+
* transaction, reading the current snapshot also fixes the transaction's DuckLake snapshot, which
|
|
14
|
+
* DuckLake otherwise fixes on its first read of the lake.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveDatasetTableRefAtCurrentSnapshot(options: DuckLakeStorageOptions, runtime: DuckDbQueryRuntime, datasetId: string): Promise<{
|
|
17
|
+
readonly snapshotId: string;
|
|
18
|
+
readonly table: DatasetTableRef | null;
|
|
19
|
+
}>;
|
|
20
|
+
/** Every table a dataset's versions change. */
|
|
21
|
+
export declare function datasetTableIds(table: Omit<DatasetTableRef, "tableName">): readonly bigint[];
|
|
9
22
|
//# sourceMappingURL=ducklake-dataset-table-ref.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-dataset-table-ref.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-dataset-table-ref.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ducklake-dataset-table-ref.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-dataset-table-ref.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAI1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,4FAA4F;IAC5F,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAEjC;AAED;;;;GAIG;AACH,wBAAsB,uCAAuC,CAC3D,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,CAAC,CAmBlF;AAED,+CAA+C;AAC/C,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,SAAS,MAAM,EAAE,CAI5F"}
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import type { DuckLakeMaintenanceOptions, DuckLakeMaintenanceReport, DuckLakeStorageOptions } from "../types";
|
|
2
2
|
import type { DuckLakeConnectionManager } from "./ducklake-connection-manager";
|
|
3
|
+
import type { DuckLakeSnapshotReader } from "./ducklake-snapshot-reader";
|
|
4
|
+
/**
|
|
5
|
+
* Expires old snapshots, except those holding a version that is still needed, then reclaims files.
|
|
6
|
+
*
|
|
7
|
+
* DuckLake's own `older_than` would expire the latest version of a dataset idle longer than the
|
|
8
|
+
* retention, leaving its rows without a version to read them through. Maintenance lists the
|
|
9
|
+
* snapshots older than the retention, keeps those holding each dataset's latest version or a
|
|
10
|
+
* protected version, and expires the rest by id. DuckLake then schedules the files only the
|
|
11
|
+
* expired snapshots referenced, as it does with `older_than`.
|
|
12
|
+
*/
|
|
3
13
|
export declare class DuckLakeMaintenance {
|
|
4
14
|
private readonly options;
|
|
5
15
|
private readonly connections;
|
|
6
|
-
|
|
16
|
+
private readonly snapshots;
|
|
17
|
+
constructor(options: DuckLakeStorageOptions, connections: DuckLakeConnectionManager, snapshots: DuckLakeSnapshotReader);
|
|
7
18
|
runMaintenance(options?: DuckLakeMaintenanceOptions): Promise<DuckLakeMaintenanceReport>;
|
|
19
|
+
private runMaintenanceProcedures;
|
|
20
|
+
/**
|
|
21
|
+
* Snapshots older than the retention, except the current one, which DuckLake never expires.
|
|
22
|
+
*
|
|
23
|
+
* Not DuckLake's own `older_than` selection: a SQLite catalog stores snapshot times as text with
|
|
24
|
+
* their UTC offset, and with DuckLake 415a9ebd that selection then also returned snapshots
|
|
25
|
+
* written a moment ago outside UTC. Casting the stored text compares instants on every catalog.
|
|
26
|
+
*/
|
|
27
|
+
private snapshotsOlderThan;
|
|
8
28
|
}
|
|
9
29
|
//# sourceMappingURL=ducklake-maintenance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-maintenance.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-maintenance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ducklake-maintenance.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-maintenance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,UAAU,CAAA;AAGjB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAaxE;;;;;;;;GAQG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,yBAAyB,EACtC,SAAS,EAAE,sBAAsB;IAG9C,cAAc,CAClB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC;YAmCvB,wBAAwB;IAoDtC;;;;;;OAMG;YACW,kBAAkB;CAiBjC"}
|
|
@@ -1,14 +1,33 @@
|
|
|
1
|
-
import type { DatasetDefinition } from "@sixb/core";
|
|
2
|
-
import type { DatasetCatalogState, DatasetVersion, DatasetVersionRef } from "@sixb/core/lake-storage";
|
|
1
|
+
import type { DatasetDefinition, DatasetSchema } from "@sixb/core";
|
|
2
|
+
import type { DatasetCatalogState, DatasetProducer, DatasetVersion, DatasetVersionLineage, DatasetVersionMode, DatasetVersionRef, LatestVersionsSince, ListLatestVersionsSinceInput } from "@sixb/core/lake-storage";
|
|
3
3
|
import type { DuckLakeStorageOptions } from "../types";
|
|
4
4
|
import type { DuckDbQueryRuntime } from "./duckdb-runtime";
|
|
5
5
|
import type { DuckLakeConnectionManager } from "./ducklake-connection-manager";
|
|
6
6
|
import type { DuckLakeDatasetCatalog } from "./ducklake-dataset-catalog";
|
|
7
7
|
import { type DatasetTableRef } from "./ducklake-dataset-table-ref";
|
|
8
|
+
import type { LatestVersionAtSnapshot } from "./ducklake-version-transaction";
|
|
9
|
+
import { type SixbCommitMetadata } from "./versions";
|
|
10
|
+
export interface DatasetSnapshotRow {
|
|
11
|
+
readonly snapshotId: string;
|
|
12
|
+
readonly tableId: bigint;
|
|
13
|
+
readonly createdAt: Date;
|
|
14
|
+
readonly mode: DatasetVersionMode;
|
|
15
|
+
readonly parentSnapshotId?: string;
|
|
16
|
+
readonly metadata?: SixbCommitMetadata;
|
|
17
|
+
}
|
|
18
|
+
/** A version reference, with the DuckLake table and snapshot it was resolved through. */
|
|
19
|
+
export interface DuckLakeTableVersionRef extends DatasetVersionRef {
|
|
20
|
+
readonly table: DatasetTableRef;
|
|
21
|
+
readonly snapshot: DatasetSnapshotRow;
|
|
22
|
+
}
|
|
23
|
+
/** What a commit needs of the version it builds on. */
|
|
8
24
|
export interface DuckLakeVersionSummary {
|
|
9
25
|
readonly datasetId: string;
|
|
10
26
|
readonly versionId: string;
|
|
27
|
+
readonly schema: DatasetSchema;
|
|
28
|
+
readonly producer?: DatasetProducer;
|
|
11
29
|
readonly inputs?: readonly DatasetVersionRef[];
|
|
30
|
+
readonly lineage?: DatasetVersionLineage;
|
|
12
31
|
readonly rowCount?: number;
|
|
13
32
|
readonly validatedPrimaryKeyColumns?: readonly string[];
|
|
14
33
|
}
|
|
@@ -21,8 +40,13 @@ export interface DuckLakeVersionSummary {
|
|
|
21
40
|
*
|
|
22
41
|
* This class intentionally reads DuckLake metadata directly. The provider does
|
|
23
42
|
* not keep a Sixb side table for versions; a Sixb version is a DuckLake
|
|
24
|
-
* snapshot
|
|
25
|
-
* Sixb
|
|
43
|
+
* snapshot whose `changes_made` names the dataset table: one that changed its
|
|
44
|
+
* rows, or that altered the table with Sixb commit metadata naming the dataset,
|
|
45
|
+
* as a version that changes no rows does (see the write coordinator's
|
|
46
|
+
* `claimTable`).
|
|
47
|
+
*
|
|
48
|
+
* DuckLake names a table in `changes_made` for every change to its rows, inlined
|
|
49
|
+
* or written to files, so version reads never scan the catalog's file tables.
|
|
26
50
|
*/
|
|
27
51
|
export declare class DuckLakeSnapshotReader {
|
|
28
52
|
private readonly options;
|
|
@@ -41,8 +65,28 @@ export declare class DuckLakeSnapshotReader {
|
|
|
41
65
|
*/
|
|
42
66
|
listDatasetCatalogState(datasetIds: readonly string[]): Promise<readonly DatasetCatalogState[]>;
|
|
43
67
|
private collectDatasetCatalogState;
|
|
68
|
+
/**
|
|
69
|
+
* Change feed over DuckLake's snapshot table, which is an append-only commit log: snapshot ids
|
|
70
|
+
* only increase, and a commit becomes visible only after every lower id has (concurrent commits
|
|
71
|
+
* that pick the same id conflict, and the loser retries with the next one). The cursor is the
|
|
72
|
+
* last snapshot id read. Every query is bounded by a snapshot-id range, so an idle read is one
|
|
73
|
+
* indexed query that returns the cursor's own snapshot, whatever the history length.
|
|
74
|
+
*/
|
|
75
|
+
listLatestVersionsSince(input: ListLatestVersionsSinceInput): Promise<LatestVersionsSince | null>;
|
|
76
|
+
private queryHeadSnapshotId;
|
|
77
|
+
/** The cursor's snapshot and up to one feed page of snapshots after it, oldest first. */
|
|
78
|
+
private querySnapshotsFrom;
|
|
79
|
+
/** Current dataset tables, with the first snapshot each table id existed in. */
|
|
80
|
+
private resolveFeedTables;
|
|
81
|
+
/** Folds a page of snapshots, oldest first, into each dataset's newest data version. */
|
|
82
|
+
private collectFeedPage;
|
|
83
|
+
/**
|
|
84
|
+
* The snapshot of every dataset's latest version, however old, from one shared walk down the
|
|
85
|
+
* whole history: maintenance must never expire one.
|
|
86
|
+
*/
|
|
87
|
+
latestVersionSnapshotIds(runtime: DuckDbQueryRuntime): Promise<readonly string[]>;
|
|
44
88
|
private snapshotRowToSummary;
|
|
45
|
-
private
|
|
89
|
+
private resolveDatasetTables;
|
|
46
90
|
/**
|
|
47
91
|
* Resolve each dataset's latest snapshot row with one shared descending walk.
|
|
48
92
|
*
|
|
@@ -52,14 +96,24 @@ export declare class DuckLakeSnapshotReader {
|
|
|
52
96
|
*/
|
|
53
97
|
private resolveLatestSnapshotRows;
|
|
54
98
|
private queryCatalogSnapshotBatch;
|
|
55
|
-
private queryFileChangeFlags;
|
|
56
99
|
private assertNoMetadataConflict;
|
|
57
100
|
getLatestVersionForDefinition(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition): Promise<DatasetVersion | null>;
|
|
58
|
-
getLatestVersionRefForDefinition(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition): Promise<
|
|
101
|
+
getLatestVersionRefForDefinition(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition): Promise<DuckLakeTableVersionRef | null>;
|
|
59
102
|
getLatestVersionSummaryForDefinition(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition): Promise<DuckLakeVersionSummary | null>;
|
|
103
|
+
/**
|
|
104
|
+
* The latest version a commit builds on, with the lake's snapshot it was read at. Its first
|
|
105
|
+
* read fixes the snapshot of a transaction it runs in (see `beginTransactionOnLatestVersion`).
|
|
106
|
+
*/
|
|
107
|
+
getLatestVersionSummaryAtCurrentSnapshot(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition): Promise<LatestVersionAtSnapshot<DuckLakeVersionSummary>>;
|
|
108
|
+
private getLatestVersionSummaryForTableRef;
|
|
60
109
|
getVersionForSnapshot(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition, snapshotId: string): Promise<DatasetVersion | null>;
|
|
61
110
|
getVersionForTableRef(runtime: DuckDbQueryRuntime, tableRef: DatasetTableRef, snapshotId: string): Promise<DatasetVersion | null>;
|
|
62
|
-
getVersionRefForSnapshot(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition, snapshotId: string): Promise<
|
|
111
|
+
getVersionRefForSnapshot(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition, snapshotId: string): Promise<DuckLakeTableVersionRef | null>;
|
|
112
|
+
/**
|
|
113
|
+
* The versions resolved refs point to, with their schemas from one catalog read. Refs resolve
|
|
114
|
+
* without their parent, so these versions carry no `parentVersionId`.
|
|
115
|
+
*/
|
|
116
|
+
getVersionsForRefs(runtime: DuckDbQueryRuntime, refs: readonly DuckLakeTableVersionRef[]): Promise<DatasetVersion[]>;
|
|
63
117
|
listVersionsForDefinition(runtime: DuckDbQueryRuntime, dataset: DatasetDefinition, limit?: number): Promise<readonly DatasetVersion[]>;
|
|
64
118
|
private listVersionsForTableRef;
|
|
65
119
|
getLatestVersionForTableRef(runtime: DuckDbQueryRuntime, tableRef: DatasetTableRef): Promise<DatasetVersion | null>;
|
|
@@ -67,9 +121,27 @@ export declare class DuckLakeSnapshotReader {
|
|
|
67
121
|
private getSnapshotRowForTableRef;
|
|
68
122
|
private getSnapshotRowsForTableRef;
|
|
69
123
|
private collectVisibleSnapshotRows;
|
|
124
|
+
/**
|
|
125
|
+
* Hydrates, newest first, the snapshots whose changes name one of the dataset's tables: every
|
|
126
|
+
* snapshot that may hold one of its versions. The text match is a superset;
|
|
127
|
+
* candidateToSnapshotRow decides visibility.
|
|
128
|
+
*
|
|
129
|
+
* The query walks the catalog's snapshot ids downwards, from `beforeSnapshotId` or the head,
|
|
130
|
+
* and stops at the limit or at the table's creation. A lookup therefore reads the snapshots
|
|
131
|
+
* between where it starts and the versions it returns: a few for an active dataset, at most the
|
|
132
|
+
* table's lifetime for one written long ago. It never reads the file tables, whose replaced
|
|
133
|
+
* files stay until cleanup.
|
|
134
|
+
*/
|
|
70
135
|
private querySnapshotCandidates;
|
|
136
|
+
/**
|
|
137
|
+
* Sixb commit metadata of the snapshots that changed a scanned dataset. Each one carries the
|
|
138
|
+
* lineage of its version, which can be large: scans read it only for the snapshots they keep,
|
|
139
|
+
* never for the other datasets' snapshots they page past.
|
|
140
|
+
*/
|
|
141
|
+
private readCommitMetadata;
|
|
71
142
|
private candidateToSnapshotRow;
|
|
72
|
-
|
|
143
|
+
/** One catalog read for the schemas of every listed version, not one per version. */
|
|
144
|
+
private snapshotsToVersions;
|
|
73
145
|
private withParentSnapshotIds;
|
|
74
146
|
}
|
|
75
147
|
//# sourceMappingURL=ducklake-snapshot-reader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-snapshot-reader.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-snapshot-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"ducklake-snapshot-reader.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-snapshot-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DatasetRow } from "@sixb/core";
|
|
2
|
-
import { type DatasetWriteCommitResult, type ExecuteSqlTransformInput, type LakeSqlExecutor, type PreviewSqlTransformInput } from "@sixb/core/lake-storage";
|
|
2
|
+
import { type AnalyzeSqlTransformInput, type DatasetWriteCommitResult, type ExecuteSqlTransformInput, type LakeSqlExecutor, type PreviewSqlTransformInput, type SqlTransformAnalysis } from "@sixb/core/lake-storage";
|
|
3
3
|
import type { DuckLakeStorageOptions } from "../types";
|
|
4
4
|
import type { DuckLakeConnectionManager } from "./ducklake-connection-manager";
|
|
5
5
|
import type { DuckLakeDatasetCatalog } from "./ducklake-dataset-catalog";
|
|
@@ -23,9 +23,17 @@ export declare class DuckLakeSqlExecutor implements LakeSqlExecutor<"duckdb"> {
|
|
|
23
23
|
constructor(options: DuckLakeStorageOptions, connections: DuckLakeConnectionManager, datasets: DuckLakeDatasetCatalog, snapshots: DuckLakeSnapshotReader, writes: DuckLakeWriteCoordinator);
|
|
24
24
|
preview(input: PreviewSqlTransformInput<"duckdb">): AsyncIterable<DatasetRow>;
|
|
25
25
|
execute(input: ExecuteSqlTransformInput<"duckdb">): Promise<DatasetWriteCommitResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Column lineage bound against the definitions passed in, without reading the lake: it works
|
|
28
|
+
* before any source version exists. Their columns are bound in the order given, which can differ
|
|
29
|
+
* from the lake's stored order; `execute` binds each source's stored version schema instead.
|
|
30
|
+
*/
|
|
31
|
+
analyze(input: AnalyzeSqlTransformInput<"duckdb">): Promise<SqlTransformAnalysis>;
|
|
26
32
|
private resolveSources;
|
|
27
33
|
private resolveSourceDataset;
|
|
28
34
|
private resolveTargetDataset;
|
|
35
|
+
/** The source versions read, by source name, with their schemas from one catalog read. */
|
|
36
|
+
private readSourceVersions;
|
|
29
37
|
private resolveSourceVersion;
|
|
30
38
|
private assertResultSchemaMatchesTarget;
|
|
31
39
|
private applySqlTransform;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-sql-executor.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-sql-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8C,UAAU,EAAE,MAAM,YAAY,CAAA;AACxF,OAAO,
|
|
1
|
+
{"version":3,"file":"ducklake-sql-executor.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-sql-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8C,UAAU,EAAE,MAAM,YAAY,CAAA;AACxF,OAAO,EACL,KAAK,wBAAwB,EAQ7B,KAAK,wBAAwB,EAE7B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EAEpB,KAAK,wBAAwB,EAE7B,KAAK,oBAAoB,EAG1B,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAStD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAA2B,MAAM,4BAA4B,CAAA;AACjG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AA+C5E;;GAEG;AACH,qBAAa,mBAAoB,YAAW,eAAe,CAAC,QAAQ,CAAC;IASjE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZzB,QAAQ,CAAC,OAAO,EAAG,QAAQ,CAAS;IACpC,QAAQ,CAAC,YAAY;;;;MAIpB;gBAGkB,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,yBAAyB,EACtC,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,sBAAsB,EACjC,MAAM,EAAE,wBAAwB;IAG5C,OAAO,CAAC,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC;IAgB9E,OAAO,CAAC,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAoD3F;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAczE,cAAc;YAmCd,oBAAoB;YAcpB,oBAAoB;IAelC,0FAA0F;YAC5E,kBAAkB;YAalB,oBAAoB;YAuBpB,+BAA+B;YAoD/B,iBAAiB;CAuChC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { LakeConcurrencyError } from "@sixb/core/lake-storage";
|
|
2
|
+
import type { DuckLakeCatalogOptions, DuckLakeStorageOptions } from "../types";
|
|
3
|
+
import type { DuckDbQueryRuntime } from "./duckdb-runtime";
|
|
4
|
+
/**
|
|
5
|
+
* The catalog moved while a version transaction was being prepared or committed, before anything
|
|
6
|
+
* was stored. Rerunning the whole transaction from a fresh read of the latest version is safe.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CatalogMovedError extends LakeConcurrencyError {
|
|
9
|
+
}
|
|
10
|
+
/** The latest version of a dataset, and the lake's snapshot it was read at. */
|
|
11
|
+
export interface LatestVersionAtSnapshot<T> {
|
|
12
|
+
readonly snapshotId: string;
|
|
13
|
+
readonly latestVersion: T | null;
|
|
14
|
+
}
|
|
15
|
+
export interface BeginVersionTransactionInput<T> {
|
|
16
|
+
readonly options: DuckLakeStorageOptions;
|
|
17
|
+
readonly runtime: DuckDbQueryRuntime;
|
|
18
|
+
readonly datasetId: string;
|
|
19
|
+
readonly signal?: AbortSignal;
|
|
20
|
+
/**
|
|
21
|
+
* Reads the latest version of the dataset, which the transaction then builds on. Its first
|
|
22
|
+
* statement reads the lake's current snapshot, which fixes the transaction's snapshot.
|
|
23
|
+
*/
|
|
24
|
+
readonly readLatestVersion: () => Promise<LatestVersionAtSnapshot<T>>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Begins the transaction of a new dataset version together with a read of the latest version, so
|
|
28
|
+
* what the new version derives from its parent, such as its row count or its lineage, describes
|
|
29
|
+
* the parent it commits on top of, provided every version it must not build on unseen claims its
|
|
30
|
+
* table (see the write coordinator).
|
|
31
|
+
*/
|
|
32
|
+
export declare function beginTransactionOnLatestVersion<T>(input: BeginVersionTransactionInput<T>): Promise<T | null>;
|
|
33
|
+
export interface CommitOnReadSnapshot {
|
|
34
|
+
/** Recycles the connection when its DuckLake retry setting cannot be restored. */
|
|
35
|
+
readonly poisonRuntime: () => void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Commits a version transaction. A conflict with a concurrent commit fails before DuckLake stores
|
|
39
|
+
* anything, and is raised as a `CatalogMovedError` for the transaction to rerun.
|
|
40
|
+
*
|
|
41
|
+
* DuckLake commits on top of any snapshot committed since the transaction began that does not
|
|
42
|
+
* conflict with it. With `onReadSnapshot`, the commit fails on any such snapshot instead, of this
|
|
43
|
+
* dataset or not: a version that must sit on the version it read, but that inserts and deletes no
|
|
44
|
+
* rows DuckLake could check, needs it.
|
|
45
|
+
*/
|
|
46
|
+
export declare function commitVersionTransaction(runtime: DuckDbQueryRuntime, datasetId: string, onReadSnapshot?: CommitOnReadSnapshot): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Reruns a version transaction that the catalog moved under, before anything was stored. The
|
|
49
|
+
* rerun reads the latest version again: one guarded on an expected latest version checks its guard
|
|
50
|
+
* against what moved, and fails as an optimistic commit if this dataset is what moved.
|
|
51
|
+
*/
|
|
52
|
+
export declare function rerunWhenCatalogMoves<T>(datasetId: string, transaction: (attempt: number) => Promise<T>, signal?: AbortSignal): Promise<T>;
|
|
53
|
+
export declare function isSqliteCatalog(catalog: DuckLakeCatalogOptions): boolean;
|
|
54
|
+
//# sourceMappingURL=ducklake-version-transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ducklake-version-transaction.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-version-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,yBAAyB,CAAA;AAChF,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAE9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAgB1D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,oBAAoB;CAAG;AAE9D,+EAA+E;AAC/E,MAAM,WAAW,uBAAuB,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,4BAA4B,CAAC,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAA;CACtE;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CAAC,CAAC,EACrD,KAAK,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACrC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA0BnB;AAED,MAAM,WAAW,oBAAoB;IACnC,kFAAkF;IAClF,QAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,CAAA;CACnC;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,oBAAoB,GACpC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC5C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CAmBZ;AAoCD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAKxE"}
|
|
@@ -13,6 +13,8 @@ export interface DuckLakeCommitDatasetVersionInput {
|
|
|
13
13
|
readonly commitMessage: string;
|
|
14
14
|
readonly producer?: BeginDatasetWriteInput["producer"];
|
|
15
15
|
readonly inputs?: BeginDatasetWriteInput["inputs"];
|
|
16
|
+
/** The lineage of the rows written, as `BeginDatasetWriteInput.lineage`. */
|
|
17
|
+
readonly lineage?: BeginDatasetWriteInput["lineage"];
|
|
16
18
|
applyChanges(runtime: DuckDbQueryRuntime, context: DuckLakeApplyChangesContext): Promise<ApplyDatasetRowsResult>;
|
|
17
19
|
}
|
|
18
20
|
export interface DuckLakeApplyChangesContext {
|
|
@@ -41,16 +43,41 @@ export declare class DuckLakeWriteCoordinator {
|
|
|
41
43
|
withCommitRuntime<T>(run: (runtime: DuckDbQueryRuntime) => Promise<T>): Promise<T>;
|
|
42
44
|
commitDatasetVersionOnExclusiveRuntime(runtime: DuckDbQueryRuntime, input: DuckLakeCommitDatasetVersionInput): Promise<DatasetWriteCommitResult>;
|
|
43
45
|
private commitVersionOutcomeOnExclusiveRuntime;
|
|
44
|
-
private withGuardedRetrySetting;
|
|
45
46
|
private commitDatasetVersionUnlocked;
|
|
46
47
|
private versionForCommittedWrite;
|
|
47
48
|
private applyStagedRows;
|
|
48
49
|
private setCommitMetadata;
|
|
49
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Claims the table for the version this transaction commits by reapplying its current comment:
|
|
52
|
+
* an idempotent metadata write, which DuckLake records as altering the table. A transaction
|
|
53
|
+
* that changes a table another one altered since it began then fails to commit, before storing
|
|
54
|
+
* anything, and reruns on the new latest version (see `mustClaimTable`).
|
|
55
|
+
*
|
|
56
|
+
* It also gives a version that changes no rows, an initial empty write or a change of
|
|
57
|
+
* provenance, a DuckLake snapshot: DuckLake 1.5.2 creates none for a transaction whose data and
|
|
58
|
+
* metadata are unchanged, and set_commit_message alone cannot force one.
|
|
59
|
+
*
|
|
60
|
+
* Altering a table bumps DuckLake's catalog-wide schema version: every connection reloads its
|
|
61
|
+
* catalog, and concurrent writers to other tables slow down. Versions claim only when needed.
|
|
62
|
+
*/
|
|
63
|
+
private claimTable;
|
|
64
|
+
/** A commit that changes no rows still creates a version for a first version or new provenance. */
|
|
65
|
+
private noOpCreatesVersion;
|
|
66
|
+
/**
|
|
67
|
+
* The latest version a write that began without reading it compared its rows with: the one at
|
|
68
|
+
* the lake snapshot its first read fixed. The version metadata also shows versions committed
|
|
69
|
+
* since. One of this dataset means the rows were compared with an older version, so the write
|
|
70
|
+
* reruns.
|
|
71
|
+
*/
|
|
72
|
+
private latestVersionAtReadSnapshot;
|
|
50
73
|
private versionForNoOpCommit;
|
|
51
74
|
private rollbackTransaction;
|
|
75
|
+
/**
|
|
76
|
+
* Every version but a snapshot keeps its parent's rows, and the lineage it records merges the
|
|
77
|
+
* parent's. A snapshot replaces its parent: it reads it only to guard on it, or on SQLite, whose
|
|
78
|
+
* later reads inside the transaction would block its commit.
|
|
79
|
+
*/
|
|
52
80
|
private beginVersionTransaction;
|
|
53
|
-
private currentSnapshotId;
|
|
54
81
|
private lastCommittedSnapshotId;
|
|
55
82
|
private findSnapshotIdByCommitId;
|
|
56
83
|
private findOwnSnapshotId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-write-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-write-coordinator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"ducklake-write-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-write-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DatasetVersionLineage } from "@sixb/core/lake-storage";
|
|
2
|
+
export declare function encodeLineage(lineage: DatasetVersionLineage): string;
|
|
3
|
+
/**
|
|
4
|
+
* The stored lineage, as stored. One Sixb cannot read is unknown, as Sixb reads a malformed
|
|
5
|
+
* lineage: dropping it instead would classify a version outside pipelines by its own columns only.
|
|
6
|
+
*/
|
|
7
|
+
export declare function decodeLineage(datasetId: string, stored: unknown): DatasetVersionLineage;
|
|
8
|
+
//# sourceMappingURL=lineage-encoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lineage-encoding.d.ts","sourceRoot":"","sources":["../../src/internal/lineage-encoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAqBhC,wBAAgB,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CA8BpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,qBAAqB,CAOvF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AnalyzeSqlTransformSource, SqlTransformLineage } from "@sixb/core/lake-storage";
|
|
2
|
+
import { type DuckLakeSqlTransformTemplate } from "../sql-transform-relations";
|
|
3
|
+
interface AnalyzeSqlTransformLineageInput {
|
|
4
|
+
readonly sources: Readonly<Record<string, AnalyzeSqlTransformSource>>;
|
|
5
|
+
readonly template: DuckLakeSqlTransformTemplate;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* `SqlTransformAnalysis` with the result's column names in order, which the lineage record cannot
|
|
9
|
+
* carry: object keys that look like integers enumerate first.
|
|
10
|
+
*/
|
|
11
|
+
export type SqlLineageAnalysis = {
|
|
12
|
+
readonly supported: true;
|
|
13
|
+
readonly lineage: SqlTransformLineage;
|
|
14
|
+
readonly outputColumns: readonly string[];
|
|
15
|
+
} | {
|
|
16
|
+
readonly supported: false;
|
|
17
|
+
readonly reason: string;
|
|
18
|
+
readonly readsOnlySources: boolean;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Column lineage of a SQL transform, derived without reading any data.
|
|
22
|
+
*
|
|
23
|
+
* A fresh in-memory DuckDB instance creates one empty table per source from its column schema,
|
|
24
|
+
* the transform renders against those tables in the same relation shape it runs with on the lake,
|
|
25
|
+
* and DuckDB binds it. The bound, unoptimized plan is then walked operator by operator. Whatever
|
|
26
|
+
* the walker does not understand exactly is rejected rather than guessed; a rejection or a bind
|
|
27
|
+
* error is an unsupported analysis, while an invalid source pick throws. An unsupported analysis
|
|
28
|
+
* of SQL that parsed still says whether its parse tree reads anything but the sources.
|
|
29
|
+
*/
|
|
30
|
+
export declare function analyzeSqlTransformLineage(input: AnalyzeSqlTransformLineageInput): Promise<SqlLineageAnalysis>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../../src/internal/sql-lineage/analysis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,yBAAyB,EAEzB,mBAAmB,EACpB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EACL,KAAK,4BAA4B,EAGlC,MAAM,4BAA4B,CAAA;AAMnC,UAAU,+BAA+B;IACvC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAA;IACrE,QAAQ,CAAC,QAAQ,EAAE,4BAA4B,CAAA;CAChD;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IACE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1C,GACD;IAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,CAAA;AAyB9F;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CA6B7B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type JsonObject } from "./plan-json";
|
|
2
|
+
import { type PlanColumn } from "./plan-relation";
|
|
3
|
+
/** Source columns whose values flow into an expression evaluated over an operator's `input`. */
|
|
4
|
+
export declare function expressionDependencies(expression: unknown, input: readonly PlanColumn[]): Set<number>;
|
|
5
|
+
/** The sort expressions of an ORDER BY list (`{ type, null_order, expression }` entries). */
|
|
6
|
+
export declare function orderExpressions(orders: readonly unknown[]): readonly unknown[];
|
|
7
|
+
/** `{ orders: [...] }` or null, as aggregates and DISTINCT ON write their ORDER BY. */
|
|
8
|
+
export declare function nestedOrderExpressions(object: JsonObject, key: string): readonly unknown[];
|
|
9
|
+
//# sourceMappingURL=expressions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../../src/internal/sql-lineage/expressions.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EAMhB,MAAM,aAAa,CAAA;AACpB,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAG7E,gGAAgG;AAChG,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,OAAO,EACnB,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,GAAG,CAAC,MAAM,CAAC,CAIb;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,OAAO,EAAE,CAE/E;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAG1F"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict readers for DuckDB's JSON serializers (`json_serialize_sql`, `json_serialize_plan`).
|
|
3
|
+
*
|
|
4
|
+
* The format is not a stable DuckDB API. Every field the analysis reads must be present with the
|
|
5
|
+
* expected shape, so a renamed or retyped field in a future release rejects the transform instead
|
|
6
|
+
* of silently dropping a dependency.
|
|
7
|
+
*/
|
|
8
|
+
export type JsonObject = Readonly<Record<string, unknown>>;
|
|
9
|
+
export declare function isJsonObject(value: unknown): value is JsonObject;
|
|
10
|
+
export declare function asObject(value: unknown, what: string): JsonObject;
|
|
11
|
+
/** A field the serializer always writes. It may be null. */
|
|
12
|
+
export declare function field(object: JsonObject, key: string): unknown;
|
|
13
|
+
export declare function objectField(object: JsonObject, key: string): JsonObject;
|
|
14
|
+
export declare function nullableObjectField(object: JsonObject, key: string): JsonObject | null;
|
|
15
|
+
export declare function stringField(object: JsonObject, key: string): string;
|
|
16
|
+
export declare function booleanField(object: JsonObject, key: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Indexes and table indexes. DuckDB writes 2^64-1 as an "unset" sentinel, which `JSON.parse`
|
|
19
|
+
* rounds; it stays an integer far past any column count, which is all the analysis compares.
|
|
20
|
+
*/
|
|
21
|
+
export declare function indexField(object: JsonObject, key: string): number;
|
|
22
|
+
/** A list field. The serializer writes an absent list as null or as an empty array. */
|
|
23
|
+
export declare function listField(object: JsonObject, key: string): readonly unknown[];
|
|
24
|
+
export declare function asList(value: unknown, what: string): readonly unknown[];
|
|
25
|
+
export declare function objectListField(object: JsonObject, key: string): readonly JsonObject[];
|
|
26
|
+
export declare function indexListField(object: JsonObject, key: string): readonly number[];
|
|
27
|
+
export declare function asIndexList(value: unknown, what: string): readonly number[];
|
|
28
|
+
export declare function stringListField(object: JsonObject, key: string): readonly string[];
|
|
29
|
+
/**
|
|
30
|
+
* Both serializers answer `{ "error": false, <listKey>: [...] }`, or `{ "error": true,
|
|
31
|
+
* "error_message": ... }` when DuckDB could not parse or bind the query.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseSerializerOutput(text: string, listKey: string, failure: string): readonly unknown[];
|
|
34
|
+
//# sourceMappingURL=plan-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-json.d.ts","sourceRoot":"","sources":["../../../src/internal/sql-lineage/plan-json.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAE1D,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAMjE;AAED,4DAA4D;AAC5D,wBAAgB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAM9D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAEvE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAGtF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAOrE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAElE;AAUD,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAE7E;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAUvE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,UAAU,EAAE,CAEtF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAEjF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAE3E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAQlF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,SAAS,OAAO,EAAE,CAOpB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Source columns, as ids assigned by the analysis session, that something depends on. */
|
|
2
|
+
export type Dependencies = ReadonlySet<number>;
|
|
3
|
+
/**
|
|
4
|
+
* A planner-internal column past the end of a table's columns: `rowid`, or the placeholder a
|
|
5
|
+
* `count(*)` scan reads. Scanning one is allowed; depending on one rejects the transform.
|
|
6
|
+
*/
|
|
7
|
+
export declare const VIRTUAL_COLUMN = -1;
|
|
8
|
+
/** A column flowing out of a plan operator. */
|
|
9
|
+
export interface PlanColumn {
|
|
10
|
+
readonly dependencies: Dependencies;
|
|
11
|
+
/**
|
|
12
|
+
* `table_index.column_index` in the plan. Most expressions reference their input by position
|
|
13
|
+
* (BOUND_REF); the subtree under a table function's input keeps binding references instead.
|
|
14
|
+
*/
|
|
15
|
+
readonly binding?: string;
|
|
16
|
+
}
|
|
17
|
+
/** The output of a plan operator: its columns, and what decides which rows exist and their order. */
|
|
18
|
+
export interface PlanRelation {
|
|
19
|
+
readonly columns: readonly PlanColumn[];
|
|
20
|
+
readonly rows: Dependencies;
|
|
21
|
+
}
|
|
22
|
+
export declare function bindingKey(tableIndex: number, columnIndex: number): string;
|
|
23
|
+
/** Positional access into an operator's columns or index lists. */
|
|
24
|
+
export declare function itemAt<T>(items: readonly T[], index: number, what: string): T;
|
|
25
|
+
export declare function unionOf(...sets: readonly Dependencies[]): Set<number>;
|
|
26
|
+
export declare function addAll(target: Set<number>, source: Iterable<number>): void;
|
|
27
|
+
export declare function sameDependencies(left: Dependencies, right: Dependencies): boolean;
|
|
28
|
+
//# sourceMappingURL=plan-relation.d.ts.map
|