@chkit/plugin-backfill 0.1.0-beta.2 → 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 (80) hide show
  1. package/README.md +40 -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 +38 -0
  15. package/dist/chunking/analyze.d.ts.map +1 -0
  16. package/dist/chunking/analyze.js +76 -0
  17. package/dist/chunking/analyze.js.map +1 -0
  18. package/dist/chunking/build.d.ts +11 -0
  19. package/dist/chunking/build.d.ts.map +1 -0
  20. package/dist/chunking/build.js +51 -0
  21. package/dist/chunking/build.js.map +1 -0
  22. package/dist/chunking/introspect.d.ts +34 -0
  23. package/dist/chunking/introspect.d.ts.map +1 -0
  24. package/dist/chunking/introspect.js +96 -0
  25. package/dist/chunking/introspect.js.map +1 -0
  26. package/dist/chunking/splitter.d.ts +20 -0
  27. package/dist/chunking/splitter.d.ts.map +1 -0
  28. package/dist/chunking/splitter.js +76 -0
  29. package/dist/chunking/splitter.js.map +1 -0
  30. package/dist/chunking/sql.d.ts +12 -0
  31. package/dist/chunking/sql.d.ts.map +1 -0
  32. package/dist/chunking/sql.js +221 -0
  33. package/dist/chunking/sql.js.map +1 -0
  34. package/dist/chunking/types.d.ts +29 -0
  35. package/dist/chunking/types.d.ts.map +1 -0
  36. package/dist/chunking/types.js +2 -0
  37. package/dist/chunking/types.js.map +1 -0
  38. package/dist/detect.d.ts +13 -0
  39. package/dist/detect.d.ts.map +1 -0
  40. package/dist/detect.js +113 -0
  41. package/dist/detect.js.map +1 -0
  42. package/dist/index.d.ts +8 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +3 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/options.d.ts +151 -4
  47. package/dist/options.d.ts.map +1 -1
  48. package/dist/options.js +161 -109
  49. package/dist/options.js.map +1 -1
  50. package/dist/payload.d.ts +7 -17
  51. package/dist/payload.d.ts.map +1 -1
  52. package/dist/payload.js +8 -18
  53. package/dist/payload.js.map +1 -1
  54. package/dist/planner.d.ts +9 -8
  55. package/dist/planner.d.ts.map +1 -1
  56. package/dist/planner.js +92 -92
  57. package/dist/planner.js.map +1 -1
  58. package/dist/plugin.d.ts +4 -3
  59. package/dist/plugin.d.ts.map +1 -1
  60. package/dist/plugin.js +295 -215
  61. package/dist/plugin.js.map +1 -1
  62. package/dist/queries.d.ts +21 -0
  63. package/dist/queries.d.ts.map +1 -0
  64. package/dist/queries.js +113 -0
  65. package/dist/queries.js.map +1 -0
  66. package/dist/runtime.d.ts +14 -0
  67. package/dist/runtime.d.ts.map +1 -1
  68. package/dist/runtime.js +162 -83
  69. package/dist/runtime.js.map +1 -1
  70. package/dist/state.d.ts +16 -28
  71. package/dist/state.d.ts.map +1 -1
  72. package/dist/state.js +59 -124
  73. package/dist/state.js.map +1 -1
  74. package/dist/table-config.d.ts +9 -0
  75. package/dist/table-config.d.ts.map +1 -0
  76. package/dist/table-config.js +2 -0
  77. package/dist/table-config.js.map +1 -0
  78. package/dist/types.d.ts +50 -103
  79. package/dist/types.d.ts.map +1 -1
  80. package/package.json +23 -2
package/dist/payload.js CHANGED
@@ -7,22 +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,
10
+ maxChunkBytes: output.plan.options.maxChunkBytes,
11
+ sortKeyColumn: output.plan.options.sortKeyColumn,
11
12
  planPath: output.planPath,
12
- existed: output.existed,
13
- };
14
- }
15
- export function runPayload(output) {
16
- return {
17
- ok: output.status.status === 'completed',
18
- command: 'run',
19
- planId: output.run.planId,
20
- status: output.status.status,
21
- chunkCounts: output.status.totals,
22
- attempts: output.status.attempts,
23
- runPath: output.runPath,
24
- eventPath: output.eventPath,
25
- lastError: output.status.lastError,
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,
26
18
  };
27
19
  }
