mindoodb 0.0.80 → 0.0.81
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.
|
@@ -15,7 +15,7 @@ export interface MindooQuerySubscription {
|
|
|
15
15
|
* Live query: delivers the initial result, keeps the summary current via
|
|
16
16
|
* the database's change listener, and re-evaluates the query after every
|
|
17
17
|
* (coalesced) change event. `onResult` only fires when the result
|
|
18
|
-
* fingerprint
|
|
18
|
+
* fingerprint changed or a document in the result was synced in.
|
|
19
19
|
*
|
|
20
20
|
* Re-evaluations are single-flight with a pending flag, so bursts of
|
|
21
21
|
* change events never queue up more than one follow-up run. Evaluation
|
|
@@ -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,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;
|
|
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;AAgHD;;;;;;;;;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,CA4FzB"}
|
|
@@ -16,6 +16,11 @@ const executeQuery_1 = require("./executeQuery");
|
|
|
16
16
|
* Included rows participate recursively. Without that, editing a line
|
|
17
17
|
* item would leave the invoice's own `lastModified` untouched and the
|
|
18
18
|
* subscriber would never hear about a change to data it was handed.
|
|
19
|
+
*
|
|
20
|
+
* `lastModified` is the newest change's creation time, so a change that
|
|
21
|
+
* arrives by sync but was made before the replica's own latest edit leaves
|
|
22
|
+
* it untouched. The fingerprint alone misses that; synced changes to a
|
|
23
|
+
* document in the result count as well (see {@link resultContainsDoc}).
|
|
19
24
|
*/
|
|
20
25
|
function fingerprintResult(result) {
|
|
21
26
|
const parts = [String(result.total)];
|
|
@@ -47,6 +52,31 @@ function appendRowFingerprint(parts, row) {
|
|
|
47
52
|
appendRowFingerprint(parts, slotValue);
|
|
48
53
|
}
|
|
49
54
|
}
|
|
55
|
+
/** Whether one of `docIds` is a row of the result or of its includes. */
|
|
56
|
+
function resultContainsDoc(result, docIds) {
|
|
57
|
+
if (docIds.size === 0) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return result.rows.some((row) => rowContainsDoc(row, docIds));
|
|
61
|
+
}
|
|
62
|
+
function rowContainsDoc(row, docIds) {
|
|
63
|
+
if (docIds.has(row.docId)) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
if (!row.includes) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
for (const slotValue of Object.values(row.includes)) {
|
|
70
|
+
if (slotValue === null) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const children = Array.isArray(slotValue) ? slotValue : [slotValue];
|
|
74
|
+
if (children.some((child) => rowContainsDoc(child, docIds))) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
50
80
|
/**
|
|
51
81
|
* Every database a query reads from: the root plus each `include.db`
|
|
52
82
|
* (recursively; an include without one stays on its parent's database).
|
|
@@ -77,7 +107,7 @@ function collectQueryDatabases(db, query) {
|
|
|
77
107
|
* Live query: delivers the initial result, keeps the summary current via
|
|
78
108
|
* the database's change listener, and re-evaluates the query after every
|
|
79
109
|
* (coalesced) change event. `onResult` only fires when the result
|
|
80
|
-
* fingerprint
|
|
110
|
+
* fingerprint changed or a document in the result was synced in.
|
|
81
111
|
*
|
|
82
112
|
* Re-evaluations are single-flight with a pending flag, so bursts of
|
|
83
113
|
* change events never queue up more than one follow-up run. Evaluation
|
|
@@ -94,6 +124,9 @@ function executeQueryLive(db, summary, query, onResult, options) {
|
|
|
94
124
|
}
|
|
95
125
|
}
|
|
96
126
|
let lastFingerprint = null;
|
|
127
|
+
// Documents synced in since the last evaluation started. Local writes are
|
|
128
|
+
// the newest changes and always move `lastModified` on their own.
|
|
129
|
+
let changedDocIds = new Set();
|
|
97
130
|
let unsubscribed = false;
|
|
98
131
|
let running = false;
|
|
99
132
|
let pending = false;
|
|
@@ -106,12 +139,14 @@ function executeQueryLive(db, summary, query, onResult, options) {
|
|
|
106
139
|
}
|
|
107
140
|
};
|
|
108
141
|
const evaluate = async (force) => {
|
|
142
|
+
const changed = changedDocIds;
|
|
143
|
+
changedDocIds = new Set();
|
|
109
144
|
const result = await (0, executeQuery_1.executeQuery)(db, summary, query, options);
|
|
110
145
|
if (unsubscribed) {
|
|
111
146
|
return;
|
|
112
147
|
}
|
|
113
148
|
const fingerprint = fingerprintResult(result);
|
|
114
|
-
if (force || fingerprint !== lastFingerprint) {
|
|
149
|
+
if (force || fingerprint !== lastFingerprint || resultContainsDoc(result, changed)) {
|
|
115
150
|
lastFingerprint = fingerprint;
|
|
116
151
|
onResult(result);
|
|
117
152
|
}
|
|
@@ -138,8 +173,13 @@ function executeQueryLive(db, summary, query, onResult, options) {
|
|
|
138
173
|
running = false;
|
|
139
174
|
}
|
|
140
175
|
};
|
|
141
|
-
const removeListeners = databases.map((database) => database.addChangeListener(() => {
|
|
176
|
+
const removeListeners = databases.map((database) => database.addChangeListener((event) => {
|
|
142
177
|
if (!unsubscribed) {
|
|
178
|
+
if (event.origin === "ingest") {
|
|
179
|
+
for (const change of event.changes) {
|
|
180
|
+
changedDocIds.add(change.docId);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
143
183
|
void run(false);
|
|
144
184
|
}
|
|
145
185
|
}));
|
|
@@ -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":";;AA8IA,4CAkGC;AA9OD,iDAA8C;AAoB9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,iBAAiB,CAAC,MAAyB;IAClD,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAe,EAAE,GAAmB;IAChE,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,SAAS,KAAK,SAAS;QACzB,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,EAAE;QACpC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACnE,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC9B,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;YACD,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QACxB,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,SAAS,iBAAiB,CAAC,MAAyB,EAAE,MAA2B;IAC/E,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,cAAc,CAAC,GAAmB,EAAE,MAA2B;IACtE,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,EAAY,EAAE,KAAkB;IAC7D,MAAM,SAAS,GAAe,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAErC,MAAM,IAAI,GAAG,CAAC,QAA4C,EAAE,QAAkB,EAAQ,EAAE;QACtF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACjB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAC9B,EAAY,EACZ,OAA6B,EAC7B,KAAkB,EAClB,QAA6C,EAC7C,OAAqE;IAErE,uEAAuE;IACvE,mEAAmE;IACnE,gBAAgB;IAChB,MAAM,SAAS,GAAG,qBAAqB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,0EAA0E;IAC1E,kEAAkE;IAClE,IAAI,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,WAAW,GAAG,CAAC,KAAc,EAAQ,EAAE;QAC3C,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAc,EAAiB,EAAE;QACvD,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAY,EAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,KAAK,IAAI,WAAW,KAAK,eAAe,IAAI,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACnF,eAAe,GAAG,WAAW,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,KAAK,EAAE,KAAc,EAAiB,EAAE;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,GAAG,IAAI,CAAC;YACf,OAAO;QACT,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC;YACH,GAAG,CAAC;gBACF,OAAO,GAAG,KAAK,CAAC;gBAChB,IAAI,CAAC;oBACH,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,WAAW,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;gBACD,KAAK,GAAG,KAAK,CAAC;YAChB,CAAC,QAAQ,OAAO,IAAI,CAAC,YAAY,EAAE;QACrC,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACjD,QAAQ,CAAC,iBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;QACpC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC9B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,6CAA6C;IAC7C,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;IAEf,OAAO;QACL,WAAW;YACT,YAAY,GAAG,IAAI,CAAC;YACpB,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;gBAC7C,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO;YACX,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
|