@peerbit/indexer-interface 3.0.5 → 3.0.6
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/src/index-engine.d.ts +11 -0
- package/dist/src/index-engine.d.ts.map +1 -1
- package/dist/src/index-engine.js.map +1 -1
- package/dist/src/utils.d.ts +20 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +67 -1
- package/dist/src/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/index-engine.ts +11 -0
- package/src/utils.ts +77 -0
|
@@ -51,6 +51,17 @@ export type IndexIterator<T extends Record<string, any>, S extends Shape | undef
|
|
|
51
51
|
done: () => boolean | undefined;
|
|
52
52
|
pending: () => MaybePromise<number>;
|
|
53
53
|
close: () => MaybePromise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Mark results claimed or enqueued by a higher-level live-update path as
|
|
56
|
+
* consumed by this iterator.
|
|
57
|
+
*
|
|
58
|
+
* Mutable iterators can implement this hook to keep subsequent pages and
|
|
59
|
+
* pending counts from returning those same ids again. Callers must only mark
|
|
60
|
+
* ids once another delivery path owns them (for example, after enqueueing a
|
|
61
|
+
* local result or successfully sending a remote push). Snapshot iterators may
|
|
62
|
+
* omit this hook.
|
|
63
|
+
*/
|
|
64
|
+
markYielded?: (ids: Iterable<IdKey>) => MaybePromise<void>;
|
|
54
65
|
};
|
|
55
66
|
/**
|
|
56
67
|
* Public data APIs require an open index and should throw NotStartedError after
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-engine.d.ts","sourceRoot":"","sources":["../../src/index-engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index-engine.d.ts","sourceRoot":"","sources":["../../src/index-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElD,KAAK,YAAY,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE7C,MAAM,WAAW,aAAa,CAC7B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAEnD,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,CAAC,CAAC;CACT;AAED,MAAM,MAAM,cAAc,CACzB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAChD,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;AAEvB,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACpD,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IACjC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;CAC9E,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AACF,MAAM,MAAM,yBAAyB,CAAC,CAAC,EAAE,CAAC,IAAI;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CAExB,CAAC;AAYF,MAAM,MAAM,KAAK,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,EAAE,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,GAC5C,GAAG,GACH,CAAC,SAAS,KAAK,EAAE,GAChB,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAC5B,CAAC,SAAS,KAAK,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACzC,KAAK,CAAC;AAEX,MAAM,MAAM,mBAAmB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,GACpD,eAAe,CAAC,CAAC,CAAC,GAClB,CAAC,CAAC;AAEL,MAAM,MAAM,aAAa,CACxB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,KAAK,GAAG,SAAS,IACxB;IACH,IAAI,EAAE,CACL,MAAM,EAAE,MAAM,KACV,YAAY,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,GAAG,EAAE,MAAM,YAAY,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAC3D,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,GAAG;IACrE,IAAI,CACH,UAAU,EAAE,yBAAyB,CAAC,CAAC,EAAE,UAAU,CAAC,GAClD,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACtC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3B,GAAG,CACF,EAAE,EAAE,KAAK,EACT,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,GACxB,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC9C,GAAG,CACF,KAAK,EAAE,CAAC,EACR,EAAE,CAAC,EAAE,KAAK,EACV,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,OAAO,CAAC;KAClB,GACC,YAAY,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3C,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;IACjD,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACtD,KAAK,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC,SAAS,KAAK,GAAG,SAAS,GAAG,SAAS,EAC9C,OAAO,CAAC,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC1C,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvB,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,SAAS,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,GAC5B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,KAAK,GAAG,SAAS,EAE3B,GAAG,WAAW,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KACjC,aAAa,CAAC,CAAC,EAAE,CAAC,CAiDpB,CAAC;AAEF,MAAM,WAAW,OAAO;IACvB,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,EAC7C,UAAU,EAAE,yBAAyB,CAAC,CAAC,EAAE,UAAU,CAAC,GAClD,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC3C,SAAS,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-engine.js","sourceRoot":"","sources":["../../src/index-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index-engine.js","sourceRoot":"","sources":["../../src/index-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,MAAM,SAAS,CAAC;AA0IrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAI/B,GAAG,SAAgC,EACb,EAAE;IACxB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC;IACzC,IAAI,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QACpC,IAAI,GAAG,GAA8C,EAAE,CAAC;QACxD,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAElB,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpB,CAAC,EAAE,CAAC;gBACJ,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;oBAC3B,MAAM;gBACP,CAAC;gBACD,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM;YACP,CAAC;QACF,CAAC;QAED,OAAO,GAAG,CAAC;IACZ,CAAC,CAAC;IACF,OAAO;QACN,IAAI;QACJ,IAAI;QACJ,KAAK,EAAE,KAAK,IAAI,EAAE;YACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAClC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACF,CAAC;QACD,GAAG,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,KAAK,MAAM,OAAO,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;YACF,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAC/C,CAAC;YACF,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;KACD,CAAC;AACH,CAAC,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;gIAqBgI"}
|
package/dist/src/utils.d.ts
CHANGED
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
import { type AbstractType, type CustomField, type SimpleField } from "@dao-xyz/borsh";
|
|
2
|
+
import { type IdKey } from "./id.js";
|
|
2
3
|
import { type Sort } from "./query.js";
|
|
4
|
+
/**
|
|
5
|
+
* Break sort ties by the document primary-key id using the id's NATURAL TYPED
|
|
6
|
+
* order, so equal-sort-key results order identically to the default sqlite3
|
|
7
|
+
* backend (which scans its primary-key index):
|
|
8
|
+
* - integer ids (number/bigint) compare NUMERICALLY (sqlite INTEGER: 2 < 10)
|
|
9
|
+
* - byte ids (Uint8Array) compare by raw memcmp (sqlite BLOB)
|
|
10
|
+
* - string ids compare as UTF-8 bytes (sqlite TEXT / BINARY
|
|
11
|
+
* collation) — deliberately NOT localeCompare,
|
|
12
|
+
* whose locale-aware order diverges from sqlite.
|
|
13
|
+
* A single index only ever holds one id kind; the kind-rank fallback is a
|
|
14
|
+
* defensive tie-breaker for mixed kinds. Returns a negative/zero/positive number
|
|
15
|
+
* suitable for Array.prototype.sort. Callers reverse the result when the primary
|
|
16
|
+
* (last) sort field is DESC so ties follow the scan direction.
|
|
17
|
+
*/
|
|
18
|
+
export declare const compareIds: (a: IdKey, b: IdKey) => number;
|
|
3
19
|
export declare const stringArraysEquals: (a: string[] | string, b: string[] | string) => boolean;
|
|
4
|
-
export declare const extractSortCompare: (a: Record<string, any>, b: Record<string, any>, sorts: Sort[], aliases?: Map<string, string
|
|
20
|
+
export declare const extractSortCompare: (a: Record<string, any>, b: Record<string, any>, sorts: Sort[], aliases?: Map<string, string>, ids?: {
|
|
21
|
+
a: IdKey;
|
|
22
|
+
b: IdKey;
|
|
23
|
+
}) => number;
|
|
5
24
|
export declare const sortCompare: (av: any, bv: any) => number;
|
|
6
25
|
export declare const extractFieldValue: <T>(doc: any, path: string[], aliases?: Map<string, string>) => T;
|
|
7
26
|
export declare function id(properties: SimpleField | CustomField<any>): (targetOrValue: any, nameOrContext: any) => any;
|
package/dist/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,IAAI,EAAiB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,IAAI,EAAiB,MAAM,YAAY,CAAC;AAwBtD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,UAAU,GAAI,GAAG,KAAK,EAAE,GAAG,KAAK,KAAG,MAuB/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC9B,GAAG,MAAM,EAAE,GAAG,MAAM,EACpB,GAAG,MAAM,EAAE,GAAG,MAAM,YAWpB,CAAC;AAaF,eAAO,MAAM,kBAAkB,GAC9B,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtB,OAAO,IAAI,EAAE,EACb,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM;IAAE,CAAC,EAAE,KAAK,CAAC;IAAC,CAAC,EAAE,KAAK,CAAA;CAAE,WA6B5B,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,IAAI,GAAG,EAAE,IAAI,GAAG,WAU3C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAClC,KAAK,GAAG,EACR,MAAM,MAAM,EAAE,EACd,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,CAKF,CAAC;AAkCF,wBAAgB,EAAE,CAAC,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,IAEpD,eAAe,GAAG,EAAE,eAAe,GAAG,SAe9C;AAkBD,eAAO,MAAM,aAAa,GACzB,OAAO,YAAY,CAAC,GAAG,CAAC,KACtB,MAAM,EAAE,GAAG,SAwBb,CAAC"}
|
package/dist/src/utils.js
CHANGED
|
@@ -1,5 +1,58 @@
|
|
|
1
1
|
import { field, getSchema, } from "@dao-xyz/borsh";
|
|
2
|
+
import {} from "./id.js";
|
|
2
3
|
import { SortDirection } from "./query.js";
|
|
4
|
+
const idByteEncoder = new TextEncoder();
|
|
5
|
+
const compareBytes = (a, b) => {
|
|
6
|
+
const length = Math.min(a.length, b.length);
|
|
7
|
+
for (let i = 0; i < length; i++) {
|
|
8
|
+
if (a[i] !== b[i]) {
|
|
9
|
+
return a[i] < b[i] ? -1 : 1;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return a.length - b.length;
|
|
13
|
+
};
|
|
14
|
+
const idKindRank = (key) => {
|
|
15
|
+
if (typeof key === "number" || typeof key === "bigint") {
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
if (key instanceof Uint8Array) {
|
|
19
|
+
return 1;
|
|
20
|
+
}
|
|
21
|
+
return 2;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Break sort ties by the document primary-key id using the id's NATURAL TYPED
|
|
25
|
+
* order, so equal-sort-key results order identically to the default sqlite3
|
|
26
|
+
* backend (which scans its primary-key index):
|
|
27
|
+
* - integer ids (number/bigint) compare NUMERICALLY (sqlite INTEGER: 2 < 10)
|
|
28
|
+
* - byte ids (Uint8Array) compare by raw memcmp (sqlite BLOB)
|
|
29
|
+
* - string ids compare as UTF-8 bytes (sqlite TEXT / BINARY
|
|
30
|
+
* collation) — deliberately NOT localeCompare,
|
|
31
|
+
* whose locale-aware order diverges from sqlite.
|
|
32
|
+
* A single index only ever holds one id kind; the kind-rank fallback is a
|
|
33
|
+
* defensive tie-breaker for mixed kinds. Returns a negative/zero/positive number
|
|
34
|
+
* suitable for Array.prototype.sort. Callers reverse the result when the primary
|
|
35
|
+
* (last) sort field is DESC so ties follow the scan direction.
|
|
36
|
+
*/
|
|
37
|
+
export const compareIds = (a, b) => {
|
|
38
|
+
const ak = a.key;
|
|
39
|
+
const bk = b.key;
|
|
40
|
+
if ((typeof ak === "number" || typeof ak === "bigint") &&
|
|
41
|
+
(typeof bk === "number" || typeof bk === "bigint")) {
|
|
42
|
+
// Compare as bigint so a mixed number/bigint pair (u32 IntegerKey vs u64
|
|
43
|
+
// LargeIntegerKey) still orders by true numeric value.
|
|
44
|
+
const an = BigInt(ak);
|
|
45
|
+
const bn = BigInt(bk);
|
|
46
|
+
return an < bn ? -1 : an > bn ? 1 : 0;
|
|
47
|
+
}
|
|
48
|
+
if (ak instanceof Uint8Array && bk instanceof Uint8Array) {
|
|
49
|
+
return compareBytes(ak, bk);
|
|
50
|
+
}
|
|
51
|
+
if (typeof ak === "string" && typeof bk === "string") {
|
|
52
|
+
return compareBytes(idByteEncoder.encode(ak), idByteEncoder.encode(bk));
|
|
53
|
+
}
|
|
54
|
+
return idKindRank(ak) - idKindRank(bk);
|
|
55
|
+
};
|
|
3
56
|
export const stringArraysEquals = (a, b) => {
|
|
4
57
|
if (a.length !== b.length) {
|
|
5
58
|
return false;
|
|
@@ -22,7 +75,7 @@ export const stringArraysEquals = (a, b) => {
|
|
|
22
75
|
return arr;
|
|
23
76
|
};
|
|
24
77
|
*/
|
|
25
|
-
export const extractSortCompare = (a, b, sorts, aliases) => {
|
|
78
|
+
export const extractSortCompare = (a, b, sorts, aliases, ids) => {
|
|
26
79
|
for (const sort of sorts) {
|
|
27
80
|
const av = extractFieldValue(a, sort.key, aliases);
|
|
28
81
|
const bv = extractFieldValue(b, sort.key, aliases);
|
|
@@ -36,6 +89,19 @@ export const extractSortCompare = (a, b, sorts, aliases) => {
|
|
|
36
89
|
}
|
|
37
90
|
}
|
|
38
91
|
}
|
|
92
|
+
// All sort fields compared equal: break the tie deterministically by the
|
|
93
|
+
// document primary-key id in its natural typed order, so the result order is
|
|
94
|
+
// content-deterministic and matches the default sqlite3 backend instead of
|
|
95
|
+
// depending on insertion order. The default backend scans its primary-key
|
|
96
|
+
// index in the sort direction, so reverse the id order when the primary (last)
|
|
97
|
+
// sort field is DESC.
|
|
98
|
+
if (ids) {
|
|
99
|
+
const idCmp = compareIds(ids.a, ids.b);
|
|
100
|
+
if (idCmp !== 0) {
|
|
101
|
+
const primaryDirection = sorts.length > 0 ? sorts[sorts.length - 1].direction : SortDirection.ASC;
|
|
102
|
+
return primaryDirection === SortDirection.DESC ? -idCmp : idCmp;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
39
105
|
return 0;
|
|
40
106
|
};
|
|
41
107
|
export const sortCompare = (av, bv) => {
|
package/dist/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,EACL,SAAS,GACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAa,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,CAAoB,EACpB,CAAoB,EACnB,EAAE;IACH,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACd,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,CAAsB,EACtB,CAAsB,EACtB,KAAa,EACb,OAA6B,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index-engine.ts
CHANGED
|
@@ -89,6 +89,17 @@ export type IndexIterator<
|
|
|
89
89
|
done: () => boolean | undefined;
|
|
90
90
|
pending: () => MaybePromise<number>;
|
|
91
91
|
close: () => MaybePromise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Mark results claimed or enqueued by a higher-level live-update path as
|
|
94
|
+
* consumed by this iterator.
|
|
95
|
+
*
|
|
96
|
+
* Mutable iterators can implement this hook to keep subsequent pages and
|
|
97
|
+
* pending counts from returning those same ids again. Callers must only mark
|
|
98
|
+
* ids once another delivery path owns them (for example, after enqueueing a
|
|
99
|
+
* local result or successfully sending a remote push). Snapshot iterators may
|
|
100
|
+
* omit this hook.
|
|
101
|
+
*/
|
|
102
|
+
markYielded?: (ids: Iterable<IdKey>) => MaybePromise<void>;
|
|
92
103
|
};
|
|
93
104
|
|
|
94
105
|
/**
|
package/src/utils.ts
CHANGED
|
@@ -5,8 +5,70 @@ import {
|
|
|
5
5
|
field,
|
|
6
6
|
getSchema,
|
|
7
7
|
} from "@dao-xyz/borsh";
|
|
8
|
+
import { type IdKey } from "./id.js";
|
|
8
9
|
import { type Sort, SortDirection } from "./query.js";
|
|
9
10
|
|
|
11
|
+
const idByteEncoder = new TextEncoder();
|
|
12
|
+
|
|
13
|
+
const compareBytes = (a: Uint8Array, b: Uint8Array): number => {
|
|
14
|
+
const length = Math.min(a.length, b.length);
|
|
15
|
+
for (let i = 0; i < length; i++) {
|
|
16
|
+
if (a[i] !== b[i]) {
|
|
17
|
+
return a[i] < b[i] ? -1 : 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return a.length - b.length;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const idKindRank = (key: string | number | bigint | Uint8Array): number => {
|
|
24
|
+
if (typeof key === "number" || typeof key === "bigint") {
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
if (key instanceof Uint8Array) {
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
return 2;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Break sort ties by the document primary-key id using the id's NATURAL TYPED
|
|
35
|
+
* order, so equal-sort-key results order identically to the default sqlite3
|
|
36
|
+
* backend (which scans its primary-key index):
|
|
37
|
+
* - integer ids (number/bigint) compare NUMERICALLY (sqlite INTEGER: 2 < 10)
|
|
38
|
+
* - byte ids (Uint8Array) compare by raw memcmp (sqlite BLOB)
|
|
39
|
+
* - string ids compare as UTF-8 bytes (sqlite TEXT / BINARY
|
|
40
|
+
* collation) — deliberately NOT localeCompare,
|
|
41
|
+
* whose locale-aware order diverges from sqlite.
|
|
42
|
+
* A single index only ever holds one id kind; the kind-rank fallback is a
|
|
43
|
+
* defensive tie-breaker for mixed kinds. Returns a negative/zero/positive number
|
|
44
|
+
* suitable for Array.prototype.sort. Callers reverse the result when the primary
|
|
45
|
+
* (last) sort field is DESC so ties follow the scan direction.
|
|
46
|
+
*/
|
|
47
|
+
export const compareIds = (a: IdKey, b: IdKey): number => {
|
|
48
|
+
const ak = a.key;
|
|
49
|
+
const bk = b.key;
|
|
50
|
+
if (
|
|
51
|
+
(typeof ak === "number" || typeof ak === "bigint") &&
|
|
52
|
+
(typeof bk === "number" || typeof bk === "bigint")
|
|
53
|
+
) {
|
|
54
|
+
// Compare as bigint so a mixed number/bigint pair (u32 IntegerKey vs u64
|
|
55
|
+
// LargeIntegerKey) still orders by true numeric value.
|
|
56
|
+
const an = BigInt(ak);
|
|
57
|
+
const bn = BigInt(bk);
|
|
58
|
+
return an < bn ? -1 : an > bn ? 1 : 0;
|
|
59
|
+
}
|
|
60
|
+
if (ak instanceof Uint8Array && bk instanceof Uint8Array) {
|
|
61
|
+
return compareBytes(ak, bk);
|
|
62
|
+
}
|
|
63
|
+
if (typeof ak === "string" && typeof bk === "string") {
|
|
64
|
+
return compareBytes(
|
|
65
|
+
idByteEncoder.encode(ak),
|
|
66
|
+
idByteEncoder.encode(bk),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return idKindRank(ak) - idKindRank(bk);
|
|
70
|
+
};
|
|
71
|
+
|
|
10
72
|
export const stringArraysEquals = (
|
|
11
73
|
a: string[] | string,
|
|
12
74
|
b: string[] | string,
|
|
@@ -38,6 +100,7 @@ export const extractSortCompare = (
|
|
|
38
100
|
b: Record<string, any>,
|
|
39
101
|
sorts: Sort[],
|
|
40
102
|
aliases?: Map<string, string>,
|
|
103
|
+
ids?: { a: IdKey; b: IdKey },
|
|
41
104
|
) => {
|
|
42
105
|
for (const sort of sorts) {
|
|
43
106
|
const av = extractFieldValue(a, sort.key, aliases);
|
|
@@ -51,6 +114,20 @@ export const extractSortCompare = (
|
|
|
51
114
|
}
|
|
52
115
|
}
|
|
53
116
|
}
|
|
117
|
+
// All sort fields compared equal: break the tie deterministically by the
|
|
118
|
+
// document primary-key id in its natural typed order, so the result order is
|
|
119
|
+
// content-deterministic and matches the default sqlite3 backend instead of
|
|
120
|
+
// depending on insertion order. The default backend scans its primary-key
|
|
121
|
+
// index in the sort direction, so reverse the id order when the primary (last)
|
|
122
|
+
// sort field is DESC.
|
|
123
|
+
if (ids) {
|
|
124
|
+
const idCmp = compareIds(ids.a, ids.b);
|
|
125
|
+
if (idCmp !== 0) {
|
|
126
|
+
const primaryDirection =
|
|
127
|
+
sorts.length > 0 ? sorts[sorts.length - 1].direction : SortDirection.ASC;
|
|
128
|
+
return primaryDirection === SortDirection.DESC ? -idCmp : idCmp;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
54
131
|
return 0;
|
|
55
132
|
};
|
|
56
133
|
|