@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.
- package/README.md +40 -0
- package/dist/args.d.ts +109 -6
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +73 -97
- package/dist/args.js.map +1 -1
- package/dist/async-backfill.d.ts +64 -0
- package/dist/async-backfill.d.ts.map +1 -0
- package/dist/async-backfill.js +251 -0
- package/dist/async-backfill.js.map +1 -0
- package/dist/check.d.ts +9 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +79 -0
- package/dist/check.js.map +1 -0
- package/dist/chunking/analyze.d.ts +38 -0
- package/dist/chunking/analyze.d.ts.map +1 -0
- package/dist/chunking/analyze.js +76 -0
- package/dist/chunking/analyze.js.map +1 -0
- package/dist/chunking/build.d.ts +11 -0
- package/dist/chunking/build.d.ts.map +1 -0
- package/dist/chunking/build.js +51 -0
- package/dist/chunking/build.js.map +1 -0
- package/dist/chunking/introspect.d.ts +34 -0
- package/dist/chunking/introspect.d.ts.map +1 -0
- package/dist/chunking/introspect.js +96 -0
- package/dist/chunking/introspect.js.map +1 -0
- package/dist/chunking/splitter.d.ts +20 -0
- package/dist/chunking/splitter.d.ts.map +1 -0
- package/dist/chunking/splitter.js +76 -0
- package/dist/chunking/splitter.js.map +1 -0
- package/dist/chunking/sql.d.ts +12 -0
- package/dist/chunking/sql.d.ts.map +1 -0
- package/dist/chunking/sql.js +221 -0
- package/dist/chunking/sql.js.map +1 -0
- package/dist/chunking/types.d.ts +29 -0
- package/dist/chunking/types.d.ts.map +1 -0
- package/dist/chunking/types.js +2 -0
- package/dist/chunking/types.js.map +1 -0
- package/dist/detect.d.ts +13 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +113 -0
- package/dist/detect.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +151 -4
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +161 -109
- package/dist/options.js.map +1 -1
- package/dist/payload.d.ts +7 -17
- package/dist/payload.d.ts.map +1 -1
- package/dist/payload.js +8 -18
- package/dist/payload.js.map +1 -1
- package/dist/planner.d.ts +9 -8
- package/dist/planner.d.ts.map +1 -1
- package/dist/planner.js +92 -92
- package/dist/planner.js.map +1 -1
- package/dist/plugin.d.ts +4 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +295 -215
- package/dist/plugin.js.map +1 -1
- package/dist/queries.d.ts +21 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +113 -0
- package/dist/queries.js.map +1 -0
- package/dist/runtime.d.ts +14 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +162 -83
- package/dist/runtime.js.map +1 -1
- package/dist/state.d.ts +16 -28
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +59 -124
- package/dist/state.js.map +1 -1
- package/dist/table-config.d.ts +9 -0
- package/dist/table-config.d.ts.map +1 -0
- package/dist/table-config.js +2 -0
- package/dist/table-config.js.map +1 -0
- package/dist/types.d.ts +50 -103
- package/dist/types.d.ts.map +1 -1
- package/package.json +23 -2
package/dist/state.d.ts
CHANGED
|
@@ -1,42 +1,30 @@
|
|
|
1
1
|
import type { ResolvedChxConfig } from '@chkit/core';
|
|
2
|
-
import type {
|
|
2
|
+
import type { BackfillEnvironment, BackfillPathSet, BackfillPlanState, BackfillRunState, BackfillStatusSummary, ReadPlanOutput } from './types.js';
|
|
3
3
|
export declare function hashId(input: string): string;
|
|
4
4
|
export declare function nowIso(): string;
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
5
|
+
export declare function randomPlanId(): string;
|
|
6
|
+
export declare function computeEnvironmentFingerprint(clickhouse: {
|
|
7
|
+
url: string;
|
|
8
|
+
database?: string;
|
|
9
|
+
} | undefined): BackfillEnvironment | undefined;
|
|
10
|
+
export declare function ensureEnvironmentMatch(input: {
|
|
7
11
|
plan: BackfillPlanState;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
clickhouse: {
|
|
13
|
+
url: string;
|
|
14
|
+
database?: string;
|
|
15
|
+
} | undefined;
|
|
16
|
+
forceEnvironment: boolean;
|
|
17
|
+
}): void;
|
|
18
|
+
export declare function computeBackfillStateDir(config: Pick<ResolvedChxConfig, 'metaDir'>, configPath: string, stateDir?: string): string;
|
|
12
19
|
export declare function backfillPaths(stateDir: string, planId: string): BackfillPathSet;
|
|
13
20
|
export declare function writeJson(filePath: string, value: unknown): Promise<void>;
|
|
14
|
-
export declare function readExistingPlan(planPath: string): Promise<BackfillPlanState | null>;
|
|
15
21
|
export declare function readPlan(input: {
|
|
16
22
|
planId: string;
|
|
17
23
|
configPath: string;
|
|
18
24
|
config: Pick<ResolvedChxConfig, 'metaDir'>;
|
|
19
|
-
|
|
25
|
+
stateDir?: string;
|
|
20
26
|
}): Promise<ReadPlanOutput>;
|
|
21
27
|
export declare function readRun(runPath: string): Promise<BackfillRunState | null>;
|
|
22
|
-
export declare function createRunState(input: {
|
|
23
|
-
plan: BackfillPlanState;
|
|
24
|
-
options: NormalizedBackfillPluginOptions;
|
|
25
|
-
execution: BackfillExecutionOptions;
|
|
26
|
-
}): BackfillRunState;
|
|
27
|
-
export declare function collectActiveRunTargets(runsDir: string): Promise<Map<string, string>>;
|
|
28
28
|
export declare function listPlanIds(plansDir: string): Promise<string[]>;
|
|
29
|
-
export declare function summarizeRunStatus(run: BackfillRunState, runPath: string,
|
|
30
|
-
export declare function persistRunAndEvent(input: {
|
|
31
|
-
run: BackfillRunState;
|
|
32
|
-
runPath: string;
|
|
33
|
-
eventPath: string;
|
|
34
|
-
event: Record<string, unknown>;
|
|
35
|
-
}): Promise<void>;
|
|
36
|
-
export declare function ensureRunCompatibility(input: {
|
|
37
|
-
run: BackfillRunState;
|
|
38
|
-
plan: BackfillPlanState;
|
|
39
|
-
options: NormalizedBackfillPluginOptions;
|
|
40
|
-
forceCompatibility: boolean;
|
|
41
|
-
}): void;
|
|
29
|
+
export declare function summarizeRunStatus(run: BackfillRunState, runPath: string, plan: BackfillPlanState): BackfillStatusSummary;
|
|
42
30
|
//# sourceMappingURL=state.d.ts.map
|
package/dist/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGpD,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGpD,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACf,MAAM,YAAY,CAAA;AAEnB,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACzD,mBAAmB,GAAG,SAAS,CASjC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,iBAAiB,CAAA;IACvB,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IAC1D,gBAAgB,EAAE,OAAO,CAAA;CAC1B,GAAG,IAAI,CAeP;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAKR;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAU/E;AAOD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/E;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAA;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,cAAc,CAAC,CAY1B;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAE/E;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOrE;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,iBAAiB,GACtB,qBAAqB,CAmCvB"}
|
package/dist/state.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
|
-
import {
|
|
3
|
+
import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { dirname, join, resolve } from 'node:path';
|
|
5
5
|
import { BackfillConfigError } from './errors.js';
|
|
6
6
|
export function hashId(input) {
|
|
@@ -9,51 +9,52 @@ export function hashId(input) {
|
|
|
9
9
|
export function nowIso() {
|
|
10
10
|
return new Date().toISOString();
|
|
11
11
|
}
|
|
12
|
-
export function
|
|
13
|
-
|
|
14
|
-
return JSON.stringify(value);
|
|
15
|
-
}
|
|
16
|
-
if (Array.isArray(value)) {
|
|
17
|
-
return `[${value.map((item) => stableSerialize(item)).join(',')}]`;
|
|
18
|
-
}
|
|
19
|
-
const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
|
|
20
|
-
return `{${entries
|
|
21
|
-
.map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item)}`)
|
|
22
|
-
.join(',')}}`;
|
|
12
|
+
export function randomPlanId() {
|
|
13
|
+
return randomBytes(8).toString('hex');
|
|
23
14
|
}
|
|
24
|
-
export function
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}));
|
|
35
|
-
}
|
|
36
|
-
export function planIdentity(target, from, to, chunkHours) {
|
|
37
|
-
return `${target}|${from}|${to}|${chunkHours}`;
|
|
15
|
+
export function computeEnvironmentFingerprint(clickhouse) {
|
|
16
|
+
if (!clickhouse)
|
|
17
|
+
return undefined;
|
|
18
|
+
const database = clickhouse.database ?? 'default';
|
|
19
|
+
const origin = new URL(clickhouse.url).origin;
|
|
20
|
+
return {
|
|
21
|
+
fingerprint: hashId(`${origin}|${database}`).slice(0, 16),
|
|
22
|
+
url: origin,
|
|
23
|
+
database,
|
|
24
|
+
};
|
|
38
25
|
}
|
|
39
|
-
export function
|
|
40
|
-
if (
|
|
41
|
-
return
|
|
26
|
+
export function ensureEnvironmentMatch(input) {
|
|
27
|
+
if (!input.plan.environment)
|
|
28
|
+
return;
|
|
29
|
+
if (!input.clickhouse)
|
|
30
|
+
return;
|
|
31
|
+
const current = computeEnvironmentFingerprint(input.clickhouse);
|
|
32
|
+
if (!current)
|
|
33
|
+
return;
|
|
34
|
+
if (input.plan.environment.fingerprint === current.fingerprint)
|
|
35
|
+
return;
|
|
36
|
+
if (input.forceEnvironment)
|
|
37
|
+
return;
|
|
38
|
+
throw new BackfillConfigError(`Environment mismatch for plan ${input.plan.planId}. ` +
|
|
39
|
+
`Plan was created for ${input.plan.environment.url} (database: ${input.plan.environment.database}), ` +
|
|
40
|
+
`but current config points to ${current.url} (database: ${current.database}). ` +
|
|
41
|
+
`Retry with --force-environment to override.`);
|
|
42
|
+
}
|
|
43
|
+
export function computeBackfillStateDir(config, configPath, stateDir) {
|
|
44
|
+
if (stateDir && stateDir.length > 0) {
|
|
45
|
+
return resolve(dirname(configPath), stateDir);
|
|
42
46
|
}
|
|
43
47
|
return resolve(dirname(configPath), config.metaDir, 'backfill');
|
|
44
48
|
}
|
|
45
49
|
export function backfillPaths(stateDir, planId) {
|
|
46
50
|
const plansDir = join(stateDir, 'plans');
|
|
47
51
|
const runsDir = join(stateDir, 'runs');
|
|
48
|
-
const eventsDir = join(stateDir, 'events');
|
|
49
52
|
return {
|
|
50
53
|
stateDir,
|
|
51
54
|
plansDir,
|
|
52
55
|
runsDir,
|
|
53
|
-
eventsDir,
|
|
54
56
|
planPath: join(plansDir, `${planId}.json`),
|
|
55
57
|
runPath: join(runsDir, `${planId}.json`),
|
|
56
|
-
eventPath: join(eventsDir, `${planId}.ndjson`),
|
|
57
58
|
};
|
|
58
59
|
}
|
|
59
60
|
async function readJsonMaybe(filePath) {
|
|
@@ -65,15 +66,8 @@ export async function writeJson(filePath, value) {
|
|
|
65
66
|
await mkdir(dirname(filePath), { recursive: true });
|
|
66
67
|
await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
|
|
67
68
|
}
|
|
68
|
-
async function appendEvent(eventPath, event) {
|
|
69
|
-
await mkdir(dirname(eventPath), { recursive: true });
|
|
70
|
-
await appendFile(eventPath, `${JSON.stringify({ at: nowIso(), ...event })}\n`, 'utf8');
|
|
71
|
-
}
|
|
72
|
-
export async function readExistingPlan(planPath) {
|
|
73
|
-
return readJsonMaybe(planPath);
|
|
74
|
-
}
|
|
75
69
|
export async function readPlan(input) {
|
|
76
|
-
const stateDir = computeBackfillStateDir(input.config, input.configPath, input.
|
|
70
|
+
const stateDir = computeBackfillStateDir(input.config, input.configPath, input.stateDir);
|
|
77
71
|
const paths = backfillPaths(stateDir, input.planId);
|
|
78
72
|
const plan = await readJsonMaybe(paths.planPath);
|
|
79
73
|
if (!plan) {
|
|
@@ -88,51 +82,6 @@ export async function readPlan(input) {
|
|
|
88
82
|
export async function readRun(runPath) {
|
|
89
83
|
return readJsonMaybe(runPath);
|
|
90
84
|
}
|
|
91
|
-
export function createRunState(input) {
|
|
92
|
-
const startedAt = nowIso();
|
|
93
|
-
return {
|
|
94
|
-
planId: input.plan.planId,
|
|
95
|
-
target: input.plan.target,
|
|
96
|
-
status: 'planned',
|
|
97
|
-
createdAt: startedAt,
|
|
98
|
-
startedAt,
|
|
99
|
-
updatedAt: startedAt,
|
|
100
|
-
replayDone: input.execution.replayDone ?? false,
|
|
101
|
-
replayFailed: input.execution.replayFailed ?? false,
|
|
102
|
-
compatibilityToken: computeCompatibilityToken({
|
|
103
|
-
plan: input.plan,
|
|
104
|
-
options: input.options,
|
|
105
|
-
}),
|
|
106
|
-
options: input.plan.options,
|
|
107
|
-
chunks: input.plan.chunks.map((chunk) => ({
|
|
108
|
-
id: chunk.id,
|
|
109
|
-
from: chunk.from,
|
|
110
|
-
to: chunk.to,
|
|
111
|
-
status: 'pending',
|
|
112
|
-
attempts: 0,
|
|
113
|
-
idempotencyToken: chunk.idempotencyToken,
|
|
114
|
-
sqlTemplate: chunk.sqlTemplate,
|
|
115
|
-
})),
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
export async function collectActiveRunTargets(runsDir) {
|
|
119
|
-
const active = new Map();
|
|
120
|
-
if (!existsSync(runsDir))
|
|
121
|
-
return active;
|
|
122
|
-
const entries = await readdir(runsDir, { withFileTypes: true });
|
|
123
|
-
for (const entry of entries) {
|
|
124
|
-
if (!entry.isFile() || !entry.name.endsWith('.json'))
|
|
125
|
-
continue;
|
|
126
|
-
const file = join(runsDir, entry.name);
|
|
127
|
-
const run = await readRun(file);
|
|
128
|
-
if (!run)
|
|
129
|
-
continue;
|
|
130
|
-
if (run.status !== 'running')
|
|
131
|
-
continue;
|
|
132
|
-
active.set(run.planId, run.target);
|
|
133
|
-
}
|
|
134
|
-
return active;
|
|
135
|
-
}
|
|
136
85
|
export async function listPlanIds(plansDir) {
|
|
137
86
|
if (!existsSync(plansDir))
|
|
138
87
|
return [];
|
|
@@ -142,57 +91,43 @@ export async function listPlanIds(plansDir) {
|
|
|
142
91
|
.map((entry) => entry.name.replace(/\.json$/, ''))
|
|
143
92
|
.sort();
|
|
144
93
|
}
|
|
145
|
-
export function summarizeRunStatus(run, runPath,
|
|
146
|
-
const
|
|
147
|
-
total:
|
|
94
|
+
export function summarizeRunStatus(run, runPath, plan) {
|
|
95
|
+
const totals = {
|
|
96
|
+
total: plan.chunks.length,
|
|
148
97
|
pending: 0,
|
|
98
|
+
submitted: 0,
|
|
149
99
|
running: 0,
|
|
150
100
|
done: 0,
|
|
151
101
|
failed: 0,
|
|
152
|
-
skipped: 0,
|
|
153
102
|
};
|
|
154
|
-
let
|
|
155
|
-
for (const chunk of
|
|
156
|
-
|
|
157
|
-
if (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
103
|
+
let rowsWritten = 0;
|
|
104
|
+
for (const chunk of plan.chunks) {
|
|
105
|
+
const state = run.progress[chunk.id];
|
|
106
|
+
if (!state) {
|
|
107
|
+
totals.pending += 1;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
rowsWritten += state.writtenRows ?? 0;
|
|
111
|
+
if (state.status === 'pending')
|
|
112
|
+
totals.pending += 1;
|
|
113
|
+
else if (state.status === 'submitted')
|
|
114
|
+
totals.submitted += 1;
|
|
115
|
+
else if (state.status === 'running')
|
|
116
|
+
totals.running += 1;
|
|
117
|
+
else if (state.status === 'done')
|
|
118
|
+
totals.done += 1;
|
|
119
|
+
else if (state.status === 'failed')
|
|
120
|
+
totals.failed += 1;
|
|
167
121
|
}
|
|
168
122
|
return {
|
|
169
123
|
planId: run.planId,
|
|
170
124
|
target: run.target,
|
|
171
125
|
status: run.status,
|
|
172
|
-
totals
|
|
173
|
-
|
|
126
|
+
totals,
|
|
127
|
+
rowsWritten,
|
|
174
128
|
updatedAt: run.updatedAt,
|
|
175
129
|
runPath,
|
|
176
|
-
eventPath,
|
|
177
130
|
lastError: run.lastError,
|
|
178
131
|
};
|
|
179
132
|
}
|
|
180
|
-
export async function persistRunAndEvent(input) {
|
|
181
|
-
input.run.updatedAt = nowIso();
|
|
182
|
-
await writeJson(input.runPath, input.run);
|
|
183
|
-
await appendEvent(input.eventPath, input.event);
|
|
184
|
-
}
|
|
185
|
-
export function ensureRunCompatibility(input) {
|
|
186
|
-
if (!input.run.compatibilityToken)
|
|
187
|
-
return;
|
|
188
|
-
const expected = computeCompatibilityToken({
|
|
189
|
-
plan: input.plan,
|
|
190
|
-
options: input.options,
|
|
191
|
-
});
|
|
192
|
-
if (input.run.compatibilityToken === expected)
|
|
193
|
-
return;
|
|
194
|
-
if (input.forceCompatibility)
|
|
195
|
-
return;
|
|
196
|
-
throw new BackfillConfigError(`Run compatibility check failed for plan ${input.plan.planId}. Runtime options changed since last checkpoint. Retry with --force-compatibility to acknowledge override.`);
|
|
197
|
-
}
|
|
198
133
|
//# sourceMappingURL=state.js.map
|
package/dist/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-config.d.ts","sourceRoot":"","sources":["../src/table-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,YAAY;QACpB,QAAQ,CAAC,EAAE,mBAAmB,CAAA;KAC/B;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-config.js","sourceRoot":"","sources":["../src/table-config.ts"],"names":[],"mappings":""}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,33 +1,17 @@
|
|
|
1
1
|
import type { ChxInlinePluginRegistration, ResolvedChxConfig } from '@chkit/core';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
export interface
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
failCheckOnRequiredPendingBackfill?: boolean;
|
|
13
|
-
}
|
|
14
|
-
export interface BackfillPluginLimits {
|
|
15
|
-
maxWindowHours?: number;
|
|
16
|
-
minChunkMinutes?: number;
|
|
17
|
-
}
|
|
18
|
-
export interface BackfillPluginOptions {
|
|
19
|
-
stateDir?: string;
|
|
20
|
-
defaults?: BackfillPluginDefaults;
|
|
21
|
-
policy?: BackfillPluginPolicy;
|
|
22
|
-
limits?: BackfillPluginLimits;
|
|
23
|
-
}
|
|
24
|
-
export interface NormalizedBackfillPluginOptions {
|
|
25
|
-
stateDir?: string;
|
|
26
|
-
defaults: Required<BackfillPluginDefaults>;
|
|
27
|
-
policy: Required<BackfillPluginPolicy>;
|
|
28
|
-
limits: Required<BackfillPluginLimits>;
|
|
2
|
+
import type { BackfillProgress } from './async-backfill.js';
|
|
3
|
+
import type { PartitionInfo, SortKeyInfo } from './chunking/types.js';
|
|
4
|
+
import type { PluginConfig } from './options.js';
|
|
5
|
+
/** @deprecated Use {@link PluginConfig} instead. */
|
|
6
|
+
export type BackfillPluginOptions = PluginConfig;
|
|
7
|
+
export type { PluginConfig };
|
|
8
|
+
export interface BackfillEnvironment {
|
|
9
|
+
fingerprint: string;
|
|
10
|
+
url: string;
|
|
11
|
+
database: string;
|
|
29
12
|
}
|
|
30
13
|
export type BackfillPlanStatus = 'planned' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';
|
|
14
|
+
export type { ChunkBoundary, PartitionInfo, PlannedChunk, SortKeyInfo } from './chunking/types.js';
|
|
31
15
|
export interface BackfillChunk {
|
|
32
16
|
id: string;
|
|
33
17
|
from: string;
|
|
@@ -37,50 +21,52 @@ export interface BackfillChunk {
|
|
|
37
21
|
idempotencyToken: string;
|
|
38
22
|
sqlTemplate: string;
|
|
39
23
|
lastError?: string;
|
|
24
|
+
partitionId: string;
|
|
25
|
+
estimatedBytes: number;
|
|
26
|
+
sortKeyFrom?: string;
|
|
27
|
+
sortKeyTo?: string;
|
|
40
28
|
}
|
|
41
29
|
export interface BackfillPlanState {
|
|
42
30
|
planId: string;
|
|
43
31
|
target: string;
|
|
44
32
|
createdAt: string;
|
|
45
33
|
status: BackfillPlanStatus;
|
|
34
|
+
strategy?: 'table' | 'mv_replay' | 'partition';
|
|
35
|
+
environment?: BackfillEnvironment;
|
|
46
36
|
from: string;
|
|
47
37
|
to: string;
|
|
48
38
|
chunks: BackfillChunk[];
|
|
39
|
+
partitions?: PartitionInfo[];
|
|
40
|
+
sortKey?: SortKeyInfo;
|
|
49
41
|
options: {
|
|
50
|
-
chunkHours
|
|
42
|
+
chunkHours?: number;
|
|
43
|
+
maxChunkBytes?: number;
|
|
51
44
|
maxParallelChunks: number;
|
|
52
45
|
maxRetriesPerChunk: number;
|
|
53
46
|
requireIdempotencyToken: boolean;
|
|
47
|
+
timeColumn?: string;
|
|
48
|
+
sortKeyColumn?: string;
|
|
49
|
+
};
|
|
50
|
+
policy: {
|
|
51
|
+
requireDryRunBeforeRun: boolean;
|
|
52
|
+
requireExplicitWindow: boolean;
|
|
53
|
+
blockOverlappingRuns: boolean;
|
|
54
|
+
failCheckOnRequiredPendingBackfill: boolean;
|
|
55
|
+
};
|
|
56
|
+
limits: {
|
|
57
|
+
maxWindowHours: number;
|
|
58
|
+
minChunkMinutes: number;
|
|
54
59
|
};
|
|
55
|
-
policy: Required<BackfillPluginPolicy>;
|
|
56
|
-
limits: Required<BackfillPluginLimits>;
|
|
57
|
-
}
|
|
58
|
-
export interface BackfillRunChunkState {
|
|
59
|
-
id: string;
|
|
60
|
-
from: string;
|
|
61
|
-
to: string;
|
|
62
|
-
status: 'pending' | 'running' | 'done' | 'failed' | 'skipped';
|
|
63
|
-
attempts: number;
|
|
64
|
-
idempotencyToken: string;
|
|
65
|
-
sqlTemplate: string;
|
|
66
|
-
startedAt?: string;
|
|
67
|
-
completedAt?: string;
|
|
68
|
-
lastError?: string;
|
|
69
60
|
}
|
|
70
61
|
export interface BackfillRunState {
|
|
71
62
|
planId: string;
|
|
72
63
|
target: string;
|
|
73
|
-
status:
|
|
74
|
-
createdAt: string;
|
|
64
|
+
status: 'running' | 'completed' | 'failed' | 'cancelled';
|
|
75
65
|
startedAt: string;
|
|
76
66
|
updatedAt: string;
|
|
77
67
|
completedAt?: string;
|
|
78
68
|
lastError?: string;
|
|
79
|
-
|
|
80
|
-
replayFailed: boolean;
|
|
81
|
-
compatibilityToken: string;
|
|
82
|
-
options: BackfillPlanState['options'];
|
|
83
|
-
chunks: BackfillRunChunkState[];
|
|
69
|
+
progress: BackfillProgress;
|
|
84
70
|
}
|
|
85
71
|
export interface BackfillStatusSummary {
|
|
86
72
|
planId: string;
|
|
@@ -89,15 +75,14 @@ export interface BackfillStatusSummary {
|
|
|
89
75
|
totals: {
|
|
90
76
|
total: number;
|
|
91
77
|
pending: number;
|
|
78
|
+
submitted: number;
|
|
92
79
|
running: number;
|
|
93
80
|
done: number;
|
|
94
81
|
failed: number;
|
|
95
|
-
skipped: number;
|
|
96
82
|
};
|
|
97
|
-
|
|
83
|
+
rowsWritten: number;
|
|
98
84
|
updatedAt: string;
|
|
99
85
|
runPath: string;
|
|
100
|
-
eventPath: string;
|
|
101
86
|
lastError?: string;
|
|
102
87
|
}
|
|
103
88
|
export interface BackfillPluginCheckContext {
|
|
@@ -122,7 +107,6 @@ export interface BackfillPluginCheckResult {
|
|
|
122
107
|
export interface BuildBackfillPlanOutput {
|
|
123
108
|
plan: BackfillPlanState;
|
|
124
109
|
planPath: string;
|
|
125
|
-
existed: boolean;
|
|
126
110
|
}
|
|
127
111
|
export interface ReadPlanOutput {
|
|
128
112
|
plan: BackfillPlanState;
|
|
@@ -133,20 +117,8 @@ export interface BackfillPathSet {
|
|
|
133
117
|
stateDir: string;
|
|
134
118
|
plansDir: string;
|
|
135
119
|
runsDir: string;
|
|
136
|
-
eventsDir: string;
|
|
137
120
|
planPath: string;
|
|
138
121
|
runPath: string;
|
|
139
|
-
eventPath: string;
|
|
140
|
-
}
|
|
141
|
-
export interface BackfillExecutionOptions {
|
|
142
|
-
replayDone?: boolean;
|
|
143
|
-
replayFailed?: boolean;
|
|
144
|
-
forceOverlap?: boolean;
|
|
145
|
-
forceCompatibility?: boolean;
|
|
146
|
-
simulation?: {
|
|
147
|
-
failChunkId?: string;
|
|
148
|
-
failCount?: number;
|
|
149
|
-
};
|
|
150
122
|
}
|
|
151
123
|
export interface BackfillDoctorReport {
|
|
152
124
|
planId: string;
|
|
@@ -155,14 +127,9 @@ export interface BackfillDoctorReport {
|
|
|
155
127
|
recommendations: string[];
|
|
156
128
|
failedChunkIds: string[];
|
|
157
129
|
}
|
|
158
|
-
export interface ExecuteBackfillRunOutput {
|
|
159
|
-
run: BackfillRunState;
|
|
160
|
-
status: BackfillStatusSummary;
|
|
161
|
-
runPath: string;
|
|
162
|
-
eventPath: string;
|
|
163
|
-
}
|
|
164
130
|
export interface BackfillPluginCommandContext {
|
|
165
131
|
args: string[];
|
|
132
|
+
flags: Record<string, string | string[] | boolean | undefined>;
|
|
166
133
|
jsonMode: boolean;
|
|
167
134
|
options: Record<string, unknown>;
|
|
168
135
|
config: ResolvedChxConfig;
|
|
@@ -178,6 +145,13 @@ export interface BackfillPlugin {
|
|
|
178
145
|
commands: Array<{
|
|
179
146
|
name: 'plan' | 'run' | 'resume' | 'status' | 'cancel' | 'doctor';
|
|
180
147
|
description: string;
|
|
148
|
+
flags?: ReadonlyArray<{
|
|
149
|
+
name: string;
|
|
150
|
+
type: 'boolean' | 'string' | 'string[]';
|
|
151
|
+
description: string;
|
|
152
|
+
placeholder?: string;
|
|
153
|
+
negation?: boolean;
|
|
154
|
+
}>;
|
|
181
155
|
run: (context: BackfillPluginCommandContext) => undefined | number | Promise<undefined | number>;
|
|
182
156
|
}>;
|
|
183
157
|
hooks?: {
|
|
@@ -193,37 +167,10 @@ export interface BackfillPlugin {
|
|
|
193
167
|
}) => void | Promise<void>;
|
|
194
168
|
};
|
|
195
169
|
}
|
|
196
|
-
export type BackfillPluginRegistration = ChxInlinePluginRegistration<BackfillPlugin,
|
|
197
|
-
export interface
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
chunkHours?: number;
|
|
202
|
-
forceLargeWindow: boolean;
|
|
203
|
-
}
|
|
204
|
-
export interface ParsedRunArgs {
|
|
205
|
-
planId: string;
|
|
206
|
-
replayDone: boolean;
|
|
207
|
-
replayFailed: boolean;
|
|
208
|
-
forceOverlap: boolean;
|
|
209
|
-
forceCompatibility: boolean;
|
|
210
|
-
simulateFailChunk?: string;
|
|
211
|
-
simulateFailCount: number;
|
|
212
|
-
}
|
|
213
|
-
export interface ParsedResumeArgs {
|
|
214
|
-
planId: string;
|
|
215
|
-
replayDone: boolean;
|
|
216
|
-
replayFailed: boolean;
|
|
217
|
-
forceOverlap: boolean;
|
|
218
|
-
forceCompatibility: boolean;
|
|
219
|
-
}
|
|
220
|
-
export interface ParsedStatusArgs {
|
|
221
|
-
planId: string;
|
|
222
|
-
}
|
|
223
|
-
export interface ParsedCancelArgs {
|
|
224
|
-
planId: string;
|
|
225
|
-
}
|
|
226
|
-
export interface ParsedDoctorArgs {
|
|
227
|
-
planId: string;
|
|
170
|
+
export type BackfillPluginRegistration = ChxInlinePluginRegistration<BackfillPlugin, PluginConfig>;
|
|
171
|
+
export interface TimeColumnCandidate {
|
|
172
|
+
name: string;
|
|
173
|
+
type: string;
|
|
174
|
+
source: 'order_by' | 'column_scan' | 'schema';
|
|
228
175
|
}
|
|
229
176
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEjF,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|