28
20
  export function statusPayload(summary) {
@@ -32,9 +24,8 @@ export function statusPayload(summary) {
32
24
  planId: summary.planId,
33
25
  status: summary.status,
34
26
  chunkCounts: summary.totals,
35
- attempts: summary.attempts,
27
+ rowsWritten: summary.rowsWritten,
36
28
  runPath: summary.runPath,
37
- eventPath: summary.eventPath,
38
29
  updatedAt: summary.updatedAt,
39
30
  lastError: summary.lastError,
40
31
  };
@@ -47,7 +38,6 @@ export function cancelPayload(summary) {
47
38
  status: summary.status,
48
39
  chunkCounts: summary.totals,
49
40
  runPath: summary.runPath,
50
- eventPath: summary.eventPath,
51
41
  };
52
42
  }
53
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;IAYzD,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,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAgC;IAWzD,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,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;KACnC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA8B;IAY1D,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,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,13 +1,14 @@
1
1
  import type { ResolvedChxConfig } from '@chkit/core';
2
- import type { BuildBackfillPlanOutput, NormalizedBackfillPluginOptions } from './types.js';
2
+ import type { PlanOptions } from './options.js';
3
+ import type { BuildBackfillPlanOutput } from './types.js';
3
4
  export declare function buildBackfillPlan(input: {
4
- target: string;
5
- from: string;
6
- to: string;
5
+ opts: PlanOptions;
7
6
  configPath: string;
8
- config: Pick<ResolvedChxConfig, 'metaDir'>;
9
- options: NormalizedBackfillPluginOptions;
10
- chunkHours?: number;
11
- forceLargeWindow?: boolean;
7
+ config: Pick<ResolvedChxConfig, 'metaDir' | 'schema'>;
8
+ clickhouse?: {
9
+ url: string;
10
+ database: string;
11
+ };
12
+ clickhouseQuery: <T>(sql: string) => Promise<T[]>;
12
13
  }): Promise<BuildBackfillPlanOutput>;
13
14
  //# sourceMappingURL=planner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAYpD,OAAO,KAAK,EAGV,uBAAuB,EACvB,+BAA+B,EAChC,MAAM,YAAY,CAAA;AAsFnB,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,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAA;IAC1C,OAAO,EAAE,+BAA+B,CAAA;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAiEnC"}
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,113 +1,113 @@
1
+ import { dirname } from 'node:path';
2
+ import { loadSchemaDefinitions } from '@chkit/core/schema-loader';
3
+ import { analyzeAndChunk } from './chunking/analyze.js';
4
+ import { buildChunkSql } from './chunking/sql.js';
5
+ import { findMvForTarget } from './detect.js';
1
6
  import { BackfillConfigError } from './errors.js';
