@cavelang/query 0.34.0 → 0.36.0
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 +498 -9
- package/dist/src/bounded.d.ts +1 -1
- package/dist/src/bounded.d.ts.map +1 -1
- package/dist/src/bounded.js +14 -7
- package/dist/src/bounded.js.map +1 -1
- package/dist/src/capture.d.ts +7 -0
- package/dist/src/capture.d.ts.map +1 -0
- package/dist/src/capture.js +52 -0
- package/dist/src/capture.js.map +1 -0
- package/dist/src/compile.d.ts +3 -3
- package/dist/src/compile.d.ts.map +1 -1
- package/dist/src/compile.js +107 -54
- package/dist/src/compile.js.map +1 -1
- package/dist/src/page.d.ts.map +1 -1
- package/dist/src/page.js +103 -45
- package/dist/src/page.js.map +1 -1
- package/dist/src/pattern.d.ts.map +1 -1
- package/dist/src/pattern.js +20 -10
- package/dist/src/pattern.js.map +1 -1
- package/dist/src/read-snapshot.d.ts +4 -0
- package/dist/src/read-snapshot.d.ts.map +1 -0
- package/dist/src/read-snapshot.js +29 -0
- package/dist/src/read-snapshot.js.map +1 -0
- package/dist/src/record.d.ts.map +1 -1
- package/dist/src/record.js +51 -16
- package/dist/src/record.js.map +1 -1
- package/dist/src/unicode.d.ts +3 -0
- package/dist/src/unicode.d.ts.map +1 -0
- package/dist/src/unicode.js +7 -0
- package/dist/src/unicode.js.map +1 -0
- package/package.json +6 -6
- package/src/bounded.ts +23 -8
- package/src/capture.ts +59 -0
- package/src/compile.ts +102 -56
- package/src/page.ts +102 -44
- package/src/pattern.ts +20 -10
- package/src/read-snapshot.ts +23 -0
- package/src/record.ts +52 -16
- package/src/unicode.ts +6 -0
package/dist/src/page.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/** Snapshot-stable, bounded CAVE-Q pages. */
|
|
2
2
|
import { QuerySql } from '@cavelang/store/adapter';
|
|
3
|
-
import { Value } from '@cavelang/core';
|
|
3
|
+
import { Uuidv7, Value } from '@cavelang/core';
|
|
4
4
|
import { queryRecords } from "./record.js";
|
|
5
5
|
import { of as recordOf } from "./record.js";
|
|
6
6
|
import { window } from "./bounded.js";
|
|
7
|
+
import { readSnapshot } from "./read-snapshot.js";
|
|
7
8
|
import * as Pattern from "./pattern.js";
|
|
8
9
|
export const format = 'cave.query-page';
|
|
9
10
|
export const version = 1;
|
|
@@ -28,13 +29,15 @@ const encodeCursor = (cursor) => encodeURIComponent(JSON.stringify(cursor));
|
|
|
28
29
|
const decodeCursor = (text) => {
|
|
29
30
|
try {
|
|
30
31
|
const value = JSON.parse(decodeURIComponent(text));
|
|
31
|
-
if (value.v !==
|
|
32
|
-
!Number.
|
|
32
|
+
if (value.v !== 2 || typeof value.fingerprint !== 'string' || typeof value.snapshot !== 'string' ||
|
|
33
|
+
!Uuidv7.is(value.snapshot) || !Number.isSafeInteger(value.offset) || value.offset < 0 ||
|
|
34
|
+
!Array.isArray(value.revision) || value.revision.length !== 4 ||
|
|
35
|
+
!value.revision.every(entry => Number.isSafeInteger(entry) && entry >= 0))
|
|
33
36
|
throw new Error('invalid');
|
|
34
37
|
return value;
|
|
35
38
|
}
|
|
36
39
|
catch {
|
|
37
|
-
throw new Error('CAVE-Q: invalid pagination cursor');
|
|
40
|
+
throw new Error('CAVE-Q: invalid pagination cursor; restart from the first page');
|
|
38
41
|
}
|
|
39
42
|
};
|
|
40
43
|
const snapshotOf = (store, asOf) => {
|
|
@@ -45,9 +48,42 @@ const snapshotOf = (store, asOf) => {
|
|
|
45
48
|
const row = store.db.prepare(`SELECT MAX(tx) AS tx FROM cave_claim${where}`).get();
|
|
46
49
|
return typeof row?.['tx'] === 'string' ? row['tx'] : null;
|
|
47
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* Detect changes to an append-only historical universe, including edges from
|
|
53
|
+
* future parents attached to old rows. This deliberately covers all touching
|
|
54
|
+
* lineage, beyond vocabulary alone. One statement reads both sets consistently;
|
|
55
|
+
* wholly future rows and edges are irrelevant.
|
|
56
|
+
* Local rowid tails supplement counts and keep the token constant-sized.
|
|
57
|
+
*/
|
|
58
|
+
const revisionOf = (store, snapshot) => {
|
|
59
|
+
const value = store.db.prepare(`
|
|
60
|
+
SELECT
|
|
61
|
+
(SELECT COUNT(*) FROM cave_claim WHERE tx <= ?) AS claims,
|
|
62
|
+
(SELECT COALESCE(MAX(rowid), 0) FROM cave_claim WHERE tx <= ?) AS claim_tail,
|
|
63
|
+
COUNT(*) AS edges, COALESCE(MAX(e.rowid), 0) AS edge_tail
|
|
64
|
+
FROM cave_edge e
|
|
65
|
+
WHERE EXISTS (SELECT 1 FROM cave_claim c WHERE c.id = e.parent_id AND c.tx <= ?)
|
|
66
|
+
OR EXISTS (SELECT 1 FROM cave_claim c WHERE c.id = e.child_id AND c.tx <= ?)
|
|
67
|
+
`).get(snapshot, snapshot, snapshot, snapshot);
|
|
68
|
+
return [value.claims, value.claim_tail, value.edges, value.edge_tail];
|
|
69
|
+
};
|
|
70
|
+
const sameRevision = (a, b) => a.every((value, i) => value === b[i]);
|
|
71
|
+
const changedSnapshot = () => { throw new Error('CAVE-Q: pagination snapshot changed; restart from the first page'); };
|
|
48
72
|
/** Read one SQL-bounded page frozen at the first page's transaction boundary. */
|
|
49
73
|
export const page = (store, input, options = {}) => {
|
|
50
|
-
|
|
74
|
+
// Read the declared fields once, including inherited/non-enumerable values.
|
|
75
|
+
// Fingerprinting, snapshot selection and SQL must use the same options even
|
|
76
|
+
// when the caller supplies accessors whose values can change between reads.
|
|
77
|
+
options = {
|
|
78
|
+
all: options.all,
|
|
79
|
+
aliases: options.aliases,
|
|
80
|
+
asOf: options.asOf,
|
|
81
|
+
at: options.at,
|
|
82
|
+
resolve: options.resolve,
|
|
83
|
+
limit: options.limit,
|
|
84
|
+
cursor: options.cursor,
|
|
85
|
+
};
|
|
86
|
+
const limit = options.limit === undefined ? defaultLimit : options.limit;
|
|
51
87
|
if (!Number.isInteger(limit) || limit < 1 || limit > maxLimit) {
|
|
52
88
|
throw new Error(`CAVE-Q: page limit must be an integer from 1 to ${maxLimit}`);
|
|
53
89
|
}
|
|
@@ -57,11 +93,18 @@ export const page = (store, input, options = {}) => {
|
|
|
57
93
|
throw new Error('CAVE-Q: pagination cursor does not match this query and its options');
|
|
58
94
|
}
|
|
59
95
|
const snapshot = cursor?.snapshot ?? snapshotOf(store, options.asOf);
|
|
60
|
-
if (snapshot === null)
|
|
61
|
-
return { format, version, snapshot, matches: [] };
|
|
62
|
-
const offset = cursor?.offset ?? 0;
|
|
63
96
|
const { cursor: _cursor, limit: _limit, ...queryOptions } = options;
|
|
64
97
|
const pattern = Pattern.parse(input);
|
|
98
|
+
if (snapshot === null) {
|
|
99
|
+
// Use ordinary compilation/validation even when no rows exist at the
|
|
100
|
+
// requested boundary. A bounded read avoids a separate validation policy.
|
|
101
|
+
window(store, pattern, { ...queryOptions, limit: 1 });
|
|
102
|
+
return { format, version, snapshot, matches: [] };
|
|
103
|
+
}
|
|
104
|
+
const revision = revisionOf(store, snapshot);
|
|
105
|
+
if (cursor !== undefined && !sameRevision(cursor.revision, revision))
|
|
106
|
+
changedSnapshot();
|
|
107
|
+
const offset = cursor?.offset ?? 0;
|
|
65
108
|
const exactNumeric = pattern.payload.kind === 'attribute' && pattern.payload.value.kind === 'term' &&
|
|
66
109
|
Value.parse(pattern.payload.value.text).kind === 'number';
|
|
67
110
|
let matches;
|
|
@@ -79,52 +122,67 @@ export const page = (store, input, options = {}) => {
|
|
|
79
122
|
}
|
|
80
123
|
else {
|
|
81
124
|
// Valid-time coverage and exact numeric approximation checks happen
|
|
82
|
-
// after SQLite returns.
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
125
|
+
// after SQLite returns. Original row positions let a full candidate
|
|
126
|
+
// batch stop at the last selected match without consuming later rows.
|
|
127
|
+
matches = readSnapshot(store, () => {
|
|
128
|
+
const found = [];
|
|
129
|
+
let rawOffset = offset;
|
|
130
|
+
let scanned = 0;
|
|
131
|
+
const scanBudget = Math.max(defaultLimit, limit);
|
|
132
|
+
let exhausted = false;
|
|
133
|
+
let unread = false;
|
|
134
|
+
while (found.length < limit && scanned < scanBudget) {
|
|
135
|
+
const positions = new WeakMap();
|
|
136
|
+
const result = window(store, pattern, {
|
|
137
|
+
...queryOptions,
|
|
138
|
+
asOf: snapshot,
|
|
139
|
+
limit: scanBudget - scanned,
|
|
140
|
+
offset: rawOffset,
|
|
141
|
+
}, positions);
|
|
142
|
+
if (result.scanned === 0) {
|
|
143
|
+
exhausted = true;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
const selected = result.matches.slice(0, limit - found.length);
|
|
147
|
+
for (const match of selected)
|
|
148
|
+
found.push(recordOf(store, match));
|
|
149
|
+
// This path has physical rows: valid-time transitive queries are
|
|
150
|
+
// rejected, and exact numeric patterns are attribute queries.
|
|
151
|
+
const consumed = found.length === limit
|
|
152
|
+
? positions.get(selected.at(-1).row) + 1 : result.scanned;
|
|
153
|
+
rawOffset += consumed;
|
|
154
|
+
scanned += consumed;
|
|
155
|
+
unread = consumed < result.scanned;
|
|
102
156
|
}
|
|
103
|
-
|
|
104
|
-
scanned += result.scanned;
|
|
105
|
-
}
|
|
106
|
-
if (!exhausted) {
|
|
107
|
-
// A single bounded probe distinguishes a genuinely finished page from
|
|
108
|
-
// one that filled its match/scan budget. It need not pass post-filters:
|
|
109
|
-
// the continuation resumes before it and applies them normally.
|
|
110
|
-
const probe = window(store, pattern, {
|
|
111
|
-
...queryOptions,
|
|
112
|
-
asOf: snapshot,
|
|
113
|
-
limit: 1,
|
|
114
|
-
offset: rawOffset,
|
|
115
|
-
});
|
|
116
|
-
if (probe.scanned > 0)
|
|
157
|
+
if (unread)
|
|
117
158
|
nextOffset = rawOffset;
|
|
118
|
-
|
|
119
|
-
|
|
159
|
+
else if (!exhausted) {
|
|
160
|
+
// A single bounded probe distinguishes a genuinely finished page from
|
|
161
|
+
// one that filled its match/scan budget. It need not pass post-filters:
|
|
162
|
+
// the continuation resumes before it and applies them normally.
|
|
163
|
+
const probe = window(store, pattern, {
|
|
164
|
+
...queryOptions,
|
|
165
|
+
asOf: snapshot,
|
|
166
|
+
limit: 1,
|
|
167
|
+
offset: rawOffset,
|
|
168
|
+
});
|
|
169
|
+
if (probe.scanned > 0)
|
|
170
|
+
nextOffset = rawOffset;
|
|
171
|
+
}
|
|
172
|
+
return found;
|
|
173
|
+
});
|
|
120
174
|
}
|
|
175
|
+
// No mixed result escapes if a peer or callback changes history while the
|
|
176
|
+
// page's SQL windows and record projections are being evaluated.
|
|
177
|
+
if (!sameRevision(revision, revisionOf(store, snapshot)))
|
|
178
|
+
changedSnapshot();
|
|
121
179
|
return {
|
|
122
180
|
format,
|
|
123
181
|
version,
|
|
124
182
|
snapshot,
|
|
125
183
|
matches,
|
|
126
184
|
...nextOffset === undefined ? {} : {
|
|
127
|
-
next: encodeCursor({ v:
|
|
185
|
+
next: encodeCursor({ v: 2, fingerprint: expected, snapshot, offset: nextOffset, revision })
|
|
128
186
|
}
|
|
129
187
|
};
|
|
130
188
|
};
|
package/dist/src/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/page.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/page.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,qEAAqE;AACrE,MAAM,MAAM,IAAI,GACZ;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpD,yFAAyF;AACzF,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAA;AAEjC,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,CAAA;AAE5B,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAA;AAE3D,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1F;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAClG;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3E,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,CAAC,GAAG,OAAO,CAAA;AA8FvB,yEAAyE;AACzE,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,KAAG,OAiFrC,CAAA"}
|
package/dist/src/pattern.js
CHANGED
|
@@ -16,15 +16,22 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { Confidence, Value, Verb } from '@cavelang/core';
|
|
18
18
|
import { Token } from '@cavelang/parser';
|
|
19
|
+
import { assertQueryUnicode } from "./unicode.js";
|
|
19
20
|
const filterOps = ['>=', '<=', '!=', '=', '>', '<'];
|
|
20
21
|
const isFilterOp = (text) => filterOps.includes(text);
|
|
22
|
+
const variableName = (text) => {
|
|
23
|
+
const name = text.slice(1);
|
|
24
|
+
if (name === '')
|
|
25
|
+
throw new Error('CAVE-Q: variable requires a name after ?; use _ for a wildcard');
|
|
26
|
+
return name;
|
|
27
|
+
};
|
|
21
28
|
const slotOf = (token) => {
|
|
22
29
|
if (token.kind === 'word') {
|
|
23
30
|
if (token.text === '_') {
|
|
24
31
|
return { kind: 'wildcard' };
|
|
25
32
|
}
|
|
26
33
|
if (token.text.startsWith('?')) {
|
|
27
|
-
return { kind: 'var', name: token.text
|
|
34
|
+
return { kind: 'var', name: variableName(token.text) };
|
|
28
35
|
}
|
|
29
36
|
return { kind: 'term', text: token.text };
|
|
30
37
|
}
|
|
@@ -39,7 +46,7 @@ const verbSlotOf = (token) => {
|
|
|
39
46
|
return { kind: 'wildcard' };
|
|
40
47
|
}
|
|
41
48
|
if (token.text.startsWith('?')) {
|
|
42
|
-
return { kind: 'var', name: token.text
|
|
49
|
+
return { kind: 'var', name: variableName(token.text) };
|
|
43
50
|
}
|
|
44
51
|
const transitive = token.text.endsWith('+');
|
|
45
52
|
const name = transitive ? token.text.slice(0, -1) : token.text;
|
|
@@ -60,7 +67,7 @@ const parseFilter = (tokens, lineNo) => {
|
|
|
60
67
|
switch (field.text) {
|
|
61
68
|
case 'conf': {
|
|
62
69
|
const conf = valueText.endsWith('%') ? Confidence.parse(valueText) : Number(valueText);
|
|
63
|
-
if (conf === undefined || Number.
|
|
70
|
+
if (conf === undefined || !Number.isFinite(conf)) {
|
|
64
71
|
return bad(`cannot parse confidence ${JSON.stringify(valueText)}`);
|
|
65
72
|
}
|
|
66
73
|
return { field: 'conf', op: op.text, value: conf };
|
|
@@ -100,13 +107,16 @@ const parseFilter = (tokens, lineNo) => {
|
|
|
100
107
|
export const parse = (input) => {
|
|
101
108
|
const lines = input
|
|
102
109
|
.split(/\r?\n/)
|
|
103
|
-
.map(line =>
|
|
104
|
-
|
|
110
|
+
.map((line, index) => {
|
|
111
|
+
assertQueryUnicode(line, index + 1);
|
|
112
|
+
return { text: line.trim(), lineNo: index + 1 };
|
|
113
|
+
})
|
|
114
|
+
.filter(line => line.text !== '' && !line.text.startsWith(';'));
|
|
105
115
|
if (lines.length === 0) {
|
|
106
116
|
throw new Error('CAVE-Q: empty query');
|
|
107
117
|
}
|
|
108
118
|
const [patternLine, ...filterLines] = lines;
|
|
109
|
-
const { head } = Token.splitComment(patternLine);
|
|
119
|
+
const { head } = Token.splitComment(patternLine.text);
|
|
110
120
|
const tokens = Token.tokenize(head);
|
|
111
121
|
if (tokens.length < 2) {
|
|
112
122
|
throw new Error('CAVE-Q: a pattern needs at least a subject and a verb (spec §12.1)');
|
|
@@ -172,13 +182,13 @@ export const parse = (input) => {
|
|
|
172
182
|
else {
|
|
173
183
|
throw new Error(`CAVE-Q: cannot parse payload ${JSON.stringify(payloadTokens.map(token => token.text).join(' '))}`);
|
|
174
184
|
}
|
|
175
|
-
const filters = filterLines.map(
|
|
176
|
-
const filterTokens = Token.tokenize(Token.splitComment(line).head);
|
|
185
|
+
const filters = filterLines.map(line => {
|
|
186
|
+
const filterTokens = Token.tokenize(Token.splitComment(line.text).head);
|
|
177
187
|
const [keyword, ...rest_] = filterTokens;
|
|
178
188
|
if (keyword?.kind !== 'word' || keyword.text !== 'WHERE') {
|
|
179
|
-
throw new Error(`CAVE-Q line ${
|
|
189
|
+
throw new Error(`CAVE-Q line ${line.lineNo}: expected WHERE, got ${JSON.stringify(keyword?.text ?? '')}`);
|
|
180
190
|
}
|
|
181
|
-
return parseFilter(rest_,
|
|
191
|
+
return parseFilter(rest_, line.lineNo);
|
|
182
192
|
});
|
|
183
193
|
return { subject, verb, payload, negated, contexts, tags, filters };
|
|
184
194
|
};
|
package/dist/src/pattern.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-snapshot.d.ts","sourceRoot":"","sources":["../../src/read-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAOpD,yEAAyE;AACzE,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC,KAAG,CAc7D,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const message = (error) => {
|
|
2
|
+
try {
|
|
3
|
+
return error instanceof Error ? String(error.message) : String(error);
|
|
4
|
+
}
|
|
5
|
+
catch {
|
|
6
|
+
return '[unprintable thrown value]';
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
/** A deferred savepoint also nests within a caller-owned transaction. */
|
|
10
|
+
export const readSnapshot = (store, read) => {
|
|
11
|
+
const savepoint = 'cave_query_read';
|
|
12
|
+
store.db.exec(`SAVEPOINT ${savepoint}`);
|
|
13
|
+
let result;
|
|
14
|
+
try {
|
|
15
|
+
result = read();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
try {
|
|
19
|
+
store.db.exec(`RELEASE ${savepoint}`);
|
|
20
|
+
}
|
|
21
|
+
catch (releaseError) {
|
|
22
|
+
throw new AggregateError([error, releaseError], `CAVE-Q matching failed: ${message(error)}; read snapshot release also failed: ${message(releaseError)}`, { cause: error });
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
store.db.exec(`RELEASE ${savepoint}`);
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=read-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-snapshot.js","sourceRoot":"","sources":["../../src/read-snapshot.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,CAAC,KAAc,EAAU,EAAE;IACzC,IAAI,CAAC;QAAC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAAC,CAAC;IAC7E,MAAM,CAAC;QAAC,OAAO,4BAA4B,CAAA;IAAC,CAAC;AAC/C,CAAC,CAAA;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAI,KAAY,EAAE,IAAa,EAAK,EAAE;IAChE,MAAM,SAAS,GAAG,iBAAiB,CAAA;IACnC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,SAAS,EAAE,CAAC,CAAA;IACvC,IAAI,MAAS,CAAA;IACb,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,EAAE,CAAA;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC;YAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,SAAS,EAAE,CAAC,CAAA;QAAC,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YAClE,MAAM,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,EAC5C,2BAA2B,OAAO,CAAC,KAAK,CAAC,wCAAwC,OAAO,CAAC,YAAY,CAAC,EAAE,EACxG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACrB,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IACD,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,SAAS,EAAE,CAAC,CAAA;IACrC,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
|
package/dist/src/record.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAKlD,eAAO,MAAM,MAAM,EAAG,kBAA2B,CAAA;AACjD,eAAO,MAAM,OAAO,EAAG,CAAU,CAAA;AAEjC,MAAM,MAAM,CAAC,GAAG;IACd,QAAQ,CAAC,MAAM,EAAE,OAAO,MAAM,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,OAAO,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAA;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,WAAW,CAAC,CAAC,EAAE,CAAA;IAC3C,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,EAAE,GAAI,OAAO,KAAK,EAAE,OAAO,KAAK,KAAG,CAgB/C,CAAA;AAyBD,2EAA2E;AAC3E,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,GAAG,OAAO,KAAG,CAuBhD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,QAAQ,CAAC,EAAE,QAAQ,MAAM,KAAG,MACT,CAAA;AAE1C,iFAAiF;AACjF,eAAO,MAAM,YAAY,GACvB,OAAO,KAAK,EACZ,OAAO,MAAM,EACb,UAAS,OAAY,KACpB,CAAC,EAGH,CAAA"}
|
package/dist/src/record.js
CHANGED
|
@@ -1,41 +1,76 @@
|
|
|
1
1
|
/** Versioned JSON projection of CAVE-Q matches. */
|
|
2
2
|
import { Record as ClaimRecord } from '@cavelang/store/adapter';
|
|
3
3
|
import { query } from "./bounded.js";
|
|
4
|
+
import { readSnapshot } from "./read-snapshot.js";
|
|
5
|
+
import { captureOptions } from "./capture.js";
|
|
4
6
|
export const format = 'cave.query-match';
|
|
5
7
|
export const version = 1;
|
|
6
|
-
export const of = (store, match) =>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
export const of = (store, match) => {
|
|
9
|
+
const supplied = { bindings: match.bindings, row: match.row, rows: match.rows, at: match.at };
|
|
10
|
+
requireBindingPrototype(supplied.bindings);
|
|
11
|
+
const { bindings, row, rows, at } = structuredClone(supplied);
|
|
12
|
+
validateMetadata(bindings, rows, at);
|
|
13
|
+
if (rows !== undefined)
|
|
14
|
+
for (const evidence of rows) {
|
|
15
|
+
if (!object(evidence))
|
|
16
|
+
throw new Error(`CAVE query record: malformed ${format}/v${version} support`);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
format,
|
|
20
|
+
version,
|
|
21
|
+
bindings,
|
|
22
|
+
...(row === undefined ? {} : { claim: store.recordOf(row) }),
|
|
23
|
+
...(rows === undefined ? {} : { support: rows.map(store.recordOf) }),
|
|
24
|
+
...(at === undefined ? {} : { at }),
|
|
25
|
+
};
|
|
26
|
+
};
|
|
14
27
|
const object = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
28
|
+
const requireBindingPrototype = (bindings) => {
|
|
29
|
+
if (object(bindings) && Object.getPrototypeOf(bindings) !== Object.prototype &&
|
|
30
|
+
Object.getPrototypeOf(bindings) !== null) {
|
|
31
|
+
throw new Error(`CAVE query record: malformed ${format}/v${version}`);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const validateMetadata = (bindings, support, at) => {
|
|
35
|
+
if (!object(bindings) ||
|
|
36
|
+
(Object.getPrototypeOf(bindings) !== Object.prototype && Object.getPrototypeOf(bindings) !== null) ||
|
|
37
|
+
!Object.values(bindings).every(binding => typeof binding === 'string') ||
|
|
38
|
+
(support !== undefined && !Array.isArray(support))) {
|
|
39
|
+
throw new Error(`CAVE query record: malformed ${format}/v${version}`);
|
|
40
|
+
}
|
|
41
|
+
if (at !== undefined && (!object(at) || typeof at['num'] !== 'number' || !Number.isFinite(at['num']) ||
|
|
42
|
+
typeof at['text'] !== 'string' || (at['unit'] !== undefined && typeof at['unit'] !== 'string'))) {
|
|
43
|
+
throw new Error(`CAVE query record: malformed ${format}/v${version} interpolation`);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
15
46
|
/** Decode a persisted query-match record and every nested claim record. */
|
|
16
47
|
export const decode = (input) => {
|
|
17
|
-
|
|
48
|
+
let value = typeof input === 'string' ? JSON.parse(input) : object(input) ? { ...input } : input;
|
|
49
|
+
if (typeof input !== 'string' && object(value)) {
|
|
50
|
+
// Check the supplied map before cloning normalizes custom prototypes.
|
|
51
|
+
requireBindingPrototype(value['bindings']);
|
|
52
|
+
value = structuredClone(value);
|
|
53
|
+
}
|
|
18
54
|
if (!object(value) || value['format'] !== format) {
|
|
19
55
|
throw new Error(`CAVE query record: expected format ${JSON.stringify(format)}`);
|
|
20
56
|
}
|
|
21
57
|
if (value['version'] !== version) {
|
|
22
58
|
throw new Error(`CAVE query record: unsupported ${format} version ${JSON.stringify(value['version'])}`);
|
|
23
59
|
}
|
|
24
|
-
|
|
25
|
-
!Object.values(value['bindings']).every(binding => typeof binding === 'string') ||
|
|
26
|
-
(value['support'] !== undefined && !Array.isArray(value['support']))) {
|
|
27
|
-
throw new Error(`CAVE query record: malformed ${format}/v${version}`);
|
|
28
|
-
}
|
|
60
|
+
validateMetadata(value['bindings'], value['support'], value['at']);
|
|
29
61
|
const decoded = value;
|
|
30
62
|
return {
|
|
31
63
|
...decoded,
|
|
32
64
|
...(decoded.claim === undefined ? {} : { claim: ClaimRecord.decode(decoded.claim) }),
|
|
33
65
|
...(decoded.support === undefined ? {} : {
|
|
34
|
-
support: decoded.support.
|
|
66
|
+
support: Array.from({ length: decoded.support.length }, (_, index) => ClaimRecord.decode(decoded.support[index]))
|
|
35
67
|
}),
|
|
36
68
|
};
|
|
37
69
|
};
|
|
38
70
|
export const encode = (record, space) => JSON.stringify(record, undefined, space);
|
|
39
71
|
/** Stable library/JSON query surface; raw `query()` remains storage-oriented. */
|
|
40
|
-
export const queryRecords = (store, input, options = {}) =>
|
|
72
|
+
export const queryRecords = (store, input, options = {}) => {
|
|
73
|
+
options = captureOptions(options);
|
|
74
|
+
return readSnapshot(store, () => query(store, input, options).map(match => of(store, match)));
|
|
75
|
+
};
|
|
41
76
|
//# sourceMappingURL=record.js.map
|
package/dist/src/record.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAG/D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unicode.d.ts","sourceRoot":"","sources":["../../src/unicode.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,GAAI,OAAO,OAAO,EAAE,OAAO,MAAM,KAAG,IAIlE,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Query strings must survive SQLite's UTF-8 encoding without replacement. */
|
|
2
|
+
export const assertQueryUnicode = (value, line) => {
|
|
3
|
+
if (typeof value === 'string' && /[\uD800-\uDFFF]/u.test(value)) {
|
|
4
|
+
throw new Error(`CAVE-Q${line === undefined ? '' : ` line ${line}`}: unpaired UTF-16 surrogate cannot be queried as UTF-8`);
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=unicode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unicode.js","sourceRoot":"","sources":["../../src/unicode.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAE,IAAa,EAAQ,EAAE;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,wDAAwD,CAAC,CAAA;IAC7H,CAAC;AACH,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cavelang/query",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.36.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CAVE-Q — graph-pattern queries with variables, lifecycle and inverse verbs, transitive hops, and filters.",
|
|
6
6
|
"keywords": [
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"directory": "packages/query"
|
|
22
22
|
},
|
|
23
23
|
"engines": {
|
|
24
|
-
"node": "^
|
|
24
|
+
"node": "^24.16.0 || ^26.1.0"
|
|
25
25
|
},
|
|
26
26
|
"exports": {
|
|
27
27
|
".": {
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"access": "public"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@cavelang/
|
|
48
|
-
"@cavelang/
|
|
49
|
-
"@cavelang/
|
|
50
|
-
"@cavelang/
|
|
47
|
+
"@cavelang/canonical": "0.36.0",
|
|
48
|
+
"@cavelang/core": "0.36.0",
|
|
49
|
+
"@cavelang/parser": "0.36.0",
|
|
50
|
+
"@cavelang/store": "0.36.0"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
53
|
"bench:transitive": "node --disable-warning=ExperimentalWarning bench/transitive.ts",
|