mindoodb 0.0.89 → 0.0.91
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 +1 -0
- package/dist/browser/index.mjs +15 -0
- package/dist/core/BaseMindooDB.d.ts +18 -0
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +57 -0
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +3 -0
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +28 -0
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +2 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +10 -2
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/expressions/builder.d.ts +30 -0
- package/dist/core/expressions/builder.d.ts.map +1 -1
- package/dist/core/expressions/builder.js +42 -0
- package/dist/core/expressions/builder.js.map +1 -1
- package/dist/core/expressions/evaluateExpression.d.ts +10 -0
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
- package/dist/core/expressions/evaluateExpression.js +66 -1
- 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 +5 -0
- 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 +2 -1
- package/dist/core/expressions/index.js.map +1 -1
- package/dist/core/expressions/metadata.d.ts +2 -2
- package/dist/core/expressions/metadata.d.ts.map +1 -1
- package/dist/core/expressions/metadata.js +14 -0
- package/dist/core/expressions/metadata.js.map +1 -1
- package/dist/core/expressions/types.d.ts +1 -1
- package/dist/core/expressions/types.d.ts.map +1 -1
- package/dist/core/filing/FilingIndex.d.ts +209 -0
- package/dist/core/filing/FilingIndex.d.ts.map +1 -0
- package/dist/core/filing/FilingIndex.js +689 -0
- package/dist/core/filing/FilingIndex.js.map +1 -0
- package/dist/core/filing/MindooFilingStore.d.ts +200 -0
- package/dist/core/filing/MindooFilingStore.d.ts.map +1 -0
- package/dist/core/filing/MindooFilingStore.js +515 -0
- package/dist/core/filing/MindooFilingStore.js.map +1 -0
- package/dist/core/filing/index.d.ts +4 -0
- package/dist/core/filing/index.d.ts.map +1 -0
- package/dist/core/filing/index.js +22 -0
- package/dist/core/filing/index.js.map +1 -0
- package/dist/core/filing/refs.d.ts +56 -0
- package/dist/core/filing/refs.d.ts.map +1 -0
- package/dist/core/filing/refs.js +109 -0
- package/dist/core/filing/refs.js.map +1 -0
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/indexing/createViewDataProvider.d.ts +6 -0
- package/dist/core/indexing/createViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/createViewDataProvider.js +26 -1
- package/dist/core/indexing/createViewDataProvider.js.map +1 -1
- package/dist/core/indexing/summary/DocumentSummaryStore.d.ts +43 -1
- package/dist/core/indexing/summary/DocumentSummaryStore.d.ts.map +1 -1
- package/dist/core/indexing/summary/DocumentSummaryStore.js +302 -2
- package/dist/core/indexing/summary/DocumentSummaryStore.js.map +1 -1
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts +33 -2
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js +129 -26
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js.map +1 -1
- package/dist/core/indexing/summary/types.d.ts +40 -0
- package/dist/core/indexing/summary/types.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +27 -2
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +106 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.d.ts +70 -5
- package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.js +329 -28
- package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +4 -22
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +175 -129
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts +28 -0
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js +62 -0
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFilingJoin.d.ts +75 -0
- package/dist/core/indexing/virtualviews/VirtualViewFilingJoin.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewFilingJoin.js +163 -0
- package/dist/core/indexing/virtualviews/VirtualViewFilingJoin.js.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewMergedNavigator.d.ts +112 -0
- package/dist/core/indexing/virtualviews/VirtualViewMergedNavigator.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewMergedNavigator.js +296 -0
- package/dist/core/indexing/virtualviews/VirtualViewMergedNavigator.js.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewNavigator.d.ts +2 -0
- package/dist/core/indexing/virtualviews/VirtualViewNavigator.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewNavigator.js +10 -9
- package/dist/core/indexing/virtualviews/VirtualViewNavigator.js.map +1 -1
- package/dist/core/indexing/virtualviews/index.d.ts +2 -0
- package/dist/core/indexing/virtualviews/index.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/index.js +8 -1
- package/dist/core/indexing/virtualviews/index.js.map +1 -1
- package/dist/core/query/executeQuery.d.ts.map +1 -1
- package/dist/core/query/executeQuery.js +4 -0
- package/dist/core/query/executeQuery.js.map +1 -1
- package/dist/core/query/executeQueryInclude.d.ts.map +1 -1
- package/dist/core/query/executeQueryInclude.js +4 -0
- package/dist/core/query/executeQueryInclude.js.map +1 -1
- package/dist/core/query/queryView.d.ts.map +1 -1
- package/dist/core/query/queryView.js +4 -0
- package/dist/core/query/queryView.js.map +1 -1
- package/dist/core/types.d.ts +20 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,9 +4,12 @@ exports.VirtualViewFactory = exports.VirtualViewNavigatorBuilder = exports.Virtu
|
|
|
4
4
|
const VirtualView_1 = require("./VirtualView");
|
|
5
5
|
const VirtualViewColumn_1 = require("./VirtualViewColumn");
|
|
6
6
|
const VirtualViewNavigator_1 = require("./VirtualViewNavigator");
|
|
7
|
+
const VirtualViewMergedNavigator_1 = require("./VirtualViewMergedNavigator");
|
|
7
8
|
const MindooDBVirtualViewDataProvider_1 = require("./MindooDBVirtualViewDataProvider");
|
|
8
9
|
const IViewEntryAccessCheck_1 = require("./IViewEntryAccessCheck");
|
|
9
10
|
const createViewDataProvider_1 = require("../createViewDataProvider");
|
|
11
|
+
const evaluateExpression_1 = require("../../expressions/evaluateExpression");
|
|
12
|
+
const VirtualViewFilingJoin_1 = require("./VirtualViewFilingJoin");
|
|
10
13
|
const types_1 = require("./types");
|
|
11
14
|
/**
|
|
12
15
|
* Builder for creating VirtualView instances with a fluent API
|
|
@@ -21,6 +24,8 @@ class VirtualViewBuilder {
|
|
|
21
24
|
* summary-vs-documents per source (summary-first).
|
|
22
25
|
*/
|
|
23
26
|
this.pendingDbSources = [];
|
|
27
|
+
/** Filing stores joined via `withFilingStore`, or null. */
|
|
28
|
+
this.filingJoin = null;
|
|
24
29
|
}
|
|
25
30
|
/**
|
|
26
31
|
* Add a column to the view
|
|
@@ -97,6 +102,46 @@ class VirtualViewBuilder {
|
|
|
97
102
|
this.pendingDbSources.push({ origin, db, filter, options });
|
|
98
103
|
return this;
|
|
99
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Join a filing store into the view under `name`: column and filter
|
|
107
|
+
* expressions can then use `folders(name)` (the folder ids the document
|
|
108
|
+
* is filed in — typically a multi-value category) and
|
|
109
|
+
* `inFolder(name, folderId?)` (a selection, AND-combined with the rest of
|
|
110
|
+
* the filter). Filing lives in sidecar documents of the filing database
|
|
111
|
+
* (see `db.filing(store)`); when filing changes, exactly the affected
|
|
112
|
+
* documents are re-evaluated. References to databases that are not a
|
|
113
|
+
* data source of this view are ignored.
|
|
114
|
+
*
|
|
115
|
+
* @param source `{ db, store }` (optionally `decryptionKeyId`) or a
|
|
116
|
+
* filing store obtained from `db.filing(store)`.
|
|
117
|
+
*/
|
|
118
|
+
withFilingStore(name, source) {
|
|
119
|
+
if (!this.filingJoin) {
|
|
120
|
+
this.filingJoin = new VirtualViewFilingJoin_1.VirtualViewFilingJoin();
|
|
121
|
+
}
|
|
122
|
+
this.filingJoin.add(name, source);
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
125
|
+
/** Every filing store name the columns and filters reference. */
|
|
126
|
+
collectReferencedFilingStores() {
|
|
127
|
+
const names = new Set();
|
|
128
|
+
const visit = (expression) => {
|
|
129
|
+
if (!expression)
|
|
130
|
+
return;
|
|
131
|
+
for (const name of (0, evaluateExpression_1.analyzeExpressionRequirements)(expression).filingStores) {
|
|
132
|
+
names.add(name);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
for (const column of this.columns) {
|
|
136
|
+
visit(column.expression);
|
|
137
|
+
}
|
|
138
|
+
for (const source of this.pendingDbSources) {
|
|
139
|
+
if (source.filter && typeof source.filter !== "function") {
|
|
140
|
+
visit(source.filter);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return names;
|
|
144
|
+
}
|
|
100
145
|
/**
|
|
101
146
|
* Add a custom data provider
|
|
102
147
|
*/
|
|
@@ -114,6 +159,12 @@ class VirtualViewBuilder {
|
|
|
114
159
|
* (possibly synced) summary configuration.
|
|
115
160
|
*/
|
|
116
161
|
async build() {
|
|
162
|
+
for (const name of this.collectReferencedFilingStores()) {
|
|
163
|
+
if (name !== "*" && !this.filingJoin?.has(name)) {
|
|
164
|
+
throw new Error(`The view uses folders("${name}") / inFolder("${name}"), but no filing store "${name}" was ` +
|
|
165
|
+
`registered — add .withFilingStore("${name}", { db, store }).`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
117
168
|
const providers = [...this.dataProviders];
|
|
118
169
|
const dataSourceInfos = new Map();
|
|
119
170
|
for (const source of this.pendingDbSources) {
|
|
@@ -140,6 +191,7 @@ class VirtualViewBuilder {
|
|
|
140
191
|
}
|
|
141
192
|
const view = new VirtualView_1.VirtualView(this.columns);
|
|
142
193
|
view.setCategorizationStyle(this.categorizationStyle);
|
|
194
|
+
view.setFilingJoin(this.filingJoin);
|
|
143
195
|
for (const provider of providers) {
|
|
144
196
|
provider.init(view);
|
|
145
197
|
view.addDataProvider(provider);
|
|
@@ -267,6 +319,16 @@ class VirtualViewFactory {
|
|
|
267
319
|
static createNavigator(view) {
|
|
268
320
|
return new VirtualViewNavigatorBuilder(view);
|
|
269
321
|
}
|
|
322
|
+
/**
|
|
323
|
+
* Create a navigator that reads the documents of several categories as
|
|
324
|
+
* one sorted, de-duplicated list (k-way merge over the document sort
|
|
325
|
+
* columns) — e.g. the inbox folders of several accounts from one
|
|
326
|
+
* "mail by folder" view. Each path is a category-value path from the
|
|
327
|
+
* top, like `["acc1/inbox"]`; paths that do not exist are ignored.
|
|
328
|
+
*/
|
|
329
|
+
static createMergedNavigator(view, rootCategoryPaths, options) {
|
|
330
|
+
return new VirtualViewMergedNavigator_1.VirtualViewMergedNavigator(view, rootCategoryPaths, options);
|
|
331
|
+
}
|
|
270
332
|
/**
|
|
271
333
|
* Create a simple navigator for a view (all categories and documents)
|
|
272
334
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualViewFactory.js","sourceRoot":"","sources":["../../../../src/core/indexing/virtualviews/VirtualViewFactory.ts"],"names":[],"mappings":";;;AAEA,+CAAqE;AACrE,2DAAkF;AAElF,iEAA8D;
|
|
1
|
+
{"version":3,"file":"VirtualViewFactory.js","sourceRoot":"","sources":["../../../../src/core/indexing/virtualviews/VirtualViewFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { MindooDB } from "../../types";
|
|
2
|
+
import type { MindooFilingStore } from "../../filing/MindooFilingStore";
|
|
3
|
+
import type { MindooDBAppExpression } from "../../expressions/types";
|
|
4
|
+
/** Where a view's filing store comes from (`VirtualViewBuilder.withFilingStore`). */
|
|
5
|
+
export type FilingStoreSource = MindooFilingStore | {
|
|
6
|
+
db: MindooDB;
|
|
7
|
+
store: string;
|
|
8
|
+
decryptionKeyId?: string;
|
|
9
|
+
};
|
|
10
|
+
/** Filing changes handed to data providers before their update. */
|
|
11
|
+
export type FilingRefChanges = ReadonlySet<string> | "all";
|
|
12
|
+
/**
|
|
13
|
+
* Optional data-provider capability: providers that evaluate `folders()` /
|
|
14
|
+
* `inFolder()` receive the physical keys (`"<tenantId>/<dbId>/<docId>"`) of
|
|
15
|
+
* documents whose folder membership changed, so they can re-evaluate them
|
|
16
|
+
* even though the documents themselves did not change.
|
|
17
|
+
*/
|
|
18
|
+
export interface IFilingAwareDataProvider {
|
|
19
|
+
onFilingChanges(changes: FilingRefChanges): void;
|
|
20
|
+
}
|
|
21
|
+
export declare function isFilingAwareDataProvider(provider: unknown): provider is IFilingAwareDataProvider;
|
|
22
|
+
/** Persisted positions of a view's filing join (part of the view cache). */
|
|
23
|
+
export type FilingJoinState = Record<string, {
|
|
24
|
+
generation: string;
|
|
25
|
+
seq: number;
|
|
26
|
+
} | null>;
|
|
27
|
+
/**
|
|
28
|
+
* The filing stores a VirtualView joins (`withFilingStore`), as seen by its
|
|
29
|
+
* data providers: membership lookups for `folders()` / `inFolder()` and the
|
|
30
|
+
* per-update delta of documents whose membership changed.
|
|
31
|
+
*
|
|
32
|
+
* Filing indexes are shared per (database, store); the join only tracks how
|
|
33
|
+
* far THIS view has consumed each index's change log.
|
|
34
|
+
*/
|
|
35
|
+
export declare class VirtualViewFilingJoin {
|
|
36
|
+
private readonly stores;
|
|
37
|
+
/** Register a filing store under the name expressions use. */
|
|
38
|
+
add(name: string, source: FilingStoreSource): void;
|
|
39
|
+
/** Names of the joined filing stores. */
|
|
40
|
+
getNames(): string[];
|
|
41
|
+
has(name: string): boolean;
|
|
42
|
+
/** The filing store registered under `name`. */
|
|
43
|
+
getFilingStore(name: string): MindooFilingStore | undefined;
|
|
44
|
+
/** The filing databases (for live bindings). */
|
|
45
|
+
getDatabases(): MindooDB[];
|
|
46
|
+
/**
|
|
47
|
+
* Bring every joined index up to date and return the documents whose
|
|
48
|
+
* membership changed since this view's last refresh (`"all"` when the
|
|
49
|
+
* view has to re-evaluate everything, e.g. on its first update).
|
|
50
|
+
* Advances the view's positions — callers hand the result to their
|
|
51
|
+
* providers, which keep it until processed.
|
|
52
|
+
*/
|
|
53
|
+
refresh(): Promise<FilingRefChanges>;
|
|
54
|
+
/** Folder ids of a document (physical key) in the store registered as `name`. */
|
|
55
|
+
foldersOf(name: string, physRef: string): readonly string[];
|
|
56
|
+
/** Physical keys of the members of a folder in the store registered as `name`. */
|
|
57
|
+
membersOf(name: string, folderId: string): readonly string[];
|
|
58
|
+
/** Whether every joined index has been loaded (lookups are meaningful). */
|
|
59
|
+
isReady(): boolean;
|
|
60
|
+
/** Register a listener fired whenever a joined index changes. */
|
|
61
|
+
onDidChange(listener: () => void): () => void;
|
|
62
|
+
exportState(): FilingJoinState;
|
|
63
|
+
importState(state: FilingJoinState | undefined): void;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The folder a filter is driven by: `inFolder(store, "<literal id>")` as the
|
|
67
|
+
* whole filter or as one operand of a top-level `and`. Only such members
|
|
68
|
+
* can match, so a provider may read the folder's members instead of every
|
|
69
|
+
* document. `null` when the filter is not of that shape.
|
|
70
|
+
*/
|
|
71
|
+
export declare function findDrivingFolder(filter: MindooDBAppExpression | null | undefined): {
|
|
72
|
+
store: string;
|
|
73
|
+
folderId: string;
|
|
74
|
+
} | null;
|
|
75
|
+
//# sourceMappingURL=VirtualViewFilingJoin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VirtualViewFilingJoin.d.ts","sourceRoot":"","sources":["../../../../src/core/indexing/virtualviews/VirtualViewFilingJoin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,qFAAqF;AACrF,MAAM,MAAM,iBAAiB,GACzB,iBAAiB,GACjB;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,mEAAmE;AACnE,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,wBAAwB,CAEjG;AAQD,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC;AAEzF;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;IAEpE,8DAA8D;IAC9D,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAuBlD,yCAAyC;IACzC,QAAQ,IAAI,MAAM,EAAE;IAIpB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,gDAAgD;IAChD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI3D,gDAAgD;IAChD,YAAY,IAAI,QAAQ,EAAE;IAI1B;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAqB1C,iFAAiF;IACjF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;IAI3D,kFAAkF;IAClF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;IAI5D,2EAA2E;IAC3E,OAAO,IAAI,OAAO;IAOlB,iEAAiE;IACjE,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAgB7C,WAAW,IAAI,eAAe;IAQ9B,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI;CAStD;AAID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,GAC/C;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoB5C"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VirtualViewFilingJoin = void 0;
|
|
4
|
+
exports.isFilingAwareDataProvider = isFilingAwareDataProvider;
|
|
5
|
+
exports.findDrivingFolder = findDrivingFolder;
|
|
6
|
+
function isFilingAwareDataProvider(provider) {
|
|
7
|
+
return typeof provider?.onFilingChanges === "function";
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The filing stores a VirtualView joins (`withFilingStore`), as seen by its
|
|
11
|
+
* data providers: membership lookups for `folders()` / `inFolder()` and the
|
|
12
|
+
* per-update delta of documents whose membership changed.
|
|
13
|
+
*
|
|
14
|
+
* Filing indexes are shared per (database, store); the join only tracks how
|
|
15
|
+
* far THIS view has consumed each index's change log.
|
|
16
|
+
*/
|
|
17
|
+
class VirtualViewFilingJoin {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.stores = new Map();
|
|
20
|
+
}
|
|
21
|
+
/** Register a filing store under the name expressions use. */
|
|
22
|
+
add(name, source) {
|
|
23
|
+
if (!name) {
|
|
24
|
+
throw new Error("withFilingStore: name must be a non-empty string.");
|
|
25
|
+
}
|
|
26
|
+
if (this.stores.has(name)) {
|
|
27
|
+
throw new Error(`Filing store "${name}" is already registered on this view.`);
|
|
28
|
+
}
|
|
29
|
+
let filingStore;
|
|
30
|
+
if ("getIndex" in source && typeof source.getIndex === "function") {
|
|
31
|
+
filingStore = source;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const spec = source;
|
|
35
|
+
if (!spec.db?.filing) {
|
|
36
|
+
throw new Error(`withFilingStore("${name}"): the database does not support filing.`);
|
|
37
|
+
}
|
|
38
|
+
filingStore = spec.db.filing(spec.store, spec.decryptionKeyId !== undefined ? { decryptionKeyId: spec.decryptionKeyId } : undefined);
|
|
39
|
+
}
|
|
40
|
+
this.stores.set(name, { filingStore, index: null, position: null });
|
|
41
|
+
}
|
|
42
|
+
/** Names of the joined filing stores. */
|
|
43
|
+
getNames() {
|
|
44
|
+
return Array.from(this.stores.keys());
|
|
45
|
+
}
|
|
46
|
+
has(name) {
|
|
47
|
+
return this.stores.has(name);
|
|
48
|
+
}
|
|
49
|
+
/** The filing store registered under `name`. */
|
|
50
|
+
getFilingStore(name) {
|
|
51
|
+
return this.stores.get(name)?.filingStore;
|
|
52
|
+
}
|
|
53
|
+
/** The filing databases (for live bindings). */
|
|
54
|
+
getDatabases() {
|
|
55
|
+
return Array.from(new Set(Array.from(this.stores.values(), (s) => s.filingStore.getDatabase())));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Bring every joined index up to date and return the documents whose
|
|
59
|
+
* membership changed since this view's last refresh (`"all"` when the
|
|
60
|
+
* view has to re-evaluate everything, e.g. on its first update).
|
|
61
|
+
* Advances the view's positions — callers hand the result to their
|
|
62
|
+
* providers, which keep it until processed.
|
|
63
|
+
*/
|
|
64
|
+
async refresh() {
|
|
65
|
+
let all = false;
|
|
66
|
+
const refs = new Set();
|
|
67
|
+
for (const joined of this.stores.values()) {
|
|
68
|
+
if (!joined.index) {
|
|
69
|
+
joined.index = await joined.filingStore.getIndex();
|
|
70
|
+
}
|
|
71
|
+
await joined.index.update();
|
|
72
|
+
const changes = joined.index.changesSince(joined.position);
|
|
73
|
+
joined.position = { generation: changes.generation, seq: changes.seq };
|
|
74
|
+
if (changes.refs === "all") {
|
|
75
|
+
all = true;
|
|
76
|
+
}
|
|
77
|
+
else if (!all) {
|
|
78
|
+
for (const ref of changes.refs) {
|
|
79
|
+
refs.add(ref);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return all ? "all" : refs;
|
|
84
|
+
}
|
|
85
|
+
/** Folder ids of a document (physical key) in the store registered as `name`. */
|
|
86
|
+
foldersOf(name, physRef) {
|
|
87
|
+
return this.stores.get(name)?.index?.foldersOf(physRef) ?? NO_FOLDERS;
|
|
88
|
+
}
|
|
89
|
+
/** Physical keys of the members of a folder in the store registered as `name`. */
|
|
90
|
+
membersOf(name, folderId) {
|
|
91
|
+
return this.stores.get(name)?.index?.membersOf(folderId) ?? NO_FOLDERS;
|
|
92
|
+
}
|
|
93
|
+
/** Whether every joined index has been loaded (lookups are meaningful). */
|
|
94
|
+
isReady() {
|
|
95
|
+
for (const joined of this.stores.values()) {
|
|
96
|
+
if (!joined.index)
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
/** Register a listener fired whenever a joined index changes. */
|
|
102
|
+
onDidChange(listener) {
|
|
103
|
+
const unsubscribes = [];
|
|
104
|
+
let disposed = false;
|
|
105
|
+
for (const joined of this.stores.values()) {
|
|
106
|
+
void joined.filingStore.getIndex().then((index) => {
|
|
107
|
+
if (!disposed) {
|
|
108
|
+
unsubscribes.push(index.onDidChange(listener));
|
|
109
|
+
}
|
|
110
|
+
}).catch(() => undefined);
|
|
111
|
+
}
|
|
112
|
+
return () => {
|
|
113
|
+
disposed = true;
|
|
114
|
+
for (const unsubscribe of unsubscribes)
|
|
115
|
+
unsubscribe();
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
exportState() {
|
|
119
|
+
const state = {};
|
|
120
|
+
for (const [name, joined] of this.stores) {
|
|
121
|
+
state[name] = joined.position;
|
|
122
|
+
}
|
|
123
|
+
return state;
|
|
124
|
+
}
|
|
125
|
+
importState(state) {
|
|
126
|
+
if (!state)
|
|
127
|
+
return;
|
|
128
|
+
for (const [name, position] of Object.entries(state)) {
|
|
129
|
+
const joined = this.stores.get(name);
|
|
130
|
+
if (joined && position && typeof position.generation === "string" && typeof position.seq === "number") {
|
|
131
|
+
joined.position = { ...position };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.VirtualViewFilingJoin = VirtualViewFilingJoin;
|
|
137
|
+
const NO_FOLDERS = Object.freeze([]);
|
|
138
|
+
/**
|
|
139
|
+
* The folder a filter is driven by: `inFolder(store, "<literal id>")` as the
|
|
140
|
+
* whole filter or as one operand of a top-level `and`. Only such members
|
|
141
|
+
* can match, so a provider may read the folder's members instead of every
|
|
142
|
+
* document. `null` when the filter is not of that shape.
|
|
143
|
+
*/
|
|
144
|
+
function findDrivingFolder(filter) {
|
|
145
|
+
if (!filter || filter.kind !== "operation") {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const candidates = filter.op === "and" ? filter.args : [filter];
|
|
149
|
+
for (const candidate of candidates) {
|
|
150
|
+
if (candidate.kind === "operation" &&
|
|
151
|
+
candidate.op === "inFolder" &&
|
|
152
|
+
candidate.args.length >= 2 &&
|
|
153
|
+
candidate.args[0]?.kind === "literal" &&
|
|
154
|
+
candidate.args[1]?.kind === "literal" &&
|
|
155
|
+
typeof candidate.args[0].value === "string" &&
|
|
156
|
+
typeof candidate.args[1].value === "string" &&
|
|
157
|
+
candidate.args[1].value !== "") {
|
|
158
|
+
return { store: candidate.args[0].value, folderId: candidate.args[1].value };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=VirtualViewFilingJoin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VirtualViewFilingJoin.js","sourceRoot":"","sources":["../../../../src/core/indexing/virtualviews/VirtualViewFilingJoin.ts"],"names":[],"mappings":";;;AAuBA,8DAEC;AA2JD,8CAsBC;AAnLD,SAAgB,yBAAyB,CAAC,QAAiB;IACzD,OAAO,OAAQ,QAAqC,EAAE,eAAe,KAAK,UAAU,CAAC;AACvF,CAAC;AAWD;;;;;;;GAOG;AACH,MAAa,qBAAqB;IAAlC;QACmB,WAAM,GAAmC,IAAI,GAAG,EAAE,CAAC;IA6HtE,CAAC;IA3HC,8DAA8D;IAC9D,GAAG,CAAC,IAAY,EAAE,MAAyB;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,uCAAuC,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,WAA8B,CAAC;QACnC,IAAI,UAAU,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAClE,WAAW,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAmE,CAAC;YACjF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,2CAA2C,CAAC,CAAC;YACvF,CAAC;YACD,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAC1B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAC3F,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,yCAAyC;IACzC,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,gDAAgD;IAChD,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5C,CAAC;IAED,gDAAgD;IAChD,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACnG,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,CAAC,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YACrD,CAAC;YACD,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3D,MAAM,CAAC,QAAQ,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;YACvE,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC3B,GAAG,GAAG,IAAI,CAAC;YACb,CAAC;iBAAM,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,iFAAiF;IACjF,SAAS,CAAC,IAAY,EAAE,OAAe;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC;IACxE,CAAC;IAED,kFAAkF;IAClF,SAAS,CAAC,IAAY,EAAE,QAAgB;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC;IACzE,CAAC;IAED,2EAA2E;IAC3E,OAAO;QACL,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,WAAW,CAAC,QAAoB;QAC9B,MAAM,YAAY,GAAsB,EAAE,CAAC;QAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,KAAK,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,GAAG,EAAE;YACV,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,MAAM,WAAW,IAAI,YAAY;gBAAE,WAAW,EAAE,CAAC;QACxD,CAAC,CAAC;IACJ,CAAC;IAED,WAAW;QACT,MAAM,KAAK,GAAoB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,KAAkC;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,MAAM,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACtG,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA9HD,sDA8HC;AAED,MAAM,UAAU,GAAsB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAExD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,MAAgD;IAEhD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAChE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IACE,SAAS,CAAC,IAAI,KAAK,WAAW;YAC9B,SAAS,CAAC,EAAE,KAAK,UAAU;YAC3B,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,SAAS;YACrC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,SAAS;YACrC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ;YAC3C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ;YAC3C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,EAC9B,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { VirtualView } from "./VirtualView";
|
|
2
|
+
import type { VirtualViewEntryData } from "./VirtualViewEntryData";
|
|
3
|
+
/**
|
|
4
|
+
* Position of a document entry in a merged read: its document sort key.
|
|
5
|
+
* JSON-serializable, so it can travel as a paging token.
|
|
6
|
+
*/
|
|
7
|
+
export interface MergedEntryKey {
|
|
8
|
+
/** Document sort values. */
|
|
9
|
+
v: unknown[];
|
|
10
|
+
/** Origin of the entry. */
|
|
11
|
+
o: string;
|
|
12
|
+
/** Document id of the entry. */
|
|
13
|
+
d: string;
|
|
14
|
+
}
|
|
15
|
+
/** One page of a merged read. */
|
|
16
|
+
export interface MergedNavigatorPage {
|
|
17
|
+
entries: VirtualViewEntryData[];
|
|
18
|
+
/**
|
|
19
|
+
* Key of the last returned entry — pass it as `after` (forward) or
|
|
20
|
+
* `before` (backward) to read the next page; `null` when the read
|
|
21
|
+
* reached the end.
|
|
22
|
+
*/
|
|
23
|
+
nextKey: MergedEntryKey | null;
|
|
24
|
+
}
|
|
25
|
+
/** Options of {@link VirtualViewMergedNavigator}. */
|
|
26
|
+
export interface MergedNavigatorOptions {
|
|
27
|
+
/** Optional visibility filter (e.g. reader checks); hidden entries are skipped. */
|
|
28
|
+
accessCheck?: (entry: VirtualViewEntryData) => boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Reads the documents of SEVERAL categories of one view as one sorted list
|
|
32
|
+
* — a k-way merge over the document sort columns. All categories of a view
|
|
33
|
+
* share the same column design, so their documents' sort keys are
|
|
34
|
+
* comparable.
|
|
35
|
+
*
|
|
36
|
+
* Typical use: one persistent "mail by folder" view, where the folder is
|
|
37
|
+
* the first (multi-value) category, read as "inbox of accounts A and B" or
|
|
38
|
+
* "all folders named Projects" without rebuilding anything. A document in
|
|
39
|
+
* several of the read categories appears once: its occurrences share the
|
|
40
|
+
* same sort key (values, origin, doc id), so they meet in the merge and the
|
|
41
|
+
* duplicate is dropped.
|
|
42
|
+
*
|
|
43
|
+
* Only document entries are returned (sub-categories below the given
|
|
44
|
+
* categories are walked through; their documents are merged by the
|
|
45
|
+
* document sort columns, not grouped). Paging is key-based: a page costs
|
|
46
|
+
* O(page size × number of categories), plus a binary search per category
|
|
47
|
+
* to find the start (a category with sub-categories is collected and sorted
|
|
48
|
+
* first, O(n log n) in its size).
|
|
49
|
+
*/
|
|
50
|
+
export declare class VirtualViewMergedNavigator {
|
|
51
|
+
private readonly view;
|
|
52
|
+
private readonly paths;
|
|
53
|
+
private readonly accessCheck;
|
|
54
|
+
private current;
|
|
55
|
+
constructor(view: VirtualView, rootCategoryPaths: unknown[][], options?: MergedNavigatorOptions);
|
|
56
|
+
/**
|
|
57
|
+
* The category entries of the paths, resolved on every read: in a live
|
|
58
|
+
* view a category appears with its first document and is removed (and
|
|
59
|
+
* later re-created) with its last one.
|
|
60
|
+
*/
|
|
61
|
+
private get roots();
|
|
62
|
+
getView(): VirtualView;
|
|
63
|
+
/** The category entries that were found (missing paths are left out). */
|
|
64
|
+
getRootEntries(): VirtualViewEntryData[];
|
|
65
|
+
/**
|
|
66
|
+
* Sum of the documents below the categories — an upper bound of the
|
|
67
|
+
* merged count (documents in several of them count more than once).
|
|
68
|
+
* Use {@link countDocuments} for the exact number.
|
|
69
|
+
*/
|
|
70
|
+
getDocumentCountUpperBound(): number;
|
|
71
|
+
/** Exact number of distinct, visible documents (walks all of them). */
|
|
72
|
+
countDocuments(): number;
|
|
73
|
+
/** Comparator for document sort keys (any leaf category's child comparator). */
|
|
74
|
+
private comparator;
|
|
75
|
+
static keyOf(entry: VirtualViewEntryData): MergedEntryKey;
|
|
76
|
+
private static toSortKey;
|
|
77
|
+
/** The merged, de-duplicated document stream in one direction. */
|
|
78
|
+
documents(direction: "forward" | "backward", start: MergedEntryKey | null): Generator<VirtualViewEntryData>;
|
|
79
|
+
private readPage;
|
|
80
|
+
/** Read up to `limit` documents in view order, after `after` (exclusive). */
|
|
81
|
+
readForward(options?: {
|
|
82
|
+
after?: MergedEntryKey | null;
|
|
83
|
+
limit?: number;
|
|
84
|
+
}): MergedNavigatorPage;
|
|
85
|
+
/** Read up to `limit` documents in reverse view order, before `before` (exclusive). */
|
|
86
|
+
readBackward(options?: {
|
|
87
|
+
before?: MergedEntryKey | null;
|
|
88
|
+
limit?: number;
|
|
89
|
+
}): MergedNavigatorPage;
|
|
90
|
+
/** Iterate all documents forward (async, like `VirtualViewNavigator.entriesForward`). */
|
|
91
|
+
entriesForward(after?: MergedEntryKey | null): AsyncGenerator<VirtualViewEntryData>;
|
|
92
|
+
/** Iterate all documents backward. */
|
|
93
|
+
entriesBackward(before?: MergedEntryKey | null): AsyncGenerator<VirtualViewEntryData>;
|
|
94
|
+
getCurrentEntry(): VirtualViewEntryData | null;
|
|
95
|
+
gotoFirst(): boolean;
|
|
96
|
+
gotoLast(): boolean;
|
|
97
|
+
gotoNext(): boolean;
|
|
98
|
+
gotoPrev(): boolean;
|
|
99
|
+
/** Move the cursor to the document with this key (or the first after it). */
|
|
100
|
+
gotoKey(key: MergedEntryKey): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* The document at a tree position string of the underlying view (as
|
|
103
|
+
* returned by `entry.getPositionStr()`), when it belongs to one of the
|
|
104
|
+
* merged categories — so hosts can keep using ordinary positions as
|
|
105
|
+
* paging tokens. `null` otherwise.
|
|
106
|
+
*/
|
|
107
|
+
getPos(position: string): VirtualViewEntryData | null;
|
|
108
|
+
/** Move the cursor to the document at a tree position (see {@link getPos}). */
|
|
109
|
+
gotoPos(position: string): boolean;
|
|
110
|
+
private moveTo;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=VirtualViewMergedNavigator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VirtualViewMergedNavigator.d.ts","sourceRoot":"","sources":["../../../../src/core/indexing/virtualviews/VirtualViewMergedNavigator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAMnE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,CAAC,EAAE,OAAO,EAAE,CAAC;IACb,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,gCAAgC;IAChC,CAAC,EAAE,MAAM,CAAC;CACX;AAED,iCAAiC;AACjC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC;;;;OAIG;IACH,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;CAChC;AAED,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC,mFAAmF;IACnF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC;CACxD;AAyED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoD;IAChF,OAAO,CAAC,OAAO,CAAqC;gBAExC,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,sBAAsB;IAM/F;;;;OAIG;IACH,OAAO,KAAK,KAAK,GAUhB;IAED,OAAO,IAAI,WAAW;IAItB,yEAAyE;IACzE,cAAc,IAAI,oBAAoB,EAAE;IAIxC;;;;OAIG;IACH,0BAA0B,IAAI,MAAM;IAIpC,uEAAuE;IACvE,cAAc,IAAI,MAAM;IAQxB,gFAAgF;IAChF,OAAO,CAAC,UAAU;IAKlB,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc;IAKzD,OAAO,CAAC,MAAM,CAAC,SAAS;IAIxB,kEAAkE;IACjE,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC,oBAAoB,CAAC;IA0C5G,OAAO,CAAC,QAAQ;IAoBhB,6EAA6E;IAC7E,WAAW,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,mBAAmB;IAI7F,uFAAuF;IACvF,YAAY,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,mBAAmB;IAI/F,yFAAyF;IAClF,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,cAAc,CAAC,oBAAoB,CAAC;IAI1F,sCAAsC;IAC/B,eAAe,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,cAAc,CAAC,oBAAoB,CAAC;IAM5F,eAAe,IAAI,oBAAoB,GAAG,IAAI;IAI9C,SAAS,IAAI,OAAO;IAIpB,QAAQ,IAAI,OAAO;IAInB,QAAQ,IAAI,OAAO;IAMnB,QAAQ,IAAI,OAAO;IAMnB,6EAA6E;IAC7E,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO;IAcrC;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;IAerD,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIlC,OAAO,CAAC,MAAM;CAKf"}
|