@chkit/plugin-backfill 0.1.0-beta.2 → 0.1.0-beta.21

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 (164) hide show
  1. package/README.md +170 -0
  2. package/dist/args.d.ts +109 -6
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +73 -97
  5. package/dist/args.js.map +1 -1
  6. package/dist/async-backfill.d.ts +64 -0
  7. package/dist/async-backfill.d.ts.map +1 -0
  8. package/dist/async-backfill.js +251 -0
  9. package/dist/async-backfill.js.map +1 -0
  10. package/dist/check.d.ts +9 -0
  11. package/dist/check.d.ts.map +1 -0
  12. package/dist/check.js +79 -0
  13. package/dist/check.js.map +1 -0
  14. package/dist/chunking/analyze.d.ts +8 -0
  15. package/dist/chunking/analyze.d.ts.map +1 -0
  16. package/dist/chunking/analyze.js +8 -0
  17. package/dist/chunking/analyze.js.map +1 -0
  18. package/dist/chunking/boundary-codec.d.ts +10 -0
  19. package/dist/chunking/boundary-codec.d.ts.map +1 -0
  20. package/dist/chunking/boundary-codec.js +79 -0
  21. package/dist/chunking/boundary-codec.js.map +1 -0
  22. package/dist/chunking/build.d.ts +11 -0
  23. package/dist/chunking/build.d.ts.map +1 -0
  24. package/dist/chunking/build.js +51 -0
  25. package/dist/chunking/build.js.map +1 -0
  26. package/dist/chunking/e2e/constants.d.ts +2 -0
  27. package/dist/chunking/e2e/constants.d.ts.map +1 -0
  28. package/dist/chunking/e2e/constants.js +2 -0
  29. package/dist/chunking/e2e/constants.js.map +1 -0
  30. package/dist/chunking/e2e/seed-datasets.script.d.ts +20 -0
  31. package/dist/chunking/e2e/seed-datasets.script.d.ts.map +1 -0
  32. package/dist/chunking/e2e/seed-datasets.script.js +134 -0
  33. package/dist/chunking/e2e/seed-datasets.script.js.map +1 -0
  34. package/dist/chunking/introspect.d.ts +40 -0
  35. package/dist/chunking/introspect.d.ts.map +1 -0
  36. package/dist/chunking/introspect.js +187 -0
  37. package/dist/chunking/introspect.js.map +1 -0
  38. package/dist/chunking/partition-slices.d.ts +14 -0
  39. package/dist/chunking/partition-slices.d.ts.map +1 -0
  40. package/dist/chunking/partition-slices.js +111 -0
  41. package/dist/chunking/partition-slices.js.map +1 -0
  42. package/dist/chunking/planner.d.ts +3 -0
  43. package/dist/chunking/planner.d.ts.map +1 -0
  44. package/dist/chunking/planner.js +343 -0
  45. package/dist/chunking/planner.js.map +1 -0
  46. package/dist/chunking/services/distribution-source.d.ts +11 -0
  47. package/dist/chunking/services/distribution-source.d.ts.map +1 -0
  48. package/dist/chunking/services/distribution-source.js +60 -0
  49. package/dist/chunking/services/distribution-source.js.map +1 -0
  50. package/dist/chunking/services/metadata-source.d.ts +4 -0
  51. package/dist/chunking/services/metadata-source.d.ts.map +1 -0
  52. package/dist/chunking/services/metadata-source.js +138 -0
  53. package/dist/chunking/services/metadata-source.js.map +1 -0
  54. package/dist/chunking/services/row-probe.d.ts +14 -0
  55. package/dist/chunking/services/row-probe.d.ts.map +1 -0
  56. package/dist/chunking/services/row-probe.js +62 -0
  57. package/dist/chunking/services/row-probe.js.map +1 -0
  58. package/dist/chunking/splitter.d.ts +20 -0
  59. package/dist/chunking/splitter.d.ts.map +1 -0
  60. package/dist/chunking/splitter.js +76 -0
  61. package/dist/chunking/splitter.js.map +1 -0
  62. package/dist/chunking/sql.d.ts +20 -0
  63. package/dist/chunking/sql.d.ts.map +1 -0
  64. package/dist/chunking/sql.js +304 -0
  65. package/dist/chunking/sql.js.map +1 -0
  66. package/dist/chunking/strategies/equal-width-split.d.ts +4 -0
  67. package/dist/chunking/strategies/equal-width-split.d.ts.map +1 -0
  68. package/dist/chunking/strategies/equal-width-split.js +46 -0
  69. package/dist/chunking/strategies/equal-width-split.js.map +1 -0
  70. package/dist/chunking/strategies/group-by-key-split.d.ts +3 -0
  71. package/dist/chunking/strategies/group-by-key-split.d.ts.map +1 -0
  72. package/dist/chunking/strategies/group-by-key-split.js +54 -0
  73. package/dist/chunking/strategies/group-by-key-split.js.map +1 -0
  74. package/dist/chunking/strategies/metadata-single-chunk.d.ts +3 -0
  75. package/dist/chunking/strategies/metadata-single-chunk.d.ts.map +1 -0
  76. package/dist/chunking/strategies/metadata-single-chunk.js +5 -0
  77. package/dist/chunking/strategies/metadata-single-chunk.js.map +1 -0
  78. package/dist/chunking/strategies/quantile-range-split.d.ts +5 -0
  79. package/dist/chunking/strategies/quantile-range-split.d.ts.map +1 -0
  80. package/dist/chunking/strategies/quantile-range-split.js +132 -0
  81. package/dist/chunking/strategies/quantile-range-split.js.map +1 -0
  82. package/dist/chunking/strategies/refinement.d.ts +4 -0
  83. package/dist/chunking/strategies/refinement.d.ts.map +1 -0
  84. package/dist/chunking/strategies/refinement.js +61 -0
  85. package/dist/chunking/strategies/refinement.js.map +1 -0
  86. package/dist/chunking/strategies/string-prefix-split.d.ts +4 -0
  87. package/dist/chunking/strategies/string-prefix-split.d.ts.map +1 -0
  88. package/dist/chunking/strategies/string-prefix-split.js +73 -0
  89. package/dist/chunking/strategies/string-prefix-split.js.map +1 -0
  90. package/dist/chunking/strategies/temporal-bucket-split.d.ts +4 -0
  91. package/dist/chunking/strategies/temporal-bucket-split.d.ts.map +1 -0
  92. package/dist/chunking/strategies/temporal-bucket-split.js +67 -0
  93. package/dist/chunking/strategies/temporal-bucket-split.js.map +1 -0
  94. package/dist/chunking/strategy-policy.d.ts +3 -0
  95. package/dist/chunking/strategy-policy.d.ts.map +1 -0
  96. package/dist/chunking/strategy-policy.js +4 -0
  97. package/dist/chunking/strategy-policy.js.map +1 -0
  98. package/dist/chunking/types.d.ts +139 -0
  99. package/dist/chunking/types.d.ts.map +1 -0
  100. package/dist/chunking/types.js +2 -0
  101. package/dist/chunking/types.js.map +1 -0
  102. package/dist/chunking/utils/binary-string.d.ts +8 -0
  103. package/dist/chunking/utils/binary-string.d.ts.map +1 -0
  104. package/dist/chunking/utils/binary-string.js +52 -0
  105. package/dist/chunking/utils/binary-string.js.map +1 -0
  106. package/dist/chunking/utils/ids.d.ts +4 -0
  107. package/dist/chunking/utils/ids.d.ts.map +1 -0
  108. package/dist/chunking/utils/ids.js +11 -0
  109. package/dist/chunking/utils/ids.js.map +1 -0
  110. package/dist/chunking/utils/ranges.d.ts +5 -0
  111. package/dist/chunking/utils/ranges.d.ts.map +1 -0
  112. package/dist/chunking/utils/ranges.js +19 -0
  113. package/dist/chunking/utils/ranges.js.map +1 -0
  114. package/dist/detect.d.ts +13 -0
  115. package/dist/detect.d.ts.map +1 -0
  116. package/dist/detect.js +113 -0
  117. package/dist/detect.js.map +1 -0
  118. package/dist/index.d.ts +3 -0
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +1 -0
  121. package/dist/index.js.map +1 -1
  122. package/dist/logging.d.ts +12 -0
  123. package/dist/logging.d.ts.map +1 -0
  124. package/dist/logging.js +61 -0
  125. package/dist/logging.js.map +1 -0
  126. package/dist/options.d.ts +151 -4
  127. package/dist/options.d.ts.map +1 -1
  128. package/dist/options.js +161 -109
  129. package/dist/options.js.map +1 -1
  130. package/dist/payload.d.ts +7 -17
  131. package/dist/payload.d.ts.map +1 -1
  132. package/dist/payload.js +7 -19
  133. package/dist/payload.js.map +1 -1
  134. package/dist/planner.d.ts +10 -8
  135. package/dist/planner.d.ts.map +1 -1
  136. package/dist/planner.js +76 -97
  137. package/dist/planner.js.map +1 -1
  138. package/dist/plugin.d.ts +4 -3
  139. package/dist/plugin.d.ts.map +1 -1
  140. package/dist/plugin.js +311 -215
  141. package/dist/plugin.js.map +1 -1
  142. package/dist/queries.d.ts +21 -0
  143. package/dist/queries.d.ts.map +1 -0
  144. package/dist/queries.js +113 -0
  145. package/dist/queries.js.map +1 -0
  146. package/dist/runtime.d.ts +14 -0
  147. package/dist/runtime.d.ts.map +1 -1
  148. package/dist/runtime.js +162 -83
  149. package/dist/runtime.js.map +1 -1
  150. package/dist/sdk.d.ts +12 -0
  151. package/dist/sdk.d.ts.map +1 -0
  152. package/dist/sdk.js +9 -0
  153. package/dist/sdk.js.map +1 -0
  154. package/dist/state.d.ts +16 -28
  155. package/dist/state.d.ts.map +1 -1
  156. package/dist/state.js +73 -127
  157. package/dist/state.js.map +1 -1
  158. package/dist/table-config.d.ts +9 -0
  159. package/dist/table-config.d.ts.map +1 -0
  160. package/dist/table-config.js +2 -0
  161. package/dist/table-config.js.map +1 -0
  162. package/dist/types.d.ts +49 -114
  163. package/dist/types.d.ts.map +1 -1
  164. package/package.json +31 -2
