@_linked/core 1.3.0 → 2.0.0-next.20260310082533
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/CHANGELOG.md +113 -10
- package/README.md +209 -14
- package/lib/cjs/index.d.ts +10 -2
- package/lib/cjs/index.js +31 -6
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/package.d.ts +1 -1
- package/lib/cjs/queries/CreateBuilder.d.ts +38 -0
- package/lib/cjs/queries/CreateBuilder.js +100 -0
- package/lib/cjs/queries/CreateBuilder.js.map +1 -0
- package/lib/cjs/queries/CreateQuery.d.ts +3 -3
- package/lib/cjs/queries/CreateQuery.js.map +1 -1
- package/lib/cjs/queries/DeleteBuilder.d.ts +39 -0
- package/lib/cjs/queries/DeleteBuilder.js +85 -0
- package/lib/cjs/queries/DeleteBuilder.js.map +1 -0
- package/lib/cjs/queries/DeleteQuery.d.ts +3 -3
- package/lib/cjs/queries/DeleteQuery.js.map +1 -1
- package/lib/cjs/queries/FieldSet.d.ts +203 -0
- package/lib/cjs/queries/FieldSet.js +533 -0
- package/lib/cjs/queries/FieldSet.js.map +1 -0
- package/lib/cjs/queries/IRDesugar.d.ts +13 -8
- package/lib/cjs/queries/IRDesugar.js +143 -132
- package/lib/cjs/queries/IRDesugar.js.map +1 -1
- package/lib/cjs/queries/IRLower.js +1 -0
- package/lib/cjs/queries/IRLower.js.map +1 -1
- package/lib/cjs/queries/IntermediateRepresentation.d.ts +1 -0
- package/lib/cjs/queries/MutationQuery.d.ts +1 -1
- package/lib/cjs/queries/MutationQuery.js +1 -6
- package/lib/cjs/queries/MutationQuery.js.map +1 -1
- package/lib/cjs/queries/PropertyPath.d.ts +38 -0
- package/lib/cjs/queries/PropertyPath.js +82 -0
- package/lib/cjs/queries/PropertyPath.js.map +1 -0
- package/lib/cjs/queries/ProxiedPathBuilder.d.ts +14 -0
- package/lib/cjs/queries/ProxiedPathBuilder.js +29 -0
- package/lib/cjs/queries/ProxiedPathBuilder.js.map +1 -0
- package/lib/cjs/queries/QueryBuilder.d.ts +141 -0
- package/lib/cjs/queries/QueryBuilder.js +334 -0
- package/lib/cjs/queries/QueryBuilder.js.map +1 -0
- package/lib/cjs/queries/SelectQuery.d.ts +60 -134
- package/lib/cjs/queries/SelectQuery.js +67 -526
- package/lib/cjs/queries/SelectQuery.js.map +1 -1
- package/lib/cjs/queries/UpdateBuilder.d.ts +37 -0
- package/lib/cjs/queries/UpdateBuilder.js +84 -0
- package/lib/cjs/queries/UpdateBuilder.js.map +1 -0
- package/lib/cjs/queries/UpdateQuery.d.ts +3 -3
- package/lib/cjs/queries/UpdateQuery.js.map +1 -1
- package/lib/cjs/queries/WhereCondition.d.ts +18 -0
- package/lib/cjs/queries/WhereCondition.js +3 -0
- package/lib/cjs/queries/WhereCondition.js.map +1 -0
- package/lib/cjs/queries/resolveShape.d.ts +10 -0
- package/lib/cjs/queries/resolveShape.js +23 -0
- package/lib/cjs/queries/resolveShape.js.map +1 -0
- package/lib/cjs/shapes/SHACL.js +7 -5
- package/lib/cjs/shapes/SHACL.js.map +1 -1
- package/lib/cjs/shapes/Shape.d.ts +33 -52
- package/lib/cjs/shapes/Shape.js +36 -56
- package/lib/cjs/shapes/Shape.js.map +1 -1
- package/lib/cjs/sparql/SparqlAlgebra.d.ts +6 -1
- package/lib/cjs/sparql/algebraToString.js +10 -0
- package/lib/cjs/sparql/algebraToString.js.map +1 -1
- package/lib/cjs/sparql/irToAlgebra.js +6 -2
- package/lib/cjs/sparql/irToAlgebra.js.map +1 -1
- package/lib/cjs/test-helpers/query-fixtures.d.ts +568 -3049
- package/lib/cjs/test-helpers/query-fixtures.js +59 -18
- package/lib/cjs/test-helpers/query-fixtures.js.map +1 -1
- package/lib/cjs/test-helpers/test-utils.d.ts +18 -0
- package/lib/cjs/test-helpers/test-utils.js +47 -0
- package/lib/cjs/test-helpers/test-utils.js.map +1 -0
- package/lib/cjs/utils/Package.d.ts +8 -8
- package/lib/cjs/utils/Package.js.map +1 -1
- package/lib/cjs/utils/ShapeClass.d.ts +2 -2
- package/lib/cjs/utils/ShapeClass.js +4 -22
- package/lib/cjs/utils/ShapeClass.js.map +1 -1
- package/lib/esm/index.d.ts +10 -2
- package/lib/esm/index.js +23 -2
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/package.d.ts +1 -1
- package/lib/esm/queries/CreateBuilder.d.ts +38 -0
- package/lib/esm/queries/CreateBuilder.js +96 -0
- package/lib/esm/queries/CreateBuilder.js.map +1 -0
- package/lib/esm/queries/CreateQuery.d.ts +3 -3
- package/lib/esm/queries/CreateQuery.js.map +1 -1
- package/lib/esm/queries/DeleteBuilder.d.ts +39 -0
- package/lib/esm/queries/DeleteBuilder.js +81 -0
- package/lib/esm/queries/DeleteBuilder.js.map +1 -0
- package/lib/esm/queries/DeleteQuery.d.ts +3 -3
- package/lib/esm/queries/DeleteQuery.js.map +1 -1
- package/lib/esm/queries/FieldSet.d.ts +203 -0
- package/lib/esm/queries/FieldSet.js +529 -0
- package/lib/esm/queries/FieldSet.js.map +1 -0
- package/lib/esm/queries/IRDesugar.d.ts +13 -8
- package/lib/esm/queries/IRDesugar.js +143 -132
- package/lib/esm/queries/IRDesugar.js.map +1 -1
- package/lib/esm/queries/IRLower.js +1 -0
- package/lib/esm/queries/IRLower.js.map +1 -1
- package/lib/esm/queries/IntermediateRepresentation.d.ts +1 -0
- package/lib/esm/queries/MutationQuery.d.ts +1 -1
- package/lib/esm/queries/MutationQuery.js +1 -6
- package/lib/esm/queries/MutationQuery.js.map +1 -1
- package/lib/esm/queries/PropertyPath.d.ts +38 -0
- package/lib/esm/queries/PropertyPath.js +77 -0
- package/lib/esm/queries/PropertyPath.js.map +1 -0
- package/lib/esm/queries/ProxiedPathBuilder.d.ts +14 -0
- package/lib/esm/queries/ProxiedPathBuilder.js +26 -0
- package/lib/esm/queries/ProxiedPathBuilder.js.map +1 -0
- package/lib/esm/queries/QueryBuilder.d.ts +141 -0
- package/lib/esm/queries/QueryBuilder.js +330 -0
- package/lib/esm/queries/QueryBuilder.js.map +1 -0
- package/lib/esm/queries/SelectQuery.d.ts +60 -134
- package/lib/esm/queries/SelectQuery.js +61 -515
- package/lib/esm/queries/SelectQuery.js.map +1 -1
- package/lib/esm/queries/UpdateBuilder.d.ts +37 -0
- package/lib/esm/queries/UpdateBuilder.js +80 -0
- package/lib/esm/queries/UpdateBuilder.js.map +1 -0
- package/lib/esm/queries/UpdateQuery.d.ts +3 -3
- package/lib/esm/queries/UpdateQuery.js.map +1 -1
- package/lib/esm/queries/WhereCondition.d.ts +18 -0
- package/lib/esm/queries/WhereCondition.js +2 -0
- package/lib/esm/queries/WhereCondition.js.map +1 -0
- package/lib/esm/queries/resolveShape.d.ts +10 -0
- package/lib/esm/queries/resolveShape.js +20 -0
- package/lib/esm/queries/resolveShape.js.map +1 -0
- package/lib/esm/shapes/SHACL.js +7 -5
- package/lib/esm/shapes/SHACL.js.map +1 -1
- package/lib/esm/shapes/Shape.d.ts +33 -52
- package/lib/esm/shapes/Shape.js +36 -53
- package/lib/esm/shapes/Shape.js.map +1 -1
- package/lib/esm/sparql/SparqlAlgebra.d.ts +6 -1
- package/lib/esm/sparql/algebraToString.js +10 -0
- package/lib/esm/sparql/algebraToString.js.map +1 -1
- package/lib/esm/sparql/irToAlgebra.js +6 -2
- package/lib/esm/sparql/irToAlgebra.js.map +1 -1
- package/lib/esm/test-helpers/query-fixtures.d.ts +568 -3049
- package/lib/esm/test-helpers/query-fixtures.js +59 -18
- package/lib/esm/test-helpers/query-fixtures.js.map +1 -1
- package/lib/esm/test-helpers/test-utils.d.ts +18 -0
- package/lib/esm/test-helpers/test-utils.js +41 -0
- package/lib/esm/test-helpers/test-utils.js.map +1 -0
- package/lib/esm/utils/Package.d.ts +8 -8
- package/lib/esm/utils/Package.js.map +1 -1
- package/lib/esm/utils/ShapeClass.d.ts +2 -2
- package/lib/esm/utils/ShapeClass.js +4 -22
- package/lib/esm/utils/ShapeClass.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PropertyPath = void 0;
|
|
4
|
+
exports.walkPropertyPath = walkPropertyPath;
|
|
5
|
+
const ShapeClass_js_1 = require("../utils/ShapeClass.js");
|
|
6
|
+
/**
|
|
7
|
+
* A value object representing a sequence of property traversals from a root shape.
|
|
8
|
+
*
|
|
9
|
+
* Each segment is a PropertyShape representing one hop in the traversal.
|
|
10
|
+
* For example, `friends.name` on PersonShape produces a PropertyPath with
|
|
11
|
+
* two segments: [friendsPropertyShape, namePropertyShape].
|
|
12
|
+
*
|
|
13
|
+
* This is used by FieldSet and QueryBuilder to describe which properties
|
|
14
|
+
* to select/filter, independent of proxy tracing.
|
|
15
|
+
*/
|
|
16
|
+
class PropertyPath {
|
|
17
|
+
constructor(rootShape, segments) {
|
|
18
|
+
this.rootShape = rootShape;
|
|
19
|
+
this.segments = segments;
|
|
20
|
+
}
|
|
21
|
+
/** Append a property traversal hop, returning a new PropertyPath. */
|
|
22
|
+
prop(property) {
|
|
23
|
+
return new PropertyPath(this.rootShape, [...this.segments, property]);
|
|
24
|
+
}
|
|
25
|
+
/** The terminal (leaf) property of this path. */
|
|
26
|
+
get terminal() {
|
|
27
|
+
return this.segments[this.segments.length - 1];
|
|
28
|
+
}
|
|
29
|
+
/** The depth (number of hops) of this path. */
|
|
30
|
+
get depth() {
|
|
31
|
+
return this.segments.length;
|
|
32
|
+
}
|
|
33
|
+
/** String representation using property labels joined by dots. */
|
|
34
|
+
toString() {
|
|
35
|
+
return this.segments.map((s) => s.label).join('.');
|
|
36
|
+
}
|
|
37
|
+
/** Two PropertyPaths are equal if they have the same root shape and same segment sequence. */
|
|
38
|
+
equals(other) {
|
|
39
|
+
if (this.rootShape.id !== other.rootShape.id)
|
|
40
|
+
return false;
|
|
41
|
+
if (this.segments.length !== other.segments.length)
|
|
42
|
+
return false;
|
|
43
|
+
return this.segments.every((s, i) => s.id === other.segments[i].id);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.PropertyPath = PropertyPath;
|
|
47
|
+
/**
|
|
48
|
+
* Resolve a dot-separated property path string into a PropertyPath.
|
|
49
|
+
*
|
|
50
|
+
* Walks the shape's property shapes by label, following valueShape references
|
|
51
|
+
* to traverse into nested shapes.
|
|
52
|
+
*
|
|
53
|
+
* Example: `walkPropertyPath(PersonShape, 'friends.name')` resolves
|
|
54
|
+
* [friendsPropertyShape, namePropertyShape].
|
|
55
|
+
*
|
|
56
|
+
* @throws If any segment cannot be resolved.
|
|
57
|
+
*/
|
|
58
|
+
function walkPropertyPath(shape, path) {
|
|
59
|
+
const labels = path.split('.');
|
|
60
|
+
const segments = [];
|
|
61
|
+
let currentShape = shape;
|
|
62
|
+
for (const label of labels) {
|
|
63
|
+
const propertyShape = currentShape.getPropertyShape(label);
|
|
64
|
+
if (!propertyShape) {
|
|
65
|
+
throw new Error(`Property '${label}' not found on shape '${currentShape.label || currentShape.id}' while resolving path '${path}'`);
|
|
66
|
+
}
|
|
67
|
+
segments.push(propertyShape);
|
|
68
|
+
// If there are more segments to resolve, follow the valueShape
|
|
69
|
+
if (segments.length < labels.length) {
|
|
70
|
+
if (!propertyShape.valueShape) {
|
|
71
|
+
throw new Error(`Property '${label}' on shape '${currentShape.label || currentShape.id}' has no valueShape; cannot traverse further in path '${path}'`);
|
|
72
|
+
}
|
|
73
|
+
const shapeClass = (0, ShapeClass_js_1.getShapeClass)(propertyShape.valueShape);
|
|
74
|
+
if (!shapeClass || !shapeClass.shape) {
|
|
75
|
+
throw new Error(`Cannot resolve valueShape '${propertyShape.valueShape.id}' for property '${label}' in path '${path}'`);
|
|
76
|
+
}
|
|
77
|
+
currentShape = shapeClass.shape;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return new PropertyPath(shape, segments);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=PropertyPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyPath.js","sourceRoot":"","sources":["../../../src/queries/PropertyPath.ts"],"names":[],"mappings":";;;AA0DA,4CAgCC;AAzFD,0DAAqD;AAErD;;;;;;;;;GASG;AACH,MAAa,YAAY;IACvB,YACW,SAAoB,EACpB,QAAkC;QADlC,cAAS,GAAT,SAAS,CAAW;QACpB,aAAQ,GAAR,QAAQ,CAA0B;IAC1C,CAAC;IAEJ,qEAAqE;IACrE,IAAI,CAAC,QAAuB;QAC1B,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,iDAAiD;IACjD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,+CAA+C;IAC/C,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,kEAAkE;IAClE,QAAQ;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,8FAA8F;IAC9F,MAAM,CAAC,KAAmB;QACxB,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACjE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;CACF;AAhCD,oCAgCC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,gBAAgB,CAAC,KAAgB,EAAE,IAAY;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,aAAa,KAAK,yBAAyB,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,EAAE,2BAA2B,IAAI,GAAG,CACnH,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE7B,+DAA+D;QAC/D,IAAI,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CACb,aAAa,KAAK,eAAe,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,EAAE,yDAAyD,IAAI,GAAG,CACvI,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,IAAA,6BAAa,EAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CACb,8BAA8B,aAAa,CAAC,UAAU,CAAC,EAAE,mBAAmB,KAAK,cAAc,IAAI,GAAG,CACvG,CAAC;YACJ,CAAC;YACD,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Shape, ShapeConstructor } from '../shapes/Shape.js';
|
|
2
|
+
import { QueryBuilderObject } from './SelectQuery.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates the proxy object used as the `p` parameter in query callbacks.
|
|
5
|
+
*
|
|
6
|
+
* Property access on the returned proxy (e.g., `p.name`, `p.friends.name`)
|
|
7
|
+
* creates QueryBuilderObject chains that trace the path of requested properties.
|
|
8
|
+
* This is the shared foundation for both the DSL (`Person.select(p => p.name)`)
|
|
9
|
+
* and the future QueryBuilder API.
|
|
10
|
+
*
|
|
11
|
+
* Originally extracted from SelectQueryFactory.getQueryShape() to enable reuse
|
|
12
|
+
* across the DSL and dynamic query building.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createProxiedPathBuilder<S extends Shape>(shape: ShapeConstructor<S> | QueryBuilderObject): QueryBuilderObject;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createProxiedPathBuilder = createProxiedPathBuilder;
|
|
4
|
+
const SelectQuery_js_1 = require("./SelectQuery.js");
|
|
5
|
+
/**
|
|
6
|
+
* Creates the proxy object used as the `p` parameter in query callbacks.
|
|
7
|
+
*
|
|
8
|
+
* Property access on the returned proxy (e.g., `p.name`, `p.friends.name`)
|
|
9
|
+
* creates QueryBuilderObject chains that trace the path of requested properties.
|
|
10
|
+
* This is the shared foundation for both the DSL (`Person.select(p => p.name)`)
|
|
11
|
+
* and the future QueryBuilder API.
|
|
12
|
+
*
|
|
13
|
+
* Originally extracted from SelectQueryFactory.getQueryShape() to enable reuse
|
|
14
|
+
* across the DSL and dynamic query building.
|
|
15
|
+
*/
|
|
16
|
+
function createProxiedPathBuilder(shape) {
|
|
17
|
+
if (shape instanceof SelectQuery_js_1.QueryBuilderObject) {
|
|
18
|
+
// When a QueryBuilderObject is passed directly (e.g. QueryPrimitives
|
|
19
|
+
// used as the shape for where-clause evaluation), use it as-is.
|
|
20
|
+
return shape;
|
|
21
|
+
}
|
|
22
|
+
// Create a dummy shape instance and wrap it in a QueryShape proxy.
|
|
23
|
+
// The proxy intercepts property access and resolves each property name
|
|
24
|
+
// to its PropertyShape, building a chain of QueryBuilderObjects that
|
|
25
|
+
// records which path was traversed.
|
|
26
|
+
const dummyShape = new shape();
|
|
27
|
+
return SelectQuery_js_1.QueryShape.create(dummyShape);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=ProxiedPathBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxiedPathBuilder.js","sourceRoot":"","sources":["../../../src/queries/ProxiedPathBuilder.ts"],"names":[],"mappings":";;AAcA,4DAcC;AA3BD,qDAAgE;AAEhE;;;;;;;;;;GAUG;AACH,SAAgB,wBAAwB,CACtC,KAA+C;IAE/C,IAAI,KAAK,YAAY,mCAAkB,EAAE,CAAC;QACxC,qEAAqE;QACrE,gEAAgE;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,mEAAmE;IACnE,uEAAuE;IACvE,qEAAqE;IACrE,oCAAoC;IACpC,MAAM,UAAU,GAAG,IAAI,KAAK,EAAE,CAAC;IAC/B,OAAO,2BAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Shape, ShapeConstructor } from '../shapes/Shape.js';
|
|
2
|
+
import { SelectQuery, QueryBuildFn, WhereClause, QueryResponseToResultType, SelectAllQueryResponse, QueryComponentLike } from './SelectQuery.js';
|
|
3
|
+
import type { RawSelectInput } from './IRDesugar.js';
|
|
4
|
+
import type { NodeReferenceValue } from './QueryFactory.js';
|
|
5
|
+
import { FieldSet, FieldSetFieldJSON } from './FieldSet.js';
|
|
6
|
+
/** JSON representation of a QueryBuilder. */
|
|
7
|
+
export type QueryBuilderJSON = {
|
|
8
|
+
shape: string;
|
|
9
|
+
fields?: FieldSetFieldJSON[];
|
|
10
|
+
limit?: number;
|
|
11
|
+
offset?: number;
|
|
12
|
+
subject?: string;
|
|
13
|
+
subjects?: string[];
|
|
14
|
+
singleResult?: boolean;
|
|
15
|
+
orderDirection?: 'ASC' | 'DESC';
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* An immutable, fluent query builder for select queries.
|
|
19
|
+
*
|
|
20
|
+
* Every mutation method (`.select()`, `.where()`, `.limit()`, etc.) returns
|
|
21
|
+
* a **new** QueryBuilder instance — the original is never modified.
|
|
22
|
+
*
|
|
23
|
+
* Implements `PromiseLike` so queries execute on `await`:
|
|
24
|
+
* ```ts
|
|
25
|
+
* const results = await QueryBuilder.from(Person).select(p => p.name);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* Generates IR directly via FieldSet, guaranteeing identical output to the existing DSL.
|
|
29
|
+
*/
|
|
30
|
+
export declare class QueryBuilder<S extends Shape = Shape, R = any, Result = any> implements PromiseLike<Result>, Promise<Result> {
|
|
31
|
+
private readonly _shape;
|
|
32
|
+
private readonly _selectFn?;
|
|
33
|
+
private readonly _whereFn?;
|
|
34
|
+
private readonly _sortByFn?;
|
|
35
|
+
private readonly _sortDirection?;
|
|
36
|
+
private readonly _limit?;
|
|
37
|
+
private readonly _offset?;
|
|
38
|
+
private readonly _subject?;
|
|
39
|
+
private readonly _subjects?;
|
|
40
|
+
private readonly _singleResult?;
|
|
41
|
+
private readonly _selectAllLabels?;
|
|
42
|
+
private readonly _fieldSet?;
|
|
43
|
+
private readonly _preloads?;
|
|
44
|
+
private constructor();
|
|
45
|
+
/** Create a shallow clone with overrides. */
|
|
46
|
+
private clone;
|
|
47
|
+
/**
|
|
48
|
+
* Create a QueryBuilder for the given shape.
|
|
49
|
+
*
|
|
50
|
+
* Accepts a shape class (e.g. `Person`), a NodeShape instance,
|
|
51
|
+
* or a shape IRI string (resolved via the shape registry).
|
|
52
|
+
*/
|
|
53
|
+
static from<S extends Shape>(shape: ShapeConstructor<S> | string): QueryBuilder<S>;
|
|
54
|
+
/** Set the select projection via a callback, labels, or FieldSet. */
|
|
55
|
+
select<NewR>(fn: QueryBuildFn<S, NewR>): QueryBuilder<S, NewR, QueryResponseToResultType<NewR, S>[]>;
|
|
56
|
+
select(labels: string[]): QueryBuilder<S>;
|
|
57
|
+
select<NewR>(fieldSet: FieldSet<NewR>): QueryBuilder<S, NewR, QueryResponseToResultType<NewR, S>[]>;
|
|
58
|
+
/** Select all decorated properties of the shape. */
|
|
59
|
+
selectAll(): QueryBuilder<S, any, QueryResponseToResultType<SelectAllQueryResponse<S>, S>[]>;
|
|
60
|
+
/** Add a where clause. */
|
|
61
|
+
where(fn: WhereClause<S>): QueryBuilder<S, R, Result>;
|
|
62
|
+
/** Set sort order. */
|
|
63
|
+
orderBy<OR>(fn: QueryBuildFn<S, OR>, direction?: 'ASC' | 'DESC'): QueryBuilder<S, R, Result>;
|
|
64
|
+
/**
|
|
65
|
+
* Alias for orderBy — matches the existing DSL's `sortBy` method name.
|
|
66
|
+
*/
|
|
67
|
+
sortBy<OR>(fn: QueryBuildFn<S, OR>, direction?: 'ASC' | 'DESC'): QueryBuilder<S, R, Result>;
|
|
68
|
+
/** Set result limit. */
|
|
69
|
+
limit(n: number): QueryBuilder<S, R, Result>;
|
|
70
|
+
/** Set result offset. */
|
|
71
|
+
offset(n: number): QueryBuilder<S, R, Result>;
|
|
72
|
+
/** Target a single entity by ID. Implies singleResult; unwraps array Result type. */
|
|
73
|
+
for(id: string | NodeReferenceValue): QueryBuilder<S, R, Result extends (infer E)[] ? E : Result>;
|
|
74
|
+
/** Target multiple entities by ID, or all if no ids given. */
|
|
75
|
+
forAll(ids?: (string | NodeReferenceValue)[]): QueryBuilder<S, R, Result>;
|
|
76
|
+
/** Limit to one result. Unwraps array Result type to single element. */
|
|
77
|
+
one(): QueryBuilder<S, R, Result extends (infer E)[] ? E : Result>;
|
|
78
|
+
/**
|
|
79
|
+
* Preload a component's query fields at the given property path.
|
|
80
|
+
*
|
|
81
|
+
* This merges the component's query paths into this query's selection,
|
|
82
|
+
* wrapping them in an OPTIONAL block (handled by the IR pipeline).
|
|
83
|
+
*
|
|
84
|
+
* Equivalent to the DSL's `.preloadFor()`:
|
|
85
|
+
* ```ts
|
|
86
|
+
* // DSL style
|
|
87
|
+
* Person.select(p => p.bestFriend.preloadFor(PersonCard))
|
|
88
|
+
* // QueryBuilder style
|
|
89
|
+
* QueryBuilder.from(Person).select(p => [p.name]).preload('bestFriend', PersonCard)
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* NOTE: Preloads hold live component references and are not serializable.
|
|
93
|
+
* They are injected into the selectFn at build time (see buildFactory()),
|
|
94
|
+
* so changes to preload handling must account for the selectFn wrapping logic.
|
|
95
|
+
*/
|
|
96
|
+
preload<CS extends Shape, CR>(path: string, component: QueryComponentLike<CS, CR>): QueryBuilder<S, R, Result>;
|
|
97
|
+
/**
|
|
98
|
+
* Returns the current selection as a FieldSet.
|
|
99
|
+
* If the selection was set via a FieldSet, returns that directly.
|
|
100
|
+
* If set via selectAll labels, constructs a FieldSet from them.
|
|
101
|
+
* If set via a callback, eagerly evaluates it through the proxy to produce a FieldSet.
|
|
102
|
+
*/
|
|
103
|
+
fields(): FieldSet | undefined;
|
|
104
|
+
/**
|
|
105
|
+
* Serialize this QueryBuilder to a plain JSON object.
|
|
106
|
+
*
|
|
107
|
+
* Selections are serializable regardless of how they were set (FieldSet,
|
|
108
|
+
* string[], selectAll, or callback). Callback-based selections are eagerly
|
|
109
|
+
* evaluated through the proxy to produce a FieldSet.
|
|
110
|
+
*
|
|
111
|
+
* The `where` and `orderBy` callbacks are not serialized (only the direction
|
|
112
|
+
* is preserved for orderBy).
|
|
113
|
+
*/
|
|
114
|
+
toJSON(): QueryBuilderJSON;
|
|
115
|
+
/**
|
|
116
|
+
* Reconstruct a QueryBuilder from a JSON object.
|
|
117
|
+
* Resolves shape IRI via getShapeClass() and field paths as label selections.
|
|
118
|
+
*/
|
|
119
|
+
static fromJSON<S extends Shape = Shape>(json: QueryBuilderJSON): QueryBuilder<S>;
|
|
120
|
+
/**
|
|
121
|
+
* Get the raw pipeline input.
|
|
122
|
+
*
|
|
123
|
+
* Constructs RawSelectInput directly from FieldSet entries.
|
|
124
|
+
*/
|
|
125
|
+
toRawInput(): RawSelectInput;
|
|
126
|
+
/**
|
|
127
|
+
* Build RawSelectInput directly from FieldSet entries.
|
|
128
|
+
*/
|
|
129
|
+
private _buildDirectRawInput;
|
|
130
|
+
/** Build the IR (run the full pipeline: desugar → canonicalize → lower). */
|
|
131
|
+
build(): SelectQuery;
|
|
132
|
+
/** Execute the query and return results. */
|
|
133
|
+
exec(): Promise<Result>;
|
|
134
|
+
/** `await` triggers execution. */
|
|
135
|
+
then<TResult1 = Result, TResult2 = never>(onfulfilled?: ((value: Result) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
136
|
+
/** Catch errors from execution. Chain off then() to avoid re-executing. */
|
|
137
|
+
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): Promise<Result | TResult>;
|
|
138
|
+
/** Finally handler after execution. Chain off then() to avoid re-executing. */
|
|
139
|
+
finally(onfinally?: (() => void) | null): Promise<Result>;
|
|
140
|
+
get [Symbol.toStringTag](): string;
|
|
141
|
+
}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryBuilder = void 0;
|
|
4
|
+
const resolveShape_js_1 = require("./resolveShape.js");
|
|
5
|
+
const SelectQuery_js_1 = require("./SelectQuery.js");
|
|
6
|
+
const IRPipeline_js_1 = require("./IRPipeline.js");
|
|
7
|
+
const queryDispatch_js_1 = require("./queryDispatch.js");
|
|
8
|
+
const FieldSet_js_1 = require("./FieldSet.js");
|
|
9
|
+
/**
|
|
10
|
+
* An immutable, fluent query builder for select queries.
|
|
11
|
+
*
|
|
12
|
+
* Every mutation method (`.select()`, `.where()`, `.limit()`, etc.) returns
|
|
13
|
+
* a **new** QueryBuilder instance — the original is never modified.
|
|
14
|
+
*
|
|
15
|
+
* Implements `PromiseLike` so queries execute on `await`:
|
|
16
|
+
* ```ts
|
|
17
|
+
* const results = await QueryBuilder.from(Person).select(p => p.name);
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* Generates IR directly via FieldSet, guaranteeing identical output to the existing DSL.
|
|
21
|
+
*/
|
|
22
|
+
class QueryBuilder {
|
|
23
|
+
constructor(init) {
|
|
24
|
+
this._shape = init.shape;
|
|
25
|
+
this._selectFn = init.selectFn;
|
|
26
|
+
this._whereFn = init.whereFn;
|
|
27
|
+
this._sortByFn = init.sortByFn;
|
|
28
|
+
this._sortDirection = init.sortDirection;
|
|
29
|
+
this._limit = init.limit;
|
|
30
|
+
this._offset = init.offset;
|
|
31
|
+
this._subject = init.subject;
|
|
32
|
+
this._subjects = init.subjects;
|
|
33
|
+
this._singleResult = init.singleResult;
|
|
34
|
+
this._selectAllLabels = init.selectAllLabels;
|
|
35
|
+
this._fieldSet = init.fieldSet;
|
|
36
|
+
this._preloads = init.preloads;
|
|
37
|
+
}
|
|
38
|
+
/** Create a shallow clone with overrides. */
|
|
39
|
+
clone(overrides = {}) {
|
|
40
|
+
return new QueryBuilder(Object.assign({ shape: this._shape, selectFn: this._selectFn, whereFn: this._whereFn, sortByFn: this._sortByFn, sortDirection: this._sortDirection, limit: this._limit, offset: this._offset, subject: this._subject, subjects: this._subjects, singleResult: this._singleResult, selectAllLabels: this._selectAllLabels, fieldSet: this._fieldSet, preloads: this._preloads }, overrides));
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Static constructors
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
/**
|
|
46
|
+
* Create a QueryBuilder for the given shape.
|
|
47
|
+
*
|
|
48
|
+
* Accepts a shape class (e.g. `Person`), a NodeShape instance,
|
|
49
|
+
* or a shape IRI string (resolved via the shape registry).
|
|
50
|
+
*/
|
|
51
|
+
static from(shape) {
|
|
52
|
+
const resolved = (0, resolveShape_js_1.resolveShape)(shape);
|
|
53
|
+
return new QueryBuilder({ shape: resolved });
|
|
54
|
+
}
|
|
55
|
+
select(fnOrLabelsOrFieldSet) {
|
|
56
|
+
if (fnOrLabelsOrFieldSet instanceof FieldSet_js_1.FieldSet) {
|
|
57
|
+
const labels = fnOrLabelsOrFieldSet.labels();
|
|
58
|
+
const selectFn = ((p) => labels.map((label) => p[label]));
|
|
59
|
+
return this.clone({ selectFn, selectAllLabels: undefined, fieldSet: fnOrLabelsOrFieldSet });
|
|
60
|
+
}
|
|
61
|
+
if (Array.isArray(fnOrLabelsOrFieldSet)) {
|
|
62
|
+
const labels = fnOrLabelsOrFieldSet;
|
|
63
|
+
const selectFn = ((p) => labels.map((label) => p[label]));
|
|
64
|
+
return this.clone({ selectFn, selectAllLabels: undefined, fieldSet: undefined });
|
|
65
|
+
}
|
|
66
|
+
return this.clone({ selectFn: fnOrLabelsOrFieldSet, selectAllLabels: undefined, fieldSet: undefined });
|
|
67
|
+
}
|
|
68
|
+
/** Select all decorated properties of the shape. */
|
|
69
|
+
selectAll() {
|
|
70
|
+
const propertyLabels = this._shape.shape
|
|
71
|
+
.getUniquePropertyShapes()
|
|
72
|
+
.map((ps) => ps.label);
|
|
73
|
+
const selectFn = ((p) => propertyLabels.map((label) => p[label]));
|
|
74
|
+
return this.clone({ selectFn, selectAllLabels: propertyLabels });
|
|
75
|
+
}
|
|
76
|
+
/** Add a where clause. */
|
|
77
|
+
where(fn) {
|
|
78
|
+
return this.clone({ whereFn: fn });
|
|
79
|
+
}
|
|
80
|
+
/** Set sort order. */
|
|
81
|
+
orderBy(fn, direction = 'ASC') {
|
|
82
|
+
return this.clone({ sortByFn: fn, sortDirection: direction });
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Alias for orderBy — matches the existing DSL's `sortBy` method name.
|
|
86
|
+
*/
|
|
87
|
+
sortBy(fn, direction = 'ASC') {
|
|
88
|
+
return this.orderBy(fn, direction);
|
|
89
|
+
}
|
|
90
|
+
/** Set result limit. */
|
|
91
|
+
limit(n) {
|
|
92
|
+
return this.clone({ limit: n });
|
|
93
|
+
}
|
|
94
|
+
/** Set result offset. */
|
|
95
|
+
offset(n) {
|
|
96
|
+
return this.clone({ offset: n });
|
|
97
|
+
}
|
|
98
|
+
/** Target a single entity by ID. Implies singleResult; unwraps array Result type. */
|
|
99
|
+
for(id) {
|
|
100
|
+
const subject = typeof id === 'string' ? { id } : id;
|
|
101
|
+
return this.clone({ subject, subjects: undefined, singleResult: true });
|
|
102
|
+
}
|
|
103
|
+
/** Target multiple entities by ID, or all if no ids given. */
|
|
104
|
+
forAll(ids) {
|
|
105
|
+
if (!ids) {
|
|
106
|
+
return this.clone({ subject: undefined, subjects: undefined, singleResult: false });
|
|
107
|
+
}
|
|
108
|
+
const subjects = ids.map((id) => (typeof id === 'string' ? { id } : id));
|
|
109
|
+
return this.clone({ subject: undefined, subjects, singleResult: false });
|
|
110
|
+
}
|
|
111
|
+
/** Limit to one result. Unwraps array Result type to single element. */
|
|
112
|
+
one() {
|
|
113
|
+
return this.clone({ limit: 1, singleResult: true });
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Preload a component's query fields at the given property path.
|
|
117
|
+
*
|
|
118
|
+
* This merges the component's query paths into this query's selection,
|
|
119
|
+
* wrapping them in an OPTIONAL block (handled by the IR pipeline).
|
|
120
|
+
*
|
|
121
|
+
* Equivalent to the DSL's `.preloadFor()`:
|
|
122
|
+
* ```ts
|
|
123
|
+
* // DSL style
|
|
124
|
+
* Person.select(p => p.bestFriend.preloadFor(PersonCard))
|
|
125
|
+
* // QueryBuilder style
|
|
126
|
+
* QueryBuilder.from(Person).select(p => [p.name]).preload('bestFriend', PersonCard)
|
|
127
|
+
* ```
|
|
128
|
+
*
|
|
129
|
+
* NOTE: Preloads hold live component references and are not serializable.
|
|
130
|
+
* They are injected into the selectFn at build time (see buildFactory()),
|
|
131
|
+
* so changes to preload handling must account for the selectFn wrapping logic.
|
|
132
|
+
*/
|
|
133
|
+
preload(path, component) {
|
|
134
|
+
const newPreloads = [...(this._preloads || []), { path, component }];
|
|
135
|
+
return this.clone({ preloads: newPreloads });
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Returns the current selection as a FieldSet.
|
|
139
|
+
* If the selection was set via a FieldSet, returns that directly.
|
|
140
|
+
* If set via selectAll labels, constructs a FieldSet from them.
|
|
141
|
+
* If set via a callback, eagerly evaluates it through the proxy to produce a FieldSet.
|
|
142
|
+
*/
|
|
143
|
+
fields() {
|
|
144
|
+
if (this._fieldSet) {
|
|
145
|
+
return this._fieldSet;
|
|
146
|
+
}
|
|
147
|
+
if (this._selectAllLabels) {
|
|
148
|
+
return FieldSet_js_1.FieldSet.for(this._shape.shape, this._selectAllLabels);
|
|
149
|
+
}
|
|
150
|
+
if (this._selectFn) {
|
|
151
|
+
// Eagerly evaluate the callback through FieldSet.for(ShapeClass, callback)
|
|
152
|
+
// The callback is pure — same proxy always produces same paths.
|
|
153
|
+
return FieldSet_js_1.FieldSet.for(this._shape, this._selectFn);
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// Serialization
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
/**
|
|
161
|
+
* Serialize this QueryBuilder to a plain JSON object.
|
|
162
|
+
*
|
|
163
|
+
* Selections are serializable regardless of how they were set (FieldSet,
|
|
164
|
+
* string[], selectAll, or callback). Callback-based selections are eagerly
|
|
165
|
+
* evaluated through the proxy to produce a FieldSet.
|
|
166
|
+
*
|
|
167
|
+
* The `where` and `orderBy` callbacks are not serialized (only the direction
|
|
168
|
+
* is preserved for orderBy).
|
|
169
|
+
*/
|
|
170
|
+
toJSON() {
|
|
171
|
+
var _a;
|
|
172
|
+
const shapeId = ((_a = this._shape.shape) === null || _a === void 0 ? void 0 : _a.id) || '';
|
|
173
|
+
const json = {
|
|
174
|
+
shape: shapeId,
|
|
175
|
+
};
|
|
176
|
+
// Serialize fields — fields() already handles _selectAllLabels, so
|
|
177
|
+
// no separate branch is needed (T1: dead else-if removed).
|
|
178
|
+
const fs = this.fields();
|
|
179
|
+
if (fs) {
|
|
180
|
+
json.fields = fs.toJSON().fields;
|
|
181
|
+
}
|
|
182
|
+
if (this._limit !== undefined) {
|
|
183
|
+
json.limit = this._limit;
|
|
184
|
+
}
|
|
185
|
+
if (this._offset !== undefined) {
|
|
186
|
+
json.offset = this._offset;
|
|
187
|
+
}
|
|
188
|
+
if (this._subject && typeof this._subject === 'object' && 'id' in this._subject) {
|
|
189
|
+
json.subject = this._subject.id;
|
|
190
|
+
}
|
|
191
|
+
if (this._subjects && this._subjects.length > 0) {
|
|
192
|
+
json.subjects = this._subjects.map((s) => s.id);
|
|
193
|
+
}
|
|
194
|
+
if (this._singleResult) {
|
|
195
|
+
json.singleResult = true;
|
|
196
|
+
}
|
|
197
|
+
if (this._sortDirection) {
|
|
198
|
+
json.orderDirection = this._sortDirection;
|
|
199
|
+
}
|
|
200
|
+
return json;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Reconstruct a QueryBuilder from a JSON object.
|
|
204
|
+
* Resolves shape IRI via getShapeClass() and field paths as label selections.
|
|
205
|
+
*/
|
|
206
|
+
static fromJSON(json) {
|
|
207
|
+
let builder = QueryBuilder.from(json.shape);
|
|
208
|
+
if (json.fields && json.fields.length > 0) {
|
|
209
|
+
const fieldSet = FieldSet_js_1.FieldSet.fromJSON({
|
|
210
|
+
shape: json.shape,
|
|
211
|
+
fields: json.fields,
|
|
212
|
+
});
|
|
213
|
+
builder = builder.select(fieldSet);
|
|
214
|
+
}
|
|
215
|
+
if (json.limit !== undefined) {
|
|
216
|
+
builder = builder.limit(json.limit);
|
|
217
|
+
}
|
|
218
|
+
if (json.offset !== undefined) {
|
|
219
|
+
builder = builder.offset(json.offset);
|
|
220
|
+
}
|
|
221
|
+
if (json.subject) {
|
|
222
|
+
builder = builder.for(json.subject);
|
|
223
|
+
}
|
|
224
|
+
if (json.subjects && json.subjects.length > 0) {
|
|
225
|
+
builder = builder.forAll(json.subjects);
|
|
226
|
+
}
|
|
227
|
+
if (json.singleResult && !json.subject) {
|
|
228
|
+
builder = builder.one();
|
|
229
|
+
}
|
|
230
|
+
// Restore orderDirection. The sort key callback isn't serializable,
|
|
231
|
+
// so we only store the direction. When a sort key is later re-applied
|
|
232
|
+
// via .orderBy(), the direction will be available.
|
|
233
|
+
if (json.orderDirection) {
|
|
234
|
+
// Access private clone() — safe because fromJSON is in the same class.
|
|
235
|
+
builder = builder.clone({ sortDirection: json.orderDirection });
|
|
236
|
+
}
|
|
237
|
+
return builder;
|
|
238
|
+
}
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
// Build & execute
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
/**
|
|
243
|
+
* Get the raw pipeline input.
|
|
244
|
+
*
|
|
245
|
+
* Constructs RawSelectInput directly from FieldSet entries.
|
|
246
|
+
*/
|
|
247
|
+
toRawInput() {
|
|
248
|
+
return this._buildDirectRawInput();
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Build RawSelectInput directly from FieldSet entries.
|
|
252
|
+
*/
|
|
253
|
+
_buildDirectRawInput() {
|
|
254
|
+
let fs = this.fields();
|
|
255
|
+
// When preloads exist, trace them through the proxy and merge with the FieldSet.
|
|
256
|
+
if (this._preloads && this._preloads.length > 0) {
|
|
257
|
+
const preloadFn = (p) => {
|
|
258
|
+
const results = [];
|
|
259
|
+
for (const entry of this._preloads) {
|
|
260
|
+
results.push(p[entry.path].preloadFor(entry.component));
|
|
261
|
+
}
|
|
262
|
+
return results;
|
|
263
|
+
};
|
|
264
|
+
const preloadFs = FieldSet_js_1.FieldSet.for(this._shape, preloadFn);
|
|
265
|
+
if (fs) {
|
|
266
|
+
fs = FieldSet_js_1.FieldSet.createFromEntries(fs.shape, [
|
|
267
|
+
...fs.entries,
|
|
268
|
+
...preloadFs.entries,
|
|
269
|
+
]);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
fs = preloadFs;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const entries = fs ? fs.entries : [];
|
|
276
|
+
// Evaluate where callback
|
|
277
|
+
let where;
|
|
278
|
+
if (this._whereFn) {
|
|
279
|
+
where = (0, SelectQuery_js_1.processWhereClause)(this._whereFn, this._shape);
|
|
280
|
+
}
|
|
281
|
+
// Evaluate sort callback
|
|
282
|
+
let sortBy;
|
|
283
|
+
if (this._sortByFn) {
|
|
284
|
+
sortBy = (0, SelectQuery_js_1.evaluateSortCallback)(this._shape, this._sortByFn, this._sortDirection || 'ASC');
|
|
285
|
+
}
|
|
286
|
+
const input = {
|
|
287
|
+
entries,
|
|
288
|
+
subject: this._subject,
|
|
289
|
+
limit: this._limit,
|
|
290
|
+
offset: this._offset,
|
|
291
|
+
shape: this._shape,
|
|
292
|
+
sortBy,
|
|
293
|
+
singleResult: this._singleResult ||
|
|
294
|
+
!!(this._subject &&
|
|
295
|
+
typeof this._subject === 'object' &&
|
|
296
|
+
'id' in this._subject),
|
|
297
|
+
};
|
|
298
|
+
if (where) {
|
|
299
|
+
input.where = where;
|
|
300
|
+
}
|
|
301
|
+
if (this._subjects && this._subjects.length > 0) {
|
|
302
|
+
input.subjects = this._subjects;
|
|
303
|
+
}
|
|
304
|
+
return input;
|
|
305
|
+
}
|
|
306
|
+
/** Build the IR (run the full pipeline: desugar → canonicalize → lower). */
|
|
307
|
+
build() {
|
|
308
|
+
return (0, IRPipeline_js_1.buildSelectQuery)(this.toRawInput());
|
|
309
|
+
}
|
|
310
|
+
/** Execute the query and return results. */
|
|
311
|
+
exec() {
|
|
312
|
+
return (0, queryDispatch_js_1.getQueryDispatch)().selectQuery(this.build());
|
|
313
|
+
}
|
|
314
|
+
// ---------------------------------------------------------------------------
|
|
315
|
+
// Promise-compatible interface
|
|
316
|
+
// ---------------------------------------------------------------------------
|
|
317
|
+
/** `await` triggers execution. */
|
|
318
|
+
then(onfulfilled, onrejected) {
|
|
319
|
+
return this.exec().then(onfulfilled, onrejected);
|
|
320
|
+
}
|
|
321
|
+
/** Catch errors from execution. Chain off then() to avoid re-executing. */
|
|
322
|
+
catch(onrejected) {
|
|
323
|
+
return this.then().catch(onrejected);
|
|
324
|
+
}
|
|
325
|
+
/** Finally handler after execution. Chain off then() to avoid re-executing. */
|
|
326
|
+
finally(onfinally) {
|
|
327
|
+
return this.then().finally(onfinally);
|
|
328
|
+
}
|
|
329
|
+
get [Symbol.toStringTag]() {
|
|
330
|
+
return 'QueryBuilder';
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
exports.QueryBuilder = QueryBuilder;
|
|
334
|
+
//# sourceMappingURL=QueryBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../../src/queries/QueryBuilder.ts"],"names":[],"mappings":"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"}
|