@sixb/ducklake 0.1.0 → 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.
Files changed (38) hide show
  1. package/README.md +37 -0
  2. package/dist/ducklake-storage.d.ts +2 -1
  3. package/dist/ducklake-storage.d.ts.map +1 -1
  4. package/dist/index.js +598 -43
  5. package/dist/index.js.map +15 -13
  6. package/dist/internal/dataset-row-commit.d.ts +6 -0
  7. package/dist/internal/dataset-row-commit.d.ts.map +1 -1
  8. package/dist/internal/dataset-row-merge.d.ts +16 -0
  9. package/dist/internal/dataset-row-merge.d.ts.map +1 -0
  10. package/dist/internal/ducklake-catalog-schema.d.ts +4 -1
  11. package/dist/internal/ducklake-catalog-schema.d.ts.map +1 -1
  12. package/dist/internal/ducklake-current-dataset-definitions.d.ts.map +1 -1
  13. package/dist/internal/ducklake-dataset-catalog.d.ts +1 -0
  14. package/dist/internal/ducklake-dataset-catalog.d.ts.map +1 -1
  15. package/dist/internal/ducklake-merge-session.d.ts +21 -0
  16. package/dist/internal/ducklake-merge-session.d.ts.map +1 -0
  17. package/dist/internal/ducklake-snapshot-reader.d.ts +1 -0
  18. package/dist/internal/ducklake-snapshot-reader.d.ts.map +1 -1
  19. package/dist/internal/ducklake-write-coordinator.d.ts +5 -1
  20. package/dist/internal/ducklake-write-coordinator.d.ts.map +1 -1
  21. package/dist/internal/ducklake-write-session.d.ts.map +1 -1
  22. package/dist/internal/schema.d.ts +2 -0
  23. package/dist/internal/schema.d.ts.map +1 -1
  24. package/dist/internal/versions.d.ts +1 -0
  25. package/dist/internal/versions.d.ts.map +1 -1
  26. package/package.json +7 -4
  27. package/src/ducklake-storage.ts +6 -0
  28. package/src/internal/dataset-row-commit.ts +95 -2
  29. package/src/internal/dataset-row-merge.ts +268 -0
  30. package/src/internal/ducklake-catalog-schema.ts +90 -1
  31. package/src/internal/ducklake-current-dataset-definitions.ts +14 -5
  32. package/src/internal/ducklake-dataset-catalog.ts +43 -9
  33. package/src/internal/ducklake-merge-session.ts +187 -0
  34. package/src/internal/ducklake-snapshot-reader.ts +9 -2
  35. package/src/internal/ducklake-write-coordinator.ts +160 -20
  36. package/src/internal/ducklake-write-session.ts +28 -5
  37. package/src/internal/schema.ts +7 -0
  38. 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,EAAE,KAAK,gBAAgB,EAAoB,MAAM,yBAAyB,CAAA;AACjF,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,CA0ClC"}
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;AAIxE,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;CACjC;AAWD,wBAAgB,qCAAqC,CACnD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,qBAAqB,EAAE,GACrC,aAAa,CAoBf"}
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;AAoB1D,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"}
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;AAK1D,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;IA4CxE,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,gCAAgC;YAwBhC,mBAAmB;YASnB,4BAA4B;CAgC3C"}
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;CAC3B;AAyBD;;;;;;;;;;;GAWG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFR,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,yBAAyB,EACtC,QAAQ,EAAE,sBAAsB;IAG7C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;IAanF,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAanE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IActF;;;;;;OAMG;IACG,uBAAuB,CAC3B,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC;YAY5B,0BAA0B;IAsBxC,OAAO,CAAC,oBAAoB;YAad,sBAAsB;IAiCpC;;;;;;OAMG;YACW,yBAAyB;YA8DzB,yBAAyB;YAyCzB,oBAAoB;IAuDlC,OAAO,CAAC,wBAAwB;IAY1B,6BAA6B,CACjC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAK3B,gCAAgC,CACpC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAK9B,oCAAoC,CACxC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAkBnC,qBAAqB,CACzB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAO3B,qBAAqB,CACzB,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAO3B,wBAAwB,CAC5B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAc9B,yBAAyB,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,iBAAiB,EAC1B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;YAKvB,uBAAuB;IAe/B,2BAA2B,CAC/B,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YAKnB,+BAA+B;YAY/B,yBAAyB;YAgCzB,0BAA0B;YAmB1B,0BAA0B;YA2C1B,uBAAuB;IAsGrC,OAAO,CAAC,sBAAsB;YAyChB,iBAAiB;IAgC/B,OAAO,CAAC,qBAAqB;CAa9B"}
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,EAEtB,wBAAwB,EACxB,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;AAE7B,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,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;AAMD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;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;YA4B5D,WAAW;IAyBnB,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;YAOtB,uBAAuB;YA2CvB,4BAA4B;YAwD5B,wBAAwB;YAoDxB,eAAe;YAyBf,iBAAiB;YA4BjB,oBAAoB;YAcpB,mBAAmB;YASnB,sBAAsB;YAUtB,uBAAuB;YAYvB,wBAAwB;YAiCxB,iBAAiB;IA0B/B,OAAO,CAAC,2BAA2B;CAepC"}
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;AAEhC,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"}
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,CAqClF;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"}
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.1.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
- "@sixb/core": "0.1.0"
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
  },
@@ -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 { type DatasetWriteMode, LakeStorageError } from "@sixb/core/lake-storage"
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