2
- import { backfillPaths, computeBackfillStateDir, hashId, planIdentity, readExistingPlan, stableSerialize, writeJson, } from './state.js';
3
- function ensureHoursWithinLimits(input) {
4
- const fromMillis = new Date(input.from).getTime();
5
- const toMillis = new Date(input.to).getTime();
6
- if (toMillis <= fromMillis) {
7
- throw new BackfillConfigError('Invalid backfill window. Expected --to to be after --from.');
7
+ import { backfillPaths, computeBackfillStateDir, computeEnvironmentFingerprint, writeJson, } from './state.js';
8
+ export async function buildBackfillPlan(input) {
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>.');
8
13
  }
9
- const durationHours = (toMillis - fromMillis) / (1000 * 60 * 60);
10
- if (durationHours > input.limits.maxWindowHours && !input.forceLargeWindow) {
11
- throw new BackfillConfigError(`Requested window (${durationHours.toFixed(2)} hours) exceeds limits.maxWindowHours=${input.limits.maxWindowHours}. Retry with --force-large-window to acknowledge risk.`);
14
+ const env = computeEnvironmentFingerprint(input.clickhouse);
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.`);
12
27
  }
13
- }
14
- function buildChunkSqlTemplate(chunk) {
15
- return [
16
- `/* chkit backfill plan=${chunk.planId} chunk=${chunk.chunkId} token=${chunk.token} */`,
17
- `INSERT INTO ${chunk.target}`,
18
- `SELECT *`,
19
- `FROM ${chunk.target}`,
20
- `WHERE event_time >= toDateTime('${chunk.from}')`,
21
- ` AND event_time < toDateTime('${chunk.to}');`,
22
- ].join('\n');
23
- }
24
- function buildChunks(input) {
25
- const fromMillis = new Date(input.from).getTime();
26
- const toMillis = new Date(input.to).getTime();
27
- const chunkMillis = input.chunkHours * 60 * 60 * 1000;
28
- const chunks = [];
29
- let current = fromMillis;
30
- while (current < toMillis) {
31
- const next = Math.min(current + chunkMillis, toMillis);
32
- const chunkFrom = new Date(current).toISOString();
33
- const chunkTo = new Date(next).toISOString();
34
- const idSeed = `${input.planId}:${chunkFrom}:${chunkTo}`;
35
- const chunkId = hashId(`chunk:${idSeed}`).slice(0, 16);
36
- const token = input.requireIdempotencyToken ? hashId(`token:${idSeed}`) : '';
37
- chunks.push({
38
- id: chunkId,
39
- from: chunkFrom,
40
- to: chunkTo,
41
- status: 'pending',
42
- attempts: 0,
43
- idempotencyToken: token,
44
- sqlTemplate: buildChunkSqlTemplate({
45
- planId: input.planId,
46
- chunkId,
47
- token,
48
- target: input.target,
49
- from: chunkFrom,
50
- to: chunkTo,
51
- }),
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);
32
+ const paths = backfillPaths(stateDir, planId);
33
+ // 2. Detect MV for replay strategy
34
+ let mvAsQuery;
35
+ let targetColumns;
36
+ try {
37
+ const definitions = await loadSchemaDefinitions(input.config.schema, {
38
+ cwd: dirname(input.configPath),
52
39
  });
53
- current = next;
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);
46
+ }
47
+ }
54
48
  }
55
- return chunks;
56
- }
57
- export async function buildBackfillPlan(input) {
58
- const chunkHours = input.chunkHours ?? input.options.defaults.chunkHours;
59
- if (chunkHours * 60 < input.options.limits.minChunkMinutes) {
60
- throw new BackfillConfigError(`Chunk size ${chunkHours}h is below limits.minChunkMinutes=${input.options.limits.minChunkMinutes}.`);
49
+ catch {
50
+ // Schema load failed — fall back to direct copy
61
51
  }
62
- ensureHoursWithinLimits({
63
- from: input.from,
64
- to: input.to,
65
- limits: input.options.limits,
66
- forceLargeWindow: input.forceLargeWindow ?? false,
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
+ };
67
75
  });
68
- const planId = hashId(planIdentity(input.target, input.from, input.to, chunkHours)).slice(0, 16);
69
- const stateDir = computeBackfillStateDir(input.config, input.configPath, input.options);
70
- const paths = backfillPaths(stateDir, planId);
76
+ const strategy = mvAsQuery ? 'mv_replay' : 'partition';
71
77
  const plan = {
72
78
  planId,
73
- target: input.target,
79
+ target: opts.target,
74
80
  createdAt: '1970-01-01T00:00:00.000Z',
75
81
  status: 'planned',
76
- from: input.from,
77
- to: input.to,
78
- chunks: buildChunks({
79
- planId,
80
- target: input.target,
81
- from: input.from,
82
- to: input.to,
83
- chunkHours,
84
- requireIdempotencyToken: input.options.defaults.requireIdempotencyToken,
85
- }),
82
+ strategy: strategy,
83
+ ...(env ? { environment: env } : {}),
84
+ from: derivedFrom,
85
+ to: derivedTo,
86
+ chunks,
87
+ partitions,
88
+ sortKey,
86
89
  options: {
87
- chunkHours,
88
- maxParallelChunks: input.options.defaults.maxParallelChunks,
89
- maxRetriesPerChunk: input.options.defaults.maxRetriesPerChunk,
90
- requireIdempotencyToken: input.options.defaults.requireIdempotencyToken,
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,
91
105
  },
92
- policy: input.options.policy,
93
- limits: input.options.limits,
94
106
  };
95
- const existing = await readExistingPlan(paths.planPath);
96
- if (existing) {
97
- if (stableSerialize(existing) !== stableSerialize(plan)) {
98
- throw new BackfillConfigError(`Backfill plan already exists at ${paths.planPath} but differs from current planning output. Remove it if you intentionally changed planning parameters.`);
99
- }
100
- return {
101
- plan: existing,
102
- planPath: paths.planPath,
103
- existed: true,
104
- };
105
- }
106
107
  await writeJson(paths.planPath, plan);
107
108
  return {
108
109
  plan,
109
110
  planPath: paths.planPath,
110
- existed: false,
111
111
  };
112
112
  }
113
113
  //# sourceMappingURL=planner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
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":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAEnG,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAkTxF;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"}