@@ -0,0 +1,62 @@
1
+ import { buildCountSql, buildEstimateSql, buildWhereClauseFromRanges } from '../sql.js';
2
+ export function getRowProbeStrategy(context) {
3
+ return context.rowProbeStrategy;
4
+ }
5
+ export async function estimateRows(context, filter, sortKeys) {
6
+ if (getRowProbeStrategy(context) === 'count') {
7
+ return countRowsExact(context, filter, sortKeys);
8
+ }
9
+ const rows = await context.query(buildEstimateSql(filter, sortKeys, context, getRowProbeStrategy(context)), context.querySettings);
10
+ const firstRow = rows[0];
11
+ if (!firstRow)
12
+ return 0;
13
+ for (const [key, value] of Object.entries(firstRow)) {
14
+ if (!key.toLowerCase().includes('row'))
15
+ continue;
16
+ const parsed = Number(value ?? 0);
17
+ if (Number.isFinite(parsed))
18
+ return parsed;
19
+ }
20
+ for (const value of Object.values(firstRow)) {
21
+ const parsed = Number(value ?? 0);
22
+ if (Number.isFinite(parsed))
23
+ return parsed;
24
+ }
25
+ return 0;
26
+ }
27
+ export async function countRowsExact(context, filter, sortKeys) {
28
+ const rows = await context.query(buildCountSql(filter, sortKeys, context), context.querySettings);
29
+ return Number(rows[0]?.cnt ?? 0);
30
+ }
31
+ export async function countRows(context, partitionId, ranges, sortKeys) {
32
+ const filter = {
33
+ partitionId,
34
+ ranges,
35
+ exactDimensionIndex: undefined,
36
+ exactValue: undefined,
37
+ };
38
+ return countRowsExact(context, filter, sortKeys);
39
+ }
40
+ export async function countPartitionRows(context, partitionId) {
41
+ const rows = await context.query(`SELECT count() AS cnt FROM ${context.database}.${context.table} WHERE _partition_id = '${partitionId}'`, context.querySettings);
42
+ return Number(rows[0]?.cnt ?? 0);
43
+ }
44
+ export async function getSortKeyRange(context, partitionId, ranges, sortKeys, sortKey) {
45
+ const rows = await context.query(`
46
+ SELECT
47
+ toString(min(${sortKey.name})) AS minVal,
48
+ toString(max(${sortKey.name})) AS maxVal
49
+ FROM ${context.database}.${context.table}
50
+ WHERE ${buildWhereClauseFromRanges(partitionId, ranges, sortKeys)}`, context.querySettings);
51
+ if (rows.length === 0)
52
+ return undefined;
53
+ return {
54
+ min: rows[0]?.minVal ?? '',
55
+ max: rows[0]?.maxVal ?? '',
56
+ };
57
+ }
58
+ export function parsePlannerDateTime(value) {
59
+ const normalized = value.includes('T') ? value : value.replace(' ', 'T');
60
+ return Date.parse(normalized.endsWith('Z') ? normalized : `${normalized}Z`);
61
+ }
62
+ //# sourceMappingURL=row-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-probe.js","sourceRoot":"","sources":["../../../src/chunking/services/row-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAWvF,MAAM,UAAU,mBAAmB,CAAC,OAAiD;IACnF,OAAO,OAAO,CAAC,gBAAgB,CAAA;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,MAAsB,EACtB,QAAmB;IAEnB,IAAI,mBAAmB,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC;QAC7C,OAAO,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAC9B,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,EACzE,OAAO,CAAC,aAAa,CACtB,CAAA;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACxB,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,CAAA;IAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAQ;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAA;IAC5C,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAA;IAC5C,CAAC;IAED,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAqB,EACrB,MAAsB,EACtB,QAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAkB,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAClH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAqB,EACrB,WAAmB,EACnB,MAAoB,EACpB,QAAmB;IAEnB,MAAM,MAAM,GAAmB;QAC7B,WAAW;QACX,MAAM;QACN,mBAAmB,EAAE,SAAS;QAC9B,UAAU,EAAE,SAAS;KACtB,CAAA;IACD,OAAO,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAqB,EACrB,WAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAC9B,8BAA8B,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,2BAA2B,WAAW,GAAG,EACxG,OAAO,CAAC,aAAa,CACtB,CAAA;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAqB,EACrB,WAAmB,EACnB,MAAoB,EACpB,QAAmB,EACnB,OAAgB;IAEhB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAqC;;iBAEtD,OAAO,CAAC,IAAI;iBACZ,OAAO,CAAC,IAAI;OACtB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK;QAChC,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAC/D,OAAO,CAAC,aAAa,CACtB,CAAA;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACvC,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE;QAC1B,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE;KAC3B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACxE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAA;AAC7E,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { SortKeyInfo } from './types.js';
2
+ export declare function splitNumericRange(min: number, max: number, count: number): Array<{
3
+ from: string;
4
+ to: string;
5
+ }>;
6
+ export declare function splitDateTimeRange(min: string, max: string, count: number): Array<{
7
+ from: string;
8
+ to: string;
9
+ }>;
10
+ export declare function stringToUint64(s: string): bigint;
11
+ export declare function uint64ToString(n: bigint): string;
12
+ export declare function splitStringRange(min: string, max: string, count: number): Array<{
13
+ from: string;
14
+ to: string;
15
+ }>;
16
+ export declare function splitSortKeyRange(category: SortKeyInfo['category'], min: string, max: string, count: number): Array<{
17
+ from: string;
18
+ to: string;
19
+ }>;
20
+ //# sourceMappingURL=splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../src/chunking/splitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAU9G;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAc/G;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAWhD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAc7G;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,EACjC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CASrC"}
@@ -0,0 +1,76 @@
1
+ export function splitNumericRange(min, max, count) {
2
+ const span = max - min;
3
+ const step = span / count;
4
+ const ranges = [];
5
+ for (let i = 0; i < count; i++) {
6
+ const from = min + i * step;
7
+ const to = i === count - 1 ? max + 1 : min + (i + 1) * step;
8
+ ranges.push({ from: String(from), to: String(to) });
9
+ }
10
+ return ranges;
11
+ }
12
+ export function splitDateTimeRange(min, max, count) {
13
+ const minMs = new Date(min).getTime();
14
+ const maxMs = new Date(max).getTime();
15
+ const span = maxMs - minMs;
16
+ const step = span / count;
17
+ const ranges = [];
18
+ for (let i = 0; i < count; i++) {
19
+ const from = new Date(minMs + i * step).toISOString();
20
+ const to = i === count - 1
21
+ ? new Date(maxMs + 1).toISOString()
22
+ : new Date(minMs + (i + 1) * step).toISOString();
23
+ ranges.push({ from, to });
24
+ }
25
+ return ranges;
26
+ }
27
+ export function stringToUint64(s) {
28
+ let result = 0n;
29
+ const bytes = Math.min(s.length, 8);
30
+ for (let i = 0; i < bytes; i++) {
31
+ result = (result << 8n) | BigInt(s.charCodeAt(i));
32
+ }
33
+ // Pad remaining bytes with zeros
34
+ for (let i = bytes; i < 8; i++) {
35
+ result = result << 8n;
36
+ }
37
+ return result;
38
+ }
39
+ export function uint64ToString(n) {
40
+ const chars = [];
41
+ for (let i = 7; i >= 0; i--) {
42
+ const byte = Number((n >> BigInt(i * 8)) & 0xffn);
43
+ chars.push(String.fromCharCode(byte));
44
+ }
45
+ // Trim trailing NUL bytes (padding from stringToUint64 for short strings)
46
+ let end = chars.length;
47
+ while (end > 0 && chars[end - 1] === '\0')
48
+ end--;
49
+ return chars.slice(0, end).join('');
50
+ }
51
+ export function splitStringRange(min, max, count) {
52
+ const minVal = stringToUint64(min);
53
+ const maxVal = stringToUint64(max);
54
+ const span = maxVal - minVal;
55
+ const step = span / BigInt(count);
56
+ const ranges = [];
57
+ for (let i = 0; i < count; i++) {
58
+ const from = uint64ToString(minVal + BigInt(i) * step);
59
+ const to = i === count - 1
60
+ ? uint64ToString(maxVal + 1n)
61
+ : uint64ToString(minVal + BigInt(i + 1) * step);
62
+ ranges.push({ from, to });
63
+ }
64
+ return ranges;
65
+ }
66
+ export function splitSortKeyRange(category, min, max, count) {
67
+ switch (category) {
68
+ case 'numeric':
69
+ return splitNumericRange(Number(min), Number(max), count);
70
+ case 'datetime':
71
+ return splitDateTimeRange(min, max, count);
72
+ case 'string':
73
+ return splitStringRange(min, max, count);
74
+ }
75
+ }
76
+ //# sourceMappingURL=splitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitter.js","sourceRoot":"","sources":["../../src/chunking/splitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Chunk, ChunkRange, EstimateFilter, PlannerContext, RowProbeStrategy, SortKey, TableProfile } from './types.js';
2
+ export declare function quoteSqlString(value: string): string;
3
+ export declare function formatBound(value: string, sortKey: SortKey): string;
4
+ export declare function buildWhereClauseFromRanges(partitionId: string, ranges: ChunkRange[], sortKeys: SortKey[]): string;
5
+ export declare function buildWhereClauseFromChunk(chunk: Pick<Chunk, 'partitionId' | 'ranges'>, table: Pick<TableProfile, 'sortKeys'>): string;
6
+ export declare function buildChunkExecutionSql(input: {
7
+ planId: string;
8
+ chunk: Chunk;
9
+ target: string;
10
+ table: Pick<TableProfile, 'sortKeys'>;
11
+ sourceTarget?: string;
12
+ mvAsQuery?: string;
13
+ targetColumns?: string[];
14
+ idempotencyToken?: string;
15
+ }): string;
16
+ export declare function buildEstimateSql(filter: EstimateFilter, sortKeys: SortKey[], context: PlannerContext, rowProbeStrategy: RowProbeStrategy): string;
17
+ export declare function buildCountSql(filter: EstimateFilter, sortKeys: SortKey[], context: Pick<PlannerContext, 'database' | 'table'>): string;
18
+ export declare function injectSortKeyFilter(query: string, sortKeyColumn: string, category: SortKey['category'], from: string, to: string): string;
19
+ export declare function rewriteSelectColumns(query: string, targetColumns: string[]): string;
20
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/chunking/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,YAAY,EACb,MAAM,YAAY,CAAA;AAGnB,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAUnE;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,UAAU,EAAE,EACpB,QAAQ,EAAE,OAAO,EAAE,GAClB,MAAM,CAgBR;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,CAAC,EAC5C,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,GACpC,MAAM,CAER;AAyBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,GAAG,MAAM,CA+BT;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,cAAc,EACvB,gBAAgB,EAAE,gBAAgB,GACjC,MAAM,CAMR;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC,GAClD,MAAM,CAER;AAgCD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,MAAM,CAkBR;AA+DD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAqInF"}
@@ -0,0 +1,304 @@
1
+ export function quoteSqlString(value) {
2
+ return `'${value.replaceAll('\\', '\\\\').replaceAll('\'', '\\\'')}'`;
3
+ }
4
+ export function formatBound(value, sortKey) {
5
+ if (sortKey.category === 'datetime') {
6
+ return `parseDateTimeBestEffort(${quoteSqlString(value)})`;
7
+ }
8
+ if (sortKey.category === 'string') {
9
+ return `unhex('${Buffer.from(value, 'latin1').toString('hex')}')`;
10
+ }
11
+ return quoteSqlString(value);
12
+ }
13
+ export function buildWhereClauseFromRanges(partitionId, ranges, sortKeys) {
14
+ const conditions = [`_partition_id = ${quoteSqlString(partitionId)}`];
15
+ for (const range of ranges) {
16
+ const sortKey = sortKeys[range.dimensionIndex];
17
+ if (!sortKey)
18
+ continue;
19
+ if (range.from !== undefined) {
20
+ conditions.push(`${sortKey.name} >= ${formatBound(range.from, sortKey)}`);
21
+ }
22
+ if (range.to !== undefined) {
23
+ conditions.push(`${sortKey.name} < ${formatBound(range.to, sortKey)}`);
24
+ }
25
+ }
26
+ return conditions.join('\n AND ');
27
+ }
28
+ export function buildWhereClauseFromChunk(chunk, table) {
29
+ return buildWhereClauseFromRanges(chunk.partitionId, chunk.ranges, table.sortKeys);
30
+ }
31
+ function buildSettingsClause(token) {
32
+ if (token) {
33
+ return `SETTINGS async_insert=0, insert_deduplication_token='${token}'`;
34
+ }
35
+ return 'SETTINGS async_insert=0';
36
+ }
37
+ function buildChunkConditions(chunk, sortKeys) {
38
+ return chunk.ranges.flatMap((range) => {
39
+ const sortKey = sortKeys[range.dimensionIndex];
40
+ if (!sortKey)
41
+ return [];
42
+ const conditions = [];
43
+ if (range.from !== undefined) {
44
+ conditions.push(`${sortKey.name} >= ${formatBound(range.from, sortKey)}`);
45
+ }
46
+ if (range.to !== undefined) {
47
+ conditions.push(`${sortKey.name} < ${formatBound(range.to, sortKey)}`);
48
+ }
49
+ return conditions;
50
+ });
51
+ }
52
+ export function buildChunkExecutionSql(input) {
53
+ const sourceTarget = input.sourceTarget ?? input.target;
54
+ const header = `/* chkit backfill plan=${input.planId} chunk=${input.chunk.id} token=${input.idempotencyToken ?? ''} */`;
55
+ const settings = buildSettingsClause(input.idempotencyToken ?? '');
56
+ const chunkConditions = buildChunkConditions(input.chunk, input.table.sortKeys);
57
+ if (input.mvAsQuery) {
58
+ let filtered = injectPartitionFilter(input.mvAsQuery, input.chunk.partitionId);
59
+ for (const condition of chunkConditions) {
60
+ filtered = injectWhereCondition(filtered, condition);
61
+ }
62
+ if (input.targetColumns?.length) {
63
+ filtered = rewriteSelectColumns(filtered, input.targetColumns);
64
+ }
65
+ return [header, `INSERT INTO ${input.target}`, filtered, settings].join('\n');
66
+ }
67
+ const lines = [
68
+ header,
69
+ `INSERT INTO ${input.target}`,
70
+ 'SELECT *',
71
+ `FROM ${sourceTarget}`,
72
+ `WHERE _partition_id = ${quoteSqlString(input.chunk.partitionId)}`,
73
+ ];
74
+ for (const condition of chunkConditions) {
75
+ lines.push(` AND ${condition}`);
76
+ }
77
+ lines.push(settings);
78
+ return lines.join('\n');
79
+ }
80
+ export function buildEstimateSql(filter, sortKeys, context, rowProbeStrategy) {
81
+ const whereClause = buildWhereClauseFromFilter(filter, sortKeys);
82
+ if (rowProbeStrategy === 'count') {
83
+ return `SELECT count() AS cnt FROM ${context.database}.${context.table} WHERE ${whereClause}`;
84
+ }
85
+ return `EXPLAIN ESTIMATE SELECT count() FROM ${context.database}.${context.table} WHERE ${whereClause}`;
86
+ }
87
+ export function buildCountSql(filter, sortKeys, context) {
88
+ return `SELECT count() AS cnt FROM ${context.database}.${context.table} WHERE ${buildWhereClauseFromFilter(filter, sortKeys)}`;
89
+ }
90
+ function buildWhereClauseFromFilter(filter, sortKeys) {
91
+ const conditions = [`_partition_id = ${quoteSqlString(filter.partitionId)}`];
92
+ for (const range of filter.ranges) {
93
+ const sortKey = sortKeys[range.dimensionIndex];
94
+ if (!sortKey)
95
+ continue;
96
+ if (filter.exactDimensionIndex === range.dimensionIndex && filter.exactValue !== undefined) {
97
+ conditions.push(`${sortKey.name} = ${formatBound(filter.exactValue, sortKey)}`);
98
+ continue;
99
+ }
100
+ if (range.from !== undefined) {
101
+ conditions.push(`${sortKey.name} >= ${formatBound(range.from, sortKey)}`);
102
+ }
103
+ if (range.to !== undefined) {
104
+ conditions.push(`${sortKey.name} < ${formatBound(range.to, sortKey)}`);
105
+ }
106
+ }
107
+ return conditions.join(' AND ');
108
+ }
109
+ function injectPartitionFilter(query, partitionId) {
110
+ return injectWhereCondition(query, `_partition_id = ${quoteSqlString(partitionId)}`);
111
+ }
112
+ export function injectSortKeyFilter(query, sortKeyColumn, category, from, to) {
113
+ let condition;
114
+ if (category === 'datetime') {
115
+ condition =
116
+ `${sortKeyColumn} >= parseDateTimeBestEffort(${quoteSqlString(from)})\n` +
117
+ ` AND ${sortKeyColumn} < parseDateTimeBestEffort(${quoteSqlString(to)})`;
118
+ }
119
+ else if (category === 'string') {
120
+ condition =
121
+ `${sortKeyColumn} >= unhex('${Buffer.from(from, 'latin1').toString('hex')}')\n` +
122
+ ` AND ${sortKeyColumn} < unhex('${Buffer.from(to, 'latin1').toString('hex')}')`;
123
+ }
124
+ else {
125
+ condition =
126
+ `${sortKeyColumn} >= ${quoteSqlString(from)}\n` +
127
+ ` AND ${sortKeyColumn} < ${quoteSqlString(to)}`;
128
+ }
129
+ return injectWhereCondition(query, condition);
130
+ }
131
+ function injectWhereCondition(query, condition) {
132
+ const trimmed = query.trimEnd();
133
+ const upper = trimmed.toUpperCase();
134
+ const hits = [];
135
+ let depth = 0;
136
+ for (let index = 0; index < trimmed.length; index++) {
137
+ const char = trimmed[index];
138
+ if (char === '(') {
139
+ depth += 1;
140
+ continue;
141
+ }
142
+ if (char === ')') {
143
+ depth -= 1;
144
+ continue;
145
+ }
146
+ if (char === '\'') {
147
+ index += 1;
148
+ while (index < trimmed.length && trimmed[index] !== '\'') {
149
+ if (trimmed[index] === '\\')
150
+ index += 1;
151
+ index += 1;
152
+ }
153
+ continue;
154
+ }
155
+ if (depth !== 0)
156
+ continue;
157
+ if (index > 0 && /\S/.test(trimmed[index - 1] ?? ''))
158
+ continue;
159
+ const rest = upper.slice(index);
160
+ for (const keyword of ['WHERE', 'GROUP BY', 'HAVING', 'ORDER BY', 'QUALIFY', 'LIMIT', 'SETTINGS']) {
161
+ if (rest.startsWith(keyword) &&
162
+ (index + keyword.length >= trimmed.length || /\s/.test(trimmed[index + keyword.length] ?? ''))) {
163
+ hits.push({ keyword, position: index });
164
+ break;
165
+ }
166
+ }
167
+ }
168
+ const whereHit = hits.find((hit) => hit.keyword === 'WHERE');
169
+ const firstTrailing = hits
170
+ .filter((hit) => hit.keyword !== 'WHERE')
171
+ .filter((hit) => !whereHit || hit.position > whereHit.position)[0];
172
+ const insertAt = firstTrailing ? firstTrailing.position : trimmed.length;
173
+ const before = trimmed.slice(0, insertAt).trimEnd();
174
+ const after = trimmed.slice(insertAt);
175
+ if (whereHit) {
176
+ return `${before}\n AND ${condition}${after ? `\n${after}` : ''}`;
177
+ }
178
+ return `${before}\nWHERE ${condition}${after ? `\n${after}` : ''}`;
179
+ }
180
+ export function rewriteSelectColumns(query, targetColumns) {
181
+ const trimmed = query.trimEnd();
182
+ const upper = trimmed.toUpperCase();
183
+ let selectPos = -1;
184
+ let fromPos = -1;
185
+ let depth = 0;
186
+ for (let index = 0; index < trimmed.length; index++) {
187
+ const char = trimmed[index];
188
+ if (char === '(') {
189
+ depth += 1;
190
+ continue;
191
+ }
192
+ if (char === ')') {
193
+ depth -= 1;
194
+ continue;
195
+ }
196
+ if (char === '\'') {
197
+ index += 1;
198
+ while (index < trimmed.length && trimmed[index] !== '\'') {
199
+ if (trimmed[index] === '\\')
200
+ index += 1;
201
+ index += 1;
202
+ }
203
+ continue;
204
+ }
205
+ if (depth !== 0)
206
+ continue;
207
+ if (index > 0 && /\S/.test(trimmed[index - 1] ?? ''))
208
+ continue;
209
+ const rest = upper.slice(index);
210
+ if (selectPos === -1 &&
211
+ rest.startsWith('SELECT') &&
212
+ (index + 6 >= trimmed.length || /\s/.test(trimmed[index + 6] ?? ''))) {
213
+ selectPos = index;
214
+ }
215
+ else if (selectPos !== -1 &&
216
+ fromPos === -1 &&
217
+ rest.startsWith('FROM') &&
218
+ (index + 4 >= trimmed.length || /\s/.test(trimmed[index + 4] ?? ''))) {
219
+ fromPos = index;
220
+ }
221
+ }
222
+ if (selectPos === -1 || fromPos === -1)
223
+ return query;
224
+ const projectionStart = selectPos + 6;
225
+ const rawProjection = trimmed.slice(projectionStart, fromPos).trim();
226
+ let projectionPrefix = '';
227
+ let projection = rawProjection;
228
+ const distinctMatch = rawProjection.match(/^DISTINCT\b\s*/i);
229
+ if (distinctMatch) {
230
+ projectionPrefix = distinctMatch[0] ?? '';
231
+ projection = rawProjection.slice(projectionPrefix.length).trim();
232
+ }
233
+ const items = [];
234
+ let itemStart = 0;
235
+ depth = 0;
236
+ for (let index = 0; index < projection.length; index++) {
237
+ const char = projection[index];
238
+ if (char === '(') {
239
+ depth += 1;
240
+ continue;
241
+ }
242
+ if (char === ')') {
243
+ depth -= 1;
244
+ continue;
245
+ }
246
+ if (char === '\'') {
247
+ index += 1;
248
+ while (index < projection.length && projection[index] !== '\'') {
249
+ if (projection[index] === '\\')
250
+ index += 1;
251
+ index += 1;
252
+ }
253
+ continue;
254
+ }
255
+ if (depth === 0 && char === ',') {
256
+ items.push(projection.slice(itemStart, index).trim());
257
+ itemStart = index + 1;
258
+ }
259
+ }
260
+ items.push(projection.slice(itemStart).trim());
261
+ const aliasMap = new Map();
262
+ for (const item of items) {
263
+ if (item === '*')
264
+ continue;
265
+ const itemUpper = item.toUpperCase();
266
+ let asPos = -1;
267
+ let itemDepth = 0;
268
+ for (let index = 0; index < item.length; index++) {
269
+ const char = item[index];
270
+ if (char === '(') {
271
+ itemDepth += 1;
272
+ continue;
273
+ }
274
+ if (char === ')') {
275
+ itemDepth -= 1;
276
+ continue;
277
+ }
278
+ if (char === '\'') {
279
+ index += 1;
280
+ while (index < item.length && item[index] !== '\'') {
281
+ if (item[index] === '\\')
282
+ index += 1;
283
+ index += 1;
284
+ }
285
+ continue;
286
+ }
287
+ if (itemDepth !== 0)
288
+ continue;
289
+ if (index > 0 && /\S/.test(item[index - 1] ?? ''))
290
+ continue;
291
+ const rest = itemUpper.slice(index);
292
+ if (rest.startsWith('AS') &&
293
+ (index + 2 >= item.length || /\s/.test(item[index + 2] ?? ''))) {
294
+ asPos = index;
295
+ }
296
+ }
297
+ if (asPos !== -1) {
298
+ aliasMap.set(item.slice(asPos + 2).trim(), item);
299
+ }
300
+ }
301
+ const rewrittenProjection = targetColumns.map((column) => aliasMap.get(column) ?? column);
302
+ return `${trimmed.slice(0, projectionStart)} ${projectionPrefix}${rewrittenProjection.join(', ')}\n${trimmed.slice(fromPos)}`;
303
+ }
304
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/chunking/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Partition, PartitionSlice, PlannerContext, SortKey } from '../types.js';
2
+ export declare const DEFAULT_OVERSAMPLING_MULTIPLIER = 3;
3
+ export declare function splitSliceWithEqualWidthRanges(context: PlannerContext, partition: Partition, slice: PartitionSlice, sortKeys: SortKey[], dimensionIndex: number, rangeFrom: string, rangeTo: string, subCount: number, oversamplingMultiplier?: number): Promise<PartitionSlice[]>;
4
+ //# sourceMappingURL=equal-width-split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equal-width-split.d.ts","sourceRoot":"","sources":["../../../src/chunking/strategies/equal-width-split.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,OAAO,EACR,MAAM,aAAa,CAAA;AAIpB,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAGhD,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,sBAAsB,GAAE,MAAwC,GAC/D,OAAO,CAAC,cAAc,EAAE,CAAC,CA+C3B"}
@@ -0,0 +1,46 @@
1
+ import pMap from 'p-map';
2
+ import { buildSliceFromRows } from '../partition-slices.js';
3
+ import { estimateRows } from '../services/row-probe.js';
4
+ import { replaceChunkRange } from '../utils/ranges.js';
5
+ import { buildEvenlySpacedBoundaries } from './quantile-range-split.js';
6
+ export const DEFAULT_OVERSAMPLING_MULTIPLIER = 3;
7
+ const ESTIMATE_CONCURRENCY = 50;
8
+ export async function splitSliceWithEqualWidthRanges(context, partition, slice, sortKeys, dimensionIndex, rangeFrom, rangeTo, subCount, oversamplingMultiplier = DEFAULT_OVERSAMPLING_MULTIPLIER) {
9
+ const sortKey = sortKeys[dimensionIndex];
10
+ if (!sortKey)
11
+ return [slice];
12
+ const boundaries = Array.from(new Set(buildEvenlySpacedBoundaries(rangeFrom, rangeTo, subCount * oversamplingMultiplier, sortKey)));
13
+ if (boundaries.length <= 2)
14
+ return [slice];
15
+ const intervals = [];
16
+ for (let index = 0; index < boundaries.length - 1; index++) {
17
+ const from = boundaries[index];
18
+ const to = boundaries[index + 1];
19
+ if (from === undefined || to === undefined || from === to)
20
+ continue;
21
+ intervals.push({ from, to });
22
+ }
23
+ const results = await pMap(intervals, async ({ from, to }) => {
24
+ const ranges = replaceChunkRange(slice, dimensionIndex, from, to);
25
+ const rows = await estimateRows(context, { partitionId: partition.partitionId, ranges }, sortKeys);
26
+ if (rows <= 0)
27
+ return null;
28
+ return buildSliceFromRows(partition, {
29
+ ranges,
30
+ rows,
31
+ focusedValue: slice.analysis.focusedValue,
32
+ confidence: context.rowProbeStrategy === 'count' ? 'exact' : 'low',
33
+ reason: context.rowProbeStrategy === 'count' ? 'exact-count' : 'equal-width-distribution',
34
+ lineage: slice.analysis.lineage.concat([
35
+ {
36
+ strategyId: 'equal-width-split',
37
+ dimensionIndex,
38
+ reason: 'fallback to equal-width ranges',
39
+ },
40
+ ]),
41
+ });
42
+ }, { concurrency: ESTIMATE_CONCURRENCY });
43
+ const slices = results.filter((s) => s !== null);
44
+ return slices.length > 0 ? slices : [slice];
45
+ }
46
+ //# sourceMappingURL=equal-width-split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equal-width-split.js","sourceRoot":"","sources":["../../../src/chunking/strategies/equal-width-split.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Partition, PartitionSlice, PlannerContext, SortKey } from '../types.js';
2
+ export declare function splitSliceWithGroupByKey(context: PlannerContext, partition: Partition, slice: PartitionSlice, sortKeys: SortKey[], dimensionIndex: number): Promise<PartitionSlice[] | undefined>;
3
+ //# sourceMappingURL=group-by-key-split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-by-key-split.d.ts","sourceRoot":"","sources":["../../../src/chunking/strategies/group-by-key-split.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,OAAO,EACR,MAAM,aAAa,CAAA;AAMpB,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,cAAc,EAAE,GAAG,SAAS,CAAC,CAuBvC"}