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

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 (63) hide show
  1. package/dist/async-backfill.d.ts +64 -0
  2. package/dist/async-backfill.d.ts.map +1 -0
  3. package/dist/async-backfill.js +251 -0
  4. package/dist/async-backfill.js.map +1 -0
  5. package/dist/check.d.ts +9 -0
  6. package/dist/check.d.ts.map +1 -0
  7. package/dist/check.js +79 -0
  8. package/dist/check.js.map +1 -0
  9. package/dist/chunking/analyze.d.ts +38 -0
  10. package/dist/chunking/analyze.d.ts.map +1 -0
  11. package/dist/chunking/analyze.js +76 -0
  12. package/dist/chunking/analyze.js.map +1 -0
  13. package/dist/chunking/build.d.ts +11 -0
  14. package/dist/chunking/build.d.ts.map +1 -0
  15. package/dist/chunking/build.js +51 -0
  16. package/dist/chunking/build.js.map +1 -0
  17. package/dist/chunking/introspect.d.ts +34 -0
  18. package/dist/chunking/introspect.d.ts.map +1 -0
  19. package/dist/chunking/introspect.js +96 -0
  20. package/dist/chunking/introspect.js.map +1 -0
  21. package/dist/chunking/splitter.d.ts +20 -0
  22. package/dist/chunking/splitter.d.ts.map +1 -0
  23. package/dist/chunking/splitter.js +76 -0
  24. package/dist/chunking/splitter.js.map +1 -0
  25. package/dist/chunking/sql.d.ts +12 -0
  26. package/dist/chunking/sql.d.ts.map +1 -0
  27. package/dist/chunking/sql.js +221 -0
  28. package/dist/chunking/sql.js.map +1 -0
  29. package/dist/chunking/types.d.ts +29 -0
  30. package/dist/chunking/types.d.ts.map +1 -0
  31. package/dist/chunking/types.js +2 -0
  32. package/dist/chunking/types.js.map +1 -0
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/options.d.ts +151 -4
  38. package/dist/options.d.ts.map +1 -1
  39. package/dist/options.js +160 -143
  40. package/dist/options.js.map +1 -1
  41. package/dist/payload.d.ts +6 -20
  42. package/dist/payload.d.ts.map +1 -1
  43. package/dist/payload.js +7 -21
  44. package/dist/payload.js.map +1 -1
  45. package/dist/planner.d.ts +4 -31
  46. package/dist/planner.d.ts.map +1 -1
  47. package/dist/planner.js +85 -336
  48. package/dist/planner.js.map +1 -1
  49. package/dist/plugin.d.ts +4 -3
  50. package/dist/plugin.d.ts.map +1 -1
  51. package/dist/plugin.js +234 -228
  52. package/dist/plugin.js.map +1 -1
  53. package/dist/queries.d.ts +21 -0
  54. package/dist/queries.d.ts.map +1 -0
  55. package/dist/queries.js +113 -0
  56. package/dist/queries.js.map +1 -0
  57. package/dist/state.d.ts +7 -31
  58. package/dist/state.d.ts.map +1 -1
  59. package/dist/state.js +33 -132
  60. package/dist/state.js.map +1 -1
  61. package/dist/types.d.ts +32 -124
  62. package/dist/types.d.ts.map +1 -1
  63. package/package.json +5 -3
package/dist/payload.js CHANGED
@@ -7,25 +7,14 @@ export function planPayload(output) {
7
7
  from: output.plan.from,
8
8
  to: output.plan.to,
9
9
  chunkCount: output.plan.chunks.length,
10
- chunkHours: output.plan.options.chunkHours,
11
- timeColumn: output.plan.options.timeColumn,
10
+ maxChunkBytes: output.plan.options.maxChunkBytes,
11
+ sortKeyColumn: output.plan.options.sortKeyColumn,
12
12
  planPath: output.planPath,
13
- existed: output.existed,
14
- };
15
- }
16
- export function runPayload(output) {
17
- return {
18
- ok: output.status.status === 'completed',
19
- command: 'run',
20
- planId: output.run.planId,
21
- status: output.status.status,
22
- chunkCounts: output.status.totals,
23
- attempts: output.status.attempts,
24
- rowsWritten: output.status.rowsWritten,
25
- runPath: output.runPath,
26
- eventPath: output.eventPath,
27
- lastError: output.status.lastError,
28
- noop: output.noop,
13
+ strategy: output.plan.strategy,
14
+ partitionCount: output.plan.partitions?.length,
15
+ totalBytes: output.plan.partitions
16
+ ? output.plan.partitions.reduce((sum, p) => sum + p.bytesOnDisk, 0)
17
+ : undefined,
29
18
  };
30
19
  }
