@tanstack/db-ivm 0.1.15 → 0.1.16
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/cjs/index.cjs +2 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/operators/groupedOrderBy.cjs +33 -0
- package/dist/cjs/operators/groupedOrderBy.cjs.map +1 -0
- package/dist/cjs/operators/groupedOrderBy.d.cts +31 -0
- package/dist/cjs/operators/index.d.cts +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/operators/groupedOrderBy.d.ts +31 -0
- package/dist/esm/operators/groupedOrderBy.js +33 -0
- package/dist/esm/operators/groupedOrderBy.js.map +1 -0
- package/dist/esm/operators/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/operators/groupedOrderBy.ts +95 -0
- package/src/operators/index.ts +1 -0
package/dist/cjs/index.cjs
CHANGED
|
@@ -22,6 +22,7 @@ const topK = require("./operators/topK.cjs");
|
|
|
22
22
|
const topKWithFractionalIndex = require("./operators/topKWithFractionalIndex.cjs");
|
|
23
23
|
const groupedTopKWithFractionalIndex = require("./operators/groupedTopKWithFractionalIndex.cjs");
|
|
24
24
|
const orderBy = require("./operators/orderBy.cjs");
|
|
25
|
+
const groupedOrderBy = require("./operators/groupedOrderBy.cjs");
|
|
25
26
|
const filterBy = require("./operators/filterBy.cjs");
|
|
26
27
|
exports.D2 = d2.D2;
|
|
27
28
|
exports.RootStreamBuilder = d2.RootStreamBuilder;
|
|
@@ -74,5 +75,6 @@ exports.orderBy = orderBy.orderBy;
|
|
|
74
75
|
exports.orderByWithFractionalIndex = orderBy.orderByWithFractionalIndex;
|
|
75
76
|
exports.orderByWithFractionalIndexBase = orderBy.orderByWithFractionalIndexBase;
|
|
76
77
|
exports.orderByWithIndex = orderBy.orderByWithIndex;
|
|
78
|
+
exports.groupedOrderByWithFractionalIndex = groupedOrderBy.groupedOrderByWithFractionalIndex;
|
|
77
79
|
exports.filterBy = filterBy.filterBy;
|
|
78
80
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const groupedTopKWithFractionalIndex = require("./groupedTopKWithFractionalIndex.cjs");
|
|
4
|
+
const consolidate = require("./consolidate.cjs");
|
|
5
|
+
function groupedOrderByWithFractionalIndex(valueExtractor, options) {
|
|
6
|
+
const limit = options.limit ?? Infinity;
|
|
7
|
+
const offset = options.offset ?? 0;
|
|
8
|
+
const setSizeCallback = options.setSizeCallback;
|
|
9
|
+
const setWindowFn = options.setWindowFn;
|
|
10
|
+
const groupKeyFn = options.groupKeyFn;
|
|
11
|
+
const comparator = options.comparator ?? ((a, b) => {
|
|
12
|
+
if (a === b) return 0;
|
|
13
|
+
if (a < b) return -1;
|
|
14
|
+
return 1;
|
|
15
|
+
});
|
|
16
|
+
return (stream) => {
|
|
17
|
+
return stream.pipe(
|
|
18
|
+
groupedTopKWithFractionalIndex.groupedTopKWithFractionalIndex(
|
|
19
|
+
(a, b) => comparator(valueExtractor(a), valueExtractor(b)),
|
|
20
|
+
{
|
|
21
|
+
limit,
|
|
22
|
+
offset,
|
|
23
|
+
setSizeCallback,
|
|
24
|
+
setWindowFn,
|
|
25
|
+
groupKeyFn
|
|
26
|
+
}
|
|
27
|
+
),
|
|
28
|
+
consolidate.consolidate()
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
exports.groupedOrderByWithFractionalIndex = groupedOrderByWithFractionalIndex;
|
|
33
|
+
//# sourceMappingURL=groupedOrderBy.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupedOrderBy.cjs","sources":["../../../src/operators/groupedOrderBy.ts"],"sourcesContent":["import { groupedTopKWithFractionalIndex } from './groupedTopKWithFractionalIndex.js'\nimport { consolidate } from './consolidate.js'\nimport type { IStreamBuilder, KeyValue } from '../types.js'\n\nexport interface GroupedOrderByOptions<Ve> {\n comparator?: (a: Ve, b: Ve) => number\n limit?: number\n offset?: number\n}\n\nexport interface GroupedOrderByWithFractionalIndexOptions<\n Ve,\n KeyType = unknown,\n ValueType = unknown,\n> extends GroupedOrderByOptions<Ve> {\n setSizeCallback?: (getSize: () => number) => void\n setWindowFn?: (\n windowFn: (options: { offset?: number; limit?: number }) => void,\n ) => void\n /**\n * Function to extract a group key from the element's key and value.\n * Elements with the same group key will be sorted and limited together.\n */\n groupKeyFn: (key: KeyType, value: ValueType) => unknown\n}\n\n/**\n * Orders the elements per group and limits the number of results per group, with optional offset and\n * annotates the value with a fractional index.\n * This requires a keyed stream, and uses the `groupedTopKWithFractionalIndex` operator to order elements within each group.\n *\n * Elements are grouped by the provided groupKeyFn, and each group maintains its own sorted collection\n * with independent limit/offset.\n *\n * @param valueExtractor - A function that extracts the value to order by from the element\n * @param options - Configuration including groupKeyFn, comparator, limit, and offset\n * @returns A piped operator that orders the elements per group and limits the number of results per group\n */\nexport function groupedOrderByWithFractionalIndex<\n T extends KeyValue<unknown, unknown>,\n Ve = unknown,\n>(\n valueExtractor: (\n value: T extends KeyValue<unknown, infer V> ? V : never,\n ) => Ve,\n options: GroupedOrderByWithFractionalIndexOptions<\n Ve,\n T extends KeyValue<infer K, unknown> ? K : never,\n T extends KeyValue<unknown, infer V> ? V : never\n >,\n) {\n type KeyType = T extends KeyValue<infer K, unknown> ? K : never\n type ValueType = T extends KeyValue<unknown, infer V> ? V : never\n\n const limit = options.limit ?? Infinity\n const offset = options.offset ?? 0\n const setSizeCallback = options.setSizeCallback\n const setWindowFn = options.setWindowFn\n const groupKeyFn = options.groupKeyFn\n const comparator =\n options.comparator ??\n ((a, b) => {\n // Default to JS like ordering\n if (a === b) return 0\n if (a < b) return -1\n return 1\n })\n\n return (\n stream: IStreamBuilder<T>,\n ): IStreamBuilder<[KeyType, [ValueType, string]]> => {\n // Cast to the expected key type for groupedTopKWithFractionalIndex\n type StreamKey = KeyType extends string | number ? KeyType : string | number\n\n return stream.pipe(\n groupedTopKWithFractionalIndex<StreamKey, ValueType>(\n (a: ValueType, b: ValueType) =>\n comparator(valueExtractor(a), valueExtractor(b)),\n {\n limit,\n offset,\n setSizeCallback,\n setWindowFn,\n groupKeyFn: groupKeyFn as (\n key: StreamKey,\n value: ValueType,\n ) => unknown,\n },\n ) as (\n stream: IStreamBuilder<T>,\n ) => IStreamBuilder<[KeyType, [ValueType, string]]>,\n consolidate(),\n )\n }\n}\n"],"names":["groupedTopKWithFractionalIndex","consolidate"],"mappings":";;;;AAsCO,SAAS,kCAId,gBAGA,SAKA;AAIA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,kBAAkB,QAAQ;AAChC,QAAM,cAAc,QAAQ;AAC5B,QAAM,aAAa,QAAQ;AAC3B,QAAM,aACJ,QAAQ,eACP,CAAC,GAAG,MAAM;AAET,QAAI,MAAM,EAAG,QAAO;AACpB,QAAI,IAAI,EAAG,QAAO;AAClB,WAAO;AAAA,EACT;AAEF,SAAO,CACL,WACmD;AAInD,WAAO,OAAO;AAAA,MACZA,+BAAAA;AAAAA,QACE,CAAC,GAAc,MACb,WAAW,eAAe,CAAC,GAAG,eAAe,CAAC,CAAC;AAAA,QACjD;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAIF;AAAA,MAIFC,YAAAA,YAAA;AAAA,IAAY;AAAA,EAEhB;AACF;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { IStreamBuilder, KeyValue } from '../types.js';
|
|
2
|
+
export interface GroupedOrderByOptions<Ve> {
|
|
3
|
+
comparator?: (a: Ve, b: Ve) => number;
|
|
4
|
+
limit?: number;
|
|
5
|
+
offset?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface GroupedOrderByWithFractionalIndexOptions<Ve, KeyType = unknown, ValueType = unknown> extends GroupedOrderByOptions<Ve> {
|
|
8
|
+
setSizeCallback?: (getSize: () => number) => void;
|
|
9
|
+
setWindowFn?: (windowFn: (options: {
|
|
10
|
+
offset?: number;
|
|
11
|
+
limit?: number;
|
|
12
|
+
}) => void) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Function to extract a group key from the element's key and value.
|
|
15
|
+
* Elements with the same group key will be sorted and limited together.
|
|
16
|
+
*/
|
|
17
|
+
groupKeyFn: (key: KeyType, value: ValueType) => unknown;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Orders the elements per group and limits the number of results per group, with optional offset and
|
|
21
|
+
* annotates the value with a fractional index.
|
|
22
|
+
* This requires a keyed stream, and uses the `groupedTopKWithFractionalIndex` operator to order elements within each group.
|
|
23
|
+
*
|
|
24
|
+
* Elements are grouped by the provided groupKeyFn, and each group maintains its own sorted collection
|
|
25
|
+
* with independent limit/offset.
|
|
26
|
+
*
|
|
27
|
+
* @param valueExtractor - A function that extracts the value to order by from the element
|
|
28
|
+
* @param options - Configuration including groupKeyFn, comparator, limit, and offset
|
|
29
|
+
* @returns A piped operator that orders the elements per group and limits the number of results per group
|
|
30
|
+
*/
|
|
31
|
+
export declare function groupedOrderByWithFractionalIndex<T extends KeyValue<unknown, unknown>, Ve = unknown>(valueExtractor: (value: T extends KeyValue<unknown, infer V> ? V : never) => Ve, options: GroupedOrderByWithFractionalIndexOptions<Ve, T extends KeyValue<infer K, unknown> ? K : never, T extends KeyValue<unknown, infer V> ? V : never>): (stream: IStreamBuilder<T>) => IStreamBuilder<[T extends KeyValue<infer K, unknown> ? K : never, [T extends KeyValue<unknown, infer V> ? V : never, string]]>;
|
|
@@ -16,5 +16,6 @@ export * from './topK.js';
|
|
|
16
16
|
export * from './topKWithFractionalIndex.js';
|
|
17
17
|
export * from './groupedTopKWithFractionalIndex.js';
|
|
18
18
|
export * from './orderBy.js';
|
|
19
|
+
export * from './groupedOrderBy.js';
|
|
19
20
|
export * from './filterBy.js';
|
|
20
21
|
export { groupBy, groupByOperators } from './groupBy.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -20,6 +20,7 @@ import { topK, topKWithIndex } from "./operators/topK.js";
|
|
|
20
20
|
import { TopKWithFractionalIndexOperator, topKWithFractionalIndex } from "./operators/topKWithFractionalIndex.js";
|
|
21
21
|
import { GroupedTopKWithFractionalIndexOperator, groupedTopKWithFractionalIndex } from "./operators/groupedTopKWithFractionalIndex.js";
|
|
22
22
|
import { orderBy, orderByWithFractionalIndex, orderByWithFractionalIndexBase, orderByWithIndex } from "./operators/orderBy.js";
|
|
23
|
+
import { groupedOrderByWithFractionalIndex } from "./operators/groupedOrderBy.js";
|
|
23
24
|
import { filterBy } from "./operators/filterBy.js";
|
|
24
25
|
export {
|
|
25
26
|
ConcatOperator,
|
|
@@ -52,6 +53,7 @@ export {
|
|
|
52
53
|
fullJoin,
|
|
53
54
|
groupBy,
|
|
54
55
|
groupByOperators,
|
|
56
|
+
groupedOrderByWithFractionalIndex,
|
|
55
57
|
groupedTopKWithFractionalIndex,
|
|
56
58
|
innerJoin,
|
|
57
59
|
join,
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { IStreamBuilder, KeyValue } from '../types.js';
|
|
2
|
+
export interface GroupedOrderByOptions<Ve> {
|
|
3
|
+
comparator?: (a: Ve, b: Ve) => number;
|
|
4
|
+
limit?: number;
|
|
5
|
+
offset?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface GroupedOrderByWithFractionalIndexOptions<Ve, KeyType = unknown, ValueType = unknown> extends GroupedOrderByOptions<Ve> {
|
|
8
|
+
setSizeCallback?: (getSize: () => number) => void;
|
|
9
|
+
setWindowFn?: (windowFn: (options: {
|
|
10
|
+
offset?: number;
|
|
11
|
+
limit?: number;
|
|
12
|
+
}) => void) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Function to extract a group key from the element's key and value.
|
|
15
|
+
* Elements with the same group key will be sorted and limited together.
|
|
16
|
+
*/
|
|
17
|
+
groupKeyFn: (key: KeyType, value: ValueType) => unknown;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Orders the elements per group and limits the number of results per group, with optional offset and
|
|
21
|
+
* annotates the value with a fractional index.
|
|
22
|
+
* This requires a keyed stream, and uses the `groupedTopKWithFractionalIndex` operator to order elements within each group.
|
|
23
|
+
*
|
|
24
|
+
* Elements are grouped by the provided groupKeyFn, and each group maintains its own sorted collection
|
|
25
|
+
* with independent limit/offset.
|
|
26
|
+
*
|
|
27
|
+
* @param valueExtractor - A function that extracts the value to order by from the element
|
|
28
|
+
* @param options - Configuration including groupKeyFn, comparator, limit, and offset
|
|
29
|
+
* @returns A piped operator that orders the elements per group and limits the number of results per group
|
|
30
|
+
*/
|
|
31
|
+
export declare function groupedOrderByWithFractionalIndex<T extends KeyValue<unknown, unknown>, Ve = unknown>(valueExtractor: (value: T extends KeyValue<unknown, infer V> ? V : never) => Ve, options: GroupedOrderByWithFractionalIndexOptions<Ve, T extends KeyValue<infer K, unknown> ? K : never, T extends KeyValue<unknown, infer V> ? V : never>): (stream: IStreamBuilder<T>) => IStreamBuilder<[T extends KeyValue<infer K, unknown> ? K : never, [T extends KeyValue<unknown, infer V> ? V : never, string]]>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { groupedTopKWithFractionalIndex } from "./groupedTopKWithFractionalIndex.js";
|
|
2
|
+
import { consolidate } from "./consolidate.js";
|
|
3
|
+
function groupedOrderByWithFractionalIndex(valueExtractor, options) {
|
|
4
|
+
const limit = options.limit ?? Infinity;
|
|
5
|
+
const offset = options.offset ?? 0;
|
|
6
|
+
const setSizeCallback = options.setSizeCallback;
|
|
7
|
+
const setWindowFn = options.setWindowFn;
|
|
8
|
+
const groupKeyFn = options.groupKeyFn;
|
|
9
|
+
const comparator = options.comparator ?? ((a, b) => {
|
|
10
|
+
if (a === b) return 0;
|
|
11
|
+
if (a < b) return -1;
|
|
12
|
+
return 1;
|
|
13
|
+
});
|
|
14
|
+
return (stream) => {
|
|
15
|
+
return stream.pipe(
|
|
16
|
+
groupedTopKWithFractionalIndex(
|
|
17
|
+
(a, b) => comparator(valueExtractor(a), valueExtractor(b)),
|
|
18
|
+
{
|
|
19
|
+
limit,
|
|
20
|
+
offset,
|
|
21
|
+
setSizeCallback,
|
|
22
|
+
setWindowFn,
|
|
23
|
+
groupKeyFn
|
|
24
|
+
}
|
|
25
|
+
),
|
|
26
|
+
consolidate()
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
groupedOrderByWithFractionalIndex
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=groupedOrderBy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupedOrderBy.js","sources":["../../../src/operators/groupedOrderBy.ts"],"sourcesContent":["import { groupedTopKWithFractionalIndex } from './groupedTopKWithFractionalIndex.js'\nimport { consolidate } from './consolidate.js'\nimport type { IStreamBuilder, KeyValue } from '../types.js'\n\nexport interface GroupedOrderByOptions<Ve> {\n comparator?: (a: Ve, b: Ve) => number\n limit?: number\n offset?: number\n}\n\nexport interface GroupedOrderByWithFractionalIndexOptions<\n Ve,\n KeyType = unknown,\n ValueType = unknown,\n> extends GroupedOrderByOptions<Ve> {\n setSizeCallback?: (getSize: () => number) => void\n setWindowFn?: (\n windowFn: (options: { offset?: number; limit?: number }) => void,\n ) => void\n /**\n * Function to extract a group key from the element's key and value.\n * Elements with the same group key will be sorted and limited together.\n */\n groupKeyFn: (key: KeyType, value: ValueType) => unknown\n}\n\n/**\n * Orders the elements per group and limits the number of results per group, with optional offset and\n * annotates the value with a fractional index.\n * This requires a keyed stream, and uses the `groupedTopKWithFractionalIndex` operator to order elements within each group.\n *\n * Elements are grouped by the provided groupKeyFn, and each group maintains its own sorted collection\n * with independent limit/offset.\n *\n * @param valueExtractor - A function that extracts the value to order by from the element\n * @param options - Configuration including groupKeyFn, comparator, limit, and offset\n * @returns A piped operator that orders the elements per group and limits the number of results per group\n */\nexport function groupedOrderByWithFractionalIndex<\n T extends KeyValue<unknown, unknown>,\n Ve = unknown,\n>(\n valueExtractor: (\n value: T extends KeyValue<unknown, infer V> ? V : never,\n ) => Ve,\n options: GroupedOrderByWithFractionalIndexOptions<\n Ve,\n T extends KeyValue<infer K, unknown> ? K : never,\n T extends KeyValue<unknown, infer V> ? V : never\n >,\n) {\n type KeyType = T extends KeyValue<infer K, unknown> ? K : never\n type ValueType = T extends KeyValue<unknown, infer V> ? V : never\n\n const limit = options.limit ?? Infinity\n const offset = options.offset ?? 0\n const setSizeCallback = options.setSizeCallback\n const setWindowFn = options.setWindowFn\n const groupKeyFn = options.groupKeyFn\n const comparator =\n options.comparator ??\n ((a, b) => {\n // Default to JS like ordering\n if (a === b) return 0\n if (a < b) return -1\n return 1\n })\n\n return (\n stream: IStreamBuilder<T>,\n ): IStreamBuilder<[KeyType, [ValueType, string]]> => {\n // Cast to the expected key type for groupedTopKWithFractionalIndex\n type StreamKey = KeyType extends string | number ? KeyType : string | number\n\n return stream.pipe(\n groupedTopKWithFractionalIndex<StreamKey, ValueType>(\n (a: ValueType, b: ValueType) =>\n comparator(valueExtractor(a), valueExtractor(b)),\n {\n limit,\n offset,\n setSizeCallback,\n setWindowFn,\n groupKeyFn: groupKeyFn as (\n key: StreamKey,\n value: ValueType,\n ) => unknown,\n },\n ) as (\n stream: IStreamBuilder<T>,\n ) => IStreamBuilder<[KeyType, [ValueType, string]]>,\n consolidate(),\n )\n }\n}\n"],"names":[],"mappings":";;AAsCO,SAAS,kCAId,gBAGA,SAKA;AAIA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,kBAAkB,QAAQ;AAChC,QAAM,cAAc,QAAQ;AAC5B,QAAM,aAAa,QAAQ;AAC3B,QAAM,aACJ,QAAQ,eACP,CAAC,GAAG,MAAM;AAET,QAAI,MAAM,EAAG,QAAO;AACpB,QAAI,IAAI,EAAG,QAAO;AAClB,WAAO;AAAA,EACT;AAEF,SAAO,CACL,WACmD;AAInD,WAAO,OAAO;AAAA,MACZ;AAAA,QACE,CAAC,GAAc,MACb,WAAW,eAAe,CAAC,GAAG,eAAe,CAAC,CAAC;AAAA,QACjD;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAIF;AAAA,MAIF,YAAA;AAAA,IAAY;AAAA,EAEhB;AACF;"}
|
|
@@ -16,5 +16,6 @@ export * from './topK.js';
|
|
|
16
16
|
export * from './topKWithFractionalIndex.js';
|
|
17
17
|
export * from './groupedTopKWithFractionalIndex.js';
|
|
18
18
|
export * from './orderBy.js';
|
|
19
|
+
export * from './groupedOrderBy.js';
|
|
19
20
|
export * from './filterBy.js';
|
|
20
21
|
export { groupBy, groupByOperators } from './groupBy.js';
|
package/package.json
CHANGED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { groupedTopKWithFractionalIndex } from './groupedTopKWithFractionalIndex.js'
|
|
2
|
+
import { consolidate } from './consolidate.js'
|
|
3
|
+
import type { IStreamBuilder, KeyValue } from '../types.js'
|
|
4
|
+
|
|
5
|
+
export interface GroupedOrderByOptions<Ve> {
|
|
6
|
+
comparator?: (a: Ve, b: Ve) => number
|
|
7
|
+
limit?: number
|
|
8
|
+
offset?: number
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface GroupedOrderByWithFractionalIndexOptions<
|
|
12
|
+
Ve,
|
|
13
|
+
KeyType = unknown,
|
|
14
|
+
ValueType = unknown,
|
|
15
|
+
> extends GroupedOrderByOptions<Ve> {
|
|
16
|
+
setSizeCallback?: (getSize: () => number) => void
|
|
17
|
+
setWindowFn?: (
|
|
18
|
+
windowFn: (options: { offset?: number; limit?: number }) => void,
|
|
19
|
+
) => void
|
|
20
|
+
/**
|
|
21
|
+
* Function to extract a group key from the element's key and value.
|
|
22
|
+
* Elements with the same group key will be sorted and limited together.
|
|
23
|
+
*/
|
|
24
|
+
groupKeyFn: (key: KeyType, value: ValueType) => unknown
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Orders the elements per group and limits the number of results per group, with optional offset and
|
|
29
|
+
* annotates the value with a fractional index.
|
|
30
|
+
* This requires a keyed stream, and uses the `groupedTopKWithFractionalIndex` operator to order elements within each group.
|
|
31
|
+
*
|
|
32
|
+
* Elements are grouped by the provided groupKeyFn, and each group maintains its own sorted collection
|
|
33
|
+
* with independent limit/offset.
|
|
34
|
+
*
|
|
35
|
+
* @param valueExtractor - A function that extracts the value to order by from the element
|
|
36
|
+
* @param options - Configuration including groupKeyFn, comparator, limit, and offset
|
|
37
|
+
* @returns A piped operator that orders the elements per group and limits the number of results per group
|
|
38
|
+
*/
|
|
39
|
+
export function groupedOrderByWithFractionalIndex<
|
|
40
|
+
T extends KeyValue<unknown, unknown>,
|
|
41
|
+
Ve = unknown,
|
|
42
|
+
>(
|
|
43
|
+
valueExtractor: (
|
|
44
|
+
value: T extends KeyValue<unknown, infer V> ? V : never,
|
|
45
|
+
) => Ve,
|
|
46
|
+
options: GroupedOrderByWithFractionalIndexOptions<
|
|
47
|
+
Ve,
|
|
48
|
+
T extends KeyValue<infer K, unknown> ? K : never,
|
|
49
|
+
T extends KeyValue<unknown, infer V> ? V : never
|
|
50
|
+
>,
|
|
51
|
+
) {
|
|
52
|
+
type KeyType = T extends KeyValue<infer K, unknown> ? K : never
|
|
53
|
+
type ValueType = T extends KeyValue<unknown, infer V> ? V : never
|
|
54
|
+
|
|
55
|
+
const limit = options.limit ?? Infinity
|
|
56
|
+
const offset = options.offset ?? 0
|
|
57
|
+
const setSizeCallback = options.setSizeCallback
|
|
58
|
+
const setWindowFn = options.setWindowFn
|
|
59
|
+
const groupKeyFn = options.groupKeyFn
|
|
60
|
+
const comparator =
|
|
61
|
+
options.comparator ??
|
|
62
|
+
((a, b) => {
|
|
63
|
+
// Default to JS like ordering
|
|
64
|
+
if (a === b) return 0
|
|
65
|
+
if (a < b) return -1
|
|
66
|
+
return 1
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
stream: IStreamBuilder<T>,
|
|
71
|
+
): IStreamBuilder<[KeyType, [ValueType, string]]> => {
|
|
72
|
+
// Cast to the expected key type for groupedTopKWithFractionalIndex
|
|
73
|
+
type StreamKey = KeyType extends string | number ? KeyType : string | number
|
|
74
|
+
|
|
75
|
+
return stream.pipe(
|
|
76
|
+
groupedTopKWithFractionalIndex<StreamKey, ValueType>(
|
|
77
|
+
(a: ValueType, b: ValueType) =>
|
|
78
|
+
comparator(valueExtractor(a), valueExtractor(b)),
|
|
79
|
+
{
|
|
80
|
+
limit,
|
|
81
|
+
offset,
|
|
82
|
+
setSizeCallback,
|
|
83
|
+
setWindowFn,
|
|
84
|
+
groupKeyFn: groupKeyFn as (
|
|
85
|
+
key: StreamKey,
|
|
86
|
+
value: ValueType,
|
|
87
|
+
) => unknown,
|
|
88
|
+
},
|
|
89
|
+
) as (
|
|
90
|
+
stream: IStreamBuilder<T>,
|
|
91
|
+
) => IStreamBuilder<[KeyType, [ValueType, string]]>,
|
|
92
|
+
consolidate(),
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
}
|
package/src/operators/index.ts
CHANGED
|
@@ -16,5 +16,6 @@ export * from './topK.js'
|
|
|
16
16
|
export * from './topKWithFractionalIndex.js'
|
|
17
17
|
export * from './groupedTopKWithFractionalIndex.js'
|
|
18
18
|
export * from './orderBy.js'
|
|
19
|
+
export * from './groupedOrderBy.js'
|
|
19
20
|
export * from './filterBy.js'
|
|
20
21
|
export { groupBy, groupByOperators } from './groupBy.js'
|