@dxos/echo-pipeline 0.8.2-staging.7ac8446 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{chunk-32WDI3LB.mjs → chunk-3XSXS5EX.mjs} +15 -21
- package/dist/lib/browser/chunk-3XSXS5EX.mjs.map +7 -0
- package/dist/lib/browser/chunk-CGS2ULMK.mjs +11 -0
- package/dist/lib/browser/chunk-CGS2ULMK.mjs.map +7 -0
- package/dist/lib/browser/chunk-TQJTKNMS.mjs +126 -0
- package/dist/lib/browser/chunk-TQJTKNMS.mjs.map +7 -0
- package/dist/lib/browser/filter/index.mjs +11 -0
- package/dist/lib/browser/filter/index.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1380 -516
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +202 -22
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node/chunk-HOPOFWAL.cjs +147 -0
- package/dist/lib/node/chunk-HOPOFWAL.cjs.map +7 -0
- package/dist/lib/node/chunk-Q7SFCCGT.cjs +33 -0
- package/dist/lib/node/chunk-Q7SFCCGT.cjs.map +7 -0
- package/dist/lib/node/{chunk-TC2PRBEU.cjs → chunk-SG2PL5RH.cjs} +18 -24
- package/dist/lib/node/chunk-SG2PL5RH.cjs.map +7 -0
- package/dist/lib/node/filter/index.cjs +32 -0
- package/dist/lib/node/filter/index.cjs.map +7 -0
- package/dist/lib/node/index.cjs +1381 -525
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +207 -31
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/lib/node-esm/{chunk-UKOLB3LW.mjs → chunk-3BZP75TJ.mjs} +15 -21
- package/dist/lib/node-esm/chunk-3BZP75TJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-RVK35BS7.mjs +126 -0
- package/dist/lib/node-esm/chunk-RVK35BS7.mjs.map +7 -0
- package/dist/lib/node-esm/filter/index.mjs +11 -0
- package/dist/lib/node-esm/filter/index.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +1380 -516
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +202 -22
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/automerge/automerge-host.d.ts +6 -4
- package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
- package/dist/types/src/automerge/collection-synchronizer.d.ts +1 -1
- package/dist/types/src/automerge/collection-synchronizer.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-data-monitor.d.ts +6 -6
- package/dist/types/src/automerge/echo-data-monitor.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-network-adapter.d.ts +4 -1
- package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
- package/dist/types/src/automerge/heads-store.d.ts +2 -2
- package/dist/types/src/automerge/heads-store.d.ts.map +1 -1
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts +1 -1
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts.map +1 -1
- package/dist/types/src/automerge/mesh-echo-replicator-connection.d.ts.map +1 -1
- package/dist/types/src/automerge/mesh-echo-replicator.d.ts.map +1 -1
- package/dist/types/src/automerge/network-protocol.d.ts +1 -1
- package/dist/types/src/automerge/network-protocol.d.ts.map +1 -1
- package/dist/types/src/automerge/space-collection.d.ts +1 -1
- package/dist/types/src/automerge/space-collection.d.ts.map +1 -1
- package/dist/types/src/common/feeds.d.ts.map +1 -1
- package/dist/types/src/common/space-id.d.ts.map +1 -1
- package/dist/types/src/db-host/automerge-metrics.d.ts +1 -1
- package/dist/types/src/db-host/automerge-metrics.d.ts.map +1 -1
- package/dist/types/src/db-host/data-service.d.ts.map +1 -1
- package/dist/types/src/db-host/database-root.d.ts +7 -7
- package/dist/types/src/db-host/database-root.d.ts.map +1 -1
- package/dist/types/src/db-host/documents-iterator.d.ts +1 -1
- package/dist/types/src/db-host/documents-iterator.d.ts.map +1 -1
- package/dist/types/src/db-host/documents-synchronizer.d.ts +4 -4
- package/dist/types/src/db-host/documents-synchronizer.d.ts.map +1 -1
- package/dist/types/src/db-host/echo-host.d.ts +13 -2
- package/dist/types/src/db-host/echo-host.d.ts.map +1 -1
- package/dist/types/src/db-host/index.d.ts +0 -1
- package/dist/types/src/db-host/index.d.ts.map +1 -1
- package/dist/types/src/db-host/query-service.d.ts +2 -0
- package/dist/types/src/db-host/query-service.d.ts.map +1 -1
- package/dist/types/src/db-host/space-state-manager.d.ts +4 -3
- package/dist/types/src/db-host/space-state-manager.d.ts.map +1 -1
- package/dist/types/src/edge/echo-edge-replicator.d.ts.map +1 -1
- package/dist/types/src/edge/inflight-request-limiter.d.ts.map +1 -1
- package/dist/types/src/filter/filter-match.d.ts +13 -0
- package/dist/types/src/filter/filter-match.d.ts.map +1 -0
- package/dist/types/src/filter/filter-match.test.d.ts +2 -0
- package/dist/types/src/filter/filter-match.test.d.ts.map +1 -0
- package/dist/types/src/filter/index.d.ts +2 -0
- package/dist/types/src/filter/index.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
- package/dist/types/src/pipeline/message-selector.d.ts.map +1 -1
- package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
- package/dist/types/src/pipeline/timeframe-clock.d.ts.map +1 -1
- package/dist/types/src/query/errors.d.ts +23 -0
- package/dist/types/src/query/errors.d.ts.map +1 -0
- package/dist/types/src/query/index.d.ts +5 -0
- package/dist/types/src/query/index.d.ts.map +1 -0
- package/dist/types/src/query/plan.d.ts +132 -0
- package/dist/types/src/query/plan.d.ts.map +1 -0
- package/dist/types/src/query/query-executor.d.ts +83 -0
- package/dist/types/src/query/query-executor.d.ts.map +1 -0
- package/dist/types/src/query/query-planner.d.ts +33 -0
- package/dist/types/src/query/query-planner.d.ts.map +1 -0
- package/dist/types/src/query/query-planner.test.d.ts +2 -0
- package/dist/types/src/query/query-planner.test.d.ts.map +1 -0
- package/dist/types/src/space/admission-discovery-extension.d.ts.map +1 -1
- package/dist/types/src/space/control-pipeline.d.ts.map +1 -1
- package/dist/types/src/space/space-manager.d.ts.map +1 -1
- package/dist/types/src/space/space-protocol.d.ts.map +1 -1
- package/dist/types/src/space/space.d.ts.map +1 -1
- package/dist/types/src/testing/change-metadata.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-data.d.ts +18 -0
- package/dist/types/src/testing/test-data.d.ts.map +1 -0
- package/dist/types/src/testing/test-network-adapter.d.ts +3 -2
- package/dist/types/src/testing/test-network-adapter.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +39 -0
- package/dist/types/src/testing/test-schema.d.ts.map +1 -0
- package/dist/types/src/util.d.ts +2 -2
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +43 -34
- package/src/automerge/automerge-host.test.ts +7 -7
- package/src/automerge/automerge-host.ts +58 -60
- package/src/automerge/automerge-repo.test.ts +65 -65
- package/src/automerge/collection-synchronizer.test.ts +1 -1
- package/src/automerge/collection-synchronizer.ts +11 -10
- package/src/automerge/echo-data-monitor.ts +21 -20
- package/src/automerge/echo-network-adapter.test.ts +1 -1
- package/src/automerge/echo-network-adapter.ts +25 -18
- package/src/automerge/heads-store.ts +4 -3
- package/src/automerge/leveldb-storage-adapter.ts +1 -1
- package/src/automerge/mesh-echo-replicator-connection.ts +6 -5
- package/src/automerge/mesh-echo-replicator.ts +2 -2
- package/src/automerge/network-protocol.ts +2 -1
- package/src/automerge/space-collection.ts +2 -1
- package/src/db-host/automerge-metrics.ts +2 -1
- package/src/db-host/data-service.ts +4 -3
- package/src/db-host/database-root.ts +17 -22
- package/src/db-host/documents-iterator.ts +9 -8
- package/src/db-host/documents-synchronizer.test.ts +2 -2
- package/src/db-host/documents-synchronizer.ts +20 -18
- package/src/db-host/echo-host.ts +44 -15
- package/src/db-host/index.ts +0 -1
- package/src/db-host/query-service.ts +43 -37
- package/src/db-host/space-state-manager.ts +14 -4
- package/src/edge/echo-edge-replicator.test.ts +3 -3
- package/src/edge/echo-edge-replicator.ts +9 -8
- package/src/edge/inflight-request-limiter.ts +4 -4
- package/src/filter/filter-match.test.ts +101 -0
- package/src/filter/filter-match.ts +174 -0
- package/src/filter/index.ts +5 -0
- package/src/index.ts +1 -0
- package/src/metadata/metadata-store.ts +13 -13
- package/src/pipeline/pipeline-stress.test.ts +9 -9
- package/src/pipeline/pipeline.ts +13 -13
- package/src/pipeline/timeframe-clock.ts +5 -5
- package/src/query/errors.ts +7 -0
- package/src/query/index.ts +8 -0
- package/src/query/plan.ts +179 -0
- package/src/query/query-executor.ts +648 -0
- package/src/query/query-planner.test.ts +613 -0
- package/src/query/query-planner.ts +470 -0
- package/src/space/admission-discovery-extension.ts +2 -2
- package/src/space/control-pipeline.ts +8 -8
- package/src/space/space-manager.ts +5 -4
- package/src/space/space-protocol.browser.test.ts +1 -0
- package/src/space/space-protocol.test.ts +1 -0
- package/src/space/space-protocol.ts +4 -4
- package/src/space/space.ts +5 -5
- package/src/testing/index.ts +2 -0
- package/src/testing/test-agent-builder.ts +6 -6
- package/src/testing/test-data.ts +127 -0
- package/src/testing/test-network-adapter.ts +15 -12
- package/src/testing/test-replicator.ts +2 -2
- package/src/testing/test-schema.ts +53 -0
- package/src/util.ts +7 -3
- package/dist/lib/browser/chunk-32WDI3LB.mjs.map +0 -7
- package/dist/lib/node/chunk-TC2PRBEU.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-UKOLB3LW.mjs.map +0 -7
- package/dist/types/src/db-host/query-state.d.ts +0 -41
- package/dist/types/src/db-host/query-state.d.ts.map +0 -1
- package/src/db-host/query-state.ts +0 -217
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { Resource } from '@dxos/context';
|
|
2
|
-
import { type Indexer } from '@dxos/indexing';
|
|
3
|
-
import { type Filter as FilterProto } from '@dxos/protocols/proto/dxos/echo/filter';
|
|
4
|
-
import { type QueryRequest, type QueryResult } from '@dxos/protocols/proto/dxos/echo/query';
|
|
5
|
-
import { type AutomergeHost } from '../automerge';
|
|
6
|
-
type QueryStateParams = {
|
|
7
|
-
indexer: Indexer;
|
|
8
|
-
automergeHost: AutomergeHost;
|
|
9
|
-
request: QueryRequest;
|
|
10
|
-
};
|
|
11
|
-
type QueryRunResult = {
|
|
12
|
-
changed: boolean;
|
|
13
|
-
};
|
|
14
|
-
export type QueryMetrics = {
|
|
15
|
-
objectsReturned: number;
|
|
16
|
-
objectsReturnedFromIndex: number;
|
|
17
|
-
documentsLoaded: number;
|
|
18
|
-
executionTime: number;
|
|
19
|
-
indexQueryTime: number;
|
|
20
|
-
documentLoadTime: number;
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Manages querying logic on service side.
|
|
24
|
-
*/
|
|
25
|
-
export declare class QueryState extends Resource {
|
|
26
|
-
private readonly _params;
|
|
27
|
-
private _results;
|
|
28
|
-
/**
|
|
29
|
-
* Metrics are only captured for the first run of the query since that is the most representative.
|
|
30
|
-
* We plan to change the query logic so that reactive updates do not require a full re-run of the query.
|
|
31
|
-
*/
|
|
32
|
-
private _firstRun;
|
|
33
|
-
readonly filter: FilterProto;
|
|
34
|
-
metrics: QueryMetrics;
|
|
35
|
-
get active(): boolean;
|
|
36
|
-
constructor(_params: QueryStateParams);
|
|
37
|
-
getResults(): QueryResult[];
|
|
38
|
-
execQuery(): Promise<QueryRunResult>;
|
|
39
|
-
}
|
|
40
|
-
export {};
|
|
41
|
-
//# sourceMappingURL=query-state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-state.d.ts","sourceRoot":"","sources":["../../../../src/db-host/query-state.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2B,QAAQ,EAAE,MAAM,eAAe,CAAC;AAElE,OAAO,EAAE,KAAK,OAAO,EAAmB,MAAM,gBAAgB,CAAC;AAI/D,OAAO,EAAE,KAAK,MAAM,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAI5F,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEtE,KAAK,gBAAgB,GAAG;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,qBACa,UAAW,SAAQ,QAAQ;IA2B1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IA1BpC,OAAO,CAAC,QAAQ,CAAqB;IAErC;;;OAGG;IACH,OAAO,CAAC,SAAS,CAAQ;IAEzB,SACgB,MAAM,EAAE,WAAW,CAAC;IAG7B,OAAO,EAAE,YAAY,CAO1B;IAEF,IACI,MAAM,YAET;gBAE4B,OAAO,EAAE,gBAAgB;IAKtD,UAAU;IAMJ,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;CAoG3C"}
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { type DocumentId } from '@dxos/automerge/automerge-repo';
|
|
6
|
-
import { Context, LifecycleState, Resource } from '@dxos/context';
|
|
7
|
-
import { createIdFromSpaceKey, type SpaceDoc } from '@dxos/echo-protocol';
|
|
8
|
-
import { type Indexer, type IndexQuery } from '@dxos/indexing';
|
|
9
|
-
import { invariant } from '@dxos/invariant';
|
|
10
|
-
import { DXN, PublicKey } from '@dxos/keys';
|
|
11
|
-
import { objectPointerCodec } from '@dxos/protocols';
|
|
12
|
-
import { type Filter as FilterProto } from '@dxos/protocols/proto/dxos/echo/filter';
|
|
13
|
-
import { type QueryRequest, type QueryResult } from '@dxos/protocols/proto/dxos/echo/query';
|
|
14
|
-
import { trace } from '@dxos/tracing';
|
|
15
|
-
import { isNonNullable } from '@dxos/util';
|
|
16
|
-
|
|
17
|
-
import { type AutomergeHost, getSpaceKeyFromDoc } from '../automerge';
|
|
18
|
-
|
|
19
|
-
type QueryStateParams = {
|
|
20
|
-
indexer: Indexer;
|
|
21
|
-
automergeHost: AutomergeHost;
|
|
22
|
-
request: QueryRequest;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
type QueryRunResult = {
|
|
26
|
-
changed: boolean;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export type QueryMetrics = {
|
|
30
|
-
objectsReturned: number;
|
|
31
|
-
objectsReturnedFromIndex: number;
|
|
32
|
-
documentsLoaded: number;
|
|
33
|
-
executionTime: number;
|
|
34
|
-
indexQueryTime: number;
|
|
35
|
-
documentLoadTime: number;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Manages querying logic on service side.
|
|
40
|
-
*/
|
|
41
|
-
@trace.resource()
|
|
42
|
-
export class QueryState extends Resource {
|
|
43
|
-
private _results: QueryResult[] = [];
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Metrics are only captured for the first run of the query since that is the most representative.
|
|
47
|
-
* We plan to change the query logic so that reactive updates do not require a full re-run of the query.
|
|
48
|
-
*/
|
|
49
|
-
private _firstRun = true;
|
|
50
|
-
|
|
51
|
-
@trace.info({ depth: null })
|
|
52
|
-
public readonly filter: FilterProto;
|
|
53
|
-
|
|
54
|
-
@trace.info()
|
|
55
|
-
public metrics: QueryMetrics = {
|
|
56
|
-
objectsReturned: 0,
|
|
57
|
-
objectsReturnedFromIndex: 0,
|
|
58
|
-
documentsLoaded: 0,
|
|
59
|
-
executionTime: 0,
|
|
60
|
-
indexQueryTime: 0,
|
|
61
|
-
documentLoadTime: 0,
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
@trace.info()
|
|
65
|
-
get active() {
|
|
66
|
-
return this._lifecycleState === LifecycleState.OPEN;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
constructor(private readonly _params: QueryStateParams) {
|
|
70
|
-
super();
|
|
71
|
-
this.filter = _params.request.filter;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
getResults() {
|
|
75
|
-
return this._results;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// https://github.com/open-telemetry/semantic-conventions/blob/main/docs/attributes-registry/db.md#generic-database-attributes
|
|
79
|
-
@trace.span({ showInBrowserTimeline: true, op: 'db.query', attributes: { 'db.system': 'echo' } })
|
|
80
|
-
async execQuery(): Promise<QueryRunResult> {
|
|
81
|
-
const filter = this._params.request.filter;
|
|
82
|
-
|
|
83
|
-
const beginQuery = performance.now();
|
|
84
|
-
|
|
85
|
-
// For object id filters, we return no results as those are handled by the SpaceQuerySource.
|
|
86
|
-
const hits =
|
|
87
|
-
filter.objectIds && filter.objectIds?.length > 0
|
|
88
|
-
? []
|
|
89
|
-
: await this._params.indexer.execQuery(filterToIndexQuery(filter));
|
|
90
|
-
if (this._firstRun) {
|
|
91
|
-
this.metrics.indexQueryTime = performance.now() - beginQuery;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const beginFilter = performance.now();
|
|
95
|
-
|
|
96
|
-
const results: QueryResult[] = (
|
|
97
|
-
await Promise.all(
|
|
98
|
-
hits.map(async (result) => {
|
|
99
|
-
if (this._firstRun) {
|
|
100
|
-
this.metrics.objectsReturnedFromIndex++;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const { objectId, documentId, spaceKey: spaceKeyInIndex } = objectPointerCodec.decode(result.id);
|
|
104
|
-
|
|
105
|
-
let spaceKey: string | null;
|
|
106
|
-
if (spaceKeyInIndex !== undefined) {
|
|
107
|
-
spaceKey = spaceKeyInIndex;
|
|
108
|
-
} else {
|
|
109
|
-
// Indexes created by older versions of the indexer do not have the spaceKey in the index.
|
|
110
|
-
// If the spaceKey is not in the index, we need to load the document to get it.
|
|
111
|
-
|
|
112
|
-
if (this._firstRun) {
|
|
113
|
-
this.metrics.documentsLoaded++;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const handle = await this._params.automergeHost.loadDoc<SpaceDoc>(
|
|
117
|
-
Context.default(),
|
|
118
|
-
documentId as DocumentId,
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
// `whenReady` creates a timeout so we guard it with an if to skip it if the handle is already ready.
|
|
122
|
-
if (this._ctx.disposed) {
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
spaceKey = getSpaceKeyFromDoc(handle.docSync()!);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (!spaceKey) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
// TODO(mykola): Remove business logic from here.
|
|
132
|
-
if (
|
|
133
|
-
this._params.request.filter.options?.spaces?.length &&
|
|
134
|
-
!this._params.request.filter.options.spaces.some((key) => key.equals(spaceKey!))
|
|
135
|
-
) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (this._firstRun) {
|
|
140
|
-
this.metrics.objectsReturned++;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return {
|
|
144
|
-
id: objectId,
|
|
145
|
-
documentId,
|
|
146
|
-
spaceId: await createIdFromSpaceKey(PublicKey.from(spaceKey)),
|
|
147
|
-
spaceKey: PublicKey.from(spaceKey),
|
|
148
|
-
rank: result.rank,
|
|
149
|
-
} satisfies QueryResult;
|
|
150
|
-
}),
|
|
151
|
-
)
|
|
152
|
-
).filter(isNonNullable);
|
|
153
|
-
|
|
154
|
-
if (this._firstRun) {
|
|
155
|
-
this.metrics.documentLoadTime = performance.now() - beginFilter;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (this._ctx.disposed) {
|
|
159
|
-
return { changed: false };
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const areResultsUnchanged =
|
|
163
|
-
!this._firstRun &&
|
|
164
|
-
this._results.length === results.length &&
|
|
165
|
-
this._results.every((oldResult) => results.some((result) => result.id === oldResult.id)) &&
|
|
166
|
-
results.every((result) => this._results.some((oldResult) => oldResult.id === result.id));
|
|
167
|
-
|
|
168
|
-
if (this._firstRun) {
|
|
169
|
-
this.metrics.executionTime = performance.now() - beginQuery;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
this._firstRun = false;
|
|
173
|
-
if (areResultsUnchanged) {
|
|
174
|
-
return { changed: false };
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
this._results = results;
|
|
178
|
-
return { changed: true };
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// TODO(burdon): Process Filter DSL.
|
|
183
|
-
const filterToIndexQuery = (filter: FilterProto): IndexQuery => {
|
|
184
|
-
invariant(!(filter.type && (filter.or ?? []).length > 0), 'Cannot mix type and or filters.');
|
|
185
|
-
invariant(
|
|
186
|
-
(filter.or ?? []).every((subFilter) => !(subFilter.type && (subFilter.or ?? []).length > 0)),
|
|
187
|
-
'Cannot mix type and or filters.',
|
|
188
|
-
);
|
|
189
|
-
if (
|
|
190
|
-
filter.type ||
|
|
191
|
-
((filter.or ?? []).length > 0 && (filter.or ?? []).every((subFilter) => !subFilter.not && subFilter.type))
|
|
192
|
-
) {
|
|
193
|
-
return {
|
|
194
|
-
typenames:
|
|
195
|
-
filter.type && filter.type.length > 0
|
|
196
|
-
? filter.type.map((type) => dxnToIndexerTypename(DXN.parse(type)))
|
|
197
|
-
: (filter.or ?? [])
|
|
198
|
-
.flatMap((f) => f.type?.map((type) => dxnToIndexerTypename(DXN.parse(type))) ?? [])
|
|
199
|
-
.filter(isNonNullable),
|
|
200
|
-
inverted: filter.not,
|
|
201
|
-
};
|
|
202
|
-
} else {
|
|
203
|
-
// Query all objects.
|
|
204
|
-
return { typenames: [] };
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
const dxnToIndexerTypename = (dxn: DXN) => {
|
|
209
|
-
switch (dxn.kind) {
|
|
210
|
-
case DXN.kind.TYPE:
|
|
211
|
-
return dxn.parts[0];
|
|
212
|
-
case DXN.kind.ECHO:
|
|
213
|
-
return dxn.parts[1];
|
|
214
|
-
default:
|
|
215
|
-
throw new Error(`Invalid DXN kind: ${dxn.kind}`);
|
|
216
|
-
}
|
|
217
|
-
};
|