@enspirit/bmg-js 1.0.2 → 1.1.1
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 +3 -2
- package/dist/AsyncRelation/Base.d.ts +47 -0
- package/dist/AsyncRelation/index.d.ts +25 -0
- package/dist/Relation/Memory.d.ts +2 -1
- package/dist/Relation/index.d.ts +1 -1
- package/dist/async/Relation/Base.d.ts +47 -0
- package/dist/async/Relation/index.d.ts +25 -0
- package/dist/async/operators/_helpers.d.ts +16 -0
- package/dist/async/operators/autowrap.d.ts +7 -0
- package/dist/async/operators/constants.d.ts +6 -0
- package/dist/async/operators/cross_product.d.ts +9 -0
- package/dist/async/operators/extend.d.ts +7 -0
- package/dist/async/operators/group.d.ts +7 -0
- package/dist/async/operators/image.d.ts +8 -0
- package/dist/async/operators/index.d.ts +28 -0
- package/dist/async/operators/intersect.d.ts +7 -0
- package/dist/async/operators/isEqual.d.ts +7 -0
- package/dist/async/operators/join.d.ts +7 -0
- package/dist/async/operators/left_join.d.ts +8 -0
- package/dist/async/operators/matching.d.ts +7 -0
- package/dist/async/operators/minus.d.ts +7 -0
- package/dist/async/operators/not_matching.d.ts +7 -0
- package/dist/async/operators/one.d.ts +6 -0
- package/dist/async/operators/prefix.d.ts +6 -0
- package/dist/async/operators/project.d.ts +10 -0
- package/dist/async/operators/rename.d.ts +6 -0
- package/dist/async/operators/restrict.d.ts +14 -0
- package/dist/async/operators/suffix.d.ts +6 -0
- package/dist/async/operators/summarize.d.ts +8 -0
- package/dist/async/operators/toArray.d.ts +5 -0
- package/dist/async/operators/transform.d.ts +9 -0
- package/dist/async/operators/ungroup.d.ts +7 -0
- package/dist/async/operators/union.d.ts +6 -0
- package/dist/async/operators/unwrap.d.ts +6 -0
- package/dist/async/operators/wrap.d.ts +6 -0
- package/dist/async/operators/yByX.d.ts +7 -0
- package/dist/async/types.d.ts +58 -0
- package/dist/async-operators/_helpers.d.ts +16 -0
- package/dist/async-operators/autowrap.d.ts +7 -0
- package/dist/async-operators/constants.d.ts +6 -0
- package/dist/async-operators/cross_product.d.ts +9 -0
- package/dist/async-operators/extend.d.ts +7 -0
- package/dist/async-operators/group.d.ts +7 -0
- package/dist/async-operators/image.d.ts +8 -0
- package/dist/async-operators/index.d.ts +28 -0
- package/dist/async-operators/intersect.d.ts +7 -0
- package/dist/async-operators/isEqual.d.ts +7 -0
- package/dist/async-operators/join.d.ts +7 -0
- package/dist/async-operators/left_join.d.ts +8 -0
- package/dist/async-operators/matching.d.ts +7 -0
- package/dist/async-operators/minus.d.ts +7 -0
- package/dist/async-operators/not_matching.d.ts +7 -0
- package/dist/async-operators/one.d.ts +6 -0
- package/dist/async-operators/prefix.d.ts +6 -0
- package/dist/async-operators/project.d.ts +10 -0
- package/dist/async-operators/rename.d.ts +6 -0
- package/dist/async-operators/restrict.d.ts +14 -0
- package/dist/async-operators/suffix.d.ts +6 -0
- package/dist/async-operators/summarize.d.ts +8 -0
- package/dist/async-operators/toArray.d.ts +5 -0
- package/dist/async-operators/transform.d.ts +9 -0
- package/dist/async-operators/ungroup.d.ts +7 -0
- package/dist/async-operators/union.d.ts +6 -0
- package/dist/async-operators/unwrap.d.ts +6 -0
- package/dist/async-operators/wrap.d.ts +6 -0
- package/dist/async-operators/yByX.d.ts +7 -0
- package/dist/async-types.d.ts +58 -0
- package/dist/async.d.ts +4 -0
- package/dist/bmg.cjs +1 -1
- package/dist/bmg.cjs.map +1 -1
- package/dist/bmg.modern.js +1 -1
- package/dist/bmg.modern.js.map +1 -1
- package/dist/bmg.module.js +1 -1
- package/dist/bmg.module.js.map +1 -1
- package/dist/bmg.umd.js +1 -1
- package/dist/bmg.umd.js.map +1 -1
- package/dist/index.d.ts +15 -3
- package/dist/lib-definitions.d.ts +1 -1
- package/dist/operators/index.d.ts +1 -30
- package/dist/operators/isEqual.d.ts +1 -2
- package/dist/operators/isRelation.d.ts +2 -1
- package/dist/sync/Relation/Memory.d.ts +46 -0
- package/dist/sync/Relation/index.d.ts +1 -0
- package/dist/sync/operators/_helpers.d.ts +142 -0
- package/dist/sync/operators/allbut.d.ts +2 -0
- package/dist/sync/operators/autowrap.d.ts +2 -0
- package/dist/sync/operators/constants.d.ts +2 -0
- package/dist/sync/operators/cross_product.d.ts +3 -0
- package/dist/sync/operators/exclude.d.ts +2 -0
- package/dist/sync/operators/extend.d.ts +2 -0
- package/dist/sync/operators/group.d.ts +2 -0
- package/dist/sync/operators/image.d.ts +2 -0
- package/dist/sync/operators/index.d.ts +30 -0
- package/dist/sync/operators/intersect.d.ts +2 -0
- package/dist/sync/operators/isEqual.d.ts +1 -0
- package/dist/sync/operators/isRelation.d.ts +2 -0
- package/dist/sync/operators/join.d.ts +2 -0
- package/dist/sync/operators/left_join.d.ts +2 -0
- package/dist/sync/operators/matching.d.ts +2 -0
- package/dist/sync/operators/minus.d.ts +2 -0
- package/dist/sync/operators/not_matching.d.ts +2 -0
- package/dist/sync/operators/one.d.ts +2 -0
- package/dist/sync/operators/prefix.d.ts +2 -0
- package/dist/sync/operators/project.d.ts +2 -0
- package/dist/sync/operators/rename.d.ts +2 -0
- package/dist/sync/operators/restrict.d.ts +2 -0
- package/dist/sync/operators/suffix.d.ts +2 -0
- package/dist/sync/operators/summarize.d.ts +2 -0
- package/dist/sync/operators/transform.d.ts +2 -0
- package/dist/sync/operators/ungroup.d.ts +2 -0
- package/dist/sync/operators/union.d.ts +2 -0
- package/dist/sync/operators/unwrap.d.ts +2 -0
- package/dist/sync/operators/wrap.d.ts +2 -0
- package/dist/sync/operators/yByX.d.ts +2 -0
- package/dist/types.d.ts +7 -0
- package/dist/writer/Text.d.ts +68 -0
- package/dist/writer/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/Relation/index.ts +2 -1
- package/src/async/Relation/Base.ts +245 -0
- package/src/async/Relation/index.ts +31 -0
- package/src/async/operators/_helpers.ts +60 -0
- package/src/async/operators/autowrap.ts +31 -0
- package/src/async/operators/constants.ts +26 -0
- package/src/async/operators/cross_product.ts +39 -0
- package/src/async/operators/extend.ts +36 -0
- package/src/async/operators/group.ts +61 -0
- package/src/async/operators/image.ts +42 -0
- package/src/async/operators/index.ts +28 -0
- package/src/async/operators/intersect.ts +28 -0
- package/src/async/operators/isEqual.ts +39 -0
- package/src/async/operators/join.ts +39 -0
- package/src/async/operators/left_join.ts +55 -0
- package/src/async/operators/matching.ts +39 -0
- package/src/async/operators/minus.ts +28 -0
- package/src/async/operators/not_matching.ts +39 -0
- package/src/async/operators/one.ts +25 -0
- package/src/async/operators/prefix.ts +15 -0
- package/src/async/operators/project.ts +64 -0
- package/src/async/operators/rename.ts +33 -0
- package/src/async/operators/restrict.ts +61 -0
- package/src/async/operators/suffix.ts +15 -0
- package/src/async/operators/summarize.ts +90 -0
- package/src/async/operators/toArray.ts +18 -0
- package/src/async/operators/transform.ts +43 -0
- package/src/async/operators/ungroup.ts +43 -0
- package/src/async/operators/union.ts +29 -0
- package/src/async/operators/unwrap.ts +31 -0
- package/src/async/operators/wrap.ts +32 -0
- package/src/async/operators/yByX.ts +19 -0
- package/src/async/types.ts +86 -0
- package/src/async.ts +4 -0
- package/src/index.ts +17 -3
- package/src/lib-definitions.ts +11 -0
- package/src/operators/index.ts +2 -31
- package/src/{Relation → sync/Relation}/Memory.ts +9 -1
- package/src/sync/Relation/index.ts +1 -0
- package/src/{operators → sync/operators}/_helpers.ts +1 -1
- package/src/{operators → sync/operators}/allbut.ts +1 -1
- package/src/{operators → sync/operators}/autowrap.ts +1 -1
- package/src/{operators → sync/operators}/constants.ts +1 -1
- package/src/{operators → sync/operators}/cross_product.ts +1 -1
- package/src/{operators → sync/operators}/exclude.ts +2 -2
- package/src/{operators → sync/operators}/extend.ts +1 -1
- package/src/{operators → sync/operators}/group.ts +2 -2
- package/src/{operators → sync/operators}/image.ts +2 -2
- package/src/sync/operators/index.ts +31 -0
- package/src/{operators → sync/operators}/intersect.ts +1 -1
- package/src/{operators → sync/operators}/isEqual.ts +1 -2
- package/src/sync/operators/isRelation.ts +6 -0
- package/src/{operators → sync/operators}/join.ts +1 -1
- package/src/{operators → sync/operators}/left_join.ts +1 -1
- package/src/{operators → sync/operators}/matching.ts +1 -1
- package/src/{operators → sync/operators}/minus.ts +1 -1
- package/src/{operators → sync/operators}/not_matching.ts +1 -1
- package/src/{operators → sync/operators}/one.ts +1 -1
- package/src/{operators → sync/operators}/prefix.ts +1 -1
- package/src/{operators → sync/operators}/project.ts +1 -1
- package/src/{operators → sync/operators}/rename.ts +1 -1
- package/src/{operators → sync/operators}/restrict.ts +2 -2
- package/src/{operators → sync/operators}/suffix.ts +1 -1
- package/src/{operators → sync/operators}/summarize.ts +1 -1
- package/src/{operators → sync/operators}/transform.ts +1 -1
- package/src/{operators → sync/operators}/ungroup.ts +1 -1
- package/src/{operators → sync/operators}/union.ts +1 -1
- package/src/{operators → sync/operators}/unwrap.ts +1 -1
- package/src/sync/operators/where.ts +1 -0
- package/src/{operators → sync/operators}/wrap.ts +1 -1
- package/src/{operators → sync/operators}/yByX.ts +1 -1
- package/src/types.ts +11 -0
- package/src/writer/Text.ts +415 -0
- package/src/writer/index.ts +1 -0
- package/src/operators/isRelation.ts +0 -5
- /package/{src/operators/where.ts → dist/sync/operators/where.d.ts} +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export { restrict, where, exclude } from './restrict';
|
|
2
|
+
export { project, allbut } from './project';
|
|
3
|
+
export { extend } from './extend';
|
|
4
|
+
export { constants } from './constants';
|
|
5
|
+
export { rename } from './rename';
|
|
6
|
+
export { prefix } from './prefix';
|
|
7
|
+
export { suffix } from './suffix';
|
|
8
|
+
export { transform } from './transform';
|
|
9
|
+
export { union } from './union';
|
|
10
|
+
export { minus } from './minus';
|
|
11
|
+
export { intersect } from './intersect';
|
|
12
|
+
export { matching } from './matching';
|
|
13
|
+
export { not_matching } from './not_matching';
|
|
14
|
+
export { join } from './join';
|
|
15
|
+
export { left_join } from './left_join';
|
|
16
|
+
export { cross_product, cross_join } from './cross_product';
|
|
17
|
+
export { group } from './group';
|
|
18
|
+
export { ungroup } from './ungroup';
|
|
19
|
+
export { wrap } from './wrap';
|
|
20
|
+
export { unwrap } from './unwrap';
|
|
21
|
+
export { image } from './image';
|
|
22
|
+
export { summarize } from './summarize';
|
|
23
|
+
export { autowrap } from './autowrap';
|
|
24
|
+
export { yByX } from './yByX';
|
|
25
|
+
export { isEqual } from './isEqual';
|
|
26
|
+
export { one } from './one';
|
|
27
|
+
export { toArray } from './toArray';
|
|
28
|
+
export { isAsyncRelation, toAsyncOperationalOperand, deduplicateAsync } from './_helpers';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Set intersection: returns tuples present in both relations.
|
|
5
|
+
* Materializes right side first, then streams left.
|
|
6
|
+
*/
|
|
7
|
+
export declare function intersect<T>(left: AsyncRelationOperand<T>, right: AsyncRelationOperand<T>): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
/**
|
|
3
|
+
* Compares two async relations for equality.
|
|
4
|
+
* Two relations are equal if they contain the exact same set of tuples.
|
|
5
|
+
* Terminal operation - returns a Promise.
|
|
6
|
+
*/
|
|
7
|
+
export declare const isEqual: <T, U>(left: AsyncRelationOperand<T>, right: AsyncRelationOperand<U>) => Promise<boolean>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { JoinKeys, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Natural join: combines tuples from left and right where join keys match.
|
|
5
|
+
* Materializes both sides (needed for key detection and nested loop join).
|
|
6
|
+
*/
|
|
7
|
+
export declare function join<T, U>(left: AsyncRelationOperand<T>, right: AsyncRelationOperand<U>, keys?: JoinKeys): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { JoinKeys, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Left outer join: combines tuples, keeping all left tuples.
|
|
5
|
+
* Non-matching left tuples have null for right attributes.
|
|
6
|
+
* Materializes both sides.
|
|
7
|
+
*/
|
|
8
|
+
export declare function left_join<T, U>(left: AsyncRelationOperand<T>, right: AsyncRelationOperand<U>, keys?: JoinKeys): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { JoinKeys, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Semi-join: returns tuples from left that have a matching tuple in right.
|
|
5
|
+
* Materializes right side first to build key set.
|
|
6
|
+
*/
|
|
7
|
+
export declare function matching<T, U>(left: AsyncRelationOperand<T>, right: AsyncRelationOperand<U>, keys?: JoinKeys): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Set difference: returns tuples in left but not in right.
|
|
5
|
+
* Materializes right side first, then streams left.
|
|
6
|
+
*/
|
|
7
|
+
export declare function minus<T>(left: AsyncRelationOperand<T>, right: AsyncRelationOperand<T>): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { JoinKeys, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Anti semi-join: returns tuples from left that have no matching tuple in right.
|
|
5
|
+
* Materializes right side first to build key set.
|
|
6
|
+
*/
|
|
7
|
+
export declare function not_matching<T, U>(left: AsyncRelationOperand<T>, right: AsyncRelationOperand<U>, keys?: JoinKeys): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { PrefixOptions, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Prefixes all attribute names (except those in options.except).
|
|
5
|
+
*/
|
|
6
|
+
export declare const prefix: <T>(operand: AsyncRelationOperand<T>, pfx: string, options?: PrefixOptions) => AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { Tuple, AttrName } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Projects tuples to specified attributes with deduplication.
|
|
5
|
+
*/
|
|
6
|
+
export declare const project: <T>(operand: AsyncRelationOperand<T>, attrs: AttrName[]) => AsyncIterable<Tuple>;
|
|
7
|
+
/**
|
|
8
|
+
* Projects out (removes) specified attributes with deduplication.
|
|
9
|
+
*/
|
|
10
|
+
export declare const allbut: <T>(operand: AsyncRelationOperand<T>, attrs: AttrName[]) => AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { Renaming, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Renames attributes in each tuple.
|
|
5
|
+
*/
|
|
6
|
+
export declare const rename: <T>(operand: AsyncRelationOperand<T>, renaming: Renaming) => AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { Predicate } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Filters tuples that match the predicate.
|
|
5
|
+
*/
|
|
6
|
+
export declare const restrict: <T>(operand: AsyncRelationOperand<T>, p: Predicate) => AsyncIterable<T>;
|
|
7
|
+
/**
|
|
8
|
+
* Alias for restrict.
|
|
9
|
+
*/
|
|
10
|
+
export declare const where: <T>(operand: AsyncRelationOperand<T>, p: Predicate) => AsyncIterable<T>;
|
|
11
|
+
/**
|
|
12
|
+
* Filters tuples that do NOT match the predicate.
|
|
13
|
+
*/
|
|
14
|
+
export declare const exclude: <T>(operand: AsyncRelationOperand<T>, p: Predicate) => AsyncIterable<T>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { SuffixOptions, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Suffixes all attribute names (except those in options.except).
|
|
5
|
+
*/
|
|
6
|
+
export declare const suffix: <T>(operand: AsyncRelationOperand<T>, sfx: string, options?: SuffixOptions) => AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { AttrName, Tuple, Aggregators } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Aggregates tuples by grouping attributes.
|
|
5
|
+
* Supports count, sum, min, max, avg, collect, and custom functions.
|
|
6
|
+
* Materializes all tuples to perform grouping.
|
|
7
|
+
*/
|
|
8
|
+
export declare function summarize<T>(operand: AsyncRelationOperand<T>, by: AttrName[], aggs: Aggregators): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { Transformation, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Applies transformation functions to attribute values.
|
|
5
|
+
* - Single function: applies to all values
|
|
6
|
+
* - Array of functions: chains them in order
|
|
7
|
+
* - Object with attr keys: applies per-attribute transformers
|
|
8
|
+
*/
|
|
9
|
+
export declare function transform<T>(operand: AsyncRelationOperand<T>, transformation: Transformation): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { AttrName, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Flattens a nested relation attribute back into parent tuples.
|
|
5
|
+
* Materializes all tuples to perform ungrouping.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ungroup<T>(operand: AsyncRelationOperand<T>, attr: AttrName): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Combines tuples from two relations, removing duplicates.
|
|
5
|
+
*/
|
|
6
|
+
export declare function union<T>(left: AsyncRelationOperand<T>, right: AsyncRelationOperand<T>): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { AttrName, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Unwraps a nested object attribute back into the parent tuple.
|
|
5
|
+
*/
|
|
6
|
+
export declare function unwrap<T>(operand: AsyncRelationOperand<T>, attr: AttrName): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { AttrName, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Wraps specified attributes into a nested object.
|
|
5
|
+
*/
|
|
6
|
+
export declare function wrap<T>(operand: AsyncRelationOperand<T>, attrs: AttrName[], as: AttrName): AsyncIterable<Tuple>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncRelationOperand } from '../async-types';
|
|
2
|
+
import type { AttrName, Tuple } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Builds a key-value map from two attributes.
|
|
5
|
+
* Terminal operation - returns a Promise.
|
|
6
|
+
*/
|
|
7
|
+
export declare const yByX: <T>(operand: AsyncRelationOperand<T>, y: AttrName, x: AttrName) => Promise<Tuple>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Tuple, TypedPredicate, Relation, TypedExtension, RenameMap, Renamed, Prefixed, Suffixed, Transformation, JoinKeys, AttrName, Aggregators, AutowrapOptions, TextOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Async version of the Relation interface.
|
|
4
|
+
* Operations are lazy - they build a pipeline that executes only when
|
|
5
|
+
* a terminal method (one(), toArray()) is awaited.
|
|
6
|
+
*
|
|
7
|
+
* @typeParam T - The tuple type for this relation.
|
|
8
|
+
*/
|
|
9
|
+
export interface AsyncRelation<T = Tuple> {
|
|
10
|
+
restrict(p: TypedPredicate<T>): AsyncRelation<T>;
|
|
11
|
+
where(p: TypedPredicate<T>): AsyncRelation<T>;
|
|
12
|
+
exclude(p: TypedPredicate<T>): AsyncRelation<T>;
|
|
13
|
+
project<K extends keyof T>(attrs: K[]): AsyncRelation<Pick<T, K>>;
|
|
14
|
+
allbut<K extends keyof T>(attrs: K[]): AsyncRelation<Omit<T, K>>;
|
|
15
|
+
extend<E extends Record<string, unknown>>(e: TypedExtension<T, E>): AsyncRelation<T & E>;
|
|
16
|
+
constants<C extends Tuple>(consts: C): AsyncRelation<T & C>;
|
|
17
|
+
rename<R extends RenameMap<T>>(r: R): AsyncRelation<Renamed<T, R>>;
|
|
18
|
+
prefix<P extends string, Ex extends keyof T = never>(pfx: P, options?: {
|
|
19
|
+
except?: Ex[];
|
|
20
|
+
}): AsyncRelation<Prefixed<T, P, Ex>>;
|
|
21
|
+
suffix<S extends string, Ex extends keyof T = never>(sfx: S, options?: {
|
|
22
|
+
except?: Ex[];
|
|
23
|
+
}): AsyncRelation<Suffixed<T, S, Ex>>;
|
|
24
|
+
transform(t: Transformation): AsyncRelation<T>;
|
|
25
|
+
union(other: AsyncRelationOperand<T>): AsyncRelation<T>;
|
|
26
|
+
minus(other: AsyncRelationOperand<T>): AsyncRelation<T>;
|
|
27
|
+
intersect(other: AsyncRelationOperand<T>): AsyncRelation<T>;
|
|
28
|
+
matching<U = Tuple>(other: AsyncRelationOperand<U>, keys?: JoinKeys): AsyncRelation<T>;
|
|
29
|
+
not_matching<U = Tuple>(other: AsyncRelationOperand<U>, keys?: JoinKeys): AsyncRelation<T>;
|
|
30
|
+
join<U = Tuple>(other: AsyncRelationOperand<U>, keys?: JoinKeys): AsyncRelation<T & U>;
|
|
31
|
+
left_join<U = Tuple>(other: AsyncRelationOperand<U>, keys?: JoinKeys): AsyncRelation<T & Partial<U>>;
|
|
32
|
+
cross_product<U = Tuple>(other: AsyncRelationOperand<U>): AsyncRelation<T & U>;
|
|
33
|
+
cross_join<U = Tuple>(other: AsyncRelationOperand<U>): AsyncRelation<T & U>;
|
|
34
|
+
group<K extends keyof T>(attrs: K[], as: AttrName): AsyncRelation<Omit<T, K> & Record<string, Relation<Pick<T, K>>>>;
|
|
35
|
+
ungroup(attr: AttrName): AsyncRelation<Tuple>;
|
|
36
|
+
wrap<K extends keyof T>(attrs: K[], as: AttrName): AsyncRelation<Omit<T, K> & Record<string, Pick<T, K>>>;
|
|
37
|
+
unwrap(attr: AttrName): AsyncRelation<Tuple>;
|
|
38
|
+
image<U = Tuple>(other: AsyncRelationOperand<U>, as: AttrName, keys?: JoinKeys): AsyncRelation<T & Record<string, Relation<U>>>;
|
|
39
|
+
summarize<K extends keyof T>(by: K[], aggs: Aggregators): AsyncRelation<Pick<T, K> & Tuple>;
|
|
40
|
+
autowrap(options?: AutowrapOptions): AsyncRelation<Tuple>;
|
|
41
|
+
one(): Promise<T>;
|
|
42
|
+
toArray(): Promise<T[]>;
|
|
43
|
+
toRelation(): Promise<Relation<T>>;
|
|
44
|
+
yByX(y: AttrName, x: AttrName): Promise<Tuple>;
|
|
45
|
+
toText(options?: TextOptions): Promise<string>;
|
|
46
|
+
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* What can be passed as an operand to async operators.
|
|
50
|
+
*/
|
|
51
|
+
export type AsyncRelationOperand<T = Tuple> = AsyncRelation<T> | AsyncIterable<T>;
|
|
52
|
+
/**
|
|
53
|
+
* Async version of OperationalOperand for internal use by operators.
|
|
54
|
+
*/
|
|
55
|
+
export interface AsyncOperationalOperand<T = Tuple> {
|
|
56
|
+
tuples(): AsyncIterable<T>;
|
|
57
|
+
output(tuples: AsyncIterable<T>): AsyncRelationOperand<T>;
|
|
58
|
+
}
|
package/dist/async.d.ts
ADDED
package/dist/bmg.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function n(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=Array(e);t<e;t++)r[t]=n[t];return r}function e(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return n(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function t(){return t=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var r in t)({}).hasOwnProperty.call(t,r)&&(n[r]=t[r])}return n},t.apply(null,arguments)}var r=function(n){if("function"==typeof n)return n;var e=n;return function(n){return Object.keys(e).every(function(t){return n[t]===e[t]})}},o=/*#__PURE__*/function(){function n(n){this.tuples=void 0,this.tuples=n,this.tuples=n}var e=n.prototype;return e.restrict=function(n){return y(this,n)},e.where=function(n){return y(this,n)},e.exclude=function(n){return g(this,n)},e.project=function(n){return R(this,n)},e.allbut=function(n){return x(this,n)},e.extend=function(n){return A(this,n)},e.constants=function(n){return m(this,n)},e.rename=function(n){return v(this,n)},e.prefix=function(n,e){return T(this,n,e)},e.suffix=function(n,e){return h(this,n,e)},e.union=function(n){return b(this,n)},e.minus=function(n){return w(this,n)},e.intersect=function(n){return k(this,n)},e.matching=function(n,e){return K(this,n,e)},e.not_matching=function(n,e){return O(this,n,e)},e.join=function(n,e){return S(this,n,e)},e.left_join=function(n,e){return N(this,n,e)},e.cross_product=function(n){return P(this,n)},e.cross_join=function(n){return P(this,n)},e.image=function(n,e,t){return J(this,n,e,t)},e.group=function(n,e){return U(this,n,e)},e.ungroup=function(n){return X(this,n)},e.wrap=function(n,e){return q(this,n,e)},e.unwrap=function(n){return z(this,n)},e.summarize=function(n,e){return _(this,n,e)},e.transform=function(n){return $(this,n)},e.autowrap=function(n){return D(this,n)},e.one=function(){return Y(this)},e.toArray=function(){return this.tuples},e.yByX=function(n,e){return V(this,n,e)},e.isEqual=function(n){return W(this,n)},n}(),u=function(n){return null!=n&&n.constructor===o},a=function(n){var e=Object.entries(n).map(function(n){return[n[0],(e=n[1],u(e)?e.toArray().map(function(n){return a(n)}).sort():e)];var e});return JSON.stringify(e.sort(function(n,e){return n[0].localeCompare(e[0])}))},i=function(n){for(var t,r=new Set,o=[],u=e(n);!(t=u()).done;){var i=t.value,s=a(i);r.has(s)||(r.add(s),o.push(i))}return o},s=function(n){if(Array.isArray(n))return{tuples:function(){return n},output:function(n){return n}};if(u(n))return{tuples:function(){return n.toArray()},output:function(n){return new o(n)}};throw"Unable to iterate "+n},p=function(n){throw n},c=function(n,e,t){return n?Array.isArray(n)?n.reduce(function(n,e){return n[e]=e,n},{}):n:function(n,e){if(0===n.length||0===e.length)return[];var t=new Set(Object.keys(n[0]));return Object.keys(e[0]).filter(function(n){return t.has(n)})}(e,t).reduce(function(n,e){return n[e]=e,n},{})},l=function(n,e,t){for(var r=0,o=Object.entries(t);r<o.length;r++){var u=o[r];if(n[u[0]]!==e[u[1]])return!1}return!0},f=function(n,e,t){return("left"===t?Object.keys(e):Object.values(e)).map(function(e){return JSON.stringify(n[e])}).join("|")},d=function(n,e){for(var t=new Set(Object.values(e)),r={},o=0,u=Object.entries(n);o<u.length;o++){var a=u[o],i=a[0],s=a[1];t.has(i)||(r[i]=s)}return r},y=function(n,t){for(var o,u=s(n),a=u.tuples(),i=r(t),p=[],c=e(a);!(o=c()).done;){var l=o.value;i(l)&&p.push(l)}return u.output(p)},g=function(n,t){for(var o,u=s(n),a=u.tuples(),i=r(t),p=[],c=e(a);!(o=c()).done;){var l=o.value;i(l)||p.push(l)}return u.output(p)},m=function(n,r){for(var o,u=s(n),a=[],i=e(u.tuples());!(o=i()).done;)a.push(t({},o.value,r));return u.output(a)},v=function(n,t){for(var r,o=s(n),u=o.tuples(),a=function(n){return"function"==typeof n?n:function(e){return n[e]||e}}(t),i=[],p=function(){var n=r.value,e=Object.keys(n).reduce(function(e,t){return e[a(t)]=n[t],e},{});i.push(e)},c=e(u);!(r=c()).done;)p();return o.output(i)},T=function(n,e,t){var r,o=new Set(null!=(r=null==t?void 0:t.except)?r:[]);return v(n,function(n){return o.has(n)?n:""+e+n})},h=function(n,e,t){var r,o=new Set(null!=(r=null==t?void 0:t.except)?r:[]);return v(n,function(n){return o.has(n)?n:""+n+e})},R=function(n,t){for(var r,o=s(n),u=o.tuples(),a=[],p=function(){var n=r.value,e=t.reduce(function(e,t){return t in n&&(e[t]=n[t]),e},{});a.push(e)},c=e(u);!(r=c()).done;)p();return o.output(i(a))},x=function(n,t){for(var r,o=s(n),u=o.tuples(),a=new Set(t),p=[],c=function(){var n=r.value,e=Object.keys(n).reduce(function(e,t){return a.has(t)||(e[t]=n[t]),e},{});p.push(e)},l=e(u);!(r=l()).done;)c();return o.output(i(p))},A=function(n,r){for(var o,u=s(n),a=[],i=e(u.tuples());!(o=i()).done;){for(var p=o.value,c=t({},p),l=0,f=Object.entries(r);l<f.length;l++){var d=f[l],y=d[1];c[d[0]]="function"==typeof y?y(p):p[y]}a.push(c)}return u.output(a)},b=function(n,t){for(var r,o=s(n),u=s(t),i=new Set,p=[],c=e(o.tuples());!(r=c()).done;){var l=r.value,f=a(l);i.has(f)||(i.add(f),p.push(l))}for(var d,y=e(u.tuples());!(d=y()).done;){var g=d.value,m=a(g);i.has(m)||(i.add(m),p.push(g))}return o.output(p)},w=function(n,t){for(var r,o=s(n),u=s(t),i=new Set,p=e(u.tuples());!(r=p()).done;)i.add(a(r.value));for(var c,l=new Set,f=[],d=e(o.tuples());!(c=d()).done;){var y=c.value,g=a(y);i.has(g)||l.has(g)||(l.add(g),f.push(y))}return o.output(f)},k=function(n,t){for(var r,o=s(n),u=s(t),i=new Set,p=e(u.tuples());!(r=p()).done;)i.add(a(r.value));for(var c,l=new Set,f=[],d=e(o.tuples());!(c=d()).done;){var y=c.value,g=a(y);i.has(g)&&!l.has(g)&&(l.add(g),f.push(y))}return o.output(f)},K=function(n,t,r){for(var o,u=s(n),a=s(t),i=[].concat(u.tuples()),p=[].concat(a.tuples()),l=c(r,i,p),d=new Set,y=e(p);!(o=y()).done;)d.add(f(o.value,l,"right"));for(var g,m=[],v=e(i);!(g=v()).done;){var T=g.value;d.has(f(T,l,"left"))&&m.push(T)}return u.output(m)},O=function(n,t,r){for(var o,u=s(n),a=s(t),i=[].concat(u.tuples()),p=[].concat(a.tuples()),l=c(r,i,p),d=new Set,y=e(p);!(o=y()).done;)d.add(f(o.value,l,"right"));for(var g,m=[],v=e(i);!(g=v()).done;){var T=g.value;d.has(f(T,l,"left"))||m.push(T)}return u.output(m)},j=function(n,e,r){return t({},n,d(e,r))},S=function(n,t,r){for(var o,u=s(n),a=s(t),i=[].concat(u.tuples()),p=[].concat(a.tuples()),f=c(r,i,p),d=[],y=e(i);!(o=y()).done;)for(var g,m=o.value,v=e(p);!(g=v()).done;){var T=g.value;l(m,T,f)&&d.push(j(m,T,f))}return u.output(d)},E=function(n,r,o){for(var u,a=t({},n),i=e(o);!(u=i()).done;){var s=u.value;a[s]=r?r[s]:null}return a},N=function(n,t,r){for(var o,u=s(n),a=s(t),i=[].concat(u.tuples()),p=[].concat(a.tuples()),f=c(r,i,p),d=function(n,e){if(0===n.length)return[];var t=new Set(Object.values(e));return Object.keys(n[0]).filter(function(n){return!t.has(n)})}(p,f),y=[],g=e(i);!(o=g()).done;){for(var m,v=o.value,T=!1,h=e(p);!(m=h()).done;){var R=m.value;l(v,R,f)&&(y.push(E(v,R,d)),T=!0)}T||y.push(E(v,null,d))}return u.output(y)},P=function(n,r){for(var o,u=s(n),a=s(r),p=[].concat(u.tuples()),c=[].concat(a.tuples()),l=[],f=e(p);!(o=f()).done;)for(var d,y=o.value,g=e(c);!(d=g()).done;)l.push(t({},d.value,y));return u.output(i(l))},J=function(n,r,u,a){for(var i,p=s(n),f=s(r),y=[].concat(p.tuples()),g=[].concat(f.tuples()),m=c(a,y,g),v=[],T=e(y);!(i=T()).done;){for(var h,R,x=i.value,A=[],b=e(g);!(R=b()).done;){var w=R.value;l(x,w,m)&&A.push(d(w,m))}v.push(t({},x,((h={})[u]=new o(A),h)))}return p.output(v)},L=function(n,e){return e.map(function(e){return JSON.stringify(n[e])}).join("|")},F=function(n,e){return e.reduce(function(e,t){return e[t]=n[t],e},{})},B=function(n,e){if("function"==typeof e)return e(n);var t="string"==typeof e?{op:e,attr:""}:e,r=t.op,o=t.attr;switch(r){case"count":return n.length;case"sum":return n.reduce(function(n,e){return n+(Number(e[o])||0)},0);case"min":var u=n.map(function(n){return n[o]}).filter(function(n){return null!=n});return u.length>0?Math.min.apply(Math,u.map(Number)):null;case"max":var a=n.map(function(n){return n[o]}).filter(function(n){return null!=n});return a.length>0?Math.max.apply(Math,a.map(Number)):null;case"avg":var i=n.map(function(n){return Number(n[o])}).filter(function(n){return!isNaN(n)});return i.length>0?i.reduce(function(n,e){return n+e},0)/i.length:null;case"collect":return n.map(function(n){return n[o]});default:throw new Error("Unknown aggregator: "+r)}},_=function(n,t,r){for(var o,u=s(n),a=[].concat(u.tuples()),i=new Map,p=e(a);!(o=p()).done;){var c=o.value,l=L(c,t);i.has(l)||i.set(l,[]),i.get(l).push(c)}for(var f,d=[],y=e(i.values());!(f=y()).done;){for(var g=f.value,m=F(g[0],t),v=0,T=Object.entries(r);v<T.length;v++){var h=T[v];m[h[0]]=B(g,h[1])}d.push(m)}return u.output(d)},M=function(n,e){return e.map(function(e){return JSON.stringify(n[e])}).join("|")},I=function(n,e){return e.reduce(function(e,t){return e[t]=n[t],e},{})},U=function(n,r,u){var a=s(n),i=[].concat(a.tuples());if(0===i.length)return a.output([]);for(var p,c=Object.keys(i[0]),l=new Set(r),f=c.filter(function(n){return!l.has(n)}),d=new Map,y=e(i);!(p=y()).done;){var g=p.value,m=M(g,f);d.has(m)||d.set(m,{base:I(g,f),nested:[]}),d.get(m).nested.push(I(g,r))}for(var v,T=[],h=e(d.values());!(v=h()).done;){var R,x=v.value;T.push(t({},x.base,((R={})[u]=new o(x.nested),R)))}return a.output(T)},C=function(n){if(u(n))return n.toArray();if(Array.isArray(n))return n;throw new Error("Value is not a relation or array")},X=function(n,r){for(var o,u=s(n),a=[],i=e([].concat(u.tuples()));!(o=i()).done;){for(var p=o.value,c=C(p[r]),l={},f=0,d=Object.entries(p);f<d.length;f++){var y=d[f],g=y[0];g!==r&&(l[g]=y[1])}for(var m,v=e(c);!(m=v()).done;)a.push(t({},l,m.value))}return u.output(a)},q=function(n,r,o){for(var u,a=s(n),i=a.tuples(),p=new Set(r),c=[],l=e(i);!(u=l()).done;){for(var f,d={},y={},g=0,m=Object.entries(u.value);g<m.length;g++){var v=m[g],T=v[0],h=v[1];p.has(T)?d[T]=h:y[T]=h}c.push(t({},y,((f={})[o]=d,f)))}return a.output(c)},z=function(n,r){for(var o,u=s(n),a=[],i=e(u.tuples());!(o=i()).done;){var p=o.value,c=p[r];if("object"!=typeof c||null===c||Array.isArray(c))throw new Error("Attribute '"+r+"' is not a tuple (object)");for(var l={},f=0,d=Object.entries(p);f<d.length;f++){var y=d[f],g=y[0];g!==r&&(l[g]=y[1])}a.push(t({},l,c))}return u.output(a)},D=function(t,r){for(var o,u,a=null!=(o=null==r?void 0:r.separator)?o:"_",i=s(t),p=[],c=e(i.tuples());!(u=c()).done;){for(var l={},f=0,d=Object.entries(u.value);f<d.length;f++){var y=d[f],g=y[0],m=y[1],v=g.split(a);if(1===v.length)l[g]=m;else{var T,h=v[0],R=n(v).slice(1);l[h]=null!=(T=l[h])?T:{},l[h][R.join(a)]=m}}p.push(l)}return i.output(p)},$=function(n,t){for(var r,o=s(n),u=[],a=e(o.tuples());!(r=a()).done;){for(var i={},p=0,c=Object.entries(r.value);p<c.length;p++){var l=c[p],f=l[0];i[f]=H(l[1],f,t)}u.push(i)}return o.output(u)},H=function(n,e,t){if("function"==typeof t)return t(n);if(Array.isArray(t))return t.reduce(function(n,e){return e(n)},n);var r=t[e];return r?Array.isArray(r)?r.reduce(function(n,e){return e(n)},n):r(n):n},W=function(n,t){for(var r,o=s(n),u=s(t),i=new Set,p=e(o.tuples());!(r=p()).done;)i.add(a(r.value));for(var c,l=new Set,f=e(u.tuples());!(c=f()).done;)l.add(a(c.value));if(i.size!==l.size)return!1;for(var d,y=e(i);!(d=y()).done;)if(!l.has(d.value))return!1;return!0},Y=function(n){for(var t,r,o=e(s(n).tuples());!(r=o()).done;){var u=r.value;if(t)return p("More than one tuple found");t=u}return t||p("Relation is empty")},V=function(n,t,r){for(var o,u={},a=e(s(n).tuples());!(o=a()).done;){var i=o.value;u[""+i[r]]=i[t]}return u};function G(n){return new o(n)}G.isRelation=u,exports.Bmg=G,exports.LIB_DEFINITIONS="\n/**\n * Type definitions for Bmg.js relational algebra library.\n *\n * This file defines all types needed for type-safe relational operations:\n * - Base types (AttrName, Tuple)\n * - Utility types for transformations (Renamed, Prefixed, Joined, etc.)\n * - The Relation interface with all operators\n * - Helper types for predicates, extensions, aggregators, etc.\n */\n\n// ============================================================================\n// Base Types\n// ============================================================================\n\n/** Attribute name in a tuple */\ntype AttrName = string\n\n/** A tuple is a record mapping attribute names to values */\ntype Tuple = Record<AttrName, unknown>\n\n// ============================================================================\n// Rename Types\n// ============================================================================\n\n/** Map from old attribute names to new attribute names */\ntype RenameMap<T> = { [K in keyof T]?: string };\n\n/** Transform tuple type by renaming keys according to RenameMap */\ntype Renamed<T, R extends RenameMap<T>> = {\n [K in keyof T as K extends keyof R ? (R[K] extends string ? R[K] : K) : K]: T[K];\n};\n\n// ============================================================================\n// Prefix/Suffix Types\n// ============================================================================\n\n/** Prefix all keys except those in Except */\ntype Prefixed<T, P extends string, Except extends keyof T = never> = {\n [K in keyof T as K extends Except ? K : `${P}${K & string}`]: T[K];\n};\n\n/** Suffix all keys except those in Except */\ntype Suffixed<T, S extends string, Except extends keyof T = never> = {\n [K in keyof T as K extends Except ? K : `${K & string}${S}`]: T[K];\n};\n\n// ============================================================================\n// Join Types\n// ============================================================================\n\n/** Extract common keys between two tuple types */\ntype CommonKeys<L, R> = Extract<keyof L, keyof R>;\n\n/** Result of inner join: L & R with R's common keys removed */\ntype Joined<L, R> = L & Omit<R, CommonKeys<L, R>>;\n\n/** Result of left join: L & optional R attributes (common keys removed) */\ntype LeftJoined<L, R> = L & Partial<Omit<R, CommonKeys<L, R>>>;\n\n/**\n * Typed join keys for array form: keys must exist on BOTH operands.\n * Example: suppliers.join(parts, ['city']) - 'city' must be a key of both.\n */\ntype TypedJoinKeysArray<L, R> = (keyof L & keyof R & string)[];\n\n/**\n * Typed join keys for object form: maps left keys to right keys.\n * Example: suppliers.join(parts, { sid: 'supplier_id' })\n * - Left key (sid) must exist on L\n * - Right key (supplier_id) must exist on R\n */\ntype TypedJoinKeysObject<L, R> = { [K in keyof L & string]?: keyof R & string };\n\n// ============================================================================\n// Wrap/Unwrap Types\n// ============================================================================\n\n/** Result of wrap: remove wrapped attrs, add nested object */\ntype Wrapped<T, K extends keyof T, As extends string> =\n Omit<T, K> & Record<As, Pick<T, K>>;\n\n/** Result of unwrap: remove object attr, spread its properties */\ntype Unwrapped<T, K extends keyof T> =\n T[K] extends Record<string, unknown> ? Omit<T, K> & T[K] : Omit<T, K>;\n\n/** Result of ungroup: remove relation attr, flatten its tuple type */\ntype Ungrouped<T, K extends keyof T> =\n T[K] extends Relation<infer N> ? Omit<T, K> & N : Omit<T, K>;\n\n// ============================================================================\n// Aggregator Types\n// ============================================================================\n\ntype AggregatorName = 'count' | 'sum' | 'min' | 'max' | 'avg' | 'collect'\ntype AggregatorSpec = { op: AggregatorName, attr: AttrName }\ntype AggregatorFunc = (tuples: Tuple[]) => unknown\ntype Aggregator = AggregatorName | AggregatorSpec | AggregatorFunc\ntype Aggregators = Record<AttrName, Aggregator>\n\n/** Infer result type from aggregator specification */\ntype AggregatorResult<A> =\n A extends 'count' ? number :\n A extends { op: 'count' } ? number :\n A extends { op: 'sum' | 'avg' | 'min' | 'max' } ? number | null :\n A extends { op: 'collect' } ? unknown[] :\n A extends (tuples: Tuple[]) => infer R ? R :\n unknown;\n\n/** Map aggregator definitions to their result types */\ntype AggregatorResults<Aggs extends Record<string, unknown>> = {\n [K in keyof Aggs]: AggregatorResult<Aggs[K]>;\n};\n\n// ============================================================================\n// Predicate Types\n// ============================================================================\n\n/** Predicate function that receives a typed tuple */\ntype TypedPredicateFunc<T> = (t: T) => boolean\n\n/** Predicate: either a partial tuple for equality matching, or a function */\ntype TypedPredicate<T> = Partial<T> | TypedPredicateFunc<T>\n\n// Legacy predicate types (for backwards compatibility with standalone operators)\ntype PredicateFunc = ((t: Tuple) => any)\ntype Predicate = Tuple | PredicateFunc\n\n// ============================================================================\n// Extension Types\n// ============================================================================\n\n/** Extension function that receives a typed tuple */\ntype TypedExtensionFunc<T, R> = (tuple: T) => R\n\n/** Extension definition: function returning value, or attribute name to copy */\ntype TypedExtension<T, E extends Record<string, unknown>> = {\n [K in keyof E]: TypedExtensionFunc<T, E[K]> | keyof T;\n}\n\ntype ExtensionFunc = (tuple: Tuple) => unknown\ntype Extension = Record<AttrName, ExtensionFunc | AttrName>\n\n// ============================================================================\n// Other Helper Types\n// ============================================================================\n\ninterface PrefixOptions {\n except?: AttrName[]\n}\n\ninterface SuffixOptions {\n except?: AttrName[]\n}\n\ninterface AutowrapOptions {\n separator?: string\n}\n\ntype Renaming = RenamingObj | RenamingFunc\ntype RenamingFunc = (attr: AttrName) => AttrName\ntype RenamingObj = Record<AttrName, AttrName>\n\ntype JoinKeys = AttrName[] | Record<AttrName, AttrName>\n\ntype TransformFunc = (value: unknown) => unknown\ntype Transformation = TransformFunc | TransformFunc[] | Record<AttrName, TransformFunc | TransformFunc[]>\n\n// ============================================================================\n// Relation Interface\n// ============================================================================\n\n/**\n * Relation interface with generic type parameter for tuple type.\n * Default parameter `Tuple` ensures backwards compatibility.\n *\n * @typeParam T - The tuple type for this relation. Defaults to `Tuple` (Record<string, unknown>).\n *\n * @example\n * // Untyped usage (backwards compatible)\n * const r = Bmg([{ id: 1 }]); // Relation<Tuple>\n *\n * @example\n * // Typed usage with full type safety\n * interface Person { id: number; name: string }\n * const r = Bmg<Person>([{ id: 1, name: 'Alice' }]);\n * r.project(['id']); // Relation<{ id: number }>\n */\ninterface Relation<T = Tuple> {\n // === Type-preserving operators ===\n\n restrict(p: TypedPredicate<T>): Relation<T>\n where(p: TypedPredicate<T>): Relation<T>\n exclude(p: TypedPredicate<T>): Relation<T>\n\n // === Projection operators ===\n\n project<K extends keyof T>(attrs: K[]): Relation<Pick<T, K>>\n allbut<K extends keyof T>(attrs: K[]): Relation<Omit<T, K>>\n\n // === Extension operators ===\n\n extend<E extends Record<string, unknown>>(e: TypedExtension<T, E>): Relation<T & E>\n constants<C extends Tuple>(consts: C): Relation<T & C>\n\n // === Rename operators ===\n\n rename<R extends RenameMap<T>>(r: R): Relation<Renamed<T, R>>\n prefix<P extends string, Ex extends keyof T = never>(pfx: P, options?: { except?: Ex[] }): Relation<Prefixed<T, P, Ex>>\n suffix<S extends string, Ex extends keyof T = never>(sfx: S, options?: { except?: Ex[] }): Relation<Suffixed<T, S, Ex>>\n\n // === Set operators (require same type) ===\n\n union(right: RelationOperand<T>): Relation<T>\n minus(right: RelationOperand<T>): Relation<T>\n intersect(right: RelationOperand<T>): Relation<T>\n\n // === Semi-join operators (preserve left type) ===\n\n matching<R>(right: RelationOperand<R>, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<T>\n not_matching<R>(right: RelationOperand<R>, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<T>\n\n // === Join operators ===\n\n join<R>(right: RelationOperand<R>, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<Joined<T, R>>\n left_join<R>(right: RelationOperand<R>, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<LeftJoined<T, R>>\n cross_product<R>(right: RelationOperand<R>): Relation<T & R>\n cross_join<R>(right: RelationOperand<R>): Relation<T & R>\n\n // === Nesting operators ===\n\n image<R, As extends string>(right: RelationOperand<R>, as: As, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<T & Record<As, Relation<Omit<R, keyof T & keyof R>>>>\n group<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Omit<T, K> & Record<As, Relation<Pick<T, K>>>>\n ungroup<K extends keyof T>(attr: K): Relation<Ungrouped<T, K>>\n wrap<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Wrapped<T, K, As>>\n unwrap<K extends keyof T>(attr: K): Relation<Unwrapped<T, K>>\n\n // === Aggregation ===\n\n summarize<By extends keyof T, Aggs extends Aggregators>(by: By[], aggs: Aggs): Relation<Pick<T, By> & AggregatorResults<Aggs>>\n\n // === Transform ===\n\n transform(t: Transformation): Relation<T>\n\n // === Dynamic (loses type precision) ===\n\n autowrap(options?: AutowrapOptions): Relation<Tuple>\n\n // === Non-relational ===\n\n one(): T\n yByX<Y extends keyof T, X extends keyof T>(y: Y, x: X): Record<T[X] & PropertyKey, T[Y]>\n toArray(): T[]\n isEqual(right: any): boolean\n}\n\n// ============================================================================\n// Operands\n// ============================================================================\n\ntype RelationOperand<T = Tuple> = Relation<T> | T[]\n\ninterface OperationalOperand<T = Tuple> {\n tuples(): Iterable<T>\n output(tuples: T[]): RelationOperand<T>\n}\n\n// ============================================================================\n// Bmg Function Declaration\n// ============================================================================\n\n/** Create a relation from an array of tuples */\ndeclare function Bmg<T>(tuples: T[]): Relation<T>\ndeclare namespace Bmg {\n function isRelation(op: unknown): boolean\n}\n",exports.allbut=x,exports.autowrap=D,exports.constants=m,exports.cross_join=P,exports.cross_product=P,exports.exclude=g,exports.extend=A,exports.group=U,exports.image=J,exports.intersect=k,exports.isEqual=W,exports.isRelation=u,exports.join=S,exports.left_join=N,exports.matching=K,exports.minus=w,exports.not_matching=O,exports.one=Y,exports.prefix=T,exports.project=R,exports.rename=v,exports.restrict=y,exports.suffix=h,exports.summarize=_,exports.transform=$,exports.ungroup=X,exports.union=b,exports.unwrap=z,exports.where=y,exports.wrap=q,exports.yByX=V;
|
|
1
|
+
function e(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}function n(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,s(r.key),r)}}function t(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function r(n,t){var r="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(r)return(r=r.call(n)).next.bind(r);if(Array.isArray(n)||(r=function(n,t){if(n){if("string"==typeof n)return e(n,t);var r={}.toString.call(n).slice(8,-1);return"Object"===r&&n.constructor&&(r=n.constructor.name),"Map"===r||"Set"===r?Array.from(n):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?e(n,t):void 0}}(n))||t&&n&&"number"==typeof n.length){r&&(n=r);var o=0;return function(){return o>=n.length?{done:!0}:{done:!1,value:n[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(){return o=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},o.apply(null,arguments)}function i(){var e,n,t="function"==typeof Symbol?Symbol:{},r=t.iterator||"@@iterator",o=t.toStringTag||"@@toStringTag";function a(t,r,o,i){var a=Object.create((r&&r.prototype instanceof p?r:p).prototype);return u(a,"_invoke",function(t,r,o){var i,u,a,p=0,c=o||[],f=!1,l={p:0,n:0,v:e,a:d,f:d.bind(e,4),d:function(n,t){return i=n,u=0,a=e,l.n=t,s}};function d(t,r){for(u=t,a=r,n=0;!f&&p&&!o&&n<c.length;n++){var o,i=c[n],d=l.p,y=i[2];t>3?(o=y===r)&&(a=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=e):i[0]<=d&&((o=t<2&&d<i[1])?(u=0,l.v=r,l.n=i[1]):d<y&&(o=t<3||i[0]>r||r>y)&&(i[4]=t,i[5]=r,l.n=y,u=0))}if(o||t>1)return s;throw f=!0,r}return function(o,c,y){if(p>1)throw TypeError("Generator is already running");for(f&&1===c&&d(c,y),u=c,a=y;(n=u<2?e:a)||!f;){i||(u?u<3?(u>1&&(l.n=-1),d(u,a)):l.n=a:l.v=a);try{if(p=2,i){if(u||(o="next"),n=i[o]){if(!(n=n.call(i,a)))throw TypeError("iterator result is not an object");if(!n.done)return n;a=n.value,u<2&&(u=0)}else 1===u&&(n=i.return)&&n.call(i),u<2&&(a=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=e}else if((n=(f=l.n<0)?a:t.call(r,l))!==s)break}catch(n){i=e,u=1,a=n}finally{p=1}}return{value:n,done:f}}}(t,o,i),!0),a}var s={};function p(){}function c(){}function f(){}n=Object.getPrototypeOf;var l=[][r]?n(n([][r]())):(u(n={},r,function(){return this}),n),d=f.prototype=p.prototype=Object.create(l);function y(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,f):(e.__proto__=f,u(e,o,"GeneratorFunction")),e.prototype=Object.create(d),e}return c.prototype=f,u(d,"constructor",f),u(f,"constructor",c),c.displayName="GeneratorFunction",u(f,o,"GeneratorFunction"),u(d),u(d,o,"Generator"),u(d,r,function(){return this}),u(d,"toString",function(){return"[object Generator]"}),(i=function(){return{w:a,m:y}})()}function u(e,n,t,r){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}u=function(e,n,t,r){function i(n,t){u(e,n,function(e){return this._invoke(n,t,e)})}n?o?o(e,n,{value:t,enumerable:!r,configurable:!r,writable:!r}):e[n]=t:(i("next",0),i("throw",1),i("return",2))},u(e,n,t,r)}function a(e){if(null!=e){var n=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],t=0;if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&t>=e.length&&(e=void 0),{value:e&&e[t++],done:!e}}}}throw new TypeError(typeof e+" is not iterable")}function s(e){var n=function(e){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var t=n.call(e,"string");if("object"!=typeof t)return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof n?n:n+""}var p=function(e){if("function"==typeof e)return e;var n=e;return function(e){return Object.keys(n).every(function(t){return e[t]===n[t]})}},c=function(e){return null!=e&&e.constructor===R},f={topLeft:"+",topCenter:"+",topRight:"+",midLeft:"+",midCenter:"+",midRight:"+",bottomLeft:"+",bottomCenter:"+",bottomRight:"+",horizontal:"-",vertical:"|"},l={ascii:f,single:{topLeft:"┌",topCenter:"┬",topRight:"┐",midLeft:"├",midCenter:"┼",midRight:"┤",bottomLeft:"└",bottomCenter:"┴",bottomRight:"┘",horizontal:"─",vertical:"│"},double:{topLeft:"╔",topCenter:"╦",topRight:"╗",midLeft:"╠",midCenter:"╬",midRight:"╣",bottomLeft:"╚",bottomCenter:"╩",bottomRight:"╝",horizontal:"═",vertical:"║"},rounded:{topLeft:"╭",topCenter:"┬",topRight:"╮",midLeft:"├",midCenter:"┼",midRight:"┤",bottomLeft:"╰",bottomCenter:"┴",bottomRight:"╯",horizontal:"─",vertical:"│"}},d=function(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},y=function(e,n){return null===e?null!=n?n:0:null===n||e>n?e:n},h=/*#__PURE__*/function(){function e(e,n){this.value=void 0,this.renderer=void 0,this._textRendering=null,this._minWidth=null,this.renderer=e,this.value=n}var n=e.prototype;return n.renderingLines=function(e){return void 0===e?this.textRendering.split("\n"):"number"==typeof this.value?this.renderingLines().map(function(n){return n.padStart(e)}):this.renderingLines().map(function(n){return n.padEnd(e)})},n.computeTextRendering=function(){var e,n=this.value;if(null===n)return"[null]";if(void 0===n)return"[undefined]";if("symbol"==typeof n)return n.toString();if("number"==typeof n){var t;if(Number.isInteger(n))return String(n);var r=null!=(t=this.renderer.options.floatPrecision)?t:3;return n.toFixed(r)}return c(e=n)||Array.isArray(e)&&e.every(d)?this.renderer.render(n,""):Array.isArray(n)?this.arrayRendering(n):n instanceof Date?n.toISOString():"object"==typeof n?JSON.stringify(n):String(n)},n.arrayRendering=function(n){var t=this;if(n.length>0&&d(n[0]))return this.renderer.render(n,"");if(0===n.length)return"[]";var r=n.map(function(n){return new e(t.renderer,n).textRendering});return r.reduce(function(e,n){return e+n.length},0)<20?"["+r.join(", ")+"]":"["+r.join(",\n ")+"]"},t(e,[{key:"minWidth",get:function(){return null===this._minWidth&&(this._minWidth=this.renderingLines().reduce(function(e,n){return y(e,n.length)},0)),this._minWidth}},{key:"textRendering",get:function(){return null===this._textRendering&&(this._textRendering=this.computeTextRendering()),this._textRendering}}])}(),m=/*#__PURE__*/function(){function e(e,n){this.cells=void 0,this.cells=n.map(function(n){return new h(e,n)})}var n=e.prototype;return n.minWidths=function(){return this.cells.map(function(e){return e.minWidth})},n.renderingLines=function(e,n){for(var t=n.vertical,r=0,o=this.cells.map(function(n,t){var o=n.renderingLines(e[t]);return r=y(r,o.length),o}),i=[],u=function(n){var r=o.map(function(t,r){var o;return null!=(o=t[n])?o:" ".repeat(e[r])}).join(" "+t+" ");i.push(t+" "+r+" "+t)},a=0;a<r;a++)u(a);return 0===i.length?[t+" "+t]:i},e}(),g=/*#__PURE__*/function(){function e(e,n,t){var r;this.renderer=void 0,this.border=void 0,this.header=void 0,this.rows=void 0,this._sizes=null,this.renderer=e,this.border=void 0===(r=e.options.border)?f:"string"==typeof r?l[r]:r,this.header=new m(e,t),this.rows=n.map(function(n){return new m(e,n)})}var n=e.prototype;return n.makeSep=function(e,n,t){var r=this.border.horizontal;return e+r+this.sizes.map(function(e){return r.repeat(e)}).join(r+n+r)+r+t},n.eachLine=/*#__PURE__*/i().m(function e(){var n,t,o,u;return i().w(function(e){for(;;)switch(e.n){case 0:if(void 0===(n=this.renderer.options.trimAt)){e.n=4;break}t=r(this.eachLineRaw());case 1:if((o=t()).done){e.n=3;break}return u=o.value,e.n=2,u.substring(0,n);case 2:e.n=1;break;case 3:e.n=5;break;case 4:return e.d(a(this.eachLineRaw()),5);case 5:return e.a(2)}},e,this)}),n.eachLineRaw=/*#__PURE__*/i().m(function e(){var n,t,o,u,a;return i().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,this.topSep;case 1:return e.n=2,this.header.renderingLines(this.sizes,this.border)[0];case 2:return e.n=3,this.midSep;case 3:n=r(this.rows);case 4:if((t=n()).done){e.n=8;break}o=r(t.value.renderingLines(this.sizes,this.border));case 5:if((u=o()).done){e.n=7;break}return a=u.value,e.n=6,a;case 6:e.n=5;break;case 7:e.n=4;break;case 8:return e.n=9,this.bottomSep;case 9:return e.a(2)}},e,this)}),n[Symbol.iterator]=/*#__PURE__*/i().m(function e(){var n,t,o;return i().w(function(e){for(;;)switch(e.n){case 0:n=r(this.eachLine());case 1:if((t=n()).done){e.n=3;break}return o=t.value,e.n=2,o.trimEnd()+"\n";case 2:e.n=1;break;case 3:return e.a(2)}},e,this)}),n.toString=function(){for(var e,n="",t=r(this);!(e=t()).done;)n+=e.value;return n},t(e,[{key:"sizes",get:function(){if(null===this._sizes){var e=this.header.minWidths();this._sizes=this.rows.reduce(function(e,n){var t=n.minWidths();return e.map(function(e,n){var r;return y(e,null!=(r=t[n])?r:0)})},e)}return this._sizes}},{key:"topSep",get:function(){return this.makeSep(this.border.topLeft,this.border.topCenter,this.border.topRight)}},{key:"midSep",get:function(){return this.makeSep(this.border.midLeft,this.border.midCenter,this.border.midRight)}},{key:"bottomSep",get:function(){return this.makeSep(this.border.bottomLeft,this.border.bottomCenter,this.border.bottomRight)}}])}(),v=/*#__PURE__*/function(){function e(e){void 0===e&&(e={}),this.options=void 0,this.options=e}var n=e.prototype;return n.render=function(e,n){void 0===n&&(n="");for(var t,o=r(this.eachLine(e));!(t=o()).done;)n+=t.value;return n},n.eachLine=/*#__PURE__*/i().m(function e(n){var t,r,o,u;return i().w(function(e){for(;;)switch(e.n){case 0:return t=d(n)&&!c(n)?[n]:c(n)?n.toArray():n,r=t.reduce(function(e,n){for(var t=0,r=Object.keys(n);t<r.length;t++){var o=r[t];e.includes(o)||e.push(o)}return e},[]),o=t.map(function(e){return r.map(function(n){return e[n]})}),u=new g(this,o,r),e.d(a(u),1);case 1:return e.a(2)}},e,this)}),e}(),T=function(e,n){return void 0===n&&(n={}),new v(n).render(e)},R=/*#__PURE__*/function(){function e(e){this.tuples=void 0,this.tuples=e,this.tuples=e}var n=e.prototype;return n.restrict=function(e){return S(this,e)},n.where=function(e){return S(this,e)},n.exclude=function(e){return E(this,e)},n.project=function(e){return J(this,e)},n.allbut=function(e){return C(this,e)},n.extend=function(e){return F(this,e)},n.constants=function(e){return L(this,e)},n.rename=function(e){return P(this,e)},n.prefix=function(e,n){return N(this,e,n)},n.suffix=function(e,n){return _(this,e,n)},n.union=function(e){return z(this,e)},n.minus=function(e){return B(this,e)},n.intersect=function(e){return M(this,e)},n.matching=function(e,n){return I(this,e,n)},n.not_matching=function(e,n){return W(this,e,n)},n.join=function(e,n){return D(this,e,n)},n.left_join=function(e,n){return X(this,e,n)},n.cross_product=function(e){return q(this,e)},n.cross_join=function(e){return q(this,e)},n.image=function(e,n,t){return $(this,e,n,t)},n.group=function(e,n){return ne(this,e,n)},n.ungroup=function(e){return re(this,e)},n.wrap=function(e,n){return oe(this,e,n)},n.unwrap=function(e){return ie(this,e)},n.summarize=function(e,n){return Q(this,e,n)},n.transform=function(e){return ae(this,e)},n.autowrap=function(e){return ue(this,e)},n.one=function(){return ce(this)},n.toArray=function(){return this.tuples},n.yByX=function(e,n){return fe(this,e,n)},n.isEqual=function(e){return pe(this,e)},n.toText=function(e){return T(this,e)},e}(),b=function(e){var n=Object.entries(e).map(function(e){return[e[0],(n=e[1],c(n)?n.toArray().map(function(e){return b(e)}).sort():n)];var n});return JSON.stringify(n.sort(function(e,n){return e[0].localeCompare(n[0])}))},x=function(e){for(var n,t=new Set,o=[],i=r(e);!(n=i()).done;){var u=n.value,a=b(u);t.has(a)||(t.add(a),o.push(u))}return o},w=function(e){if(Array.isArray(e))return{tuples:function(){return e},output:function(e){return e}};if(c(e))return{tuples:function(){return e.toArray()},output:function(e){return new R(e)}};throw"Unable to iterate "+e},k=function(e){throw e},A=function(e,n,t){return e?Array.isArray(e)?e.reduce(function(e,n){return e[n]=n,e},{}):e:function(e,n){if(0===e.length||0===n.length)return[];var t=new Set(Object.keys(e[0]));return Object.keys(n[0]).filter(function(e){return t.has(e)})}(n,t).reduce(function(e,n){return e[n]=n,e},{})},O=function(e,n,t){for(var r=0,o=Object.entries(t);r<o.length;r++){var i=o[r];if(e[i[0]]!==n[i[1]])return!1}return!0},j=function(e,n,t){return("left"===t?Object.keys(n):Object.values(n)).map(function(n){return JSON.stringify(e[n])}).join("|")},K=function(e,n){for(var t=new Set(Object.values(n)),r={},o=0,i=Object.entries(e);o<i.length;o++){var u=i[o],a=u[0],s=u[1];t.has(a)||(r[a]=s)}return r},S=function(e,n){for(var t,o=w(e),i=o.tuples(),u=p(n),a=[],s=r(i);!(t=s()).done;){var c=t.value;u(c)&&a.push(c)}return o.output(a)},E=function(e,n){for(var t,o=w(e),i=o.tuples(),u=p(n),a=[],s=r(i);!(t=s()).done;){var c=t.value;u(c)||a.push(c)}return o.output(a)},L=function(e,n){for(var t,i=w(e),u=[],a=r(i.tuples());!(t=a()).done;)u.push(o({},t.value,n));return i.output(u)},P=function(e,n){for(var t,o=w(e),i=o.tuples(),u=function(e){return"function"==typeof e?e:function(n){return e[n]||n}}(n),a=[],s=function(){var e=t.value,n=Object.keys(e).reduce(function(n,t){return n[u(t)]=e[t],n},{});a.push(n)},p=r(i);!(t=p()).done;)s();return o.output(a)},N=function(e,n,t){var r,o=new Set(null!=(r=null==t?void 0:t.except)?r:[]);return P(e,function(e){return o.has(e)?e:""+n+e})},_=function(e,n,t){var r,o=new Set(null!=(r=null==t?void 0:t.except)?r:[]);return P(e,function(e){return o.has(e)?e:""+e+n})},J=function(e,n){for(var t,o=w(e),i=o.tuples(),u=[],a=function(){var e=t.value,r=n.reduce(function(n,t){return t in e&&(n[t]=e[t]),n},{});u.push(r)},s=r(i);!(t=s()).done;)a();return o.output(x(u))},C=function(e,n){for(var t,o=w(e),i=o.tuples(),u=new Set(n),a=[],s=function(){var e=t.value,n=Object.keys(e).reduce(function(n,t){return u.has(t)||(n[t]=e[t]),n},{});a.push(n)},p=r(i);!(t=p()).done;)s();return o.output(x(a))},F=function(e,n){for(var t,i=w(e),u=[],a=r(i.tuples());!(t=a()).done;){for(var s=t.value,p=o({},s),c=0,f=Object.entries(n);c<f.length;c++){var l=f[c],d=l[1];p[l[0]]="function"==typeof d?d(s):s[d]}u.push(p)}return i.output(u)},z=function(e,n){for(var t,o=w(e),i=w(n),u=new Set,a=[],s=r(o.tuples());!(t=s()).done;){var p=t.value,c=b(p);u.has(c)||(u.add(c),a.push(p))}for(var f,l=r(i.tuples());!(f=l()).done;){var d=f.value,y=b(d);u.has(y)||(u.add(y),a.push(d))}return o.output(a)},B=function(e,n){for(var t,o=w(e),i=w(n),u=new Set,a=r(i.tuples());!(t=a()).done;)u.add(b(t.value));for(var s,p=new Set,c=[],f=r(o.tuples());!(s=f()).done;){var l=s.value,d=b(l);u.has(d)||p.has(d)||(p.add(d),c.push(l))}return o.output(c)},M=function(e,n){for(var t,o=w(e),i=w(n),u=new Set,a=r(i.tuples());!(t=a()).done;)u.add(b(t.value));for(var s,p=new Set,c=[],f=r(o.tuples());!(s=f()).done;){var l=s.value,d=b(l);u.has(d)&&!p.has(d)&&(p.add(d),c.push(l))}return o.output(c)},I=function(e,n,t){for(var o,i=w(e),u=w(n),a=[].concat(i.tuples()),s=[].concat(u.tuples()),p=A(t,a,s),c=new Set,f=r(s);!(o=f()).done;)c.add(j(o.value,p,"right"));for(var l,d=[],y=r(a);!(l=y()).done;){var h=l.value;c.has(j(h,p,"left"))&&d.push(h)}return i.output(d)},W=function(e,n,t){for(var o,i=w(e),u=w(n),a=[].concat(i.tuples()),s=[].concat(u.tuples()),p=A(t,a,s),c=new Set,f=r(s);!(o=f()).done;)c.add(j(o.value,p,"right"));for(var l,d=[],y=r(a);!(l=y()).done;){var h=l.value;c.has(j(h,p,"left"))||d.push(h)}return i.output(d)},U=function(e,n,t){return o({},e,K(n,t))},D=function(e,n,t){for(var o,i=w(e),u=w(n),a=[].concat(i.tuples()),s=[].concat(u.tuples()),p=A(t,a,s),c=[],f=r(a);!(o=f()).done;)for(var l,d=o.value,y=r(s);!(l=y()).done;){var h=l.value;O(d,h,p)&&c.push(U(d,h,p))}return i.output(c)},G=function(e,n,t){for(var i,u=o({},e),a=r(t);!(i=a()).done;){var s=i.value;u[s]=n?n[s]:null}return u},X=function(e,n,t){for(var o,i=w(e),u=w(n),a=[].concat(i.tuples()),s=[].concat(u.tuples()),p=A(t,a,s),c=function(e,n){if(0===e.length)return[];var t=new Set(Object.values(n));return Object.keys(e[0]).filter(function(e){return!t.has(e)})}(s,p),f=[],l=r(a);!(o=l()).done;){for(var d,y=o.value,h=!1,m=r(s);!(d=m()).done;){var g=d.value;O(y,g,p)&&(f.push(G(y,g,c)),h=!0)}h||f.push(G(y,null,c))}return i.output(f)},q=function(e,n){for(var t,i=w(e),u=w(n),a=[].concat(i.tuples()),s=[].concat(u.tuples()),p=[],c=r(a);!(t=c()).done;)for(var f,l=t.value,d=r(s);!(f=d()).done;)p.push(o({},f.value,l));return i.output(x(p))},$=function(e,n,t,i){for(var u,a=w(e),s=w(n),p=[].concat(a.tuples()),c=[].concat(s.tuples()),f=A(i,p,c),l=[],d=r(p);!(u=d()).done;){for(var y,h,m=u.value,g=[],v=r(c);!(h=v()).done;){var T=h.value;O(m,T,f)&&g.push(K(T,f))}l.push(o({},m,((y={})[t]=new R(g),y)))}return a.output(l)},H=function(e,n){return n.map(function(n){return JSON.stringify(e[n])}).join("|")},Y=function(e,n){return n.reduce(function(n,t){return n[t]=e[t],n},{})},V=function(e,n){if("function"==typeof n)return n(e);var t="string"==typeof n?{op:n,attr:""}:n,r=t.op,o=t.attr;switch(r){case"count":return e.length;case"sum":return e.reduce(function(e,n){return e+(Number(n[o])||0)},0);case"min":var i=e.map(function(e){return e[o]}).filter(function(e){return null!=e});return i.length>0?Math.min.apply(Math,i.map(Number)):null;case"max":var u=e.map(function(e){return e[o]}).filter(function(e){return null!=e});return u.length>0?Math.max.apply(Math,u.map(Number)):null;case"avg":var a=e.map(function(e){return Number(e[o])}).filter(function(e){return!isNaN(e)});return a.length>0?a.reduce(function(e,n){return e+n},0)/a.length:null;case"collect":return e.map(function(e){return e[o]});default:throw new Error("Unknown aggregator: "+r)}},Q=function(e,n,t){for(var o,i=w(e),u=[].concat(i.tuples()),a=new Map,s=r(u);!(o=s()).done;){var p=o.value,c=H(p,n);a.has(c)||a.set(c,[]),a.get(c).push(p)}for(var f,l=[],d=r(a.values());!(f=d()).done;){for(var y=f.value,h=Y(y[0],n),m=0,g=Object.entries(t);m<g.length;m++){var v=g[m];h[v[0]]=V(y,v[1])}l.push(h)}return i.output(l)},Z=function(e,n){return n.map(function(n){return JSON.stringify(e[n])}).join("|")},ee=function(e,n){return n.reduce(function(n,t){return n[t]=e[t],n},{})},ne=function(e,n,t){var i=w(e),u=[].concat(i.tuples());if(0===u.length)return i.output([]);for(var a,s=Object.keys(u[0]),p=new Set(n),c=s.filter(function(e){return!p.has(e)}),f=new Map,l=r(u);!(a=l()).done;){var d=a.value,y=Z(d,c);f.has(y)||f.set(y,{base:ee(d,c),nested:[]}),f.get(y).nested.push(ee(d,n))}for(var h,m=[],g=r(f.values());!(h=g()).done;){var v,T=h.value;m.push(o({},T.base,((v={})[t]=new R(T.nested),v)))}return i.output(m)},te=function(e){if(c(e))return e.toArray();if(Array.isArray(e))return e;throw new Error("Value is not a relation or array")},re=function(e,n){for(var t,i=w(e),u=[],a=r([].concat(i.tuples()));!(t=a()).done;){for(var s=t.value,p=te(s[n]),c={},f=0,l=Object.entries(s);f<l.length;f++){var d=l[f],y=d[0];y!==n&&(c[y]=d[1])}for(var h,m=r(p);!(h=m()).done;)u.push(o({},c,h.value))}return i.output(u)},oe=function(e,n,t){for(var i,u=w(e),a=u.tuples(),s=new Set(n),p=[],c=r(a);!(i=c()).done;){for(var f,l={},d={},y=0,h=Object.entries(i.value);y<h.length;y++){var m=h[y],g=m[0],v=m[1];s.has(g)?l[g]=v:d[g]=v}p.push(o({},d,((f={})[t]=l,f)))}return u.output(p)},ie=function(e,n){for(var t,i=w(e),u=[],a=r(i.tuples());!(t=a()).done;){var s=t.value,p=s[n];if("object"!=typeof p||null===p||Array.isArray(p))throw new Error("Attribute '"+n+"' is not a tuple (object)");for(var c={},f=0,l=Object.entries(s);f<l.length;f++){var d=l[f],y=d[0];y!==n&&(c[y]=d[1])}u.push(o({},c,p))}return i.output(u)},ue=function(n,t){for(var o,i,u=null!=(o=null==t?void 0:t.separator)?o:"_",a=w(n),s=[],p=r(a.tuples());!(i=p()).done;){for(var c={},f=0,l=Object.entries(i.value);f<l.length;f++){var d=l[f],y=d[0],h=d[1],m=y.split(u);if(1===m.length)c[y]=h;else{var g,v=m[0],T=e(m).slice(1);c[v]=null!=(g=c[v])?g:{},c[v][T.join(u)]=h}}s.push(c)}return a.output(s)},ae=function(e,n){for(var t,o=w(e),i=[],u=r(o.tuples());!(t=u()).done;){for(var a={},s=0,p=Object.entries(t.value);s<p.length;s++){var c=p[s],f=c[0];a[f]=se(c[1],f,n)}i.push(a)}return o.output(i)},se=function(e,n,t){if("function"==typeof t)return t(e);if(Array.isArray(t))return t.reduce(function(e,n){return n(e)},e);var r=t[n];return r?Array.isArray(r)?r.reduce(function(e,n){return n(e)},e):r(e):e},pe=function(e,n){for(var t,o=w(e),i=w(n),u=new Set,a=r(o.tuples());!(t=a()).done;)u.add(b(t.value));for(var s,p=new Set,c=r(i.tuples());!(s=c()).done;)p.add(b(s.value));if(u.size!==p.size)return!1;for(var f,l=r(u);!(f=l()).done;)if(!p.has(f.value))return!1;return!0},ce=function(e){for(var n,t,o=r(w(e).tuples());!(t=o()).done;){var i=t.value;if(n)return k("More than one tuple found");n=i}return n||k("Relation is empty")},fe=function(e,n,t){for(var o,i={},u=r(w(e).tuples());!(o=u()).done;){var a=o.value;i[""+a[t]]=a[n]}return i};function le(e){return new R(e)}le.isRelation=c;var de=new R([{}]),ye=new R([]);exports.Bmg=le,exports.DEE=de,exports.DUM=ye,exports.LIB_DEFINITIONS="\n/**\n * Type definitions for Bmg.js relational algebra library.\n *\n * This file defines all types needed for type-safe relational operations:\n * - Base types (AttrName, Tuple)\n * - Utility types for transformations (Renamed, Prefixed, Joined, etc.)\n * - The Relation interface with all operators\n * - Helper types for predicates, extensions, aggregators, etc.\n */\n\n// ============================================================================\n// Base Types\n// ============================================================================\n\n/** Attribute name in a tuple */\ntype AttrName = string\n\n/** A tuple is a record mapping attribute names to values */\ntype Tuple = Record<AttrName, unknown>\n\n// ============================================================================\n// Rename Types\n// ============================================================================\n\n/** Map from old attribute names to new attribute names */\ntype RenameMap<T> = { [K in keyof T]?: string };\n\n/** Transform tuple type by renaming keys according to RenameMap */\ntype Renamed<T, R extends RenameMap<T>> = {\n [K in keyof T as K extends keyof R ? (R[K] extends string ? R[K] : K) : K]: T[K];\n};\n\n// ============================================================================\n// Prefix/Suffix Types\n// ============================================================================\n\n/** Prefix all keys except those in Except */\ntype Prefixed<T, P extends string, Except extends keyof T = never> = {\n [K in keyof T as K extends Except ? K : `${P}${K & string}`]: T[K];\n};\n\n/** Suffix all keys except those in Except */\ntype Suffixed<T, S extends string, Except extends keyof T = never> = {\n [K in keyof T as K extends Except ? K : `${K & string}${S}`]: T[K];\n};\n\n// ============================================================================\n// Join Types\n// ============================================================================\n\n/** Extract common keys between two tuple types */\ntype CommonKeys<L, R> = Extract<keyof L, keyof R>;\n\n/** Result of inner join: L & R with R's common keys removed */\ntype Joined<L, R> = L & Omit<R, CommonKeys<L, R>>;\n\n/** Result of left join: L & optional R attributes (common keys removed) */\ntype LeftJoined<L, R> = L & Partial<Omit<R, CommonKeys<L, R>>>;\n\n/**\n * Typed join keys for array form: keys must exist on BOTH operands.\n * Example: suppliers.join(parts, ['city']) - 'city' must be a key of both.\n */\ntype TypedJoinKeysArray<L, R> = (keyof L & keyof R & string)[];\n\n/**\n * Typed join keys for object form: maps left keys to right keys.\n * Example: suppliers.join(parts, { sid: 'supplier_id' })\n * - Left key (sid) must exist on L\n * - Right key (supplier_id) must exist on R\n */\ntype TypedJoinKeysObject<L, R> = { [K in keyof L & string]?: keyof R & string };\n\n// ============================================================================\n// Wrap/Unwrap Types\n// ============================================================================\n\n/** Result of wrap: remove wrapped attrs, add nested object */\ntype Wrapped<T, K extends keyof T, As extends string> =\n Omit<T, K> & Record<As, Pick<T, K>>;\n\n/** Result of unwrap: remove object attr, spread its properties */\ntype Unwrapped<T, K extends keyof T> =\n T[K] extends Record<string, unknown> ? Omit<T, K> & T[K] : Omit<T, K>;\n\n/** Result of ungroup: remove relation attr, flatten its tuple type */\ntype Ungrouped<T, K extends keyof T> =\n T[K] extends Relation<infer N> ? Omit<T, K> & N : Omit<T, K>;\n\n// ============================================================================\n// Aggregator Types\n// ============================================================================\n\ntype AggregatorName = 'count' | 'sum' | 'min' | 'max' | 'avg' | 'collect'\ntype AggregatorSpec = { op: AggregatorName, attr: AttrName }\ntype AggregatorFunc = (tuples: Tuple[]) => unknown\ntype Aggregator = AggregatorName | AggregatorSpec | AggregatorFunc\ntype Aggregators = Record<AttrName, Aggregator>\n\n/** Infer result type from aggregator specification */\ntype AggregatorResult<A> =\n A extends 'count' ? number :\n A extends { op: 'count' } ? number :\n A extends { op: 'sum' | 'avg' | 'min' | 'max' } ? number | null :\n A extends { op: 'collect' } ? unknown[] :\n A extends (tuples: Tuple[]) => infer R ? R :\n unknown;\n\n/** Map aggregator definitions to their result types */\ntype AggregatorResults<Aggs extends Record<string, unknown>> = {\n [K in keyof Aggs]: AggregatorResult<Aggs[K]>;\n};\n\n// ============================================================================\n// Predicate Types\n// ============================================================================\n\n/** Predicate function that receives a typed tuple */\ntype TypedPredicateFunc<T> = (t: T) => boolean\n\n/** Predicate: either a partial tuple for equality matching, or a function */\ntype TypedPredicate<T> = Partial<T> | TypedPredicateFunc<T>\n\n// Legacy predicate types (for backwards compatibility with standalone operators)\ntype PredicateFunc = ((t: Tuple) => any)\ntype Predicate = Tuple | PredicateFunc\n\n// ============================================================================\n// Extension Types\n// ============================================================================\n\n/** Extension function that receives a typed tuple */\ntype TypedExtensionFunc<T, R> = (tuple: T) => R\n\n/** Extension definition: function returning value, or attribute name to copy */\ntype TypedExtension<T, E extends Record<string, unknown>> = {\n [K in keyof E]: TypedExtensionFunc<T, E[K]> | keyof T;\n}\n\ntype ExtensionFunc = (tuple: Tuple) => unknown\ntype Extension = Record<AttrName, ExtensionFunc | AttrName>\n\n// ============================================================================\n// Other Helper Types\n// ============================================================================\n\ninterface PrefixOptions {\n except?: AttrName[]\n}\n\ninterface TextOptions {\n /** Precision for floating point numbers (default: 3) */\n floatPrecision?: number;\n /** Maximum width to trim output at */\n trimAt?: number;\n}\n\ninterface SuffixOptions {\n except?: AttrName[]\n}\n\ninterface AutowrapOptions {\n separator?: string\n}\n\ntype Renaming = RenamingObj | RenamingFunc\ntype RenamingFunc = (attr: AttrName) => AttrName\ntype RenamingObj = Record<AttrName, AttrName>\n\ntype JoinKeys = AttrName[] | Record<AttrName, AttrName>\n\ntype TransformFunc = (value: unknown) => unknown\ntype Transformation = TransformFunc | TransformFunc[] | Record<AttrName, TransformFunc | TransformFunc[]>\n\n// ============================================================================\n// Relation Interface\n// ============================================================================\n\n/**\n * Relation interface with generic type parameter for tuple type.\n * Default parameter `Tuple` ensures backwards compatibility.\n *\n * @typeParam T - The tuple type for this relation. Defaults to `Tuple` (Record<string, unknown>).\n *\n * @example\n * // Untyped usage (backwards compatible)\n * const r = Bmg([{ id: 1 }]); // Relation<Tuple>\n *\n * @example\n * // Typed usage with full type safety\n * interface Person { id: number; name: string }\n * const r = Bmg<Person>([{ id: 1, name: 'Alice' }]);\n * r.project(['id']); // Relation<{ id: number }>\n */\ninterface Relation<T = Tuple> {\n // === Type-preserving operators ===\n\n restrict(p: TypedPredicate<T>): Relation<T>\n where(p: TypedPredicate<T>): Relation<T>\n exclude(p: TypedPredicate<T>): Relation<T>\n\n // === Projection operators ===\n\n project<K extends keyof T>(attrs: K[]): Relation<Pick<T, K>>\n allbut<K extends keyof T>(attrs: K[]): Relation<Omit<T, K>>\n\n // === Extension operators ===\n\n extend<E extends Record<string, unknown>>(e: TypedExtension<T, E>): Relation<T & E>\n constants<C extends Tuple>(consts: C): Relation<T & C>\n\n // === Rename operators ===\n\n rename<R extends RenameMap<T>>(r: R): Relation<Renamed<T, R>>\n prefix<P extends string, Ex extends keyof T = never>(pfx: P, options?: { except?: Ex[] }): Relation<Prefixed<T, P, Ex>>\n suffix<S extends string, Ex extends keyof T = never>(sfx: S, options?: { except?: Ex[] }): Relation<Suffixed<T, S, Ex>>\n\n // === Set operators (require same type) ===\n\n union(right: RelationOperand<T>): Relation<T>\n minus(right: RelationOperand<T>): Relation<T>\n intersect(right: RelationOperand<T>): Relation<T>\n\n // === Semi-join operators (preserve left type) ===\n\n matching<R>(right: RelationOperand<R>, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<T>\n not_matching<R>(right: RelationOperand<R>, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<T>\n\n // === Join operators ===\n\n join<R>(right: RelationOperand<R>, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<Joined<T, R>>\n left_join<R>(right: RelationOperand<R>, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<LeftJoined<T, R>>\n cross_product<R>(right: RelationOperand<R>): Relation<T & R>\n cross_join<R>(right: RelationOperand<R>): Relation<T & R>\n\n // === Nesting operators ===\n\n image<R, As extends string>(right: RelationOperand<R>, as: As, keys?: TypedJoinKeysArray<T, R> | TypedJoinKeysObject<T, R>): Relation<T & Record<As, Relation<Omit<R, keyof T & keyof R>>>>\n group<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Omit<T, K> & Record<As, Relation<Pick<T, K>>>>\n ungroup<K extends keyof T>(attr: K): Relation<Ungrouped<T, K>>\n wrap<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Wrapped<T, K, As>>\n unwrap<K extends keyof T>(attr: K): Relation<Unwrapped<T, K>>\n\n // === Aggregation ===\n\n summarize<By extends keyof T, Aggs extends Aggregators>(by: By[], aggs: Aggs): Relation<Pick<T, By> & AggregatorResults<Aggs>>\n\n // === Transform ===\n\n transform(t: Transformation): Relation<T>\n\n // === Dynamic (loses type precision) ===\n\n autowrap(options?: AutowrapOptions): Relation<Tuple>\n\n // === Non-relational ===\n\n one(): T\n yByX<Y extends keyof T, X extends keyof T>(y: Y, x: X): Record<T[X] & PropertyKey, T[Y]>\n toArray(): T[]\n isEqual(right: any): boolean\n\n // === Display ===\n\n toText(options?: TextOptions): string\n}\n\n// ============================================================================\n// Operands\n// ============================================================================\n\ntype RelationOperand<T = Tuple> = Relation<T> | T[]\n\ninterface OperationalOperand<T = Tuple> {\n tuples(): Iterable<T>\n output(tuples: T[]): RelationOperand<T>\n}\n\n// ============================================================================\n// Bmg Function Declaration\n// ============================================================================\n\n/** Create a relation from an array of tuples */\ndeclare function Bmg<T>(tuples: T[]): Relation<T>\ndeclare namespace Bmg {\n function isRelation(op: unknown): boolean\n}\n",exports.allbut=C,exports.autowrap=ue,exports.constants=L,exports.cross_join=q,exports.cross_product=q,exports.exclude=E,exports.extend=F,exports.group=ne,exports.image=$,exports.intersect=M,exports.isEqual=pe,exports.isRelation=c,exports.join=D,exports.left_join=X,exports.matching=I,exports.minus=B,exports.not_matching=W,exports.one=ce,exports.prefix=N,exports.project=J,exports.rename=P,exports.restrict=S,exports.suffix=_,exports.summarize=Q,exports.toText=T,exports.transform=ae,exports.ungroup=re,exports.union=z,exports.unwrap=ie,exports.where=S,exports.wrap=oe,exports.yByX=fe;
|
|
2
2
|
//# sourceMappingURL=bmg.cjs.map
|