mindoodb 0.0.63 → 0.0.64
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 +14 -1
- package/dist/browser/index.mjs +4 -0
- package/dist/core/expressions/builder.d.ts +25 -0
- package/dist/core/expressions/builder.d.ts.map +1 -1
- package/dist/core/expressions/builder.js +33 -13
- package/dist/core/expressions/builder.js.map +1 -1
- package/dist/core/expressions/evaluateExpression.d.ts +55 -2
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
- package/dist/core/expressions/evaluateExpression.js +95 -3
- package/dist/core/expressions/evaluateExpression.js.map +1 -1
- package/dist/core/expressions/formulaSource.d.ts.map +1 -1
- package/dist/core/expressions/formulaSource.js +21 -2
- package/dist/core/expressions/formulaSource.js.map +1 -1
- package/dist/core/expressions/index.d.ts +1 -1
- package/dist/core/expressions/index.d.ts.map +1 -1
- package/dist/core/expressions/index.js +3 -1
- package/dist/core/expressions/index.js.map +1 -1
- package/dist/core/expressions/metadata.d.ts +1 -1
- package/dist/core/expressions/metadata.d.ts.map +1 -1
- package/dist/core/expressions/metadata.js +5 -0
- package/dist/core/expressions/metadata.js.map +1 -1
- package/dist/core/expressions/types.d.ts +17 -2
- package/dist/core/expressions/types.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/indexing/createViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/createViewDataProvider.js +1 -0
- package/dist/core/indexing/createViewDataProvider.js.map +1 -1
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js +1 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +1 -0
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
- package/dist/core/query/executeQuery.d.ts +1 -1
- package/dist/core/query/executeQuery.d.ts.map +1 -1
- package/dist/core/query/executeQuery.js +106 -71
- package/dist/core/query/executeQuery.js.map +1 -1
- package/dist/core/query/executeQueryInclude.d.ts +99 -0
- package/dist/core/query/executeQueryInclude.d.ts.map +1 -0
- package/dist/core/query/executeQueryInclude.js +447 -0
- package/dist/core/query/executeQueryInclude.js.map +1 -0
- package/dist/core/query/index.d.ts +2 -1
- package/dist/core/query/index.d.ts.map +1 -1
- package/dist/core/query/index.js +5 -1
- package/dist/core/query/index.js.map +1 -1
- package/dist/core/query/queryInternals.d.ts +45 -0
- package/dist/core/query/queryInternals.d.ts.map +1 -0
- package/dist/core/query/queryInternals.js +87 -0
- package/dist/core/query/queryInternals.js.map +1 -0
- package/dist/core/query/queryLive.d.ts.map +1 -1
- package/dist/core/query/queryLive.js +67 -8
- package/dist/core/query/queryLive.js.map +1 -1
- package/dist/core/query/queryView.d.ts.map +1 -1
- package/dist/core/query/queryView.js +19 -0
- package/dist/core/query/queryView.js.map +1 -1
- package/dist/core/query/types.d.ts +122 -7
- package/dist/core/query/types.d.ts.map +1 -1
- package/dist/core/query/types.js +13 -1
- package/dist/core/query/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryInternals.js","sourceRoot":"","sources":["../../../src/core/query/queryInternals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryLive.d.ts","sourceRoot":"","sources":["../../../src/core/query/queryLive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAErF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"queryLive.d.ts","sourceRoot":"","sources":["../../../src/core/query/queryLive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAErF,OAAO,KAAK,EACV,WAAW,EAEX,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,SAAS,CAAC;AAEjB,2CAA2C;AAC3C,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,WAAW,IAAI,IAAI,CAAC;IACpB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAgFD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,EAC7C,OAAO,CAAC,EAAE,kBAAkB,GAAG;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,GACpE,uBAAuB,CAkFzB"}
|
|
@@ -12,16 +12,67 @@ const executeQuery_1 = require("./executeQuery");
|
|
|
12
12
|
* or removing documents shifts BM25 statistics slightly for every other
|
|
13
13
|
* match, and re-pushing an unchanged result list over marginal score
|
|
14
14
|
* drift would spam subscribers.
|
|
15
|
+
*
|
|
16
|
+
* Included rows participate recursively. Without that, editing a line
|
|
17
|
+
* item would leave the invoice's own `lastModified` untouched and the
|
|
18
|
+
* subscriber would never hear about a change to data it was handed.
|
|
15
19
|
*/
|
|
16
20
|
function fingerprintResult(result) {
|
|
17
21
|
const parts = [String(result.total)];
|
|
18
22
|
for (const row of result.rows) {
|
|
19
|
-
parts
|
|
20
|
-
? `${row.docId}:${row.lastModified}`
|
|
21
|
-
: `${row.docId}:${row.lastModified}:${row.textScore.toFixed(2)}`);
|
|
23
|
+
appendRowFingerprint(parts, row);
|
|
22
24
|
}
|
|
23
25
|
return parts.join("|");
|
|
24
26
|
}
|
|
27
|
+
function appendRowFingerprint(parts, row) {
|
|
28
|
+
parts.push(row.textScore === undefined
|
|
29
|
+
? `${row.docId}:${row.lastModified}`
|
|
30
|
+
: `${row.docId}:${row.lastModified}:${row.textScore.toFixed(2)}`);
|
|
31
|
+
if (!row.includes) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
for (const [slot, slotValue] of Object.entries(row.includes)) {
|
|
35
|
+
if (slotValue === null) {
|
|
36
|
+
parts.push(`${slot}:-`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(slotValue)) {
|
|
40
|
+
parts.push(`${slot}:${slotValue.length}`);
|
|
41
|
+
for (const child of slotValue) {
|
|
42
|
+
appendRowFingerprint(parts, child);
|
|
43
|
+
}
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
parts.push(`${slot}:1`);
|
|
47
|
+
appendRowFingerprint(parts, slotValue);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Every database a query reads from: the root plus each `include.db`
|
|
52
|
+
* (recursively; an include without one stays on its parent's database).
|
|
53
|
+
* Deduplicated by instance, so two slots on the same database do not
|
|
54
|
+
* install two listeners.
|
|
55
|
+
*/
|
|
56
|
+
function collectQueryDatabases(db, query) {
|
|
57
|
+
const databases = [db];
|
|
58
|
+
const seen = new Set([db]);
|
|
59
|
+
const walk = (includes, parentDb) => {
|
|
60
|
+
for (const include of Object.values(includes)) {
|
|
61
|
+
const target = include.db ?? parentDb;
|
|
62
|
+
if (!seen.has(target)) {
|
|
63
|
+
seen.add(target);
|
|
64
|
+
databases.push(target);
|
|
65
|
+
}
|
|
66
|
+
if (include.include) {
|
|
67
|
+
walk(include.include, target);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
if (query.include) {
|
|
72
|
+
walk(query.include, db);
|
|
73
|
+
}
|
|
74
|
+
return databases;
|
|
75
|
+
}
|
|
25
76
|
/**
|
|
26
77
|
* Live query: delivers the initial result, keeps the summary current via
|
|
27
78
|
* the database's change listener, and re-evaluates the query after every
|
|
@@ -33,8 +84,14 @@ function fingerprintResult(result) {
|
|
|
33
84
|
* errors are reported through `onError` (or logged to the console).
|
|
34
85
|
*/
|
|
35
86
|
function executeQueryLive(db, summary, query, onResult, options) {
|
|
36
|
-
if
|
|
37
|
-
|
|
87
|
+
// A live query with includes is only live if it watches every database
|
|
88
|
+
// it reads from — a changed customer must push just like a changed
|
|
89
|
+
// invoice does.
|
|
90
|
+
const databases = collectQueryDatabases(db, query);
|
|
91
|
+
for (const database of databases) {
|
|
92
|
+
if (!database.addChangeListener) {
|
|
93
|
+
throw new Error("This MindooDB instance does not support change listeners.");
|
|
94
|
+
}
|
|
38
95
|
}
|
|
39
96
|
let lastFingerprint = null;
|
|
40
97
|
let unsubscribed = false;
|
|
@@ -81,17 +138,19 @@ function executeQueryLive(db, summary, query, onResult, options) {
|
|
|
81
138
|
running = false;
|
|
82
139
|
}
|
|
83
140
|
};
|
|
84
|
-
const
|
|
141
|
+
const removeListeners = databases.map((database) => database.addChangeListener(() => {
|
|
85
142
|
if (!unsubscribed) {
|
|
86
143
|
void run(false);
|
|
87
144
|
}
|
|
88
|
-
});
|
|
145
|
+
}));
|
|
89
146
|
// Deliver the initial result asynchronously.
|
|
90
147
|
void run(true);
|
|
91
148
|
return {
|
|
92
149
|
unsubscribe() {
|
|
93
150
|
unsubscribed = true;
|
|
94
|
-
removeListener
|
|
151
|
+
for (const removeListener of removeListeners) {
|
|
152
|
+
removeListener();
|
|
153
|
+
}
|
|
95
154
|
},
|
|
96
155
|
async refresh() {
|
|
97
156
|
if (unsubscribed) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryLive.js","sourceRoot":"","sources":["../../../src/core/query/queryLive.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"queryLive.js","sourceRoot":"","sources":["../../../src/core/query/queryLive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryView.d.ts","sourceRoot":"","sources":["../../../src/core/query/queryView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"queryView.d.ts","sourceRoot":"","sources":["../../../src/core/query/queryView.ts"],"names":[],"mappings":"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"}
|
|
@@ -171,6 +171,23 @@ exports.EphemeralSummaryView = EphemeralSummaryView;
|
|
|
171
171
|
* the match, `_textScoreRaw` the engine's raw score.
|
|
172
172
|
*/
|
|
173
173
|
const TEXT_SCORE_FIELDS = new Set(["_textScore", "_textScoreRaw"]);
|
|
174
|
+
/**
|
|
175
|
+
* Reject an expression the evaluator does not define.
|
|
176
|
+
*
|
|
177
|
+
* Same trap as in `db.query()`: an unrecognized node evaluates to
|
|
178
|
+
* `undefined`, which silently drops every row (in a filter) or blanks a
|
|
179
|
+
* column instead of reporting the mistake. View definitions take expressions
|
|
180
|
+
* only — formula source text has to be parsed by the caller, and saying so
|
|
181
|
+
* is more useful than an empty view.
|
|
182
|
+
*/
|
|
183
|
+
function assertKnownExpression(expression, role) {
|
|
184
|
+
const unknown = (0, expressions_1.findUnknownExpressionNode)(expression);
|
|
185
|
+
if (unknown !== null) {
|
|
186
|
+
throw new types_1.MindooQueryError(`View ${role} contains ${unknown}, which the expression language does not define ` +
|
|
187
|
+
`(build it with createViewLanguage(), or parse formula text with ` +
|
|
188
|
+
`parseMindooDBFormulaBooleanExpression()).`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
174
191
|
/**
|
|
175
192
|
* Guardrails mirroring `db.query()`: expressions must be answerable from
|
|
176
193
|
* the summary buffers (no decrypt, no view-tree operations in filters,
|
|
@@ -185,6 +202,7 @@ function validateViewDefinition(sources, definition) {
|
|
|
185
202
|
if (!expression) {
|
|
186
203
|
continue;
|
|
187
204
|
}
|
|
205
|
+
assertKnownExpression(expression, "column");
|
|
188
206
|
const requirements = (0, expressions_1.analyzeExpressionRequirements)(expression);
|
|
189
207
|
if (requirements.needsDecryption) {
|
|
190
208
|
throw new types_1.MindooQueryError("View columns cannot use decrypt expressions: encrypted fields are not stored in the summary buffer.");
|
|
@@ -197,6 +215,7 @@ function validateViewDefinition(sources, definition) {
|
|
|
197
215
|
const referencedPaths = new Set(columnPaths);
|
|
198
216
|
const filter = source.filter ?? definition.filter;
|
|
199
217
|
if (filter) {
|
|
218
|
+
assertKnownExpression(filter, "filter");
|
|
200
219
|
const requirements = (0, expressions_1.analyzeExpressionRequirements)(filter);
|
|
201
220
|
if (requirements.needsViewContext) {
|
|
202
221
|
throw new types_1.MindooQueryError(`View filters cannot use view-tree operations (${requirements.viewContextOperations.join(", ")}).`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryView.js","sourceRoot":"","sources":["../../../src/core/query/queryView.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"queryView.js","sourceRoot":"","sources":["../../../src/core/query/queryView.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { MindooDBAppBooleanExpression, MindooDBAppExpression } from "../expressions/types";
|
|
2
2
|
import type { SummaryCoverage } from "../indexing/summary/types";
|
|
3
3
|
import type { VirtualViewUpdateOptions } from "../indexing/virtualviews/IVirtualViewDataProvider";
|
|
4
|
+
import type { MindooDB } from "../types";
|
|
4
5
|
/**
|
|
5
6
|
* One sort key of a {@link MindooQuery}. Either a plain summary field
|
|
6
7
|
* path, a computed expression (evaluated per row before comparison), or a
|
|
@@ -43,17 +44,83 @@ export interface MindooQueryTextClause {
|
|
|
43
44
|
/** How multiple terms combine: `"AND"` (default) or `"OR"`. */
|
|
44
45
|
combineWith?: "AND" | "OR";
|
|
45
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Whether an include slot resolves to a single related row or a list of
|
|
49
|
+
* them. Always explicit: a lookup that happens to match exactly one
|
|
50
|
+
* document today must not silently change shape tomorrow, so `"one"`
|
|
51
|
+
* with more than one match is an error rather than an implicit array.
|
|
52
|
+
*/
|
|
53
|
+
export type MindooQueryIncludeCardinality = "one" | "many";
|
|
54
|
+
/**
|
|
55
|
+
* Default `limit` of a `"many"` include slot — the cap that keeps one
|
|
56
|
+
* pathological parent (a customer with 50k invoices) from dominating a
|
|
57
|
+
* result. Raise it per slot when you really want more.
|
|
58
|
+
*/
|
|
59
|
+
export declare const DEFAULT_INCLUDE_LIMIT = 200;
|
|
60
|
+
/**
|
|
61
|
+
* Maximum include nesting, counting the query's own `include` as level 1
|
|
62
|
+
* (so `invoice → customer → address` is level 2). A guard against
|
|
63
|
+
* accidentally exponential join plans, not a fundamental limit.
|
|
64
|
+
*/
|
|
65
|
+
export declare const MAX_INCLUDE_DEPTH = 3;
|
|
66
|
+
/**
|
|
67
|
+
* One nested lookup of a {@link MindooQuery} (see docs/adhoc-queries.md).
|
|
68
|
+
*
|
|
69
|
+
* Related documents are joined onto every paged result row under
|
|
70
|
+
* `MindooQueryRow.includes[slot]`. The join runs as ONE additional
|
|
71
|
+
* summary scan per slot, never a query per parent row.
|
|
72
|
+
*/
|
|
73
|
+
export interface MindooQueryInclude {
|
|
74
|
+
/**
|
|
75
|
+
* Database to look the related documents up in. Omit for the same
|
|
76
|
+
* database as the parent query. This is a runtime handle, not an id —
|
|
77
|
+
* the only part of a query object that is not plain JSON.
|
|
78
|
+
*/
|
|
79
|
+
db?: MindooDB;
|
|
80
|
+
/** Required: `"one"` yields a row or `null`, `"many"` yields an array. */
|
|
81
|
+
cardinality: MindooQueryIncludeCardinality;
|
|
82
|
+
/**
|
|
83
|
+
* Shorthand join: match children whose `docId` equals this PARENT field
|
|
84
|
+
* (or, when the parent value is an array, is contained in it). Sugar for
|
|
85
|
+
* `filter: v.eq(v.field("docId"), v.parent(localKey))`; combined with an
|
|
86
|
+
* explicit `filter` via logical AND.
|
|
87
|
+
*/
|
|
88
|
+
localKey?: string;
|
|
89
|
+
/**
|
|
90
|
+
* Join condition, or its formula source text. Must contain exactly one
|
|
91
|
+
* parent equality — `v.eq(v.field(childPath), v.parent(parentPath))`
|
|
92
|
+
* in either operand order — optionally ANDed with conditions that do
|
|
93
|
+
* not reference the parent (those are applied as plain child
|
|
94
|
+
* predicates). Everything else is rejected: the equality is what lets
|
|
95
|
+
* the engine answer the slot with a single indexed scan instead of a
|
|
96
|
+
* nested loop over parents x children.
|
|
97
|
+
*/
|
|
98
|
+
filter?: MindooDBAppBooleanExpression | string;
|
|
99
|
+
/** Projection for the related rows; defaults to all summary fields. */
|
|
100
|
+
fields?: string[];
|
|
101
|
+
/** Ordering within one parent's list. `"many"` only; defaults to `docId`. */
|
|
102
|
+
sortBy?: MindooQuerySortKey[];
|
|
103
|
+
/** Max related rows per parent. `"many"` only; defaults to {@link DEFAULT_INCLUDE_LIMIT}. */
|
|
104
|
+
limit?: number;
|
|
105
|
+
/** Nested lookups on the related rows (see {@link MAX_INCLUDE_DEPTH}). */
|
|
106
|
+
include?: Record<string, MindooQueryInclude>;
|
|
107
|
+
}
|
|
46
108
|
/**
|
|
47
109
|
* An ad-hoc query over the document summary buffer (see
|
|
48
110
|
* docs/adhoc-queries.md).
|
|
49
111
|
*
|
|
50
112
|
* The filter IS an expression of the MindooDB expression language — built
|
|
51
|
-
* with `createViewLanguage()`
|
|
52
|
-
*
|
|
53
|
-
* plain JSON and travel safely across process boundaries.
|
|
113
|
+
* with `createViewLanguage()` — so query definitions are plain JSON and
|
|
114
|
+
* travel safely across process boundaries.
|
|
54
115
|
*/
|
|
55
116
|
export interface MindooQuery {
|
|
56
|
-
|
|
117
|
+
/**
|
|
118
|
+
* Boolean expression, or the formula source text of one (e.g.
|
|
119
|
+
* `'v.eq(v.field("type"), "invoice")'`), which `query()` parses for you —
|
|
120
|
+
* the same convenience the app SDK offers, so a query object written for
|
|
121
|
+
* one works with the other.
|
|
122
|
+
*/
|
|
123
|
+
filter?: MindooDBAppBooleanExpression | string;
|
|
57
124
|
/**
|
|
58
125
|
* Full-text clause: additionally require documents to match this
|
|
59
126
|
* full-text search (combined with `filter` as a logical AND). Adds a
|
|
@@ -69,7 +136,28 @@ export interface MindooQuery {
|
|
|
69
136
|
* summary fields of the matching document.
|
|
70
137
|
*/
|
|
71
138
|
fields?: string[];
|
|
139
|
+
/**
|
|
140
|
+
* Nested lookups: related documents joined onto every returned row
|
|
141
|
+
* under {@link MindooQueryRow.includes}, keyed by slot name. Slot names
|
|
142
|
+
* are free-form — they live in their own object, so none of them can
|
|
143
|
+
* collide with `docId` / `fields` / `lastModified`.
|
|
144
|
+
*
|
|
145
|
+
* Hydration happens AFTER `sortBy`/`limit`/`offset`, so only the rows
|
|
146
|
+
* actually returned are joined; `total` stays the unpaged match count
|
|
147
|
+
* of the root query.
|
|
148
|
+
*/
|
|
149
|
+
include?: Record<string, MindooQueryInclude>;
|
|
72
150
|
}
|
|
151
|
+
/** A {@link MindooQueryInclude} whose formula-source filter has been parsed. */
|
|
152
|
+
export type ParsedMindooQueryInclude = Omit<MindooQueryInclude, "filter" | "include"> & {
|
|
153
|
+
filter?: MindooDBAppBooleanExpression;
|
|
154
|
+
include?: Record<string, ParsedMindooQueryInclude>;
|
|
155
|
+
};
|
|
156
|
+
/** A {@link MindooQuery} whose formula-source filters have been parsed. */
|
|
157
|
+
export type ParsedMindooQuery = Omit<MindooQuery, "filter" | "include"> & {
|
|
158
|
+
filter?: MindooDBAppBooleanExpression;
|
|
159
|
+
include?: Record<string, ParsedMindooQueryInclude>;
|
|
160
|
+
};
|
|
73
161
|
export interface MindooQueryOptions extends VirtualViewUpdateOptions {
|
|
74
162
|
/**
|
|
75
163
|
* Escape hatch: materialize every document via the changefeed instead of
|
|
@@ -79,7 +167,13 @@ export interface MindooQueryOptions extends VirtualViewUpdateOptions {
|
|
|
79
167
|
*/
|
|
80
168
|
allowFullScan?: boolean;
|
|
81
169
|
}
|
|
82
|
-
|
|
170
|
+
/**
|
|
171
|
+
* The related rows joined onto one result row, keyed by include slot
|
|
172
|
+
* name: a row (or `null`) for `cardinality: "one"`, an array for
|
|
173
|
+
* `"many"`.
|
|
174
|
+
*/
|
|
175
|
+
export type MindooQueryIncludeSlots = Record<string, MindooQueryRow | MindooQueryRow[] | null>;
|
|
176
|
+
export interface MindooQueryRow<TIncludes extends MindooQueryIncludeSlots = MindooQueryIncludeSlots> {
|
|
83
177
|
docId: string;
|
|
84
178
|
fields: Record<string, unknown>;
|
|
85
179
|
lastModified: number;
|
|
@@ -88,6 +182,22 @@ export interface MindooQueryRow {
|
|
|
88
182
|
* match). Only present when the query had a `text` clause.
|
|
89
183
|
*/
|
|
90
184
|
textScore?: number;
|
|
185
|
+
/**
|
|
186
|
+
* Related rows from the query's {@link MindooQuery.include} lookups.
|
|
187
|
+
* Absent when the query had no `include`, so results of plain queries
|
|
188
|
+
* keep exactly the shape they always had.
|
|
189
|
+
*
|
|
190
|
+
* Included rows are ordinary rows, so a nested lookup reads as
|
|
191
|
+
* `row.includes.customer.includes.address` — the same rule at every
|
|
192
|
+
* level. The slots live in their own object rather than next to
|
|
193
|
+
* `docId`/`fields` so that no relation name can collide with the
|
|
194
|
+
* protocol and this row's top level stays free for future engine data.
|
|
195
|
+
*
|
|
196
|
+
* The generic parameter is a convenience for callers who want precise
|
|
197
|
+
* slot types (`db.query<{ lines: MindooQueryRow[] }>({…})`); it is not
|
|
198
|
+
* inferred from the `include` object.
|
|
199
|
+
*/
|
|
200
|
+
includes?: TIncludes;
|
|
91
201
|
}
|
|
92
202
|
/**
|
|
93
203
|
* Which data answered the query: `"full"`/`"rebuilding"` from the summary
|
|
@@ -95,10 +205,15 @@ export interface MindooQueryRow {
|
|
|
95
205
|
* materialized via `allowFullScan`.
|
|
96
206
|
*/
|
|
97
207
|
export type MindooQueryCoverage = SummaryCoverage | "full-scan";
|
|
98
|
-
export interface MindooQueryResult {
|
|
99
|
-
rows: MindooQueryRow[];
|
|
208
|
+
export interface MindooQueryResult<TIncludes extends MindooQueryIncludeSlots = MindooQueryIncludeSlots> {
|
|
209
|
+
rows: MindooQueryRow<TIncludes>[];
|
|
100
210
|
/** Number of matching documents before `offset`/`limit` were applied. */
|
|
101
211
|
total: number;
|
|
212
|
+
/**
|
|
213
|
+
* Which data answered the query. With `include` lookups this is the
|
|
214
|
+
* MINIMUM over every involved summary — one child summary still
|
|
215
|
+
* backfilling makes the whole result `"rebuilding"`.
|
|
216
|
+
*/
|
|
102
217
|
coverage: MindooQueryCoverage;
|
|
103
218
|
}
|
|
104
219
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/query/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mDAAmD,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/query/types.ts"],"names":[],"mappings":"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"}
|
package/dist/core/query/types.js
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MindooQueryError = void 0;
|
|
3
|
+
exports.MindooQueryError = exports.MAX_INCLUDE_DEPTH = exports.DEFAULT_INCLUDE_LIMIT = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Default `limit` of a `"many"` include slot — the cap that keeps one
|
|
6
|
+
* pathological parent (a customer with 50k invoices) from dominating a
|
|
7
|
+
* result. Raise it per slot when you really want more.
|
|
8
|
+
*/
|
|
9
|
+
exports.DEFAULT_INCLUDE_LIMIT = 200;
|
|
10
|
+
/**
|
|
11
|
+
* Maximum include nesting, counting the query's own `include` as level 1
|
|
12
|
+
* (so `invoice → customer → address` is level 2). A guard against
|
|
13
|
+
* accidentally exponential join plans, not a fundamental limit.
|
|
14
|
+
*/
|
|
15
|
+
exports.MAX_INCLUDE_DEPTH = 3;
|
|
4
16
|
/**
|
|
5
17
|
* Thrown for queries that cannot be answered: referenced fields outside the
|
|
6
18
|
* summary coverage, `decrypt`/view-tree expressions without
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/query/types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/query/types.ts"],"names":[],"mappings":";;;AAyDA;;;;GAIG;AACU,QAAA,qBAAqB,GAAG,GAAG,CAAC;AAEzC;;;;GAIG;AACU,QAAA,iBAAiB,GAAG,CAAC,CAAC;AA2KnC;;;;;GAKG;AACH,MAAa,gBAAiB,SAAQ,KAAK;IAIzC,YAAY,OAAe,EAAE,IAA2B;QACtD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AATD,4CASC"}
|