@chkit/plugin-backfill 0.1.0-beta.20 → 0.1.0-beta.22

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 (133) hide show
  1. package/README.md +130 -0
  2. package/dist/async-backfill.d.ts +4 -4
  3. package/dist/async-backfill.d.ts.map +1 -1
  4. package/dist/async-backfill.js +2 -2
  5. package/dist/async-backfill.js.map +1 -1
  6. package/dist/chunking/analyze.d.ts +5 -35
  7. package/dist/chunking/analyze.d.ts.map +1 -1
  8. package/dist/chunking/analyze.js +3 -71
  9. package/dist/chunking/analyze.js.map +1 -1
  10. package/dist/chunking/boundary-codec.d.ts +4 -0
  11. package/dist/chunking/boundary-codec.d.ts.map +1 -0
  12. package/dist/chunking/boundary-codec.js +79 -0
  13. package/dist/chunking/boundary-codec.js.map +1 -0
  14. package/dist/chunking/e2e/constants.d.ts +2 -0
  15. package/dist/chunking/e2e/constants.d.ts.map +1 -0
  16. package/dist/chunking/e2e/constants.js +2 -0
  17. package/dist/chunking/e2e/constants.js.map +1 -0
  18. package/dist/chunking/e2e/seed-datasets.script.d.ts +20 -0
  19. package/dist/chunking/e2e/seed-datasets.script.d.ts.map +1 -0
  20. package/dist/chunking/e2e/seed-datasets.script.js +134 -0
  21. package/dist/chunking/e2e/seed-datasets.script.js.map +1 -0
  22. package/dist/chunking/introspect.d.ts +6 -0
  23. package/dist/chunking/introspect.d.ts.map +1 -1
  24. package/dist/chunking/introspect.js +113 -22
  25. package/dist/chunking/introspect.js.map +1 -1
  26. package/dist/chunking/partition-slices.d.ts +14 -0
  27. package/dist/chunking/partition-slices.d.ts.map +1 -0
  28. package/dist/chunking/partition-slices.js +111 -0
  29. package/dist/chunking/partition-slices.js.map +1 -0
  30. package/dist/chunking/planner.d.ts +3 -0
  31. package/dist/chunking/planner.d.ts.map +1 -0
  32. package/dist/chunking/planner.js +343 -0
  33. package/dist/chunking/planner.js.map +1 -0
  34. package/dist/chunking/services/distribution-source.d.ts +11 -0
  35. package/dist/chunking/services/distribution-source.d.ts.map +1 -0
  36. package/dist/chunking/services/distribution-source.js +60 -0
  37. package/dist/chunking/services/distribution-source.js.map +1 -0
  38. package/dist/chunking/services/metadata-source.d.ts +4 -0
  39. package/dist/chunking/services/metadata-source.d.ts.map +1 -0
  40. package/dist/chunking/services/metadata-source.js +138 -0
  41. package/dist/chunking/services/metadata-source.js.map +1 -0
  42. package/dist/chunking/services/row-probe.d.ts +12 -0
  43. package/dist/chunking/services/row-probe.d.ts.map +1 -0
  44. package/dist/chunking/services/row-probe.js +49 -0
  45. package/dist/chunking/services/row-probe.js.map +1 -0
  46. package/dist/chunking/sql.d.ts +11 -5
  47. package/dist/chunking/sql.d.ts.map +1 -1
  48. package/dist/chunking/sql.js +190 -107
  49. package/dist/chunking/sql.js.map +1 -1
  50. package/dist/chunking/strategies/equal-width-split.d.ts +3 -0
  51. package/dist/chunking/strategies/equal-width-split.d.ts.map +1 -0
  52. package/dist/chunking/strategies/equal-width-split.js +46 -0
  53. package/dist/chunking/strategies/equal-width-split.js.map +1 -0
  54. package/dist/chunking/strategies/group-by-key-split.d.ts +3 -0
  55. package/dist/chunking/strategies/group-by-key-split.d.ts.map +1 -0
  56. package/dist/chunking/strategies/group-by-key-split.js +54 -0
  57. package/dist/chunking/strategies/group-by-key-split.js.map +1 -0
  58. package/dist/chunking/strategies/metadata-single-chunk.d.ts +3 -0
  59. package/dist/chunking/strategies/metadata-single-chunk.d.ts.map +1 -0
  60. package/dist/chunking/strategies/metadata-single-chunk.js +5 -0
  61. package/dist/chunking/strategies/metadata-single-chunk.js.map +1 -0
  62. package/dist/chunking/strategies/quantile-range-split.d.ts +5 -0
  63. package/dist/chunking/strategies/quantile-range-split.d.ts.map +1 -0
  64. package/dist/chunking/strategies/quantile-range-split.js +132 -0
  65. package/dist/chunking/strategies/quantile-range-split.js.map +1 -0
  66. package/dist/chunking/strategies/refinement.d.ts +3 -0
  67. package/dist/chunking/strategies/refinement.d.ts.map +1 -0
  68. package/dist/chunking/strategies/refinement.js +61 -0
  69. package/dist/chunking/strategies/refinement.js.map +1 -0
  70. package/dist/chunking/strategies/string-prefix-split.d.ts +4 -0
  71. package/dist/chunking/strategies/string-prefix-split.d.ts.map +1 -0
  72. package/dist/chunking/strategies/string-prefix-split.js +73 -0
  73. package/dist/chunking/strategies/string-prefix-split.js.map +1 -0
  74. package/dist/chunking/strategies/temporal-bucket-split.d.ts +3 -0
  75. package/dist/chunking/strategies/temporal-bucket-split.d.ts.map +1 -0
  76. package/dist/chunking/strategies/temporal-bucket-split.js +67 -0
  77. package/dist/chunking/strategies/temporal-bucket-split.js.map +1 -0
  78. package/dist/chunking/strategy-policy.d.ts +3 -0
  79. package/dist/chunking/strategy-policy.d.ts.map +1 -0
  80. package/dist/chunking/strategy-policy.js +4 -0
  81. package/dist/chunking/strategy-policy.js.map +1 -0
  82. package/dist/chunking/types.d.ts +126 -18
  83. package/dist/chunking/types.d.ts.map +1 -1
  84. package/dist/chunking/utils/binary-string.d.ts +8 -0
  85. package/dist/chunking/utils/binary-string.d.ts.map +1 -0
  86. package/dist/chunking/utils/binary-string.js +52 -0
  87. package/dist/chunking/utils/binary-string.js.map +1 -0
  88. package/dist/chunking/utils/ids.d.ts +4 -0
  89. package/dist/chunking/utils/ids.d.ts.map +1 -0
  90. package/dist/chunking/utils/ids.js +11 -0
  91. package/dist/chunking/utils/ids.js.map +1 -0
  92. package/dist/chunking/utils/ranges.d.ts +5 -0
  93. package/dist/chunking/utils/ranges.d.ts.map +1 -0
  94. package/dist/chunking/utils/ranges.js +19 -0
  95. package/dist/chunking/utils/ranges.js.map +1 -0
  96. package/dist/detect.d.ts +0 -5
  97. package/dist/detect.d.ts.map +1 -1
  98. package/dist/detect.js +0 -41
  99. package/dist/detect.js.map +1 -1
  100. package/dist/index.d.ts +0 -5
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +0 -2
  103. package/dist/index.js.map +1 -1
  104. package/dist/logging.d.ts +12 -0
  105. package/dist/logging.d.ts.map +1 -0
  106. package/dist/logging.js +61 -0
  107. package/dist/logging.js.map +1 -0
  108. package/dist/options.d.ts +6 -15
  109. package/dist/options.d.ts.map +1 -1
  110. package/dist/options.js +1 -3
  111. package/dist/options.js.map +1 -1
  112. package/dist/payload.d.ts.map +1 -1
  113. package/dist/payload.js +4 -6
  114. package/dist/payload.js.map +1 -1
  115. package/dist/planner.d.ts +2 -1
  116. package/dist/planner.d.ts.map +1 -1
  117. package/dist/planner.js +31 -52
  118. package/dist/planner.js.map +1 -1
  119. package/dist/plugin.d.ts.map +1 -1
  120. package/dist/plugin.js +27 -11
  121. package/dist/plugin.js.map +1 -1
  122. package/dist/queries.js +3 -3
  123. package/dist/queries.js.map +1 -1
  124. package/dist/sdk.d.ts +12 -0
  125. package/dist/sdk.d.ts.map +1 -0
  126. package/dist/sdk.js +9 -0
  127. package/dist/sdk.js.map +1 -0
  128. package/dist/state.d.ts.map +1 -1
  129. package/dist/state.js +16 -5
  130. package/dist/state.js.map +1 -1
  131. package/dist/types.d.ts +12 -25
  132. package/dist/types.d.ts.map +1 -1
  133. package/package.json +11 -3
