@hardkas/query-store 0.8.16-alpha → 0.8.19-alpha
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/dist/migrations.d.ts +1 -1
- package/dist/migrations.js +181 -181
- package/package.json +3 -3
package/dist/migrations.d.ts
CHANGED
|
@@ -36,7 +36,7 @@ export declare class MigrationRunner {
|
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
38
|
* Registry of all query-store migrations.
|
|
39
|
-
* Version 1: Initial schema (Baseline 0.8.
|
|
39
|
+
* Version 1: Initial schema (Baseline 0.8.19-alpha).
|
|
40
40
|
*/
|
|
41
41
|
export declare const MIGRATIONS: Migration[];
|
|
42
42
|
//# sourceMappingURL=migrations.d.ts.map
|
package/dist/migrations.js
CHANGED
|
@@ -11,13 +11,13 @@ export class MigrationRunner {
|
|
|
11
11
|
* Ensures the migration history table exists.
|
|
12
12
|
*/
|
|
13
13
|
ensureHistoryTable() {
|
|
14
|
-
this.db.exec(`
|
|
15
|
-
CREATE TABLE IF NOT EXISTS hardkas_migrations (
|
|
16
|
-
version INTEGER PRIMARY KEY,
|
|
17
|
-
name TEXT NOT NULL,
|
|
18
|
-
checksum TEXT NOT NULL,
|
|
19
|
-
applied_at TEXT NOT NULL
|
|
20
|
-
);
|
|
14
|
+
this.db.exec(`
|
|
15
|
+
CREATE TABLE IF NOT EXISTS hardkas_migrations (
|
|
16
|
+
version INTEGER PRIMARY KEY,
|
|
17
|
+
name TEXT NOT NULL,
|
|
18
|
+
checksum TEXT NOT NULL,
|
|
19
|
+
applied_at TEXT NOT NULL
|
|
20
|
+
);
|
|
21
21
|
`);
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
@@ -96,7 +96,7 @@ export class MigrationRunner {
|
|
|
96
96
|
}
|
|
97
97
|
/**
|
|
98
98
|
* Registry of all query-store migrations.
|
|
99
|
-
* Version 1: Initial schema (Baseline 0.8.
|
|
99
|
+
* Version 1: Initial schema (Baseline 0.8.19-alpha).
|
|
100
100
|
*/
|
|
101
101
|
export const MIGRATIONS = [
|
|
102
102
|
{
|
|
@@ -104,92 +104,92 @@ export const MIGRATIONS = [
|
|
|
104
104
|
name: "initial_schema",
|
|
105
105
|
checksum: "hardkas_v1_baseline",
|
|
106
106
|
up: (db) => {
|
|
107
|
-
db.exec(`
|
|
108
|
-
CREATE TABLE IF NOT EXISTS metadata (
|
|
109
|
-
key TEXT PRIMARY KEY,
|
|
110
|
-
value TEXT NOT NULL
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
CREATE TABLE IF NOT EXISTS artifacts (
|
|
114
|
-
artifact_id TEXT PRIMARY KEY,
|
|
115
|
-
content_hash TEXT NOT NULL,
|
|
116
|
-
schema TEXT NOT NULL,
|
|
117
|
-
version TEXT NOT NULL,
|
|
118
|
-
kind TEXT NOT NULL,
|
|
119
|
-
mode TEXT NOT NULL DEFAULT 'unknown',
|
|
120
|
-
network_id TEXT NOT NULL,
|
|
121
|
-
tx_id TEXT,
|
|
122
|
-
created_at TEXT,
|
|
123
|
-
raw_json TEXT NOT NULL,
|
|
124
|
-
file_path TEXT,
|
|
125
|
-
file_mtime_ms INTEGER,
|
|
126
|
-
indexed_at TEXT
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);
|
|
130
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_schema ON artifacts(schema);
|
|
131
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);
|
|
132
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_mode ON artifacts(mode);
|
|
133
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);
|
|
134
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);
|
|
135
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);
|
|
136
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_file_path ON artifacts(file_path);
|
|
137
|
-
|
|
138
|
-
CREATE TABLE IF NOT EXISTS lineage_edges (
|
|
139
|
-
lineage_id TEXT NOT NULL,
|
|
140
|
-
parent_artifact_id TEXT NOT NULL,
|
|
141
|
-
child_artifact_id TEXT NOT NULL,
|
|
142
|
-
edge_kind TEXT NOT NULL,
|
|
143
|
-
created_at TEXT,
|
|
144
|
-
PRIMARY KEY (parent_artifact_id, child_artifact_id),
|
|
145
|
-
FOREIGN KEY (parent_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE,
|
|
146
|
-
FOREIGN KEY (child_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE
|
|
147
|
-
);
|
|
148
|
-
|
|
149
|
-
CREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);
|
|
150
|
-
CREATE INDEX IF NOT EXISTS idx_lineage_child ON lineage_edges(child_artifact_id);
|
|
151
|
-
CREATE INDEX IF NOT EXISTS idx_lineage_id ON lineage_edges(lineage_id);
|
|
152
|
-
|
|
153
|
-
CREATE TABLE IF NOT EXISTS events (
|
|
154
|
-
event_id TEXT PRIMARY KEY,
|
|
155
|
-
kind TEXT NOT NULL,
|
|
156
|
-
domain TEXT NOT NULL,
|
|
157
|
-
timestamp TEXT,
|
|
158
|
-
workflow_id TEXT NOT NULL,
|
|
159
|
-
correlation_id TEXT NOT NULL,
|
|
160
|
-
causation_id TEXT,
|
|
161
|
-
tx_id TEXT,
|
|
162
|
-
artifact_id TEXT,
|
|
163
|
-
network_id TEXT NOT NULL,
|
|
164
|
-
raw_json TEXT NOT NULL,
|
|
165
|
-
file_path TEXT,
|
|
166
|
-
file_mtime_ms INTEGER,
|
|
167
|
-
indexed_at TEXT
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
|
|
171
|
-
CREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);
|
|
172
|
-
CREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);
|
|
173
|
-
CREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);
|
|
174
|
-
CREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);
|
|
175
|
-
CREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);
|
|
176
|
-
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
177
|
-
CREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);
|
|
178
|
-
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
179
|
-
CREATE INDEX IF NOT EXISTS idx_events_file_path ON events(file_path);
|
|
180
|
-
|
|
181
|
-
CREATE TABLE IF NOT EXISTS traces (
|
|
182
|
-
trace_id TEXT PRIMARY KEY,
|
|
183
|
-
workflow_id TEXT UNIQUE NOT NULL,
|
|
184
|
-
root_event_id TEXT,
|
|
185
|
-
status TEXT NOT NULL,
|
|
186
|
-
started_at TEXT,
|
|
187
|
-
ended_at TEXT,
|
|
188
|
-
FOREIGN KEY (root_event_id) REFERENCES events(event_id) ON DELETE SET NULL
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
CREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);
|
|
192
|
-
CREATE INDEX IF NOT EXISTS idx_traces_status ON traces(status);
|
|
107
|
+
db.exec(`
|
|
108
|
+
CREATE TABLE IF NOT EXISTS metadata (
|
|
109
|
+
key TEXT PRIMARY KEY,
|
|
110
|
+
value TEXT NOT NULL
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
114
|
+
artifact_id TEXT PRIMARY KEY,
|
|
115
|
+
content_hash TEXT NOT NULL,
|
|
116
|
+
schema TEXT NOT NULL,
|
|
117
|
+
version TEXT NOT NULL,
|
|
118
|
+
kind TEXT NOT NULL,
|
|
119
|
+
mode TEXT NOT NULL DEFAULT 'unknown',
|
|
120
|
+
network_id TEXT NOT NULL,
|
|
121
|
+
tx_id TEXT,
|
|
122
|
+
created_at TEXT,
|
|
123
|
+
raw_json TEXT NOT NULL,
|
|
124
|
+
file_path TEXT,
|
|
125
|
+
file_mtime_ms INTEGER,
|
|
126
|
+
indexed_at TEXT
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_schema ON artifacts(schema);
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_mode ON artifacts(mode);
|
|
133
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_file_path ON artifacts(file_path);
|
|
137
|
+
|
|
138
|
+
CREATE TABLE IF NOT EXISTS lineage_edges (
|
|
139
|
+
lineage_id TEXT NOT NULL,
|
|
140
|
+
parent_artifact_id TEXT NOT NULL,
|
|
141
|
+
child_artifact_id TEXT NOT NULL,
|
|
142
|
+
edge_kind TEXT NOT NULL,
|
|
143
|
+
created_at TEXT,
|
|
144
|
+
PRIMARY KEY (parent_artifact_id, child_artifact_id),
|
|
145
|
+
FOREIGN KEY (parent_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE,
|
|
146
|
+
FOREIGN KEY (child_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);
|
|
150
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_child ON lineage_edges(child_artifact_id);
|
|
151
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_id ON lineage_edges(lineage_id);
|
|
152
|
+
|
|
153
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
154
|
+
event_id TEXT PRIMARY KEY,
|
|
155
|
+
kind TEXT NOT NULL,
|
|
156
|
+
domain TEXT NOT NULL,
|
|
157
|
+
timestamp TEXT,
|
|
158
|
+
workflow_id TEXT NOT NULL,
|
|
159
|
+
correlation_id TEXT NOT NULL,
|
|
160
|
+
causation_id TEXT,
|
|
161
|
+
tx_id TEXT,
|
|
162
|
+
artifact_id TEXT,
|
|
163
|
+
network_id TEXT NOT NULL,
|
|
164
|
+
raw_json TEXT NOT NULL,
|
|
165
|
+
file_path TEXT,
|
|
166
|
+
file_mtime_ms INTEGER,
|
|
167
|
+
indexed_at TEXT
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
|
|
171
|
+
CREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);
|
|
172
|
+
CREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);
|
|
173
|
+
CREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);
|
|
174
|
+
CREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);
|
|
175
|
+
CREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);
|
|
176
|
+
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
177
|
+
CREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);
|
|
178
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
179
|
+
CREATE INDEX IF NOT EXISTS idx_events_file_path ON events(file_path);
|
|
180
|
+
|
|
181
|
+
CREATE TABLE IF NOT EXISTS traces (
|
|
182
|
+
trace_id TEXT PRIMARY KEY,
|
|
183
|
+
workflow_id TEXT UNIQUE NOT NULL,
|
|
184
|
+
root_event_id TEXT,
|
|
185
|
+
status TEXT NOT NULL,
|
|
186
|
+
started_at TEXT,
|
|
187
|
+
ended_at TEXT,
|
|
188
|
+
FOREIGN KEY (root_event_id) REFERENCES events(event_id) ON DELETE SET NULL
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
CREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);
|
|
192
|
+
CREATE INDEX IF NOT EXISTS idx_traces_status ON traces(status);
|
|
193
193
|
`);
|
|
194
194
|
}
|
|
195
195
|
},
|
|
@@ -198,52 +198,52 @@ export const MIGRATIONS = [
|
|
|
198
198
|
name: "event_persistence_guarantees",
|
|
199
199
|
checksum: "hardkas_v2_events",
|
|
200
200
|
up: (db) => {
|
|
201
|
-
db.exec(`
|
|
202
|
-
CREATE TABLE IF NOT EXISTS events_v2 (
|
|
203
|
-
event_id TEXT PRIMARY KEY,
|
|
204
|
-
kind TEXT NOT NULL,
|
|
205
|
-
domain TEXT NOT NULL,
|
|
206
|
-
timestamp TEXT,
|
|
207
|
-
emitted_at TEXT,
|
|
208
|
-
workflow_id TEXT NOT NULL,
|
|
209
|
-
correlation_id TEXT NOT NULL,
|
|
210
|
-
causation_id TEXT,
|
|
211
|
-
tx_id TEXT,
|
|
212
|
-
artifact_id TEXT,
|
|
213
|
-
network_id TEXT NOT NULL,
|
|
214
|
-
sequence_number INTEGER NOT NULL DEFAULT 0,
|
|
215
|
-
global_offset INTEGER,
|
|
216
|
-
source_subsystem TEXT NOT NULL DEFAULT 'unknown',
|
|
217
|
-
raw_json TEXT NOT NULL,
|
|
218
|
-
file_path TEXT,
|
|
219
|
-
file_mtime_ms INTEGER,
|
|
220
|
-
indexed_at TEXT,
|
|
221
|
-
UNIQUE(correlation_id, sequence_number, kind)
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
INSERT INTO events_v2 (
|
|
225
|
-
event_id, kind, domain, timestamp, emitted_at, workflow_id, correlation_id, causation_id,
|
|
226
|
-
tx_id, artifact_id, network_id, sequence_number, source_subsystem, raw_json, file_path, file_mtime_ms, indexed_at
|
|
227
|
-
)
|
|
228
|
-
SELECT
|
|
229
|
-
event_id, kind, domain, timestamp, timestamp, workflow_id, correlation_id, causation_id,
|
|
230
|
-
tx_id, artifact_id, network_id, 0, 'legacy', raw_json, file_path, file_mtime_ms, indexed_at
|
|
231
|
-
FROM events;
|
|
232
|
-
|
|
233
|
-
DROP TABLE events;
|
|
234
|
-
ALTER TABLE events_v2 RENAME TO events;
|
|
235
|
-
|
|
236
|
-
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
|
|
237
|
-
CREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);
|
|
238
|
-
CREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);
|
|
239
|
-
CREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);
|
|
240
|
-
CREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);
|
|
241
|
-
CREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);
|
|
242
|
-
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
243
|
-
CREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);
|
|
244
|
-
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
245
|
-
CREATE INDEX IF NOT EXISTS idx_events_file_path ON events(file_path);
|
|
246
|
-
CREATE INDEX IF NOT EXISTS idx_events_global_offset ON events(global_offset);
|
|
201
|
+
db.exec(`
|
|
202
|
+
CREATE TABLE IF NOT EXISTS events_v2 (
|
|
203
|
+
event_id TEXT PRIMARY KEY,
|
|
204
|
+
kind TEXT NOT NULL,
|
|
205
|
+
domain TEXT NOT NULL,
|
|
206
|
+
timestamp TEXT,
|
|
207
|
+
emitted_at TEXT,
|
|
208
|
+
workflow_id TEXT NOT NULL,
|
|
209
|
+
correlation_id TEXT NOT NULL,
|
|
210
|
+
causation_id TEXT,
|
|
211
|
+
tx_id TEXT,
|
|
212
|
+
artifact_id TEXT,
|
|
213
|
+
network_id TEXT NOT NULL,
|
|
214
|
+
sequence_number INTEGER NOT NULL DEFAULT 0,
|
|
215
|
+
global_offset INTEGER,
|
|
216
|
+
source_subsystem TEXT NOT NULL DEFAULT 'unknown',
|
|
217
|
+
raw_json TEXT NOT NULL,
|
|
218
|
+
file_path TEXT,
|
|
219
|
+
file_mtime_ms INTEGER,
|
|
220
|
+
indexed_at TEXT,
|
|
221
|
+
UNIQUE(correlation_id, sequence_number, kind)
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
INSERT INTO events_v2 (
|
|
225
|
+
event_id, kind, domain, timestamp, emitted_at, workflow_id, correlation_id, causation_id,
|
|
226
|
+
tx_id, artifact_id, network_id, sequence_number, source_subsystem, raw_json, file_path, file_mtime_ms, indexed_at
|
|
227
|
+
)
|
|
228
|
+
SELECT
|
|
229
|
+
event_id, kind, domain, timestamp, timestamp, workflow_id, correlation_id, causation_id,
|
|
230
|
+
tx_id, artifact_id, network_id, 0, 'legacy', raw_json, file_path, file_mtime_ms, indexed_at
|
|
231
|
+
FROM events;
|
|
232
|
+
|
|
233
|
+
DROP TABLE events;
|
|
234
|
+
ALTER TABLE events_v2 RENAME TO events;
|
|
235
|
+
|
|
236
|
+
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
|
|
237
|
+
CREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);
|
|
238
|
+
CREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);
|
|
239
|
+
CREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);
|
|
240
|
+
CREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);
|
|
241
|
+
CREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);
|
|
242
|
+
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
243
|
+
CREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);
|
|
244
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
245
|
+
CREATE INDEX IF NOT EXISTS idx_events_file_path ON events(file_path);
|
|
246
|
+
CREATE INDEX IF NOT EXISTS idx_events_global_offset ON events(global_offset);
|
|
247
247
|
`);
|
|
248
248
|
}
|
|
249
249
|
},
|
|
@@ -252,47 +252,47 @@ export const MIGRATIONS = [
|
|
|
252
252
|
name: "lineage_closure_and_scale_indices",
|
|
253
253
|
checksum: "hardkas_v3_lineage_scale",
|
|
254
254
|
up: (db) => {
|
|
255
|
-
db.exec(`
|
|
256
|
-
-- Lineage closure table: transitive ancestor/descendant relationships
|
|
257
|
-
-- Enables O(1) "is X an ancestor of Y?" queries without recursive CTEs
|
|
258
|
-
CREATE TABLE IF NOT EXISTS lineage_closure (
|
|
259
|
-
ancestor_id TEXT NOT NULL,
|
|
260
|
-
descendant_id TEXT NOT NULL,
|
|
261
|
-
depth INTEGER NOT NULL DEFAULT 1,
|
|
262
|
-
path_hash TEXT,
|
|
263
|
-
created_at TEXT,
|
|
264
|
-
PRIMARY KEY (ancestor_id, descendant_id),
|
|
265
|
-
FOREIGN KEY (ancestor_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE,
|
|
266
|
-
FOREIGN KEY (descendant_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE
|
|
267
|
-
);
|
|
268
|
-
|
|
269
|
-
CREATE INDEX IF NOT EXISTS idx_closure_ancestor ON lineage_closure(ancestor_id);
|
|
270
|
-
CREATE INDEX IF NOT EXISTS idx_closure_descendant ON lineage_closure(descendant_id);
|
|
271
|
-
CREATE INDEX IF NOT EXISTS idx_closure_depth ON lineage_closure(depth);
|
|
272
|
-
|
|
273
|
-
-- Add depth column to lineage_edges for direct edge depth tracking
|
|
274
|
-
ALTER TABLE lineage_edges ADD COLUMN depth INTEGER NOT NULL DEFAULT 1;
|
|
275
|
-
|
|
276
|
-
-- File mtime index for incremental sync: skip unchanged files
|
|
277
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_file_mtime_ms ON artifacts(file_mtime_ms);
|
|
278
|
-
|
|
279
|
-
-- Lineage statistics metadata view for scale monitoring
|
|
280
|
-
CREATE TABLE IF NOT EXISTS lineage_stats (
|
|
281
|
-
stat_key TEXT PRIMARY KEY,
|
|
282
|
-
stat_value TEXT NOT NULL,
|
|
283
|
-
updated_at TEXT NOT NULL
|
|
284
|
-
);
|
|
285
|
-
|
|
286
|
-
-- Pruning history: track what was pruned and when
|
|
287
|
-
CREATE TABLE IF NOT EXISTS prune_history (
|
|
288
|
-
prune_id TEXT PRIMARY KEY,
|
|
289
|
-
pruned_at TEXT NOT NULL,
|
|
290
|
-
artifacts_pruned INTEGER NOT NULL DEFAULT 0,
|
|
291
|
-
traces_pruned INTEGER NOT NULL DEFAULT 0,
|
|
292
|
-
events_pruned INTEGER NOT NULL DEFAULT 0,
|
|
293
|
-
lineage_roots_preserved INTEGER NOT NULL DEFAULT 0,
|
|
294
|
-
total_bytes_freed INTEGER NOT NULL DEFAULT 0
|
|
295
|
-
);
|
|
255
|
+
db.exec(`
|
|
256
|
+
-- Lineage closure table: transitive ancestor/descendant relationships
|
|
257
|
+
-- Enables O(1) "is X an ancestor of Y?" queries without recursive CTEs
|
|
258
|
+
CREATE TABLE IF NOT EXISTS lineage_closure (
|
|
259
|
+
ancestor_id TEXT NOT NULL,
|
|
260
|
+
descendant_id TEXT NOT NULL,
|
|
261
|
+
depth INTEGER NOT NULL DEFAULT 1,
|
|
262
|
+
path_hash TEXT,
|
|
263
|
+
created_at TEXT,
|
|
264
|
+
PRIMARY KEY (ancestor_id, descendant_id),
|
|
265
|
+
FOREIGN KEY (ancestor_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE,
|
|
266
|
+
FOREIGN KEY (descendant_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
CREATE INDEX IF NOT EXISTS idx_closure_ancestor ON lineage_closure(ancestor_id);
|
|
270
|
+
CREATE INDEX IF NOT EXISTS idx_closure_descendant ON lineage_closure(descendant_id);
|
|
271
|
+
CREATE INDEX IF NOT EXISTS idx_closure_depth ON lineage_closure(depth);
|
|
272
|
+
|
|
273
|
+
-- Add depth column to lineage_edges for direct edge depth tracking
|
|
274
|
+
ALTER TABLE lineage_edges ADD COLUMN depth INTEGER NOT NULL DEFAULT 1;
|
|
275
|
+
|
|
276
|
+
-- File mtime index for incremental sync: skip unchanged files
|
|
277
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_file_mtime_ms ON artifacts(file_mtime_ms);
|
|
278
|
+
|
|
279
|
+
-- Lineage statistics metadata view for scale monitoring
|
|
280
|
+
CREATE TABLE IF NOT EXISTS lineage_stats (
|
|
281
|
+
stat_key TEXT PRIMARY KEY,
|
|
282
|
+
stat_value TEXT NOT NULL,
|
|
283
|
+
updated_at TEXT NOT NULL
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
-- Pruning history: track what was pruned and when
|
|
287
|
+
CREATE TABLE IF NOT EXISTS prune_history (
|
|
288
|
+
prune_id TEXT PRIMARY KEY,
|
|
289
|
+
pruned_at TEXT NOT NULL,
|
|
290
|
+
artifacts_pruned INTEGER NOT NULL DEFAULT 0,
|
|
291
|
+
traces_pruned INTEGER NOT NULL DEFAULT 0,
|
|
292
|
+
events_pruned INTEGER NOT NULL DEFAULT 0,
|
|
293
|
+
lineage_roots_preserved INTEGER NOT NULL DEFAULT 0,
|
|
294
|
+
total_bytes_freed INTEGER NOT NULL DEFAULT 0
|
|
295
|
+
);
|
|
296
296
|
`);
|
|
297
297
|
}
|
|
298
298
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hardkas/query-store",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.19-alpha",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@hardkas/artifacts": "0.8.
|
|
16
|
-
"@hardkas/core": "0.8.
|
|
15
|
+
"@hardkas/artifacts": "0.8.19-alpha",
|
|
16
|
+
"@hardkas/core": "0.8.19-alpha"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/node": "^22.10.0",
|