@sixb/ducklake 0.0.1 → 0.1.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/README.md +37 -0
- package/dist/ducklake-storage.d.ts +2 -1
- package/dist/ducklake-storage.d.ts.map +1 -1
- package/dist/index.js +598 -43
- package/dist/index.js.map +15 -13
- package/dist/internal/dataset-row-commit.d.ts +6 -0
- package/dist/internal/dataset-row-commit.d.ts.map +1 -1
- package/dist/internal/dataset-row-merge.d.ts +16 -0
- package/dist/internal/dataset-row-merge.d.ts.map +1 -0
- package/dist/internal/ducklake-catalog-schema.d.ts +4 -1
- package/dist/internal/ducklake-catalog-schema.d.ts.map +1 -1
- package/dist/internal/ducklake-current-dataset-definitions.d.ts.map +1 -1
- package/dist/internal/ducklake-dataset-catalog.d.ts +1 -0
- package/dist/internal/ducklake-dataset-catalog.d.ts.map +1 -1
- package/dist/internal/ducklake-merge-session.d.ts +21 -0
- package/dist/internal/ducklake-merge-session.d.ts.map +1 -0
- package/dist/internal/ducklake-snapshot-reader.d.ts +1 -0
- package/dist/internal/ducklake-snapshot-reader.d.ts.map +1 -1
- package/dist/internal/ducklake-write-coordinator.d.ts +5 -1
- package/dist/internal/ducklake-write-coordinator.d.ts.map +1 -1
- package/dist/internal/ducklake-write-session.d.ts.map +1 -1
- package/dist/internal/schema.d.ts +2 -0
- package/dist/internal/schema.d.ts.map +1 -1
- package/dist/internal/versions.d.ts +1 -0
- package/dist/internal/versions.d.ts.map +1 -1
- package/package.json +7 -4
- package/src/ducklake-storage.ts +6 -0
- package/src/internal/dataset-row-commit.ts +95 -2
- package/src/internal/dataset-row-merge.ts +268 -0
- package/src/internal/ducklake-catalog-schema.ts +90 -1
- package/src/internal/ducklake-current-dataset-definitions.ts +14 -5
- package/src/internal/ducklake-dataset-catalog.ts +43 -9
- package/src/internal/ducklake-merge-session.ts +187 -0
- package/src/internal/ducklake-snapshot-reader.ts +9 -2
- package/src/internal/ducklake-write-coordinator.ts +160 -20
- package/src/internal/ducklake-write-session.ts +28 -5
- package/src/internal/schema.ts +7 -0
- package/src/internal/versions.ts +17 -1
|
@@ -23,4 +23,10 @@ export declare function applyDatasetRowsFromRelation(input: {
|
|
|
23
23
|
readonly sourceRelationSql: string;
|
|
24
24
|
readonly previousRowCount?: number;
|
|
25
25
|
}): Promise<ApplyDatasetRowsResult>;
|
|
26
|
+
export declare function inspectUniqueKeyedRelation(input: {
|
|
27
|
+
readonly runtime: DuckDbQueryRuntime;
|
|
28
|
+
readonly dataset: DatasetDefinition;
|
|
29
|
+
readonly relationSql: string;
|
|
30
|
+
readonly context: string;
|
|
31
|
+
}): Promise<number>;
|
|
26
32
|
//# sourceMappingURL=dataset-row-commit.d.ts.map
|
|
@@ -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,
|
|
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;CAC3C;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,CAoElC;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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DatasetDefinition } from "@sixb/core";
|
|
2
|
+
import type { DuckLakeStorageOptions } from "../types";
|
|
3
|
+
import { type ApplyDatasetRowsResult } from "./dataset-row-commit";
|
|
4
|
+
import type { DuckDbQueryRuntime } from "./duckdb-runtime";
|
|
5
|
+
export interface ApplyDatasetMergeFromRelationInput {
|
|
6
|
+
readonly options: DuckLakeStorageOptions;
|
|
7
|
+
readonly runtime: DuckDbQueryRuntime;
|
|
8
|
+
readonly dataset: DatasetDefinition;
|
|
9
|
+
readonly stagingTableName: string;
|
|
10
|
+
readonly sequenceColumnName: string;
|
|
11
|
+
readonly kindColumnName: string;
|
|
12
|
+
readonly previousRowCount?: number;
|
|
13
|
+
readonly validatedPrimaryKeyColumns?: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function applyDatasetMergeFromRelation(input: ApplyDatasetMergeFromRelationInput): Promise<ApplyDatasetRowsResult>;
|
|
16
|
+
//# sourceMappingURL=dataset-row-merge.d.ts.map
|
|
@@ -0,0 +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;AAEnD,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,CAqEjC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DatasetSchema } from "@sixb/core";
|
|
1
|
+
import type { DatasetPrimaryKey, DatasetSchema } from "@sixb/core";
|
|
2
2
|
export interface DuckLakeCatalogColumn {
|
|
3
3
|
readonly tableName: string;
|
|
4
4
|
readonly columnId: bigint;
|
|
@@ -7,6 +7,9 @@ export interface DuckLakeCatalogColumn {
|
|
|
7
7
|
readonly columnType: string;
|
|
8
8
|
readonly nullsAllowed: boolean;
|
|
9
9
|
readonly parentColumnId?: bigint;
|
|
10
|
+
readonly comment?: string;
|
|
10
11
|
}
|
|
11
12
|
export declare function duckLakeCatalogColumnsToDatasetSchema(tableName: string, rows: readonly DuckLakeCatalogColumn[]): DatasetSchema;
|
|
13
|
+
export declare function duckLakePrimaryKeyColumnComment(ordinal: number): string;
|
|
14
|
+
export declare function duckLakeCatalogColumnsToDatasetPrimaryKey(tableName: string, rows: readonly DuckLakeCatalogColumn[]): DatasetPrimaryKey | undefined;
|
|
12
15
|
//# sourceMappingURL=ducklake-catalog-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-catalog-schema.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-catalog-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,aAAa,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"ducklake-catalog-schema.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-catalog-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAI3F,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAcD,wBAAgB,qCAAqC,CACnD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,qBAAqB,EAAE,GACrC,aAAa,CAoBf;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,yCAAyC,CACvD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,qBAAqB,EAAE,GACrC,iBAAiB,GAAG,SAAS,CAkE/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-current-dataset-definitions.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-current-dataset-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAQtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"ducklake-current-dataset-definitions.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-current-dataset-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAQtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAqB1D,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACxC;AAED,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAkCzC"}
|
|
@@ -26,6 +26,7 @@ export declare class DuckLakeDatasetCatalog {
|
|
|
26
26
|
private applySchemaEvolutionDdl;
|
|
27
27
|
private applyMetadataDelta;
|
|
28
28
|
private applyPartitionBy;
|
|
29
|
+
private applyPrimaryKey;
|
|
29
30
|
private setSchemaEvolutionCommitMetadata;
|
|
30
31
|
private rollbackTransaction;
|
|
31
32
|
private readDatasetColumnsAtSnapshot;
|
|
@@ -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;AAGlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,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;AAGlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAM1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAY9E;;;;;;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,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyDxE,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;IAW9C,0BAA0B,CAC9B,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAazB,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;YAQnC,0BAA0B;YA+B1B,uBAAuB;YAYvB,kBAAkB;YAmBlB,gBAAgB;YA0BhB,eAAe;YAoBf,gCAAgC;YAwBhC,mBAAmB;YASnB,4BAA4B;CAgC3C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BeginDatasetMergeInput, CommitDatasetMergeInput, DatasetMergeCommitResult, LakeMergeSession } from "@sixb/core/lake-storage";
|
|
2
|
+
import type { DuckDbRuntime } from "./duckdb-runtime";
|
|
3
|
+
export interface DuckLakeCommitMergeInput {
|
|
4
|
+
readonly merge: BeginDatasetMergeInput;
|
|
5
|
+
readonly baseVersionId: string | null;
|
|
6
|
+
readonly commit?: CommitDatasetMergeInput;
|
|
7
|
+
readonly stagingTableName: string;
|
|
8
|
+
readonly sequenceColumnName: string;
|
|
9
|
+
readonly kindColumnName: string;
|
|
10
|
+
readonly changesWritten: number;
|
|
11
|
+
}
|
|
12
|
+
type DuckLakeCommitMerge = (input: DuckLakeCommitMergeInput) => Promise<DatasetMergeCommitResult>;
|
|
13
|
+
interface CreateDuckLakeMergeSessionInput {
|
|
14
|
+
readonly commitMerge: DuckLakeCommitMerge;
|
|
15
|
+
readonly runtime: DuckDbRuntime;
|
|
16
|
+
readonly merge: BeginDatasetMergeInput;
|
|
17
|
+
readonly baseVersionId: string | null;
|
|
18
|
+
}
|
|
19
|
+
export declare function createDuckLakeMergeSession(input: CreateDuckLakeMergeSessionInput): Promise<LakeMergeSession>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=ducklake-merge-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ducklake-merge-session.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-merge-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AAMhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAKrD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAA;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAA;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE,wBAAwB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAA;AASjG,UAAU,+BAA+B;IACvC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;IACzC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAA;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CACtC;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAuB3B"}
|
|
@@ -9,6 +9,7 @@ export interface DuckLakeVersionSummary {
|
|
|
9
9
|
readonly datasetId: string;
|
|
10
10
|
readonly versionId: string;
|
|
11
11
|
readonly rowCount?: number;
|
|
12
|
+
readonly validatedPrimaryKeyColumns?: readonly string[];
|
|
12
13
|
}
|
|
13
14
|
/**
|
|
14
15
|
* Reconstructs Sixb DatasetVersion objects from DuckLake snapshots.
|
|
@@ -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;AACnD,OAAO,KAAK,EACV,mBAAmB,EAEnB,cAAc,EAEd,iBAAiB,EAClB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,KAAK,eAAe,EAA0B,MAAM,8BAA8B,CAAA;AA4C3F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,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 { DatasetDefinition } from "@sixb/core";
|
|
2
|
-
import type { BeginDatasetWriteInput, DatasetWriteCommitResult, DatasetWriteMode, LakeWriteSession } from "@sixb/core/lake-storage";
|
|
2
|
+
import type { BeginDatasetMergeInput, BeginDatasetWriteInput, DatasetWriteCommitResult, DatasetWriteMode, LakeMergeSession, LakeWriteSession } from "@sixb/core/lake-storage";
|
|
3
3
|
import type { DuckLakeStorageOptions } from "../types";
|
|
4
4
|
import { type ApplyDatasetRowsResult } from "./dataset-row-commit";
|
|
5
5
|
import type { DuckDbQueryRuntime } from "./duckdb-runtime";
|
|
@@ -17,6 +17,7 @@ export interface DuckLakeCommitDatasetVersionInput {
|
|
|
17
17
|
}
|
|
18
18
|
export interface DuckLakeApplyChangesContext {
|
|
19
19
|
readonly previousRowCount?: number;
|
|
20
|
+
readonly validatedPrimaryKeyColumns?: readonly string[];
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
23
|
* Owns the durable DuckLake transaction for a staged Sixb write.
|
|
@@ -33,10 +34,13 @@ export declare class DuckLakeWriteCoordinator {
|
|
|
33
34
|
private readonly snapshots;
|
|
34
35
|
constructor(options: DuckLakeStorageOptions, connections: DuckLakeConnectionManager, datasets: DuckLakeDatasetCatalog, snapshots: DuckLakeSnapshotReader);
|
|
35
36
|
beginWrite(input: BeginDatasetWriteInput): Promise<LakeWriteSession>;
|
|
37
|
+
beginMerge(input: BeginDatasetMergeInput): Promise<LakeMergeSession>;
|
|
36
38
|
private commitWrite;
|
|
39
|
+
private commitMerge;
|
|
37
40
|
commitDatasetVersion(input: DuckLakeCommitDatasetVersionInput): Promise<DatasetWriteCommitResult>;
|
|
38
41
|
withCommitRuntime<T>(run: (runtime: DuckDbQueryRuntime) => Promise<T>): Promise<T>;
|
|
39
42
|
commitDatasetVersionOnExclusiveRuntime(runtime: DuckDbQueryRuntime, input: DuckLakeCommitDatasetVersionInput): Promise<DatasetWriteCommitResult>;
|
|
43
|
+
private commitVersionOutcomeOnExclusiveRuntime;
|
|
40
44
|
private withGuardedRetrySetting;
|
|
41
45
|
private commitDatasetVersionUnlocked;
|
|
42
46
|
private versionForCommittedWrite;
|
|
@@ -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,
|
|
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,EAGtB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,EACL,KAAK,sBAAsB,EAI5B,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAExE,OAAO,KAAK,EAAE,sBAAsB,EAA0B,MAAM,4BAA4B,CAAA;AAKhG,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAA;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAClD,YAAY,CACV,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAAA;CACnC;AAeD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACxD;AAED;;;;;;;GAOG;AACH,qBAAa,wBAAwB;IAEjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAHT,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,yBAAyB,EACtC,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,sBAAsB;IAG9C,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4BpE,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAkC5D,WAAW;YAyBX,WAAW;IA4CnB,oBAAoB,CACxB,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,wBAAwB,CAAC;IAM9B,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAQlF,sCAAsC,CAC1C,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,wBAAwB,CAAC;YAiBtB,sCAAsC;YAUtC,uBAAuB;YA2CvB,4BAA4B;YA0D5B,wBAAwB;YAiExB,eAAe;YAyBf,iBAAiB;YAkCjB,oBAAoB;YAmBpB,mBAAmB;YASnB,sBAAsB;YAUtB,uBAAuB;YAYvB,wBAAwB;YAiCxB,iBAAiB;IA0B/B,OAAO,CAAC,2BAA2B;CAgBpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-write-session.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-write-session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"ducklake-write-session.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-write-session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AAMhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAKrD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAA;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAA;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,KAAK,mBAAmB,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAA;AAOnG,UAAU,+BAA+B;IACvC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;IACzC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAA;CACvC;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
|
|
@@ -23,6 +23,8 @@ export declare function datasetColumnToDuckDbSql(column: DatasetColumnDefinition
|
|
|
23
23
|
* Render the column list used by CREATE TABLE and staging table DDL.
|
|
24
24
|
*/
|
|
25
25
|
export declare function datasetSchemaToDuckDbColumnsSql(schema: DatasetSchema): string;
|
|
26
|
+
/** Render a dataset schema for merge staging, where delete rows leave non-key values null. */
|
|
27
|
+
export declare function datasetSchemaToDuckDbNullableColumnsSql(schema: DatasetSchema): string;
|
|
26
28
|
/**
|
|
27
29
|
* Render the column list used by INSERT ... SELECT operations.
|
|
28
30
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/internal/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAW,MAAM,YAAY,CAAA;AAMpG;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAShF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAGhF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE7E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAEzE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,SAAS,oBAAoB,EAAE,GACvC,aAAa,CAQf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAqB3F"}
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/internal/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAW,MAAM,YAAY,CAAA;AAMpG;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAShF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAGhF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE7E;AAED,8FAA8F;AAC9F,wBAAgB,uCAAuC,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAIrF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAEzE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,SAAS,oBAAoB,EAAE,GACvC,aAAa,CAQf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAqB3F"}
|
|
@@ -10,6 +10,7 @@ export interface SixbCommitMetadata {
|
|
|
10
10
|
readonly producer?: DatasetVersion["producer"];
|
|
11
11
|
readonly inputs?: DatasetVersion["inputs"];
|
|
12
12
|
readonly rowCount?: number;
|
|
13
|
+
readonly validatedPrimaryKeyColumns?: readonly string[];
|
|
13
14
|
readonly schemaChange?: SixbSchemaChangeMetadata;
|
|
14
15
|
}
|
|
15
16
|
export declare function parseVersionId(versionId: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/internal/versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG7D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,wBAAwB,CAAA;CACjD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/internal/versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG7D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,0BAA0B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,wBAAwB,CAAA;CACjD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CA2ClF;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAsBxE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sixb/ducklake",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "DuckDB/DuckLake lake storage provider for Sixb",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sixb",
|
|
@@ -36,15 +36,18 @@
|
|
|
36
36
|
"typecheck": "tsc --noEmit",
|
|
37
37
|
"test": "bun test",
|
|
38
38
|
"test:e2e": "bun run test:e2e:local && bun run test:e2e:remote",
|
|
39
|
-
"test:e2e:local": "bun test ./tests/ducklake-contract.e2e.ts ./tests/ducklake-file-refs.e2e.ts ./tests/ducklake-catalog-state.e2e.ts ./tests/ducklake-catalogs.e2e.ts ./tests/ducklake-concurrency.e2e.ts ./tests/ducklake-datasets.e2e.ts ./tests/ducklake-driver.e2e.ts ./tests/ducklake-maintenance.e2e.ts ./tests/ducklake-sql-transforms.e2e.ts ./tests/ducklake-versions.e2e.ts ./tests/ducklake-writes.e2e.ts",
|
|
39
|
+
"test:e2e:local": "bun test ./tests/ducklake-contract.e2e.ts ./tests/ducklake-file-refs.e2e.ts ./tests/ducklake-catalog-state.e2e.ts ./tests/ducklake-catalogs.e2e.ts ./tests/ducklake-concurrency.e2e.ts ./tests/ducklake-datasets.e2e.ts ./tests/ducklake-driver.e2e.ts ./tests/ducklake-maintenance.e2e.ts ./tests/ducklake-merges.e2e.ts ./tests/ducklake-sql-transforms.e2e.ts ./tests/ducklake-versions.e2e.ts ./tests/ducklake-writes.e2e.ts",
|
|
40
40
|
"test:e2e:remote": "bun test --preload ./tests/setup.ts ./tests/ducklake-remote.e2e.ts",
|
|
41
41
|
"prepack": "bun run build"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@duckdb/node-api": "^1.5.2-r.1"
|
|
45
|
-
|
|
44
|
+
"@duckdb/node-api": "^1.5.2-r.1"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"@sixb/core": "^0.1.1"
|
|
46
48
|
},
|
|
47
49
|
"devDependencies": {
|
|
50
|
+
"@sixb/core": "0.1.1",
|
|
48
51
|
"@types/bun": "latest",
|
|
49
52
|
"typescript": "^5.7.0"
|
|
50
53
|
},
|
package/src/ducklake-storage.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { DatasetDefinition, DatasetRow, LakeStorageWithSql } from "@sixb/core"
|
|
2
2
|
import type {
|
|
3
|
+
BeginDatasetMergeInput,
|
|
3
4
|
BeginDatasetWriteInput,
|
|
4
5
|
DatasetCatalogState,
|
|
5
6
|
DatasetVersion,
|
|
7
|
+
LakeMergeSession,
|
|
6
8
|
LakeWriteSession,
|
|
7
9
|
ReadDatasetRowsInput,
|
|
8
10
|
} from "@sixb/core/lake-storage"
|
|
@@ -104,6 +106,10 @@ export class DuckLakeStorage implements LakeStorageWithSql<"duckdb"> {
|
|
|
104
106
|
return this.writes.beginWrite(input)
|
|
105
107
|
}
|
|
106
108
|
|
|
109
|
+
async beginMerge(input: BeginDatasetMergeInput): Promise<LakeMergeSession> {
|
|
110
|
+
return this.writes.beginMerge(input)
|
|
111
|
+
}
|
|
112
|
+
|
|
107
113
|
async getLatestVersion(datasetId: string): Promise<DatasetVersion | null> {
|
|
108
114
|
return this.snapshotReader.getLatestVersion(datasetId)
|
|
109
115
|
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import type { DatasetDefinition } from "@sixb/core"
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
type DatasetWriteMode,
|
|
4
|
+
getDatasetPrimaryKeyColumns,
|
|
5
|
+
LakeStorageError,
|
|
6
|
+
} from "@sixb/core/lake-storage"
|
|
3
7
|
import type { DuckLakeStorageOptions } from "../types"
|
|
4
8
|
import { getBigIntLike } from "./duckdb-row"
|
|
5
9
|
import type { DuckDbQueryRuntime } from "./duckdb-runtime"
|
|
6
10
|
import { encodeDatasetTableName } from "./names"
|
|
7
11
|
import { datasetSchemaColumnNamesSql } from "./schema"
|
|
8
|
-
import { qualifiedTableName } from "./sql"
|
|
12
|
+
import { qualifiedTableName, quoteIdentifier } from "./sql"
|
|
9
13
|
|
|
10
14
|
export type CommitRowCount =
|
|
11
15
|
| { readonly kind: "exact"; readonly value: number }
|
|
@@ -40,6 +44,32 @@ export async function applyDatasetRowsFromRelation(input: {
|
|
|
40
44
|
const tableName = encodeDatasetTableName(input.dataset.id)
|
|
41
45
|
const table = qualifiedTableName(input.options, tableName)
|
|
42
46
|
const columnsSql = datasetSchemaColumnNamesSql(input.dataset.schema)
|
|
47
|
+
const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)
|
|
48
|
+
|
|
49
|
+
if (primaryKeyColumns !== null) {
|
|
50
|
+
await inspectUniqueKeyedRelation({
|
|
51
|
+
runtime: input.runtime,
|
|
52
|
+
dataset: input.dataset,
|
|
53
|
+
relationSql: input.sourceRelationSql,
|
|
54
|
+
context: `${input.mode} source`,
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
if (input.mode === "append") {
|
|
58
|
+
await inspectUniqueKeyedRelation({
|
|
59
|
+
runtime: input.runtime,
|
|
60
|
+
dataset: input.dataset,
|
|
61
|
+
relationSql: table,
|
|
62
|
+
context: "current baseline",
|
|
63
|
+
})
|
|
64
|
+
await assertNoPrimaryKeyOverlap({
|
|
65
|
+
runtime: input.runtime,
|
|
66
|
+
dataset: input.dataset,
|
|
67
|
+
leftRelationSql: input.sourceRelationSql,
|
|
68
|
+
rightRelationSql: table,
|
|
69
|
+
context: "append",
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
}
|
|
43
73
|
|
|
44
74
|
if (input.mode === "snapshot") {
|
|
45
75
|
const source = await fingerprintRelation(input.runtime, input.sourceRelationSql, columnsSql)
|
|
@@ -80,6 +110,69 @@ export async function applyDatasetRowsFromRelation(input: {
|
|
|
80
110
|
}
|
|
81
111
|
}
|
|
82
112
|
|
|
113
|
+
export async function inspectUniqueKeyedRelation(input: {
|
|
114
|
+
readonly runtime: DuckDbQueryRuntime
|
|
115
|
+
readonly dataset: DatasetDefinition
|
|
116
|
+
readonly relationSql: string
|
|
117
|
+
readonly context: string
|
|
118
|
+
}): Promise<number> {
|
|
119
|
+
const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)
|
|
120
|
+
if (primaryKeyColumns === null) {
|
|
121
|
+
throw new LakeStorageError(
|
|
122
|
+
`[SixbDuckLake] Dataset '${input.dataset.id}' must define a primaryKey before rows can be keyed.`
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const keysSql = primaryKeyColumns.map((column) => quoteIdentifier(column)).join(", ")
|
|
127
|
+
const [row] = await input.runtime.query(`
|
|
128
|
+
SELECT
|
|
129
|
+
count(*) AS row_count,
|
|
130
|
+
coalesce(max(key_count), 0) AS max_key_count
|
|
131
|
+
FROM (
|
|
132
|
+
SELECT count(*) OVER (PARTITION BY ${keysSql}) AS key_count
|
|
133
|
+
FROM ${input.relationSql}
|
|
134
|
+
) keyed_rows
|
|
135
|
+
`)
|
|
136
|
+
|
|
137
|
+
const rowCount = row === undefined ? 0 : Number(getBigIntLike(row, "row_count"))
|
|
138
|
+
const maxKeyCount = row === undefined ? 0 : Number(getBigIntLike(row, "max_key_count"))
|
|
139
|
+
if (maxKeyCount > 1) {
|
|
140
|
+
throw new LakeStorageError(
|
|
141
|
+
`[SixbDuckLake] Dataset '${input.dataset.id}' ${input.context} contains duplicate primary key.`
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return rowCount
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function assertNoPrimaryKeyOverlap(input: {
|
|
149
|
+
readonly runtime: DuckDbQueryRuntime
|
|
150
|
+
readonly dataset: DatasetDefinition
|
|
151
|
+
readonly leftRelationSql: string
|
|
152
|
+
readonly rightRelationSql: string
|
|
153
|
+
readonly context: string
|
|
154
|
+
}): Promise<void> {
|
|
155
|
+
const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)
|
|
156
|
+
if (primaryKeyColumns === null) {
|
|
157
|
+
return
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const matchSql = primaryKeyColumns
|
|
161
|
+
.map((column) => `left_rows.${quoteIdentifier(column)} = right_rows.${quoteIdentifier(column)}`)
|
|
162
|
+
.join(" AND ")
|
|
163
|
+
const [collision] = await input.runtime.query(`
|
|
164
|
+
SELECT 1
|
|
165
|
+
FROM ${input.leftRelationSql} left_rows
|
|
166
|
+
JOIN ${input.rightRelationSql} right_rows ON ${matchSql}
|
|
167
|
+
LIMIT 1
|
|
168
|
+
`)
|
|
169
|
+
if (collision !== undefined) {
|
|
170
|
+
throw new LakeStorageError(
|
|
171
|
+
`[SixbDuckLake] Dataset '${input.dataset.id}' ${input.context} contains duplicate primary key.`
|
|
172
|
+
)
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
83
176
|
interface RelationFingerprint {
|
|
84
177
|
readonly rowCount: number
|
|
85
178
|
readonly hashSum: string
|