31
20
  export function statusPayload(summary) {
@@ -35,10 +24,8 @@ export function statusPayload(summary) {
35
24
  planId: summary.planId,
36
25
  status: summary.status,
37
26
  chunkCounts: summary.totals,
38
- attempts: summary.attempts,
39
27
  rowsWritten: summary.rowsWritten,
40
28
  runPath: summary.runPath,
41
- eventPath: summary.eventPath,
42
29
  updatedAt: summary.updatedAt,
43
30
  lastError: summary.lastError,
44
31
  };
@@ -51,7 +38,6 @@ export function cancelPayload(summary) {
51
38
  status: summary.status,
52
39
  chunkCounts: summary.totals,
53
40
  runPath: summary.runPath,
54
- eventPath: summary.eventPath,
55
41
  };
56
42
  }
57
43
  export function doctorPayload(report) {
@@ -1 +1 @@
1
- {"version":3,"file":"payload.js","sourceRoot":"","sources":["../src/payload.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,WAAW,CAAC,MAA+B;IAazD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC1B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;QACrC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;QAC1C,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;QAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAgC;IAazD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW;QACxC,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;QAChC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;QACtC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;QAClC,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA8B;IAa1D,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,QAAQ;QAC/B,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA8B;IAS1D,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,WAAW;QAClC,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAA4B;IASxD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAClC,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../src/payload.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,WAAW,CAAC,MAA+B;IAezD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC1B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;QACrC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa;QAChD,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa;QAChD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;QAC9B,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM;QAC9C,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU;YAChC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACnE,CAAC,CAAC,SAAS;KACd,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA8B;IAW1D,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,QAAQ;QAC/B,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA8B;IAQ1D,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,WAAW;QAClC,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAA4B;IASxD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAClC,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAA;AACH,CAAC"}
package/dist/planner.d.ts CHANGED
@@ -1,41 +1,14 @@
1
1
  import type { ResolvedChxConfig } from '@chkit/core';
2
- import type { BuildBackfillPlanOutput, NormalizedBackfillPluginOptions } from './types.js';
3
- /**
4
- * Inject a time-range filter directly into a SQL query.
5
- *
6
- * Scans for top-level (not inside parentheses or string literals) SQL keywords
7
- * to determine where to place the condition:
8
- * - If a top-level WHERE exists, appends AND conditions at its end.
9
- * - Otherwise, inserts a WHERE clause before trailing clauses (GROUP BY, etc.).
10
- *
11
- * This avoids wrapping the query in a CTE, which causes ClickHouse to infer
12
- * Nullable wrappers on Array/Map columns — an illegal type combination.
13
- */
14
- export declare function injectTimeFilter(query: string, timeColumn: string, from: string, to: string): string;
15
- /**
16
- * Rewrite a SQL query's SELECT projection so its output columns are in the
17
- * same positional order as `targetColumns`.
18
- *
19
- * Parses the existing SELECT clause to build an alias→expression map,
20
- * then emits columns in `targetColumns` order. Columns that came from
21
- * a `*` expansion are emitted as bare names; aliased expressions (e.g.
22
- * `_skills as skills`) are preserved with their original expression.
23
- */
24
- export declare function rewriteSelectColumns(query: string, targetColumns: string[]): string;
2
+ import type { PlanOptions } from './options.js';
3
+ import type { BuildBackfillPlanOutput } from './types.js';
25
4
  export declare function buildBackfillPlan(input: {
26
- target: string;
27
- from: string;
28
- to: string;
29
- timeColumn: string;
5
+ opts: PlanOptions;
30
6
  configPath: string;
31
7
  config: Pick<ResolvedChxConfig, 'metaDir' | 'schema'>;
32
- options: NormalizedBackfillPluginOptions;
33
- chunkHours?: number;
34
- forceLargeWindow?: boolean;
35
- force?: boolean;
36
8
  clickhouse?: {
37
9
  url: string;
38
10
  database: string;
39
11
  };
12
+ clickhouseQuery: <T>(sql: string) => Promise<T[]>;
40
13
  }): Promise<BuildBackfillPlanOutput>;
41
14
  //# sourceMappingURL=planner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAcpD,OAAO,KAAK,EAGV,uBAAuB,EACvB,+BAA+B,EAChC,MAAM,YAAY,CAAA;AA6BnB;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,MAAM,CAoDR;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAwGnF;AAwFD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAA;IACrD,OAAO,EAAE,+BAA+B,CAAA;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/C,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA0GnC"}
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAMpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAO/C,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,YAAY,CAAA;AAEnB,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,IAAI,EAAE,WAAW,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAA;IACrD,UAAU,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,eAAe,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;CAClD,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAwHnC"}
package/dist/planner.js CHANGED
@@ -1,364 +1,113 @@
1
1
  import { dirname } from 'node:path';
2
- import { unlink } from 'node:fs/promises';
3
2
  import { loadSchemaDefinitions } from '@chkit/core/schema-loader';
3
+ import { analyzeAndChunk } from './chunking/analyze.js';
4
+ import { buildChunkSql } from './chunking/sql.js';
4
5
  import { findMvForTarget } from './detect.js';
5
6
  import { BackfillConfigError } from './errors.js';
6
- import { backfillPaths, computeBackfillStateDir, computeEnvironmentFingerprint, hashId, planIdentity, readExistingPlan, stableSerialize, writeJson, } from './state.js';
7
- function ensureHoursWithinLimits(input) {
8
- const fromMillis = new Date(input.from).getTime();
9
- const toMillis = new Date(input.to).getTime();
10
- if (toMillis <= fromMillis) {
11
- throw new BackfillConfigError('Invalid backfill window. Expected --to to be after --from.');
12
- }
13
- const durationHours = (toMillis - fromMillis) / (1000 * 60 * 60);
14
- if (durationHours > input.limits.maxWindowHours && !input.forceLargeWindow) {
15
- throw new BackfillConfigError(`Requested window (${durationHours.toFixed(2)} hours) exceeds limits.maxWindowHours=${input.limits.maxWindowHours}. Retry with --force-large-window to acknowledge risk.`);
16
- }
17
- }
18
- function buildSettingsClause(token) {
19
- if (token) {
20
- return `SETTINGS async_insert=0, insert_deduplication_token='${token}'`;
21
- }
22
- return `SETTINGS async_insert=0`;
23
- }
24
- /**
25
- * Inject a time-range filter directly into a SQL query.
26
- *
27
- * Scans for top-level (not inside parentheses or string literals) SQL keywords
28
- * to determine where to place the condition:
29
- * - If a top-level WHERE exists, appends AND conditions at its end.
30
- * - Otherwise, inserts a WHERE clause before trailing clauses (GROUP BY, etc.).
31
- *
32
- * This avoids wrapping the query in a CTE, which causes ClickHouse to infer
33
- * Nullable wrappers on Array/Map columns — an illegal type combination.
34
- */
35
- export function injectTimeFilter(query, timeColumn, from, to) {
36
- const trimmed = query.trimEnd();
37
- const upper = trimmed.toUpperCase();
38
- const hits = [];
39
- let depth = 0;
40
- for (let i = 0; i < trimmed.length; i++) {
41
- const ch = trimmed[i];
42
- if (ch === '(') {
43
- depth++;
44
- continue;
45
- }
46
- if (ch === ')') {
47
- depth--;
48
- continue;
49
- }
50
- if (ch === "'") {
51
- i++;
52
- while (i < trimmed.length && trimmed[i] !== "'") {
53
- if (trimmed[i] === '\\')
54
- i++;
55
- i++;
56
- }
57
- continue;
58
- }
59
- if (depth !== 0)
60
- continue;
61
- // Must be preceded by whitespace or be at start
62
- if (i > 0 && /\S/.test(trimmed[i - 1] ?? ''))
63
- continue;
64
- const rest = upper.slice(i);
65
- for (const kw of ['WHERE', 'GROUP BY', 'HAVING', 'ORDER BY', 'QUALIFY', 'LIMIT', 'SETTINGS']) {
66
- if (rest.startsWith(kw) && (i + kw.length >= trimmed.length || /\s/.test(trimmed[i + kw.length] ?? ''))) {
67
- hits.push({ keyword: kw, position: i });
68
- break;
69
- }
70
- }
71
- }
72
- const whereHit = hits.find(h => h.keyword === 'WHERE');
73
- const trailingKeywords = ['GROUP BY', 'HAVING', 'ORDER BY', 'QUALIFY', 'LIMIT', 'SETTINGS'];
74
- const firstTrailing = hits
75
- .filter(h => trailingKeywords.includes(h.keyword))
76
- .filter(h => !whereHit || h.position > whereHit.position)[0];
77
- const timeCondition = `${timeColumn} >= parseDateTimeBestEffort('${from}')\n AND ${timeColumn} < parseDateTimeBestEffort('${to}')`;
78
- const insertAt = firstTrailing ? firstTrailing.position : trimmed.length;
79
- const before = trimmed.slice(0, insertAt).trimEnd();
80
- const after = trimmed.slice(insertAt);
81
- if (whereHit) {
82
- return `${before}\n AND ${timeCondition}${after ? `\n${after}` : ''}`;
83
- }
84
- return `${before}\nWHERE ${timeCondition}${after ? `\n${after}` : ''}`;
85
- }
86
- /**
87
- * Rewrite a SQL query's SELECT projection so its output columns are in the
88
- * same positional order as `targetColumns`.
89
- *
90
- * Parses the existing SELECT clause to build an alias→expression map,
91
- * then emits columns in `targetColumns` order. Columns that came from
92
- * a `*` expansion are emitted as bare names; aliased expressions (e.g.
93
- * `_skills as skills`) are preserved with their original expression.
94
- */
95
- export function rewriteSelectColumns(query, targetColumns) {
96
- const trimmed = query.trimEnd();
97
- const upper = trimmed.toUpperCase();
98
- // Scan for top-level SELECT and FROM positions (outside parens and strings)
99
- let selectPos = -1;
100
- let fromPos = -1;
101
- let depth = 0;
102
- for (let i = 0; i < trimmed.length; i++) {
103
- const ch = trimmed[i];
104
- if (ch === '(') {
105
- depth++;
106
- continue;
107
- }
108
- if (ch === ')') {
109
- depth--;
110
- continue;
111
- }
112
- if (ch === "'") {
113
- i++;
114
- while (i < trimmed.length && trimmed[i] !== "'") {
115
- if (trimmed[i] === '\\')
116
- i++;
117
- i++;
118
- }
119
- continue;
120
- }
121
- if (depth !== 0)
122
- continue;
123
- if (i > 0 && /\S/.test(trimmed[i - 1] ?? ''))
124
- continue;
125
- const rest = upper.slice(i);
126
- if (selectPos === -1 && rest.startsWith('SELECT') && (i + 6 >= trimmed.length || /\s/.test(trimmed[i + 6] ?? ''))) {
127
- selectPos = i;
128
- }
129
- else if (selectPos !== -1 && fromPos === -1 && rest.startsWith('FROM') && (i + 4 >= trimmed.length || /\s/.test(trimmed[i + 4] ?? ''))) {
130
- fromPos = i;
131
- }
132
- }
133
- if (selectPos === -1 || fromPos === -1)
134
- return query;
135
- const projStart = selectPos + 6;
136
- const projText = trimmed.slice(projStart, fromPos).trim();
137
- // Split projection by top-level commas
138
- const items = [];
139
- let itemStart = 0;
140
- depth = 0;
141
- for (let i = 0; i < projText.length; i++) {
142
- const ch = projText[i];
143
- if (ch === '(') {
144
- depth++;
145
- continue;
146
- }
147
- if (ch === ')') {
148
- depth--;
149
- continue;
150
- }
151
- if (ch === "'") {
152
- i++;
153
- while (i < projText.length && projText[i] !== "'") {
154
- if (projText[i] === '\\')
155
- i++;
156
- i++;
157
- }
158
- continue;
159
- }
160
- if (depth === 0 && ch === ',') {
161
- items.push(projText.slice(itemStart, i).trim());
162
- itemStart = i + 1;
163
- }
164
- }
165
- items.push(projText.slice(itemStart).trim());
166
- // Build alias → expression map from non-star items
167
- const aliasMap = new Map();
168
- for (const item of items) {
169
- if (item === '*')
170
- continue;
171
- const itemUpper = item.toUpperCase();
172
- let asPos = -1;
173
- let d = 0;
174
- for (let i = 0; i < item.length; i++) {
175
- const ch = item[i];
176
- if (ch === '(') {
177
- d++;
178
- continue;
179
- }
180
- if (ch === ')') {
181
- d--;
182
- continue;
183
- }
184
- if (ch === "'") {
185
- i++;
186
- while (i < item.length && item[i] !== "'") {
187
- if (item[i] === '\\')
188
- i++;
189
- i++;
190
- }
191
- continue;
192
- }
193
- if (d !== 0)
194
- continue;
195
- if (i > 0 && /\S/.test(item[i - 1] ?? ''))
196
- continue;
197
- const rest = itemUpper.slice(i);
198
- if (rest.startsWith('AS') && (i + 2 >= item.length || /\s/.test(item[i + 2] ?? ''))) {
199
- asPos = i;
200
- }
201
- }
202
- if (asPos !== -1) {
203
- const alias = item.slice(asPos + 2).trim();
204
- aliasMap.set(alias, item);
205
- }
206
- }
207
- // Emit columns in target order
208
- const rewrittenCols = targetColumns.map(col => aliasMap.get(col) ?? col);
209
- const before = trimmed.slice(0, projStart);
210
- const after = trimmed.slice(fromPos);
211
- return `${before} ${rewrittenCols.join(', ')}\n${after}`;
212
- }
213
- function buildChunkSqlTemplate(chunk) {
214
- const header = `/* chkit backfill plan=${chunk.planId} chunk=${chunk.chunkId} token=${chunk.token} */`;
215
- const settings = buildSettingsClause(chunk.token);
216
- if (chunk.mvAsQuery) {
217
- const filtered = injectTimeFilter(chunk.mvAsQuery, chunk.timeColumn, chunk.from, chunk.to);
218
- if (chunk.targetColumns?.length) {
219
- const reordered = rewriteSelectColumns(filtered, chunk.targetColumns);
220
- return [header, `INSERT INTO ${chunk.target}`, reordered, settings].join('\n');
221
- }
222
- return [header, `INSERT INTO ${chunk.target}`, filtered, settings].join('\n');
223
- }
224
- return [
225
- header,
226
- `INSERT INTO ${chunk.target}`,
227
- `SELECT *`,
228
- `FROM ${chunk.target}`,
229
- `WHERE ${chunk.timeColumn} >= parseDateTimeBestEffort('${chunk.from}')`,
230
- ` AND ${chunk.timeColumn} < parseDateTimeBestEffort('${chunk.to}')`,
231
- settings,
232
- ].join('\n');
233
- }
234
- function buildChunks(input) {
235
- const fromMillis = new Date(input.from).getTime();
236
- const toMillis = new Date(input.to).getTime();
237
- const chunkMillis = input.chunkHours * 60 * 60 * 1000;
238
- const chunks = [];
239
- let current = fromMillis;
240
- while (current < toMillis) {
241
- const next = Math.min(current + chunkMillis, toMillis);
242
- const chunkFrom = new Date(current).toISOString();
243
- const chunkTo = new Date(next).toISOString();
244
- const idSeed = `${input.planId}:${chunkFrom}:${chunkTo}`;
245
- const chunkId = hashId(`chunk:${idSeed}`).slice(0, 16);
246
- const token = input.requireIdempotencyToken ? hashId(`token:${idSeed}`) : '';
247
- chunks.push({
248
- id: chunkId,
249
- from: chunkFrom,
250
- to: chunkTo,
251
- status: 'pending',
252
- attempts: 0,
253
- idempotencyToken: token,
254
- sqlTemplate: buildChunkSqlTemplate({
255
- planId: input.planId,
256
- chunkId,
257
- token,
258
- target: input.target,
259
- from: chunkFrom,
260
- to: chunkTo,
261
- timeColumn: input.timeColumn,
262
- mvAsQuery: input.mvAsQuery,
263
- targetColumns: input.targetColumns,
264
- }),
265
- });
266
- current = next;
267
- }
268
- return chunks;
269
- }
7
+ import { backfillPaths, computeBackfillStateDir, computeEnvironmentFingerprint, writeJson, } from './state.js';
270
8
  export async function buildBackfillPlan(input) {
271
- const chunkHours = input.chunkHours ?? input.options.defaults.chunkHours;
272
- if (chunkHours * 60 < input.options.limits.minChunkMinutes) {
273
- throw new BackfillConfigError(`Chunk size ${chunkHours}h is below limits.minChunkMinutes=${input.options.limits.minChunkMinutes}.`);
9
+ const { opts } = input;
10
+ const [database, table] = opts.target.split('.');
11
+ if (!database || !table) {
12
+ throw new BackfillConfigError('Invalid target format. Expected <database.table>.');
274
13
  }
275
- ensureHoursWithinLimits({
276
- from: input.from,
277
- to: input.to,
278
- limits: input.options.limits,
279
- forceLargeWindow: input.forceLargeWindow ?? false,
280
- });
281
14
  const env = computeEnvironmentFingerprint(input.clickhouse);
282
- const planId = hashId(planIdentity(input.target, input.from, input.to, chunkHours, input.timeColumn, env?.fingerprint)).slice(0, 16);
283
- const stateDir = computeBackfillStateDir(input.config, input.configPath, input.options);
15
+ // 1. Analyze table and build planned chunks
16
+ const { planId, partitions, sortKey, chunks: plannedChunks } = await analyzeAndChunk({
17
+ database,
18
+ table,
19
+ from: opts.from,
20
+ to: opts.to,
21
+ maxChunkBytes: opts.maxChunkBytes,
22
+ requireIdempotencyToken: opts.requireIdempotencyToken,
23
+ query: input.clickhouseQuery,
24
+ });
25
+ if (partitions.length === 0) {
26
+ throw new BackfillConfigError(`No partitions found for ${opts.target}${opts.from || opts.to ? ' within the specified time range' : ''}. The table may be empty.`);
27
+ }
28
+ const firstPartition = partitions[0];
29
+ const derivedFrom = opts.from ?? partitions.reduce((min, p) => (p.minTime < min ? p.minTime : min), firstPartition.minTime);
30
+ const derivedTo = opts.to ?? partitions.reduce((max, p) => (p.maxTime > max ? p.maxTime : max), firstPartition.maxTime);
31
+ const stateDir = computeBackfillStateDir(input.config, input.configPath, opts.stateDir);
284
32
  const paths = backfillPaths(stateDir, planId);
285
- let strategy = 'table';
33
+ // 2. Detect MV for replay strategy
286
34
  let mvAsQuery;
287
35
  let targetColumns;
288
- const [database, table] = input.target.split('.');
289
- if (database && table) {
290
- try {
291
- const definitions = await loadSchemaDefinitions(input.config.schema, {
292
- cwd: dirname(input.configPath),
293
- });
294
- const mv = findMvForTarget(definitions, database, table);
295
- if (mv) {
296
- strategy = 'mv_replay';
297
- mvAsQuery = mv.as;
298
- const tableDef = definitions.find((d) => d.kind === 'table' && d.database === database && d.name === table);
299
- if (tableDef && tableDef.kind === 'table') {
300
- targetColumns = tableDef.columns.map((c) => c.name);
301
- }
36
+ try {
37
+ const definitions = await loadSchemaDefinitions(input.config.schema, {
38
+ cwd: dirname(input.configPath),
39
+ });
40
+ const mv = findMvForTarget(definitions, database, table);
41
+ if (mv) {
42
+ mvAsQuery = mv.as;
43
+ const tableDef = definitions.find((d) => d.kind === 'table' && d.database === database && d.name === table);
44
+ if (tableDef && tableDef.kind === 'table') {
45
+ targetColumns = tableDef.columns.map((c) => c.name);
302
46
  }
303
47
  }
304
- catch {
305
- // Schema load failed — fall back to plain table strategy
306
- }
307
48
  }
49
+ catch {
50
+ // Schema load failed — fall back to direct copy
51
+ }
52
+ // 3. Stamp SQL on each planned chunk to produce BackfillChunk[]
53
+ const chunks = plannedChunks.map(planned => {
54
+ const sqlTemplate = buildChunkSql({
55
+ planId,
56
+ chunk: planned,
57
+ target: opts.target,
58
+ sortKey,
59
+ mvAsQuery,
60
+ targetColumns,
61
+ });
62
+ return {
63
+ id: planned.id,
64
+ from: planned.from,
65
+ to: planned.to,
66
+ status: 'pending',
67
+ attempts: 0,
68
+ idempotencyToken: planned.idempotencyToken,
69
+ sqlTemplate,
70
+ partitionId: planned.partitionId,
71
+ estimatedBytes: planned.estimatedBytes,
72
+ ...(planned.sortKeyFrom !== undefined ? { sortKeyFrom: planned.sortKeyFrom } : {}),
73
+ ...(planned.sortKeyTo !== undefined ? { sortKeyTo: planned.sortKeyTo } : {}),
74
+ };
75
+ });
76
+ const strategy = mvAsQuery ? 'mv_replay' : 'partition';
308
77
  const plan = {
309
78
  planId,
310
- target: input.target,
79
+ target: opts.target,
311
80
  createdAt: '1970-01-01T00:00:00.000Z',
312
81
  status: 'planned',
313
- strategy,
82
+ strategy: strategy,
314
83
  ...(env ? { environment: env } : {}),
315
- from: input.from,
316
- to: input.to,
317
- chunks: buildChunks({
318
- planId,
319
- target: input.target,
320
- from: input.from,
321
- to: input.to,
322
- chunkHours,
323
- requireIdempotencyToken: input.options.defaults.requireIdempotencyToken,
324
- timeColumn: input.timeColumn,
325
- mvAsQuery,
326
- targetColumns,
327
- }),
84
+ from: derivedFrom,
85
+ to: derivedTo,
86
+ chunks,
87
+ partitions,
88
+ sortKey,
328
89
  options: {
329
- chunkHours,
330
- maxParallelChunks: input.options.defaults.maxParallelChunks,
331
- maxRetriesPerChunk: input.options.defaults.maxRetriesPerChunk,
332
- requireIdempotencyToken: input.options.defaults.requireIdempotencyToken,
333
- timeColumn: input.timeColumn,
90
+ maxChunkBytes: opts.maxChunkBytes,
91
+ maxParallelChunks: opts.maxParallelChunks,
92
+ maxRetriesPerChunk: opts.maxRetriesPerChunk,
93
+ requireIdempotencyToken: opts.requireIdempotencyToken,
94
+ sortKeyColumn: sortKey?.column,
95
+ },
96
+ policy: {
97
+ requireDryRunBeforeRun: opts.requireDryRunBeforeRun,
98
+ requireExplicitWindow: opts.requireExplicitWindow,
99
+ blockOverlappingRuns: opts.blockOverlappingRuns,
100
+ failCheckOnRequiredPendingBackfill: opts.failCheckOnRequiredPendingBackfill,
101
+ },
102
+ limits: {
103
+ maxWindowHours: opts.maxWindowHours,
104
+ minChunkMinutes: opts.minChunkMinutes,
334
105
  },
335
- policy: input.options.policy,
336
- limits: input.options.limits,
337
106
  };
338
- if (input.force) {
339
- for (const filePath of [paths.planPath, paths.runPath, paths.eventPath]) {
340
- await unlink(filePath).catch((err) => {
341
- if (err.code !== 'ENOENT')
342
- throw err;
343
- });
344
- }
345
- }
346
- const existing = await readExistingPlan(paths.planPath);
347
- if (existing) {
348
- if (stableSerialize(existing) !== stableSerialize(plan)) {
349
- throw new BackfillConfigError(`Backfill plan already exists at ${paths.planPath} but differs from current planning output. Remove it if you intentionally changed planning parameters.`);
350
- }
351
- return {
352
- plan: existing,
353
- planPath: paths.planPath,
354
- existed: true,
355
- };
356
- }
357
107
  await writeJson(paths.planPath, plan);
358
108
  return {
359
109
  plan,
360
110
  planPath: paths.planPath,
361
- existed: false,
362
111
  };
363
112
  }
364
113
  //# sourceMappingURL=planner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAGjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,6BAA6B,EAC7B,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,SAAS,GACV,MAAM,YAAY,CAAA;AAQnB,SAAS,uBAAuB,CAAC,KAKhC;IACC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;IACjD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;IAC7C,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,mBAAmB,CAAC,4DAA4D,CAAC,CAAA;IAC7F,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IAChE,IAAI,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3E,MAAM,IAAI,mBAAmB,CAC3B,qBAAqB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,yCAAyC,KAAK,CAAC,MAAM,CAAC,cAAc,wDAAwD,CAC1K,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,wDAAwD,KAAK,GAAG,CAAA;IACzE,CAAC;IACD,OAAO,yBAAyB,CAAA;AAClC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,UAAkB,EAClB,IAAY,EACZ,EAAU;IAEV,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IAInC,MAAM,IAAI,GAAY,EAAE,CAAA;IACxB,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;QACrC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;QACrC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,CAAC,EAAE,CAAA;YACH,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAChD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;oBAAE,CAAC,EAAE,CAAA;gBAC5B,CAAC,EAAE,CAAA;YACL,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,KAAK,CAAC;YAAE,SAAQ;QAEzB,gDAAgD;QAChD,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAAE,SAAQ;QAEtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC3B,KAAK,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;YAC7F,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxG,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;gBACvC,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;IACtD,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;IAC3F,MAAM,aAAa,GAAG,IAAI;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAE9D,MAAM,aAAa,GACjB,GAAG,UAAU,gCAAgC,IAAI,aAAa,UAAU,+BAA+B,EAAE,IAAI,CAAA;IAE/G,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAA;IACxE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAA;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAErC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,WAAW,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACxE,CAAC;IACD,OAAO,GAAG,MAAM,WAAW,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,aAAuB;IACzE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IAEnC,4EAA4E;IAC5E,IAAI,SAAS,GAAG,CAAC,CAAC,CAAA;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAA;IAChB,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;QACrC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;QACrC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,CAAC,EAAE,CAAA;YACH,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAChD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;oBAAE,CAAC,EAAE,CAAA;gBAC5B,CAAC,EAAE,CAAA;YACL,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,KAAK,CAAC;YAAE,SAAQ;QAEzB,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAAE,SAAQ;QAEtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC3B,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAClH,SAAS,GAAG,CAAC,CAAA;QACf,CAAC;aAAM,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACzI,OAAO,GAAG,CAAC,CAAA;QACb,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAEpD,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAEzD,uCAAuC;IACvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,KAAK,GAAG,CAAC,CAAA;IAET,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;QACrC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;QACrC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,CAAC,EAAE,CAAA;YACH,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAClD,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI;oBAAE,CAAC,EAAE,CAAA;gBAC7B,CAAC,EAAE,CAAA;YACL,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YAC/C,SAAS,GAAG,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAE5C,mDAAmD;IACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,GAAG;YAAE,SAAQ;QAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QACpC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAA;QACd,IAAI,CAAC,GAAG,CAAC,CAAA;QAET,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YAClB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBAAC,CAAC,EAAE,CAAC;gBAAC,SAAQ;YAAC,CAAC;YACjC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBAAC,CAAC,EAAE,CAAC;gBAAC,SAAQ;YAAC,CAAC;YACjC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,CAAC,EAAE,CAAA;gBACH,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;wBAAE,CAAC,EAAE,CAAA;oBACzB,CAAC,EAAE,CAAA;gBACL,CAAC;gBACD,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAQ;YACrB,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAAE,SAAQ;YAEnD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACpF,KAAK,GAAG,CAAC,CAAA;YACX,CAAC;QACH,CAAC;QAED,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC1C,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;IAExE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACpC,OAAO,GAAG,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAA;AAC1D,CAAC;AAED,SAAS,qBAAqB,CAAC,KAU9B;IACC,MAAM,MAAM,GAAG,0BAA0B,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,OAAO,UAAU,KAAK,CAAC,KAAK,KAAK,CAAA;IACtG,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAEjD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QAC1F,IAAI,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;YACrE,OAAO,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChF,CAAC;QACD,OAAO,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/E,CAAC;IAED,OAAO;QACL,MAAM;QACN,eAAe,KAAK,CAAC,MAAM,EAAE;QAC7B,UAAU;QACV,QAAQ,KAAK,CAAC,MAAM,EAAE;QACtB,SAAS,KAAK,CAAC,UAAU,gCAAgC,KAAK,CAAC,IAAI,IAAI;QACvE,SAAS,KAAK,CAAC,UAAU,+BAA+B,KAAK,CAAC,EAAE,IAAI;QACpE,QAAQ;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAUpB;IACC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;IACjD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;IAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IAErD,MAAM,MAAM,GAAoB,EAAE,CAAA;IAClC,IAAI,OAAO,GAAG,UAAU,CAAA;IAExB,OAAO,OAAO,GAAG,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,WAAW,EAAE,QAAQ,CAAC,CAAA;QACtD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;QACjD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5C,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,IAAI,OAAO,EAAE,CAAA;QACxD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAE5E,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC;YACX,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,qBAAqB,CAAC;gBACjC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO;gBACP,KAAK;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,OAAO;gBACX,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;aACnC,CAAC;SACH,CAAC,CAAA;QAEF,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAYvC;IACC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAA;IACxE,IAAI,UAAU,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3D,MAAM,IAAI,mBAAmB,CAC3B,cAAc,UAAU,qCAAqC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,GAAG,CACrG,CAAA;IACH,CAAC;IAED,uBAAuB,CAAC;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;QAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,KAAK;KAClD,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,6BAA6B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACpI,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACvF,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAE7C,IAAI,QAAQ,GAA0B,OAAO,CAAA;IAC7C,IAAI,SAA6B,CAAA;IACjC,IAAI,aAAmC,CAAA;IAEvC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjD,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;gBACnE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;aAC/B,CAAC,CAAA;YACF,MAAM,EAAE,GAAG,eAAe,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;YACxD,IAAI,EAAE,EAAE,CAAC;gBACP,QAAQ,GAAG,WAAW,CAAA;gBACtB,SAAS,GAAG,EAAE,CAAC,EAAE,CAAA;gBACjB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CACzE,CAAA;gBACD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC1C,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;gBACrD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG;QACX,MAAM;QACN,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,0BAA0B;QACrC,MAAM,EAAE,SAAkB;QAC1B,QAAQ;QACR,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,MAAM,EAAE,WAAW,CAAC;YAClB,MAAM;YACN,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,UAAU;YACV,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;YACvE,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS;YACT,aAAa;SACd,CAAC;QACF,OAAO,EAAE;YACP,UAAU;YACV,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;YAC3D,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;YAC7D,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;YACvE,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B;QACD,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;QAC5B,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;KAC7B,CAAA;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,MAAM,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACxE,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAA0B,EAAE,EAAE;gBAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,GAAG,CAAA;YACtC,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,mBAAmB,CAC3B,mCAAmC,KAAK,CAAC,QAAQ,wGAAwG,CAC1J,CAAA;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,MAAM,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAErC,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK;KACf,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
package/dist/plugin.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { BackfillPlugin, BackfillPluginOptions, BackfillPluginRegistration } from './types.js';
2
- export declare function createBackfillPlugin(options?: BackfillPluginOptions): BackfillPlugin;
3
- export declare function backfill(options?: BackfillPluginOptions): BackfillPluginRegistration;
1
+ import { type PluginConfig } from './options.js';
2
+ import type { BackfillPlugin, BackfillPluginRegistration } from './types.js';
3
+ export declare function createBackfillPlugin(options?: PluginConfig): BackfillPlugin;
4
+ export declare function backfill(options?: PluginConfig): BackfillPluginRegistration;
4
5
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAG3B,MAAM,YAAY,CAAA;AAiHnB,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CA+SxF;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,qBAA0B,GAAG,0BAA0B,CAOxF"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAWL,KAAK,YAAY,EAClB,MAAM,cAAc,CAAA;AAcrB,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAE3B,MAAM,YAAY,CAAA;AAuInB,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,YAAiB,GAAG,cAAc,CA+R/E;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,0BAA0B,CAO/E"}