@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
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const NUMERIC_TYPES = new Set([
|
|
2
|
+
'Int8', 'Int16', 'Int32', 'Int64', 'Int128', 'Int256',
|
|
3
|
+
'UInt8', 'UInt16', 'UInt32', 'UInt64', 'UInt128', 'UInt256',
|
|
4
|
+
'Float32', 'Float64',
|
|
5
|
+
]);
|
|
6
|
+
const DATETIME_TYPES = new Set(['Date', 'Date32', 'DateTime', 'DateTime64']);
|
|
7
|
+
function classifySortKeyType(type) {
|
|
8
|
+
if (NUMERIC_TYPES.has(type))
|
|
9
|
+
return 'numeric';
|
|
10
|
+
if (DATETIME_TYPES.has(type))
|
|
11
|
+
return 'datetime';
|
|
12
|
+
if (type.startsWith('DateTime64('))
|
|
13
|
+
return 'datetime';
|
|
14
|
+
if (type.startsWith("DateTime('"))
|
|
15
|
+
return 'datetime';
|
|
16
|
+
return 'string';
|
|
17
|
+
}
|
|
18
|
+
export async function queryPartitionInfo(input) {
|
|
19
|
+
// Force replica sync on the target table before reading system.parts.
|
|
20
|
+
// select_sequential_consistency is only effective on user tables, not system
|
|
21
|
+
// tables, so this preliminary query ensures the replica has caught up with
|
|
22
|
+
// all pending writes before we inspect part metadata.
|
|
23
|
+
await input.query(`SELECT 1 FROM ${input.database}.${input.table} LIMIT 1 SETTINGS select_sequential_consistency = 1`);
|
|
24
|
+
const rows = await input.query(`SELECT
|
|
25
|
+
partition_id,
|
|
26
|
+
toString(sum(rows)) AS total_rows,
|
|
27
|
+
toString(sum(bytes_on_disk)) AS total_bytes,
|
|
28
|
+
toString(min(min_time)) AS min_time,
|
|
29
|
+
toString(max(max_time)) AS max_time
|
|
30
|
+
FROM system.parts
|
|
31
|
+
WHERE database = '${input.database}'
|
|
32
|
+
AND table = '${input.table}'
|
|
33
|
+
AND active = 1
|
|
34
|
+
GROUP BY partition_id
|
|
35
|
+
ORDER BY partition_id
|
|
36
|
+
SETTINGS select_sequential_consistency = 1`);
|
|
37
|
+
const partitions = rows.map((row) => ({
|
|
38
|
+
partitionId: row.partition_id,
|
|
39
|
+
rows: Number(row.total_rows),
|
|
40
|
+
bytesOnDisk: Number(row.total_bytes),
|
|
41
|
+
minTime: new Date(row.min_time).toISOString(),
|
|
42
|
+
maxTime: new Date(row.max_time).toISOString(),
|
|
43
|
+
}));
|
|
44
|
+
return partitions.filter((p) => {
|
|
45
|
+
if (input.from && p.maxTime < input.from)
|
|
46
|
+
return false;
|
|
47
|
+
if (input.to && p.minTime >= input.to)
|
|
48
|
+
return false;
|
|
49
|
+
return true;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export async function querySortKeyInfo(input) {
|
|
53
|
+
const tableRows = await input.query(`SELECT sorting_key FROM system.tables WHERE database = '${input.database}' AND name = '${input.table}'`);
|
|
54
|
+
const sortingKey = tableRows[0]?.sorting_key;
|
|
55
|
+
if (!sortingKey)
|
|
56
|
+
return undefined;
|
|
57
|
+
// Parse first column from sorting key (may have expressions like "toDate(event_time)")
|
|
58
|
+
const firstColumn = sortingKey.split(',')[0]?.trim();
|
|
59
|
+
if (!firstColumn)
|
|
60
|
+
return undefined;
|
|
61
|
+
// If it's a function call like toDate(col), extract the column name
|
|
62
|
+
const match = firstColumn.match(/^\w+\((\w+)\)$/);
|
|
63
|
+
const columnName = match ? match[1] : firstColumn;
|
|
64
|
+
if (!columnName)
|
|
65
|
+
return undefined;
|
|
66
|
+
const columnRows = await input.query(`SELECT type FROM system.columns WHERE database = '${input.database}' AND table = '${input.table}' AND name = '${columnName}'`);
|
|
67
|
+
const type = columnRows[0]?.type;
|
|
68
|
+
if (!type)
|
|
69
|
+
return undefined;
|
|
70
|
+
return {
|
|
71
|
+
column: columnName,
|
|
72
|
+
type,
|
|
73
|
+
category: classifySortKeyType(type),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export async function querySortKeyRanges(input) {
|
|
77
|
+
if (input.partitionIds.length === 0)
|
|
78
|
+
return new Map();
|
|
79
|
+
const inList = input.partitionIds.map((id) => `'${id}'`).join(', ');
|
|
80
|
+
const rows = await input.query(`SELECT _partition_id AS partition_id, toString(min(${input.sortKeyColumn})) AS min_val, toString(max(${input.sortKeyColumn})) AS max_val FROM ${input.database}.${input.table} WHERE _partition_id IN (${inList}) GROUP BY _partition_id SETTINGS select_sequential_consistency = 1`);
|
|
81
|
+
const result = new Map();
|
|
82
|
+
for (const row of rows) {
|
|
83
|
+
result.set(row.partition_id, { min: row.min_val, max: row.max_val });
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
export async function introspectTable(input) {
|
|
88
|
+
const partitions = await queryPartitionInfo(input);
|
|
89
|
+
const sortKey = await querySortKeyInfo({
|
|
90
|
+
database: input.database,
|
|
91
|
+
table: input.table,
|
|
92
|
+
query: input.query,
|
|
93
|
+
});
|
|
94
|
+
return { partitions, sortKey };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=introspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../src/chunking/introspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SortKeyInfo } from './types.js';
|
|
2
|
+
export declare function splitNumericRange(min: number, max: number, count: number): Array<{
|
|
3
|
+
from: string;
|
|
4
|
+
to: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function splitDateTimeRange(min: string, max: string, count: number): Array<{
|
|
7
|
+
from: string;
|
|
8
|
+
to: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function stringToUint64(s: string): bigint;
|
|
11
|
+
export declare function uint64ToString(n: bigint): string;
|
|
12
|
+
export declare function splitStringRange(min: string, max: string, count: number): Array<{
|
|
13
|
+
from: string;
|
|
14
|
+
to: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function splitSortKeyRange(category: SortKeyInfo['category'], min: string, max: string, count: number): Array<{
|
|
17
|
+
from: string;
|
|
18
|
+
to: string;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=splitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../src/chunking/splitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAU9G;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAc/G;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAWhD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAc7G;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,EACjC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CASrC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export function splitNumericRange(min, max, count) {
|
|
2
|
+
const span = max - min;
|
|
3
|
+
const step = span / count;
|
|
4
|
+
const ranges = [];
|
|
5
|
+
for (let i = 0; i < count; i++) {
|
|
6
|
+
const from = min + i * step;
|
|
7
|
+
const to = i === count - 1 ? max + 1 : min + (i + 1) * step;
|
|
8
|
+
ranges.push({ from: String(from), to: String(to) });
|
|
9
|
+
}
|
|
10
|
+
return ranges;
|
|
11
|
+
}
|
|
12
|
+
export function splitDateTimeRange(min, max, count) {
|
|
13
|
+
const minMs = new Date(min).getTime();
|
|
14
|
+
const maxMs = new Date(max).getTime();
|
|
15
|
+
const span = maxMs - minMs;
|
|
16
|
+
const step = span / count;
|
|
17
|
+
const ranges = [];
|
|
18
|
+
for (let i = 0; i < count; i++) {
|
|
19
|
+
const from = new Date(minMs + i * step).toISOString();
|
|
20
|
+
const to = i === count - 1
|
|
21
|
+
? new Date(maxMs + 1).toISOString()
|
|
22
|
+
: new Date(minMs + (i + 1) * step).toISOString();
|
|
23
|
+
ranges.push({ from, to });
|
|
24
|
+
}
|
|
25
|
+
return ranges;
|
|
26
|
+
}
|
|
27
|
+
export function stringToUint64(s) {
|
|
28
|
+
let result = 0n;
|
|
29
|
+
const bytes = Math.min(s.length, 8);
|
|
30
|
+
for (let i = 0; i < bytes; i++) {
|
|
31
|
+
result = (result << 8n) | BigInt(s.charCodeAt(i));
|
|
32
|
+
}
|
|
33
|
+
// Pad remaining bytes with zeros
|
|
34
|
+
for (let i = bytes; i < 8; i++) {
|
|
35
|
+
result = result << 8n;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
export function uint64ToString(n) {
|
|
40
|
+
const chars = [];
|
|
41
|
+
for (let i = 7; i >= 0; i--) {
|
|
42
|
+
const byte = Number((n >> BigInt(i * 8)) & 0xffn);
|
|
43
|
+
chars.push(String.fromCharCode(byte));
|
|
44
|
+
}
|
|
45
|
+
// Trim trailing NUL bytes (padding from stringToUint64 for short strings)
|
|
46
|
+
let end = chars.length;
|
|
47
|
+
while (end > 0 && chars[end - 1] === '\0')
|
|
48
|
+
end--;
|
|
49
|
+
return chars.slice(0, end).join('');
|
|
50
|
+
}
|
|
51
|
+
export function splitStringRange(min, max, count) {
|
|
52
|
+
const minVal = stringToUint64(min);
|
|
53
|
+
const maxVal = stringToUint64(max);
|
|
54
|
+
const span = maxVal - minVal;
|
|
55
|
+
const step = span / BigInt(count);
|
|
56
|
+
const ranges = [];
|
|
57
|
+
for (let i = 0; i < count; i++) {
|
|
58
|
+
const from = uint64ToString(minVal + BigInt(i) * step);
|
|
59
|
+
const to = i === count - 1
|
|
60
|
+
? uint64ToString(maxVal + 1n)
|
|
61
|
+
: uint64ToString(minVal + BigInt(i + 1) * step);
|
|
62
|
+
ranges.push({ from, to });
|
|
63
|
+
}
|
|
64
|
+
return ranges;
|
|
65
|
+
}
|
|
66
|
+
export function splitSortKeyRange(category, min, max, count) {
|
|
67
|
+
switch (category) {
|
|
68
|
+
case 'numeric':
|
|
69
|
+
return splitNumericRange(Number(min), Number(max), count);
|
|
70
|
+
case 'datetime':
|
|
71
|
+
return splitDateTimeRange(min, max, count);
|
|
72
|
+
case 'string':
|
|
73
|
+
return splitStringRange(min, max, count);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=splitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splitter.js","sourceRoot":"","sources":["../../src/chunking/splitter.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,GAAW,EAAE,KAAa;IACvE,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAA;IACtB,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,CAAA;IACzB,MAAM,MAAM,GAAwC,EAAE,CAAA;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAA;QAC3B,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;QAC3D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,GAAW,EAAE,KAAa;IACxE,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IACrC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IACrC,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,CAAA;IACzB,MAAM,MAAM,GAAwC,EAAE,CAAA;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;QACrD,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;YACxB,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;YACnC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;QAClD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IACD,iCAAiC;IACjC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,MAAM,IAAI,EAAE,CAAA;IACvB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;QACjD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,CAAC;IACD,0EAA0E;IAC1E,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;IACtB,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,GAAG,EAAE,CAAA;IAChD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,GAAW,EAAE,KAAa;IACtE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,MAAM,GAAwC,EAAE,CAAA;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QACtD,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;YACxB,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,EAAE,CAAC;YAC7B,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QACjD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAiC,EACjC,GAAW,EACX,GAAW,EACX,KAAa;IAEb,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QAC3D,KAAK,UAAU;YACb,OAAO,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5C,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PlannedChunk, SortKeyInfo } from './types.js';
|
|
2
|
+
export declare function buildChunkSql(input: {
|
|
3
|
+
planId: string;
|
|
4
|
+
chunk: PlannedChunk;
|
|
5
|
+
target: string;
|
|
6
|
+
sortKey?: SortKeyInfo;
|
|
7
|
+
mvAsQuery?: string;
|
|
8
|
+
targetColumns?: string[];
|
|
9
|
+
}): string;
|
|
10
|
+
export declare function injectSortKeyFilter(query: string, sortKeyColumn: string, category: SortKeyInfo['category'], from: string, to: string): string;
|
|
11
|
+
export declare function rewriteSelectColumns(query: string, targetColumns: string[]): string;
|
|
12
|
+
//# sourceMappingURL=sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/chunking/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAsB3D,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB,GAAG,MAAM,CA2CT;AASD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,MAAM,CAQR;AAmDD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAoGnF"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
function buildSettingsClause(token) {
|
|
2
|
+
if (token) {
|
|
3
|
+
return `SETTINGS async_insert=0, insert_deduplication_token='${token}'`;
|
|
4
|
+
}
|
|
5
|
+
return `SETTINGS async_insert=0`;
|
|
6
|
+
}
|
|
7
|
+
function buildSortKeyCondition(sortKeyColumn, category, from, to) {
|
|
8
|
+
if (category === 'datetime') {
|
|
9
|
+
return ` AND ${sortKeyColumn} >= parseDateTimeBestEffort('${from}')\n AND ${sortKeyColumn} < parseDateTimeBestEffort('${to}')`;
|
|
10
|
+
}
|
|
11
|
+
// numeric and string use direct comparison
|
|
12
|
+
return ` AND ${sortKeyColumn} >= '${from}'\n AND ${sortKeyColumn} < '${to}'`;
|
|
13
|
+
}
|
|
14
|
+
export function buildChunkSql(input) {
|
|
15
|
+
const header = `/* chkit backfill plan=${input.planId} chunk=${input.chunk.id} token=${input.chunk.idempotencyToken} */`;
|
|
16
|
+
const settings = buildSettingsClause(input.chunk.idempotencyToken);
|
|
17
|
+
const { chunk } = input;
|
|
18
|
+
if (input.mvAsQuery) {
|
|
19
|
+
// MV replay: inject partition + sort key filters into the MV's AS query
|
|
20
|
+
let filtered = injectPartitionFilter(input.mvAsQuery, chunk.partitionId);
|
|
21
|
+
if (chunk.sortKeyFrom !== undefined && chunk.sortKeyTo !== undefined && input.sortKey) {
|
|
22
|
+
filtered = injectSortKeyFilter(filtered, input.sortKey.column, input.sortKey.category, chunk.sortKeyFrom, chunk.sortKeyTo);
|
|
23
|
+
}
|
|
24
|
+
if (input.targetColumns?.length) {
|
|
25
|
+
filtered = rewriteSelectColumns(filtered, input.targetColumns);
|
|
26
|
+
}
|
|
27
|
+
return [header, `INSERT INTO ${input.target}`, filtered, settings].join('\n');
|
|
28
|
+
}
|
|
29
|
+
// Direct table copy
|
|
30
|
+
const lines = [
|
|
31
|
+
header,
|
|
32
|
+
`INSERT INTO ${input.target}`,
|
|
33
|
+
`SELECT *`,
|
|
34
|
+
`FROM ${input.target}`,
|
|
35
|
+
`WHERE _partition_id = '${chunk.partitionId}'`,
|
|
36
|
+
];
|
|
37
|
+
if (chunk.sortKeyFrom !== undefined && chunk.sortKeyTo !== undefined && input.sortKey) {
|
|
38
|
+
lines.push(buildSortKeyCondition(input.sortKey.column, input.sortKey.category, chunk.sortKeyFrom, chunk.sortKeyTo));
|
|
39
|
+
}
|
|
40
|
+
lines.push(settings);
|
|
41
|
+
return lines.join('\n');
|
|
42
|
+
}
|
|
43
|
+
// --- SQL helpers ---
|
|
44
|
+
function injectPartitionFilter(query, partitionId) {
|
|
45
|
+
const condition = `_partition_id = '${partitionId}'`;
|
|
46
|
+
return injectWhereCondition(query, condition);
|
|
47
|
+
}
|
|
48
|
+
export function injectSortKeyFilter(query, sortKeyColumn, category, from, to) {
|
|
49
|
+
let condition;
|
|
50
|
+
if (category === 'datetime') {
|
|
51
|
+
condition = `${sortKeyColumn} >= parseDateTimeBestEffort('${from}')\n AND ${sortKeyColumn} < parseDateTimeBestEffort('${to}')`;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
condition = `${sortKeyColumn} >= '${from}'\n AND ${sortKeyColumn} < '${to}'`;
|
|
55
|
+
}
|
|
56
|
+
return injectWhereCondition(query, condition);
|
|
57
|
+
}
|
|
58
|
+
function injectWhereCondition(query, condition) {
|
|
59
|
+
const trimmed = query.trimEnd();
|
|
60
|
+
const upper = trimmed.toUpperCase();
|
|
61
|
+
const hits = [];
|
|
62
|
+
let depth = 0;
|
|
63
|
+
for (let i = 0; i < trimmed.length; i++) {
|
|
64
|
+
const ch = trimmed[i];
|
|
65
|
+
if (ch === '(') {
|
|
66
|
+
depth++;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (ch === ')') {
|
|
70
|
+
depth--;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (ch === "'") {
|
|
74
|
+
i++;
|
|
75
|
+
while (i < trimmed.length && trimmed[i] !== "'") {
|
|
76
|
+
if (trimmed[i] === '\\')
|
|
77
|
+
i++;
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (depth !== 0)
|
|
83
|
+
continue;
|
|
84
|
+
if (i > 0 && /\S/.test(trimmed[i - 1] ?? ''))
|
|
85
|
+
continue;
|
|
86
|
+
const rest = upper.slice(i);
|
|
87
|
+
for (const kw of ['WHERE', 'GROUP BY', 'HAVING', 'ORDER BY', 'QUALIFY', 'LIMIT', 'SETTINGS']) {
|
|
88
|
+
if (rest.startsWith(kw) && (i + kw.length >= trimmed.length || /\s/.test(trimmed[i + kw.length] ?? ''))) {
|
|
89
|
+
hits.push({ keyword: kw, position: i });
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const whereHit = hits.find(h => h.keyword === 'WHERE');
|
|
95
|
+
const trailingKeywords = ['GROUP BY', 'HAVING', 'ORDER BY', 'QUALIFY', 'LIMIT', 'SETTINGS'];
|
|
96
|
+
const firstTrailing = hits
|
|
97
|
+
.filter(h => trailingKeywords.includes(h.keyword))
|
|
98
|
+
.filter(h => !whereHit || h.position > whereHit.position)[0];
|
|
99
|
+
const insertAt = firstTrailing ? firstTrailing.position : trimmed.length;
|
|
100
|
+
const before = trimmed.slice(0, insertAt).trimEnd();
|
|
101
|
+
const after = trimmed.slice(insertAt);
|
|
102
|
+
if (whereHit) {
|
|
103
|
+
return `${before}\n AND ${condition}${after ? `\n${after}` : ''}`;
|
|
104
|
+
}
|
|
105
|
+
return `${before}\nWHERE ${condition}${after ? `\n${after}` : ''}`;
|
|
106
|
+
}
|
|
107
|
+
export function rewriteSelectColumns(query, targetColumns) {
|
|
108
|
+
const trimmed = query.trimEnd();
|
|
109
|
+
const upper = trimmed.toUpperCase();
|
|
110
|
+
let selectPos = -1;
|
|
111
|
+
let fromPos = -1;
|
|
112
|
+
let depth = 0;
|
|
113
|
+
for (let i = 0; i < trimmed.length; i++) {
|
|
114
|
+
const ch = trimmed[i];
|
|
115
|
+
if (ch === '(') {
|
|
116
|
+
depth++;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (ch === ')') {
|
|
120
|
+
depth--;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (ch === "'") {
|
|
124
|
+
i++;
|
|
125
|
+
while (i < trimmed.length && trimmed[i] !== "'") {
|
|
126
|
+
if (trimmed[i] === '\\')
|
|
127
|
+
i++;
|
|
128
|
+
i++;
|
|
129
|
+
}
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (depth !== 0)
|
|
133
|
+
continue;
|
|
134
|
+
if (i > 0 && /\S/.test(trimmed[i - 1] ?? ''))
|
|
135
|
+
continue;
|
|
136
|
+
const rest = upper.slice(i);
|
|
137
|
+
if (selectPos === -1 && rest.startsWith('SELECT') && (i + 6 >= trimmed.length || /\s/.test(trimmed[i + 6] ?? ''))) {
|
|
138
|
+
selectPos = i;
|
|
139
|
+
}
|
|
140
|
+
else if (selectPos !== -1 && fromPos === -1 && rest.startsWith('FROM') && (i + 4 >= trimmed.length || /\s/.test(trimmed[i + 4] ?? ''))) {
|
|
141
|
+
fromPos = i;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (selectPos === -1 || fromPos === -1)
|
|
145
|
+
return query;
|
|
146
|
+
const projStart = selectPos + 6;
|
|
147
|
+
const projText = trimmed.slice(projStart, fromPos).trim();
|
|
148
|
+
const items = [];
|
|
149
|
+
let itemStart = 0;
|
|
150
|
+
depth = 0;
|
|
151
|
+
for (let i = 0; i < projText.length; i++) {
|
|
152
|
+
const ch = projText[i];
|
|
153
|
+
if (ch === '(') {
|
|
154
|
+
depth++;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (ch === ')') {
|
|
158
|
+
depth--;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (ch === "'") {
|
|
162
|
+
i++;
|
|
163
|
+
while (i < projText.length && projText[i] !== "'") {
|
|
164
|
+
if (projText[i] === '\\')
|
|
165
|
+
i++;
|
|
166
|
+
i++;
|
|
167
|
+
}
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (depth === 0 && ch === ',') {
|
|
171
|
+
items.push(projText.slice(itemStart, i).trim());
|
|
172
|
+
itemStart = i + 1;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
items.push(projText.slice(itemStart).trim());
|
|
176
|
+
const aliasMap = new Map();
|
|
177
|
+
for (const item of items) {
|
|
178
|
+
if (item === '*')
|
|
179
|
+
continue;
|
|
180
|
+
const itemUpper = item.toUpperCase();
|
|
181
|
+
let asPos = -1;
|
|
182
|
+
let d = 0;
|
|
183
|
+
for (let i = 0; i < item.length; i++) {
|
|
184
|
+
const ch = item[i];
|
|
185
|
+
if (ch === '(') {
|
|
186
|
+
d++;
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (ch === ')') {
|
|
190
|
+
d--;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (ch === "'") {
|
|
194
|
+
i++;
|
|
195
|
+
while (i < item.length && item[i] !== "'") {
|
|
196
|
+
if (item[i] === '\\')
|
|
197
|
+
i++;
|
|
198
|
+
i++;
|
|
199
|
+
}
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (d !== 0)
|
|
203
|
+
continue;
|
|
204
|
+
if (i > 0 && /\S/.test(item[i - 1] ?? ''))
|
|
205
|
+
continue;
|
|
206
|
+
const rest = itemUpper.slice(i);
|
|
207
|
+
if (rest.startsWith('AS') && (i + 2 >= item.length || /\s/.test(item[i + 2] ?? ''))) {
|
|
208
|
+
asPos = i;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (asPos !== -1) {
|
|
212
|
+
const alias = item.slice(asPos + 2).trim();
|
|
213
|
+
aliasMap.set(alias, item);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const rewrittenCols = targetColumns.map(col => aliasMap.get(col) ?? col);
|
|
217
|
+
const before = trimmed.slice(0, projStart);
|
|
218
|
+
const after = trimmed.slice(fromPos);
|
|
219
|
+
return `${before} ${rewrittenCols.join(', ')}\n${after}`;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/chunking/sql.ts"],"names":[],"mappings":"AAEA,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,wDAAwD,KAAK,GAAG,CAAA;IACzE,CAAC;IACD,OAAO,yBAAyB,CAAA;AAClC,CAAC;AAED,SAAS,qBAAqB,CAC5B,aAAqB,EACrB,QAAiC,EACjC,IAAY,EACZ,EAAU;IAEV,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,SAAS,aAAa,gCAAgC,IAAI,aAAa,aAAa,+BAA+B,EAAE,IAAI,CAAA;IAClI,CAAC;IACD,2CAA2C;IAC3C,OAAO,SAAS,aAAa,QAAQ,IAAI,YAAY,aAAa,OAAO,EAAE,GAAG,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAO7B;IACC,MAAM,MAAM,GAAG,0BAA0B,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,KAAK,CAAC,EAAE,UAAU,KAAK,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAA;IACxH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAClE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IAEvB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,wEAAwE;QACxE,IAAI,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;QACxE,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACtF,QAAQ,GAAG,mBAAmB,CAC5B,QAAQ,EACR,KAAK,CAAC,OAAO,CAAC,MAAM,EACpB,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,SAAS,CAChB,CAAA;QACH,CAAC;QACD,IAAI,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;YAChC,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;QAChE,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,oBAAoB;IACpB,MAAM,KAAK,GAAG;QACZ,MAAM;QACN,eAAe,KAAK,CAAC,MAAM,EAAE;QAC7B,UAAU;QACV,QAAQ,KAAK,CAAC,MAAM,EAAE;QACtB,0BAA0B,KAAK,CAAC,WAAW,GAAG;KAC/C,CAAA;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACtF,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAC9B,KAAK,CAAC,OAAO,CAAC,MAAM,EACpB,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,SAAS,CAChB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,sBAAsB;AAEtB,SAAS,qBAAqB,CAAC,KAAa,EAAE,WAAmB;IAC/D,MAAM,SAAS,GAAG,oBAAoB,WAAW,GAAG,CAAA;IACpD,OAAO,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,aAAqB,EACrB,QAAiC,EACjC,IAAY,EACZ,EAAU;IAEV,IAAI,SAAiB,CAAA;IACrB,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,SAAS,GAAG,GAAG,aAAa,gCAAgC,IAAI,aAAa,aAAa,+BAA+B,EAAE,IAAI,CAAA;IACjI,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,GAAG,aAAa,QAAQ,IAAI,YAAY,aAAa,OAAO,EAAE,GAAG,CAAA;IAC/E,CAAC;IACD,OAAO,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;AAC/C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,SAAiB;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IAGnC,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,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,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,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACpE,CAAC;IACD,OAAO,GAAG,MAAM,WAAW,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AACpE,CAAC;AAED,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,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,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,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,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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface PartitionInfo {
|
|
2
|
+
partitionId: string;
|
|
3
|
+
rows: number;
|
|
4
|
+
bytesOnDisk: number;
|
|
5
|
+
minTime: string;
|
|
6
|
+
maxTime: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SortKeyInfo {
|
|
9
|
+
column: string;
|
|
10
|
+
type: string;
|
|
11
|
+
category: 'numeric' | 'datetime' | 'string';
|
|
12
|
+
}
|
|
13
|
+
export interface ChunkBoundary {
|
|
14
|
+
partitionId: string;
|
|
15
|
+
sortKeyFrom?: string;
|
|
16
|
+
sortKeyTo?: string;
|
|
17
|
+
estimatedBytes: number;
|
|
18
|
+
}
|
|
19
|
+
export interface PlannedChunk {
|
|
20
|
+
id: string;
|
|
21
|
+
partitionId: string;
|
|
22
|
+
sortKeyFrom?: string;
|
|
23
|
+
sortKeyTo?: string;
|
|
24
|
+
estimatedBytes: number;
|
|
25
|
+
idempotencyToken: string;
|
|
26
|
+
from: string;
|
|
27
|
+
to: string;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chunking/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAA;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chunking/types.ts"],"names":[],"mappings":""}
|
package/dist/detect.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MaterializedViewDefinition, SchemaDefinition, TableDefinition } from '@chkit/core';
|
|
2
|
+
import './table-config.js';
|
|
3
|
+
import type { TimeColumnCandidate } from './types.js';
|
|
4
|
+
export declare function findMvForTarget(definitions: SchemaDefinition[], database: string, table: string): MaterializedViewDefinition | undefined;
|
|
5
|
+
export declare function findTableForTarget(definitions: SchemaDefinition[], database: string, table: string): TableDefinition | undefined;
|
|
6
|
+
export declare function detectCandidatesFromTable(table: TableDefinition): TimeColumnCandidate[];
|
|
7
|
+
export declare function extractSchemaTimeColumn(table: TableDefinition): string | undefined;
|
|
8
|
+
export declare function loadTimeColumnInfo(target: string, schemaGlobs: string | string[], configPath: string): Promise<{
|
|
9
|
+
schemaTimeColumn: string | undefined;
|
|
10
|
+
candidates: TimeColumnCandidate[];
|
|
11
|
+
}>;
|
|
12
|
+
export declare function detectTimeColumnCandidates(target: string, schemaGlobs: string | string[], configPath: string): Promise<TimeColumnCandidate[]>;
|
|
13
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEhG,OAAO,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAoBrD,wBAAgB,eAAe,CAC7B,WAAW,EAAE,gBAAgB,EAAE,EAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,0BAA0B,GAAG,SAAS,CAWxC;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,eAAe,GAAG,SAAS,CAsB7B;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,GAAG,mBAAmB,EAAE,CAqBvF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAElF;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAAC,CAoBtF;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiBhC"}
|
package/dist/detect.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { dirname } from 'node:path';
|
|
2
|
+
import { loadSchemaDefinitions } from '@chkit/core/schema-loader';
|
|
3
|
+
import './table-config.js';
|
|
4
|
+
const DATETIME_TYPES = new Set(['DateTime', 'DateTime64']);
|
|
5
|
+
const COMMON_TIME_COLUMN_NAMES = new Set([
|
|
6
|
+
'created_at',
|
|
7
|
+
'timestamp',
|
|
8
|
+
'ingested_at',
|
|
9
|
+
'event_time',
|
|
10
|
+
'event_at',
|
|
11
|
+
'occurred_at',
|
|
12
|
+
]);
|
|
13
|
+
function isDateTimeType(type) {
|
|
14
|
+
if (DATETIME_TYPES.has(type))
|
|
15
|
+
return true;
|
|
16
|
+
if (type.startsWith('DateTime64('))
|
|
17
|
+
return true;
|
|
18
|
+
if (type.startsWith("DateTime('"))
|
|
19
|
+
return true;
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
export function findMvForTarget(definitions, database, table) {
|
|
23
|
+
for (const def of definitions) {
|
|
24
|
+
if (def.kind === 'materialized_view' &&
|
|
25
|
+
def.to.database === database &&
|
|
26
|
+
def.to.name === table) {
|
|
27
|
+
return def;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
export function findTableForTarget(definitions, database, table) {
|
|
33
|
+
for (const def of definitions) {
|
|
34
|
+
if (def.kind === 'table' && def.database === database && def.name === table) {
|
|
35
|
+
return def;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const def of definitions) {
|
|
39
|
+
if (def.kind === 'materialized_view' &&
|
|
40
|
+
def.to.database === database &&
|
|
41
|
+
def.to.name === table) {
|
|
42
|
+
for (const sourceDef of definitions) {
|
|
43
|
+
if (sourceDef.kind === 'table' && sourceDef.database === def.database) {
|
|
44
|
+
return sourceDef;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
export function detectCandidatesFromTable(table) {
|
|
52
|
+
const candidates = [];
|
|
53
|
+
const seen = new Set();
|
|
54
|
+
const orderByColumns = new Set(table.orderBy);
|
|
55
|
+
for (const col of table.columns) {
|
|
56
|
+
if (orderByColumns.has(col.name) && isDateTimeType(col.type)) {
|
|
57
|
+
candidates.push({ name: col.name, type: col.type, source: 'order_by' });
|
|
58
|
+
seen.add(col.name);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const col of table.columns) {
|
|
62
|
+
if (seen.has(col.name))
|
|
63
|
+
continue;
|
|
64
|
+
if (COMMON_TIME_COLUMN_NAMES.has(col.name) && isDateTimeType(col.type)) {
|
|
65
|
+
candidates.push({ name: col.name, type: col.type, source: 'column_scan' });
|
|
66
|
+
seen.add(col.name);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return candidates;
|
|
70
|
+
}
|
|
71
|
+
export function extractSchemaTimeColumn(table) {
|
|
72
|
+
return table.plugins?.backfill?.timeColumn;
|
|
73
|
+
}
|
|
74
|
+
export async function loadTimeColumnInfo(target, schemaGlobs, configPath) {
|
|
75
|
+
let definitions;
|
|
76
|
+
try {
|
|
77
|
+
definitions = await loadSchemaDefinitions(schemaGlobs, {
|
|
78
|
+
cwd: dirname(configPath),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { schemaTimeColumn: undefined, candidates: [] };
|
|
83
|
+
}
|
|
84
|
+
const [database, table] = target.split('.');
|
|
85
|
+
if (!database || !table)
|
|
86
|
+
return { schemaTimeColumn: undefined, candidates: [] };
|
|
87
|
+
const resolved = findTableForTarget(definitions, database, table);
|
|
88
|
+
if (!resolved)
|
|
89
|
+
return { schemaTimeColumn: undefined, candidates: [] };
|
|
90
|
+
return {
|
|
91
|
+
schemaTimeColumn: extractSchemaTimeColumn(resolved),
|
|
92
|
+
candidates: detectCandidatesFromTable(resolved),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export async function detectTimeColumnCandidates(target, schemaGlobs, configPath) {
|
|
96
|
+
let definitions;
|
|
97
|
+
try {
|
|
98
|
+
definitions = await loadSchemaDefinitions(schemaGlobs, {
|
|
99
|
+
cwd: dirname(configPath),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
const [database, table] = target.split('.');
|
|
106
|
+
if (!database || !table)
|
|
107
|
+
return [];
|
|
108
|
+
const resolved = findTableForTarget(definitions, database, table);
|
|
109
|
+
if (!resolved)
|
|
110
|
+
return [];
|
|
111
|
+
return detectCandidatesFromTable(resolved);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
|