@@ -0,0 +1,343 @@
1
+ import pMap from 'p-map';
2
+ import { describeSqlContext, describeSqlOperation, formatBytes, getBackfillLogger, SLOW_CLICKHOUSE_QUERY_MS, SLOW_CLICKHOUSE_QUERY_REPEAT_INITIAL_MS, SLOW_CLICKHOUSE_QUERY_REPEAT_MAX_MS, summarizeSql, } from '../logging.js';
3
+ import { buildRootSlice, mergeAdjacentSlices } from './partition-slices.js';
4
+ import { introspectPartitions, introspectSortKeys } from './services/metadata-source.js';
5
+ import { getRowProbeStrategy, getSortKeyRange, parsePlannerDateTime } from './services/row-probe.js';
6
+ import { splitSliceWithEqualWidthRanges } from './strategies/equal-width-split.js';
7
+ import { buildSingleChunkPartition } from './strategies/metadata-single-chunk.js';
8
+ import { findQuantileBoundaryOnDimension, splitSliceWithQuantiles, } from './strategies/quantile-range-split.js';
9
+ import { refinePartitionSlices } from './strategies/refinement.js';
10
+ import { splitSliceWithGroupByKey } from './strategies/group-by-key-split.js';
11
+ import { buildRootStringUpperBound, splitSliceWithStringPrefixes } from './strategies/string-prefix-split.js';
12
+ import { splitSliceWithTemporalBuckets } from './strategies/temporal-bucket-split.js';
13
+ import { getCandidateDimensions } from './strategy-policy.js';
14
+ import { generateChunkId, generatePlanId } from './utils/ids.js';
15
+ import { getChunkRange, isExactChunkRange, replaceChunkRange } from './utils/ranges.js';
16
+ const MAX_SPLIT_DEPTH_MULTIPLIER = 3;
17
+ const STOP_SPLIT_FUZZ_FACTOR = 1.5;
18
+ const logger = getBackfillLogger('chunking', 'planner');
19
+ const queryLogger = getBackfillLogger('chunking', 'clickhouse');
20
+ export async function generateChunkPlan(input) {
21
+ const planStartedAt = performance.now();
22
+ const context = {
23
+ database: input.database,
24
+ table: input.table,
25
+ from: input.from,
26
+ to: input.to,
27
+ targetChunkBytes: input.targetChunkBytes,
28
+ query: createTimedPlannerQuery(input),
29
+ querySettings: input.querySettings,
30
+ rowProbeStrategy: input.rowProbeStrategy ?? 'count',
31
+ };
32
+ logger.info(`starting chunk plan for ${input.database}.${input.table} (target chunk size ${formatBytes(input.targetChunkBytes)}, row probe ${context.rowProbeStrategy})`);
33
+ const introspectionStartedAt = performance.now();
34
+ const partitions = await introspectPartitions(context);
35
+ const sortKeys = await introspectSortKeys(context);
36
+ const table = {
37
+ database: input.database,
38
+ table: input.table,
39
+ sortKeys,
40
+ };
41
+ const planId = generatePlanId();
42
+ logger.info(`introspection completed for ${input.database}.${input.table}: ${partitions.length} partitions, ${partitions.filter((partition) => partition.bytesUncompressed > context.targetChunkBytes).length} oversized partitions, ${sortKeys.length} sort keys (${Math.round(performance.now() - introspectionStartedAt)}ms)`);
43
+ const slices = [];
44
+ const plannedPartitions = [];
45
+ for (const partition of partitions) {
46
+ const result = await planPartition(context, partition, table);
47
+ slices.push(...result.slices);
48
+ plannedPartitions.push({
49
+ ...partition,
50
+ diagnostics: result.diagnostics,
51
+ });
52
+ }
53
+ const chunks = assignChunkIds(planId, slices);
54
+ const chunkBytes = chunks.map((chunk) => chunk.estimate.bytesUncompressed);
55
+ const stats = {
56
+ totalPartitions: partitions.length,
57
+ oversizedPartitions: partitions.filter((partition) => partition.bytesUncompressed > context.targetChunkBytes).length,
58
+ focusedChunks: chunks.filter((chunk) => chunk.analysis.focusedValue !== undefined).length,
59
+ totalChunks: chunks.length,
60
+ avgChunkBytes: chunkBytes.length > 0
61
+ ? Math.round(chunkBytes.reduce((sum, value) => sum + value, 0) / chunkBytes.length)
62
+ : 0,
63
+ maxChunkBytes: chunkBytes.length > 0 ? Math.max(...chunkBytes) : 0,
64
+ minChunkBytes: chunkBytes.length > 0 ? Math.min(...chunkBytes) : 0,
65
+ };
66
+ logger.info(`finished chunk plan for ${input.database}.${input.table}: ${chunks.length} chunks across ${partitions.length} partitions, ${formatBytes(partitions.reduce((sum, partition) => sum + partition.bytesUncompressed, 0))} uncompressed (${Math.round(performance.now() - planStartedAt)}ms)`);
67
+ return {
68
+ planId,
69
+ generatedAt: new Date().toISOString(),
70
+ rowProbeStrategy: getRowProbeStrategy(context),
71
+ targetChunkBytes: context.targetChunkBytes,
72
+ table,
73
+ partitions: plannedPartitions,
74
+ chunks,
75
+ totalRows: partitions.reduce((sum, partition) => sum + partition.rows, 0),
76
+ totalBytesCompressed: partitions.reduce((sum, partition) => sum + partition.bytesCompressed, 0),
77
+ totalBytesUncompressed: partitions.reduce((sum, partition) => sum + partition.bytesUncompressed, 0),
78
+ stats,
79
+ };
80
+ }
81
+ async function planPartition(context, partition, table) {
82
+ const startedAt = performance.now();
83
+ logger.info(`planning partition ${partition.partitionId} (${partition.rows.toLocaleString()} rows, ${formatBytes(partition.bytesUncompressed)} uncompressed, target ${formatBytes(context.targetChunkBytes)})`);
84
+ if (partition.bytesUncompressed <= context.targetChunkBytes || table.sortKeys.length === 0) {
85
+ const refined = await refinePartitionSlices(context, partition, buildSingleChunkPartition(partition), table.sortKeys, false);
86
+ logger.info(`kept partition ${partition.partitionId} as a single chunk (${Math.round(performance.now() - startedAt)}ms, ${partition.bytesUncompressed <= context.targetChunkBytes ? 'within target size' : 'no sort keys available'})`);
87
+ return refined;
88
+ }
89
+ const rootSlice = buildRootSlice(partition);
90
+ const splitSlices = await splitSliceRecursively(context, partition, rootSlice, table.sortKeys, 0);
91
+ const mergedSlices = mergeAdjacentSlices(splitSlices, context.targetChunkBytes);
92
+ const usedDistributionFallback = mergedSlices.some((slice) => slice.estimate.reason === 'string-prefix-distribution' ||
93
+ slice.estimate.reason === 'group-by-key-distribution' ||
94
+ slice.estimate.reason === 'temporal-distribution' ||
95
+ slice.estimate.reason === 'equal-width-distribution');
96
+ logger.debug(`partition ${partition.partitionId} produced ${splitSlices.length} candidate slices before refinement (${mergedSlices.length} after merge, distribution fallback ${usedDistributionFallback ? 'used' : 'not used'})`);
97
+ const refined = await refinePartitionSlices(context, partition, mergedSlices, table.sortKeys, usedDistributionFallback);
98
+ logger.info(`finished partition ${partition.partitionId}: ${refined.slices.length} chunks (${Math.round(performance.now() - startedAt)}ms)`);
99
+ return refined;
100
+ }
101
+ async function splitSliceRecursively(context, partition, slice, sortKeys, depth) {
102
+ if (slice.estimate.bytesUncompressed <= context.targetChunkBytes * STOP_SPLIT_FUZZ_FACTOR) {
103
+ logger.debug(`stopped splitting slice for partition ${partition.partitionId} at depth ${depth}: ${formatBytes(slice.estimate.bytesUncompressed)} is within threshold ${formatBytes(Math.round(context.targetChunkBytes * STOP_SPLIT_FUZZ_FACTOR))}`);
104
+ return [slice];
105
+ }
106
+ if (depth >= sortKeys.length * MAX_SPLIT_DEPTH_MULTIPLIER) {
107
+ logger.debug(`stopped splitting slice for partition ${partition.partitionId}: reached max depth ${sortKeys.length * MAX_SPLIT_DEPTH_MULTIPLIER}`);
108
+ return [slice];
109
+ }
110
+ const children = await splitOversizedSlice(context, partition, slice, sortKeys, depth);
111
+ if (children.length <= 1) {
112
+ logger.debug(`slice could not be split further for partition ${partition.partitionId} at depth ${depth}`);
113
+ return [slice];
114
+ }
115
+ const finalized = [];
116
+ for (const child of children) {
117
+ finalized.push(...(await splitSliceRecursively(context, partition, child, sortKeys, depth + 1)));
118
+ }
119
+ return finalized;
120
+ }
121
+ async function splitOversizedSlice(context, partition, slice, sortKeys, depth) {
122
+ const candidateDimensions = getCandidateDimensions(sortKeys, slice);
123
+ logger.debug(`attempting oversized slice split for partition ${partition.partitionId} at depth ${depth} (${formatBytes(slice.estimate.bytesUncompressed)} uncompressed across ${candidateDimensions.length} candidate dimensions)`);
124
+ for (const dimensionIndex of candidateDimensions) {
125
+ const preparedSlice = await hydrateSliceRange(context, slice, sortKeys, dimensionIndex);
126
+ if (!preparedSlice)
127
+ continue;
128
+ const sortKey = sortKeys[dimensionIndex];
129
+ if (!sortKey)
130
+ continue;
131
+ const rootLike = depth === 0;
132
+ const focusedValue = findFocusedValue(preparedSlice, sortKeys);
133
+ logger.debug(`trying split dimension ${dimensionIndex} on ${partition.partitionId} using ${sortKey.name} (${sortKey.category})`);
134
+ if (sortKey.category === 'string') {
135
+ if (rootLike) {
136
+ // First pass: equal-width EXPLAIN ESTIMATE (fast, metadata-only)
137
+ const estimateSlices = await splitWithEqualWidthEstimate(context, partition, preparedSlice, sortKeys, dimensionIndex);
138
+ if (isEffectiveSplit(preparedSlice, estimateSlices)) {
139
+ logger.debug(`equal-width estimate split succeeded for partition ${partition.partitionId}: ${estimateSlices.length} slices`);
140
+ return applyFocusedValue(estimateSlices, focusedValue);
141
+ }
142
+ }
143
+ else {
144
+ // Refinement pass: full GROUP BY key to detect hot keys directly
145
+ const keySlices = await splitSliceWithGroupByKey(context, partition, preparedSlice, sortKeys, dimensionIndex);
146
+ if (keySlices && isEffectiveSplit(preparedSlice, keySlices)) {
147
+ logger.debug(`group-by-key split succeeded for partition ${partition.partitionId}: ${keySlices.length} slices`);
148
+ return applyFocusedValue(keySlices, focusedValue);
149
+ }
150
+ // Single hot key: narrow the range and re-enter dispatch so focusedValue is detected
151
+ if (keySlices?.length === 1 && keySlices[0]?.analysis.focusedValue) {
152
+ const refined = keySlices[0];
153
+ const currentRange = getChunkRange(preparedSlice, dimensionIndex);
154
+ const refinedRange = getChunkRange(refined, dimensionIndex);
155
+ if (currentRange.from !== refinedRange.from || currentRange.to !== refinedRange.to) {
156
+ logger.debug(`narrowed single hot key for partition ${partition.partitionId}, re-entering dispatch`);
157
+ return splitOversizedSlice(context, partition, refined, sortKeys, depth);
158
+ }
159
+ }
160
+ // Fallback: GROUP BY prefix when too many distinct keys
161
+ const stringSlices = await splitSliceWithStringPrefixes(context, partition, preparedSlice, sortKeys, dimensionIndex);
162
+ if (isEffectiveSplit(preparedSlice, stringSlices)) {
163
+ logger.debug(`string-prefix split succeeded for partition ${partition.partitionId}: ${stringSlices.length} slices`);
164
+ return applyFocusedValue(stringSlices, focusedValue);
165
+ }
166
+ }
167
+ }
168
+ if (sortKey.category === 'datetime' && (!rootLike || focusedValue !== undefined)) {
169
+ const temporalSlices = await splitSliceWithTemporalBuckets(context, partition, markFocusedSlice(preparedSlice, focusedValue), sortKeys, dimensionIndex);
170
+ if (isEffectiveSplit(preparedSlice, temporalSlices)) {
171
+ logger.debug(`temporal bucket split succeeded for partition ${partition.partitionId}: ${temporalSlices.length} slices`);
172
+ return applyFocusedValue(temporalSlices, focusedValue);
173
+ }
174
+ }
175
+ const rangedSlices = await splitWithRanges(context, partition, preparedSlice, sortKeys, dimensionIndex);
176
+ if (isEffectiveSplit(preparedSlice, rangedSlices)) {
177
+ logger.debug(`range-based split succeeded for partition ${partition.partitionId}: ${rangedSlices.length} slices`);
178
+ return applyFocusedValue(rangedSlices, focusedValue);
179
+ }
180
+ }
181
+ logger.debug(`no effective split found for partition ${partition.partitionId} at depth ${depth}`);
182
+ return [slice];
183
+ }
184
+ async function splitWithRanges(context, partition, slice, sortKeys, dimensionIndex) {
185
+ const sortKey = sortKeys[dimensionIndex];
186
+ if (!sortKey)
187
+ return [slice];
188
+ const range = getChunkRange(slice, dimensionIndex);
189
+ if (range.from === undefined || range.to === undefined)
190
+ return [slice];
191
+ if (sortKey.category === 'string' && isExactChunkRange(range))
192
+ return [slice];
193
+ const subCount = Math.ceil(slice.estimate.bytesUncompressed / context.targetChunkBytes);
194
+ if (subCount <= 1)
195
+ return [slice];
196
+ const quantileBoundaries = await buildQuantileBoundaries(context, slice, sortKeys, dimensionIndex, subCount);
197
+ if (quantileBoundaries) {
198
+ logger.debug(`using quantile-aligned range split for partition ${partition.partitionId} on dimension ${dimensionIndex} with ${quantileBoundaries.length} boundaries`);
199
+ return splitSliceWithQuantiles(context, partition, slice, sortKeys, dimensionIndex, quantileBoundaries);
200
+ }
201
+ logger.debug(`falling back to equal-width range split for partition ${partition.partitionId} on dimension ${dimensionIndex} with ${subCount} subranges`);
202
+ return splitSliceWithEqualWidthRanges(context, partition, slice, sortKeys, dimensionIndex, range.from, range.to, subCount);
203
+ }
204
+ async function splitWithEqualWidthEstimate(context, partition, slice, sortKeys, dimensionIndex) {
205
+ const estimateContext = {
206
+ ...context,
207
+ rowProbeStrategy: 'explain-estimate',
208
+ };
209
+ return splitWithRanges(estimateContext, partition, slice, sortKeys, dimensionIndex);
210
+ }
211
+ async function buildQuantileBoundaries(context, slice, sortKeys, dimensionIndex, subCount) {
212
+ const range = getChunkRange(slice, dimensionIndex);
213
+ if (range.from === undefined || range.to === undefined)
214
+ return undefined;
215
+ const steps = Array.from({ length: subCount - 1 }, (_, i) => i + 1);
216
+ const foundBoundaries = await pMap(steps, (step) => {
217
+ const targetCumRows = Math.round((slice.estimate.rows * step) / subCount);
218
+ return findQuantileBoundaryOnDimension(context, slice, sortKeys, dimensionIndex, targetCumRows);
219
+ }, { concurrency: 10 });
220
+ const boundaries = [range.from, ...foundBoundaries];
221
+ const uniqueBoundaryCount = new Set(boundaries).size;
222
+ if (uniqueBoundaryCount <= Math.max(2, Math.ceil(subCount / 3))) {
223
+ logger.debug(`discarded quantile boundaries for partition ${slice.partitionId} on dimension ${dimensionIndex} because only ${uniqueBoundaryCount} unique boundaries remained`);
224
+ return undefined;
225
+ }
226
+ return boundaries.concat([range.to]);
227
+ }
228
+ async function hydrateSliceRange(context, slice, sortKeys, dimensionIndex) {
229
+ const existingRange = getChunkRange(slice, dimensionIndex);
230
+ if (existingRange.from !== undefined && existingRange.to !== undefined) {
231
+ return slice;
232
+ }
233
+ const sortKey = sortKeys[dimensionIndex];
234
+ if (!sortKey)
235
+ return undefined;
236
+ const observedRange = await getSortKeyRange(context, slice.partitionId, slice.ranges, sortKeys, sortKey);
237
+ if (!observedRange)
238
+ return undefined;
239
+ logger.debug(`hydrated missing sort-key range for partition ${slice.partitionId} on ${sortKey.name}: [${observedRange.min}, ${observedRange.max}]`);
240
+ return {
241
+ ...slice,
242
+ ranges: replaceChunkRange(slice, dimensionIndex, observedRange.min, toExclusiveUpperBound(observedRange.max, sortKey)),
243
+ };
244
+ }
245
+ function toExclusiveUpperBound(value, sortKey) {
246
+ if (sortKey.category === 'string') {
247
+ return buildRootStringUpperBound(value);
248
+ }
249
+ if (sortKey.category === 'datetime') {
250
+ return new Date(parsePlannerDateTime(value) + 1000).toISOString();
251
+ }
252
+ return String(Number(value) + 1);
253
+ }
254
+ function isEffectiveSplit(parentSlice, childSlices) {
255
+ if (childSlices.length <= 1)
256
+ return false;
257
+ return childSlices.some((childSlice) => childSlice.estimate.rows !== parentSlice.estimate.rows ||
258
+ JSON.stringify(childSlice.ranges) !== JSON.stringify(parentSlice.ranges));
259
+ }
260
+ function findFocusedValue(slice, sortKeys) {
261
+ for (const range of slice.ranges) {
262
+ const sortKey = sortKeys[range.dimensionIndex];
263
+ if (sortKey?.category !== 'string')
264
+ continue;
265
+ if (isExactChunkRange(range) && range.from !== undefined) {
266
+ return { dimensionIndex: range.dimensionIndex, value: range.from };
267
+ }
268
+ }
269
+ return undefined;
270
+ }
271
+ function applyFocusedValue(slices, focusedValue) {
272
+ if (!focusedValue)
273
+ return slices;
274
+ return slices.map((slice) => markFocusedSlice(slice, focusedValue));
275
+ }
276
+ function markFocusedSlice(slice, focusedValue) {
277
+ if (!focusedValue)
278
+ return slice;
279
+ return {
280
+ ...slice,
281
+ analysis: {
282
+ ...slice.analysis,
283
+ focusedValue,
284
+ },
285
+ };
286
+ }
287
+ function assignChunkIds(planId, slices) {
288
+ const chunkIndexes = new Map();
289
+ return slices.map((slice) => {
290
+ const currentIndex = chunkIndexes.get(slice.partitionId) ?? 0;
291
+ chunkIndexes.set(slice.partitionId, currentIndex + 1);
292
+ return {
293
+ ...slice,
294
+ id: generateChunkId(planId, slice.partitionId, currentIndex),
295
+ };
296
+ });
297
+ }
298
+ function createTimedPlannerQuery(input) {
299
+ return async function timedPlannerQuery(sql, settings) {
300
+ const startedAt = performance.now();
301
+ const sqlSummary = summarizeSql(sql);
302
+ const operation = describeSqlOperation(sql);
303
+ const context = describeSqlContext(sql);
304
+ const queryLabel = context ? `${operation} (${context})` : operation;
305
+ let repeatTimer;
306
+ let repeatDelayMs = SLOW_CLICKHOUSE_QUERY_REPEAT_INITIAL_MS;
307
+ const scheduleRepeatWarning = () => {
308
+ repeatTimer = setTimeout(() => {
309
+ const elapsedRepeatMs = Math.round(performance.now() - startedAt);
310
+ queryLogger.warning(`clickhouse query still running for ${input.database}.${input.table} after ${elapsedRepeatMs}ms: ${queryLabel}`);
311
+ repeatDelayMs = Math.min(repeatDelayMs * 2, SLOW_CLICKHOUSE_QUERY_REPEAT_MAX_MS);
312
+ scheduleRepeatWarning();
313
+ }, repeatDelayMs);
314
+ };
315
+ const slowTimer = setTimeout(() => {
316
+ const elapsedMs = Math.round(performance.now() - startedAt);
317
+ queryLogger.warning(`clickhouse query still running for ${input.database}.${input.table} after ${elapsedMs}ms: ${queryLabel} | ${sqlSummary}`);
318
+ scheduleRepeatWarning();
319
+ }, SLOW_CLICKHOUSE_QUERY_MS);
320
+ queryLogger.debug(`clickhouse query started for ${input.database}.${input.table}: ${sqlSummary}`);
321
+ try {
322
+ const rows = await input.query(sql, settings);
323
+ const durationMs = Math.round(performance.now() - startedAt);
324
+ if (durationMs >= SLOW_CLICKHOUSE_QUERY_MS) {
325
+ queryLogger.debug(`slow clickhouse query completed for ${input.database}.${input.table} in ${durationMs}ms (${rows.length} rows): ${queryLabel}`);
326
+ }
327
+ else {
328
+ queryLogger.debug(`clickhouse query completed for ${input.database}.${input.table} in ${durationMs}ms (${rows.length} rows): ${sqlSummary}`);
329
+ }
330
+ return rows;
331
+ }
332
+ catch (error) {
333
+ queryLogger.error(`clickhouse query failed for ${input.database}.${input.table} after ${Math.round(performance.now() - startedAt)}ms: ${sqlSummary}`);
334
+ throw error;
335
+ }
336
+ finally {
337
+ clearTimeout(slowTimer);
338
+ if (repeatTimer)
339
+ clearTimeout(repeatTimer);
340
+ }
341
+ };
342
+ }
343
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/chunking/planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ChunkRange, PlannerContext, SortKey, StringPrefixBucket, TemporalBucket } from '../types.js';
2
+ type QueryContext = Pick<PlannerContext, 'database' | 'table' | 'query' | 'querySettings'>;
3
+ export declare function probeStringPrefixDistribution(context: QueryContext, partitionId: string, ranges: ChunkRange[], sortKey: SortKey, dimensionIndex: number, depth: number, sortKeys: SortKey[]): Promise<StringPrefixBucket[]>;
4
+ export interface StringKeyBucket {
5
+ value: string;
6
+ rowCount: number;
7
+ }
8
+ export declare function probeStringKeyDistribution(context: QueryContext, partitionId: string, ranges: ChunkRange[], sortKey: SortKey, dimensionIndex: number, sortKeys: SortKey[], limit: number): Promise<StringKeyBucket[] | undefined>;
9
+ export declare function probeTemporalDistribution(context: QueryContext, partitionId: string, ranges: ChunkRange[], sortKeys: SortKey[], dimensionIndex: number, grain: 'day' | 'hour'): Promise<TemporalBucket[]>;
10
+ export {};
11
+ //# sourceMappingURL=distribution-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribution-source.d.ts","sourceRoot":"","sources":["../../../src/chunking/services/distribution-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,OAAO,EACP,kBAAkB,EAClB,cAAc,EACf,MAAM,aAAa,CAAA;AAEpB,KAAK,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,CAAC,CAAA;AAE1F,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAoB/B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,EAAE,GAAG,SAAS,CAAC,CAsBxC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,UAAU,EAAE,EACpB,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,KAAK,GAAG,MAAM,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC,CAuB3B"}
@@ -0,0 +1,60 @@
1
+ import { buildWhereClauseFromRanges } from '../sql.js';
2
+ export async function probeStringPrefixDistribution(context, partitionId, ranges, sortKey, dimensionIndex, depth, sortKeys) {
3
+ const range = ranges.find((candidate) => candidate.dimensionIndex === dimensionIndex);
4
+ if (!range?.from || !range.to)
5
+ return [];
6
+ const rows = await context.query(`
7
+ SELECT
8
+ substring(${sortKey.name}, 1, ${depth}) AS prefix,
9
+ count() AS cnt
10
+ FROM ${context.database}.${context.table}
11
+ WHERE ${buildWhereClauseFromRanges(partitionId, ranges, sortKeys)}
12
+ GROUP BY prefix
13
+ ORDER BY prefix`, context.querySettings);
14
+ return rows.map((row) => ({
15
+ value: row.prefix,
16
+ rowCount: Number(row.cnt),
17
+ isExactValue: Buffer.from(row.prefix, 'latin1').length < depth,
18
+ }));
19
+ }
20
+ export async function probeStringKeyDistribution(context, partitionId, ranges, sortKey, dimensionIndex, sortKeys, limit) {
21
+ const range = ranges.find((candidate) => candidate.dimensionIndex === dimensionIndex);
22
+ if (!range?.from || !range.to)
23
+ return undefined;
24
+ const rows = await context.query(`
25
+ SELECT
26
+ ${sortKey.name} AS key,
27
+ count() AS cnt
28
+ FROM ${context.database}.${context.table}
29
+ WHERE ${buildWhereClauseFromRanges(partitionId, ranges, sortKeys)}
30
+ GROUP BY key
31
+ ORDER BY cnt DESC
32
+ LIMIT ${limit + 1}`, context.querySettings);
33
+ if (rows.length > limit)
34
+ return undefined;
35
+ return rows.map((row) => ({
36
+ value: row.key,
37
+ rowCount: Number(row.cnt),
38
+ }));
39
+ }
40
+ export async function probeTemporalDistribution(context, partitionId, ranges, sortKeys, dimensionIndex, grain) {
41
+ const sortKey = sortKeys[dimensionIndex];
42
+ if (!sortKey || sortKey.category !== 'datetime')
43
+ return [];
44
+ const bucketExpression = grain === 'day'
45
+ ? `toStartOfDay(${sortKey.name})`
46
+ : `toStartOfHour(${sortKey.name})`;
47
+ const rows = await context.query(`
48
+ SELECT
49
+ formatDateTime(${bucketExpression}, '%Y-%m-%dT%H:%i:%sZ') AS bucket,
50
+ count() AS cnt
51
+ FROM ${context.database}.${context.table}
52
+ WHERE ${buildWhereClauseFromRanges(partitionId, ranges, sortKeys)}
53
+ GROUP BY bucket
54
+ ORDER BY bucket`, context.querySettings);
55
+ return rows.map((row) => ({
56
+ start: row.bucket,
57
+ rowCount: Number(row.cnt),
58
+ }));
59
+ }
60
+ //# sourceMappingURL=distribution-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribution-source.js","sourceRoot":"","sources":["../../../src/chunking/services/distribution-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Partition, PlannerContext, SortKey } from '../types.js';
2
+ export declare function introspectPartitions(context: PlannerContext): Promise<Partition[]>;
3
+ export declare function introspectSortKeys(context: PlannerContext): Promise<SortKey[]>;
4
+ //# sourceMappingURL=metadata-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-source.d.ts","sourceRoot":"","sources":["../../../src/chunking/services/metadata-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAmB,MAAM,aAAa,CAAA;AAwFtF,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAyCxF;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAsCpF"}
@@ -0,0 +1,138 @@
1
+ /** ClickHouse returns timestamps without timezone — they are always UTC. */
2
+ function parseClickHouseUTCTimestamp(value) {
3
+ const trimmed = value.trim();
4
+ const normalized = trimmed.includes('T') ? trimmed : `${trimmed.replace(' ', 'T')}Z`;
5
+ return new Date(normalized.endsWith('Z') ? normalized : `${normalized}Z`).toISOString();
6
+ }
7
+ const NUMERIC_TYPES = /^(U?Int|Float|Decimal)/;
8
+ const DATETIME_TYPES = /^(Date|DateTime)/;
9
+ function classifySortKeyType(type) {
10
+ if (NUMERIC_TYPES.test(type))
11
+ return 'numeric';
12
+ if (DATETIME_TYPES.test(type))
13
+ return 'datetime';
14
+ return 'string';
15
+ }
16
+ function boundaryEncodingForCategory(category) {
17
+ return category === 'string' ? 'hex-latin1' : 'literal';
18
+ }
19
+ function splitTopLevelCsv(input) {
20
+ const parts = [];
21
+ let current = '';
22
+ let depth = 0;
23
+ let quote;
24
+ for (let index = 0; index < input.length; index++) {
25
+ const char = input[index];
26
+ if (char === undefined)
27
+ continue;
28
+ if (quote) {
29
+ current += char;
30
+ if (char === quote && input[index - 1] !== '\\')
31
+ quote = undefined;
32
+ continue;
33
+ }
34
+ if (char === '\'' || char === '"') {
35
+ quote = char;
36
+ current += char;
37
+ continue;
38
+ }
39
+ if (char === '(') {
40
+ depth += 1;
41
+ current += char;
42
+ continue;
43
+ }
44
+ if (char === ')') {
45
+ depth = Math.max(0, depth - 1);
46
+ current += char;
47
+ continue;
48
+ }
49
+ if (char === ',' && depth === 0) {
50
+ parts.push(current.trim());
51
+ current = '';
52
+ continue;
53
+ }
54
+ current += char;
55
+ }
56
+ if (current.trim().length > 0) {
57
+ parts.push(current.trim());
58
+ }
59
+ return parts;
60
+ }
61
+ function resolveSortKeyColumn(expression, knownColumns) {
62
+ const trimmed = expression.trim();
63
+ if (knownColumns.has(trimmed))
64
+ return trimmed;
65
+ const identifiers = Array.from(trimmed.matchAll(/\b[A-Za-z_][A-Za-z0-9_]*\b/g))
66
+ .map((match) => match[0])
67
+ .filter((identifier) => Boolean(identifier));
68
+ const matches = Array.from(new Set(identifiers.filter((identifier) => knownColumns.has(identifier))));
69
+ if (matches.length === 1)
70
+ return matches[0];
71
+ if (knownColumns.size === 0 && identifiers.length > 0) {
72
+ return identifiers[identifiers.length - 1];
73
+ }
74
+ return undefined;
75
+ }
76
+ export async function introspectPartitions(context) {
77
+ await context.query(`SELECT 1 FROM ${context.database}.${context.table} LIMIT 1 SETTINGS select_sequential_consistency = 1`);
78
+ const rows = await context.query(`SELECT
79
+ partition_id,
80
+ toString(sum(rows)) AS total_rows,
81
+ toString(sum(bytes_on_disk)) AS total_bytes,
82
+ toString(sum(data_uncompressed_bytes)) AS total_uncompressed_bytes,
83
+ toString(min(min_time)) AS min_time,
84
+ toString(max(max_time)) AS max_time
85
+ FROM system.parts
86
+ WHERE database = '${context.database}'
87
+ AND table = '${context.table}'
88
+ AND active = 1
89
+ GROUP BY partition_id
90
+ ORDER BY partition_id
91
+ SETTINGS select_sequential_consistency = 1`);
92
+ return rows
93
+ .map((row) => ({
94
+ partitionId: row.partition_id,
95
+ rows: Number(row.total_rows),
96
+ bytesCompressed: Number(row.total_bytes),
97
+ bytesUncompressed: Number(row.total_uncompressed_bytes ?? row.total_bytes),
98
+ minTime: parseClickHouseUTCTimestamp(row.min_time),
99
+ maxTime: parseClickHouseUTCTimestamp(row.max_time),
100
+ }))
101
+ .filter((partition) => {
102
+ if (context.from && partition.maxTime < context.from)
103
+ return false;
104
+ if (context.to && partition.minTime >= context.to)
105
+ return false;
106
+ return true;
107
+ });
108
+ }
109
+ export async function introspectSortKeys(context) {
110
+ const tableRows = await context.query(`SELECT sorting_key FROM system.tables WHERE database = '${context.database}' AND name = '${context.table}'`);
111
+ const sortingKey = tableRows[0]?.sorting_key;
112
+ if (!sortingKey)
113
+ return [];
114
+ const expressions = splitTopLevelCsv(sortingKey);
115
+ if (expressions.length === 0)
116
+ return [];
117
+ const columnRows = await context.query(`SELECT name, type FROM system.columns WHERE database = '${context.database}' AND table = '${context.table}'`);
118
+ const typeByName = new Map(columnRows
119
+ .filter((row) => Boolean(row.name))
120
+ .map((row) => [row.name, row.type]));
121
+ const knownColumns = new Set(typeByName.keys());
122
+ return expressions.flatMap((expression, index) => {
123
+ const column = resolveSortKeyColumn(expression, knownColumns);
124
+ const type = column
125
+ ? typeByName.get(column) ?? columnRows[index]?.type ?? columnRows[0]?.type
126
+ : undefined;
127
+ if (!column || !type)
128
+ return [];
129
+ const category = classifySortKeyType(type);
130
+ return [{
131
+ name: column,
132
+ type,
133
+ category,
134
+ boundaryEncoding: boundaryEncodingForCategory(category),
135
+ }];
136
+ });
137
+ }
138
+ //# sourceMappingURL=metadata-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-source.js","sourceRoot":"","sources":["../../../src/chunking/services/metadata-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ChunkRange, EstimateFilter, PlannerContext, RowProbeStrategy, SortKey } from '../types.js';
2
+ type QueryContext = Pick<PlannerContext, 'database' | 'table' | 'query' | 'querySettings'>;
3
+ export declare function getRowProbeStrategy(context: Pick<PlannerContext, 'rowProbeStrategy'>): RowProbeStrategy;
4
+ export declare function estimateRows(context: PlannerContext, filter: EstimateFilter, sortKeys: SortKey[]): Promise<number>;
5
+ export declare function countRowsExact(context: QueryContext, filter: EstimateFilter, sortKeys: SortKey[]): Promise<number>;
6
+ export declare function getSortKeyRange(context: QueryContext, partitionId: string, ranges: ChunkRange[], sortKeys: SortKey[], sortKey: SortKey): Promise<{
7
+ min: string;
8
+ max: string;
9
+ } | undefined>;
10
+ export declare function parsePlannerDateTime(value: string): number;
11
+ export {};
12
+ //# sourceMappingURL=row-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-probe.d.ts","sourceRoot":"","sources":["../../../src/chunking/services/row-probe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,OAAO,EACR,MAAM,aAAa,CAAA;AAEpB,KAAK,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,CAAC,CAAA;AAE1F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,GAAG,gBAAgB,CAEvG;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,UAAU,EAAE,EACpB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAenD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG1D"}