@metreeca/keep-sparql 0.10.0
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/LICENSE +201 -0
- package/README.md +106 -0
- package/dist/_/_decode.d.ts +20 -0
- package/dist/_/_decode.d.ts.map +1 -0
- package/dist/_/_decode.js +55 -0
- package/dist/_/_decode.js.map +1 -0
- package/dist/_/_encode.d.ts +112 -0
- package/dist/_/_encode.d.ts.map +1 -0
- package/dist/_/_encode.js +262 -0
- package/dist/_/_encode.js.map +1 -0
- package/dist/_/_flake.d.ts +16 -0
- package/dist/_/_flake.d.ts.map +1 -0
- package/dist/_/_flake.js +65 -0
- package/dist/_/_flake.js.map +1 -0
- package/dist/_/_union.d.ts +28 -0
- package/dist/_/_union.d.ts.map +1 -0
- package/dist/_/_union.js +51 -0
- package/dist/_/_union.js.map +1 -0
- package/dist/detect/decode.d.ts +25 -0
- package/dist/detect/decode.d.ts.map +1 -0
- package/dist/detect/decode.js +34 -0
- package/dist/detect/decode.js.map +1 -0
- package/dist/detect/encode.d.ts +25 -0
- package/dist/detect/encode.d.ts.map +1 -0
- package/dist/detect/encode.js +30 -0
- package/dist/detect/encode.js.map +1 -0
- package/dist/detect/index.d.ts +17 -0
- package/dist/detect/index.d.ts.map +1 -0
- package/dist/detect/index.js +55 -0
- package/dist/detect/index.js.map +1 -0
- package/dist/index.d.ts +95 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/lookup/decode.d.ts +33 -0
- package/dist/lookup/decode.d.ts.map +1 -0
- package/dist/lookup/decode.js +193 -0
- package/dist/lookup/decode.js.map +1 -0
- package/dist/lookup/encode.d.ts +46 -0
- package/dist/lookup/encode.d.ts.map +1 -0
- package/dist/lookup/encode.js +111 -0
- package/dist/lookup/encode.js.map +1 -0
- package/dist/lookup/index.d.ts +21 -0
- package/dist/lookup/index.d.ts.map +1 -0
- package/dist/lookup/index.js +72 -0
- package/dist/lookup/index.js.map +1 -0
- package/dist/modify/decode.d.ts +22 -0
- package/dist/modify/decode.d.ts.map +1 -0
- package/dist/modify/decode.js +26 -0
- package/dist/modify/decode.js.map +1 -0
- package/dist/modify/encode.d.ts +21 -0
- package/dist/modify/encode.d.ts.map +1 -0
- package/dist/modify/encode.js +184 -0
- package/dist/modify/encode.js.map +1 -0
- package/dist/modify/index.d.ts +22 -0
- package/dist/modify/index.d.ts.map +1 -0
- package/dist/modify/index.js +44 -0
- package/dist/modify/index.js.map +1 -0
- package/dist/select/decode.d.ts +16 -0
- package/dist/select/decode.d.ts.map +1 -0
- package/dist/select/decode.js +229 -0
- package/dist/select/decode.js.map +1 -0
- package/dist/select/encode.d.ts +16 -0
- package/dist/select/encode.d.ts.map +1 -0
- package/dist/select/encode.js +434 -0
- package/dist/select/encode.js.map +1 -0
- package/dist/select/index.d.ts +16 -0
- package/dist/select/index.d.ts.map +1 -0
- package/dist/select/index.js +38 -0
- package/dist/select/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © 2025-2026 Metreeca srl
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Select-pass query encoder.
|
|
18
|
+
*
|
|
19
|
+
* Folds every queued {@link Select} into one batched SPARQL SELECT, contributing each request as a
|
|
20
|
+
* UNION branch off a shared outer query. Per-request variable allocation flows through the supplied
|
|
21
|
+
* {@link Scope}, so the {@link decode | decoder} recovers the same solution slots when settling each
|
|
22
|
+
* request against the returned round's tuples.
|
|
23
|
+
*
|
|
24
|
+
* Each request's arm evaluates as a fixed pipeline of stages (structural match, text coalescing, scalar
|
|
25
|
+
* transforms, scalar filters, grouping, projection, aggregate filtering, ordering, and slicing); the
|
|
26
|
+
* helpers below follow that order, each grouping its single-use sub-helpers as nested functions. See the
|
|
27
|
+
* `select/index.md` cheat-sheet for the query-plan structure the stages mirror.
|
|
28
|
+
*
|
|
29
|
+
* @module
|
|
30
|
+
*/
|
|
31
|
+
import { getShapeClass } from "@metreeca/blue/resource";
|
|
32
|
+
import { eager } from "@metreeca/blue/value";
|
|
33
|
+
import { isNumber, isObject, map } from "@metreeca/core";
|
|
34
|
+
import { xsd } from "@metreeca/core/datatype";
|
|
35
|
+
import { getFlakeEntries, getFlakeFocusing, getFlakeGrouping, getFlakeOrdering, getFlakeProjections, getFlakeTransforms, getFlakeVariant, hasDictionaryOptions, hasNullOptions, isAggregateFlake, isComputedFlake, isConstrainedFlake, isDrainedFlake, isGroupingFlake, isPropertyBranch, isRequiredFlake, isScalarFlake } from "@metreeca/keep-flake";
|
|
36
|
+
import { getOrderDirection, isAggregate, isProjection } from "@metreeca/qest/template";
|
|
37
|
+
import { named, rdf } from "@metreeca/trio";
|
|
38
|
+
import { all as wildcard, and, as, asc, bind, boolean, coalesce, contains, datatype, desc, distinct, eq, exists, filter, fragment, groupBy, gt, gte, having, iif, isBound, isIn, isNumeric, lang, lcase, limit, lt, lte, nexists, nil, not, number, offset, optional, or, orderBy, pattern, reference, select, str, string, term, union, variable, where } from "@metreeca/wire-sparql/builder";
|
|
39
|
+
import { boundToTerm, expression, link, membership, optionsToTerms } from "../_/_encode.js";
|
|
40
|
+
import { crossing, isXComputed, isXScalar, references } from "../_/_flake.js";
|
|
41
|
+
import { getUnionPlaceholders } from "../_/_union.js";
|
|
42
|
+
/**
|
|
43
|
+
* Folds every queued select request into one batched SPARQL SELECT.
|
|
44
|
+
*
|
|
45
|
+
* @param scope The variable scope shared with the decoder, allocating per-request solution slots
|
|
46
|
+
* @param batch The queued select requests to encode, each paired with its {@link Flake | query plan} and deferred
|
|
47
|
+
*
|
|
48
|
+
* @returns The batched SELECT query covering every request in `batch`
|
|
49
|
+
*/
|
|
50
|
+
export function encode(scope, batch) {
|
|
51
|
+
const guard = scope.resolve(batch);
|
|
52
|
+
if (batch.length > 1) {
|
|
53
|
+
return select(wildcard(), where(collections()), reorder());
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return collections();
|
|
57
|
+
}
|
|
58
|
+
function root(flake) {
|
|
59
|
+
return scope.resolve(flake);
|
|
60
|
+
}
|
|
61
|
+
function collections() {
|
|
62
|
+
return union(batch.map(({ request, flake }, index) => arm(request, flake, index)));
|
|
63
|
+
}
|
|
64
|
+
function reorder() {
|
|
65
|
+
return orderBy(asc(variable(guard)), batch.map(({ flake }) => sorting(flake)));
|
|
66
|
+
}
|
|
67
|
+
function columns(cell) {
|
|
68
|
+
return cell.range.variants.length > 1 // !!! why?
|
|
69
|
+
? cell.range.variants.map(variant => variable(scope.resolve(cell, variant)))
|
|
70
|
+
: [variable(scope.resolve(cell))];
|
|
71
|
+
}
|
|
72
|
+
function aggregateColumns(flake, anchor, reference) {
|
|
73
|
+
// `min`/`max`/`sum`/`avg` over a reference short-circuit to an unbound column (Appendix A.4.1),
|
|
74
|
+
// `count` still reduces; an aggregate's scalar wrappers (`round:avg:price`) compose inline and project
|
|
75
|
+
// as their own columns, since a select alias cannot reference a sibling column
|
|
76
|
+
const own = getFlakeTransforms(flake).flatMap(stage => stage === undefined || !isComputedFlake(stage) ? []
|
|
77
|
+
: isAggregateFlake(stage) ? column(stage)
|
|
78
|
+
: aggregateColumns(stage, anchor, reference));
|
|
79
|
+
const nested = getFlakeEntries(flake).flatMap(branch => {
|
|
80
|
+
return isPropertyBranch(branch) ? aggregateColumns(branch, scope.resolve(branch), references(branch))
|
|
81
|
+
: branch.entry.kind === "id" || branch.entry.kind === "type" ? aggregateColumns(branch, anchor, true)
|
|
82
|
+
: [];
|
|
83
|
+
});
|
|
84
|
+
return [...own, ...nested];
|
|
85
|
+
function column(flake) {
|
|
86
|
+
return !reference || flake.pipe[0] === "count" ? projected(flake) : [];
|
|
87
|
+
}
|
|
88
|
+
function derived(flake) {
|
|
89
|
+
return getFlakeTransforms(flake).flatMap(flake => isScalarFlake(flake) ? projected(flake) : []);
|
|
90
|
+
}
|
|
91
|
+
function projected(flake) {
|
|
92
|
+
return [as(expression(anchor, flake.pipe), variable(scope.resolve(flake))), ...derived(flake)];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function arm(request, flake, index) {
|
|
96
|
+
const [item] = request.query;
|
|
97
|
+
const { locale } = request;
|
|
98
|
+
const projections = getFlakeProjections(flake);
|
|
99
|
+
const projection = isProjection(item); // !!! test empty flake projection
|
|
100
|
+
const scalars = projection
|
|
101
|
+
? getFlakeGrouping(flake).map(key => variable(scope.resolve(key)))
|
|
102
|
+
: columns(flake);
|
|
103
|
+
const aggregates = aggregateColumns(flake, root(flake), false); // !!! reference flag
|
|
104
|
+
const grouped = aggregates.length > 0;
|
|
105
|
+
const block = as(number(index), variable(guard));
|
|
106
|
+
return select(grouped ? [block, ...scalars, ...aggregates]
|
|
107
|
+
: projection ? distinct(block, ...(projections.flatMap(columns)))
|
|
108
|
+
: distinct(block, ...scalars), where(anchor(request, flake, item), localised(flake, root(flake)), computed(flake, root(flake)), filters(flake, root(flake)), matchAllComputed(flake)), grouped ? groupBy(scalars) : nil(), grouped ? having(filtering(flake, root(flake))) : nil(), orderBy(sorting(flake)), slicing(flake));
|
|
109
|
+
function anchor(request, flake, placeholder) {
|
|
110
|
+
const entry = named(request.entry);
|
|
111
|
+
const shape = request.shape;
|
|
112
|
+
const field = request.field;
|
|
113
|
+
const forward = field.forward;
|
|
114
|
+
const variants = flake.range.variants;
|
|
115
|
+
// a single-variant member carries its own class / kind; a union member (multiple variants) has no
|
|
116
|
+
// item class and is not a localised leaf
|
|
117
|
+
const clazz = variants.length === 1 ? getShapeClass(variants[0]) : undefined; // !!! variant.length
|
|
118
|
+
const source = variants.length === 1 && variants[0].kind === "dictionary" // !!! variant.length
|
|
119
|
+
? fragment(coalesceGather(entry, forward, root(flake))) // !!! why here
|
|
120
|
+
: eager(shape).virtual
|
|
121
|
+
? clazz !== undefined ? pattern([root(flake), named(rdf.type), named(clazz)]) : nil()
|
|
122
|
+
: link([entry, field, root(flake)]);
|
|
123
|
+
return fragment(source, element(entry, field, root(flake), flake, placeholder));
|
|
124
|
+
}
|
|
125
|
+
function element(parent, field, anchor, flake, placeholder) {
|
|
126
|
+
// `anchor` is already bound by the caller — {@link anchor}'s root membership, or {@link entries}'
|
|
127
|
+
// edge for a nested branch — so this only descends `anchor`'s children, hanging their patterns off it.
|
|
128
|
+
// A union restates the edge binding `anchor` inside each arm's `optional` (re-derived from the IR, never
|
|
129
|
+
// threaded) so `anchor` stays in scope for the gate's filter: bare filter-only optionals leave outer
|
|
130
|
+
// variables unbound on some backends
|
|
131
|
+
if (flake.range.variants.length > 1 && crossing(flake)) {
|
|
132
|
+
// a crossing intermediate union (a path step under a shared predicate, never itself surfaced) holds
|
|
133
|
+
// only branches every variant declares; traverse it like a resource, descending the shared branches
|
|
134
|
+
// off the anchor, since the shared edge resolves regardless of which variant the member is (§5.8.1)
|
|
135
|
+
return entries(getFlakeEntries(flake), anchor, undefined);
|
|
136
|
+
}
|
|
137
|
+
else if (flake.range.variants.length > 1) {
|
|
138
|
+
// a requested variant contributes a gated arm: membership filter, shard bind, subtree. A
|
|
139
|
+
// non-requested variant carrying a surfacing (constrained/ordered) path still binds it ungated —
|
|
140
|
+
// the path's existence is the variant shard (state rule), so a value-implying constraint
|
|
141
|
+
// through a variant selects exactly the resources resolving through it
|
|
142
|
+
const requested = getUnionPlaceholders(flake.range.variants, placeholder);
|
|
143
|
+
const variants = flake.range.variants;
|
|
144
|
+
const retrievedVariants = variants.filter(variant => requested.has(variant) || getFlakeVariant(flake, variant).some(isDrainedFlake));
|
|
145
|
+
// re-derive the edge binding `anchor` from the IR — `link(parent, entry, anchor)`, the nested
|
|
146
|
+
// branch's edge or the root's membership triple — so each arm keeps `anchor` in scope
|
|
147
|
+
const source = link([parent, field, anchor]);
|
|
148
|
+
const arms = variants.map(variant => {
|
|
149
|
+
const branches = getFlakeVariant(flake, variant);
|
|
150
|
+
return requested.has(variant) || branches.some(isDrainedFlake)
|
|
151
|
+
? optional(source, membership(anchor, variant), bind(variable(anchor), variable(scope.resolve(flake, variant))), entries(branches, anchor, getShapeClass(variant)))
|
|
152
|
+
: branches.some(branch => grouped ? isXComputed(branch) : isXScalar(branch))
|
|
153
|
+
? entries(branches, anchor, getShapeClass(variant))
|
|
154
|
+
: nil();
|
|
155
|
+
});
|
|
156
|
+
// retrieve only the requested variants (§5.4): when a proper subset is requested, a member
|
|
157
|
+
// resolving through an unrequested variant binds no requested shard, so it is excluded by
|
|
158
|
+
// requiring at least one to be bound — the encoder never returns a member the query did not ask for
|
|
159
|
+
const gate = retrievedVariants.length > 0 && retrievedVariants.length < variants.length
|
|
160
|
+
? filter(retrievedVariants
|
|
161
|
+
.map(variant => isBound(variable(scope.resolve(flake, variant))))
|
|
162
|
+
.reduce((left, right) => or(left, right)))
|
|
163
|
+
: nil();
|
|
164
|
+
return fragment(...arms, gate);
|
|
165
|
+
}
|
|
166
|
+
else if (flake.range.variants[0].kind === "resource" || flake.range.variants[0].kind === "reference") {
|
|
167
|
+
return entries(getFlakeEntries(flake), anchor, getShapeClass(flake.range.variants[0]));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
return nil();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function entries(branches, anchor, clazz) {
|
|
174
|
+
return fragment(...branches.map(branch => {
|
|
175
|
+
if (isPropertyBranch(branch) && branch.entry.range.shape.kind === "dictionary") {
|
|
176
|
+
// a structurally-addressed localised property binds its raw edge here (tagged-literal match,
|
|
177
|
+
// §5.7.3); a coalesced one is bound by the coalesce pass instead (§6.2)
|
|
178
|
+
return hasDictionaryOptions(branch)
|
|
179
|
+
? fragment(optional(link([anchor, branch.entry, scope.resolve(branch)])), matchAllStored(branch, anchor))
|
|
180
|
+
: nil();
|
|
181
|
+
}
|
|
182
|
+
else if (isPropertyBranch(branch) && (grouped ? isXComputed(branch) : isXScalar(branch))) {
|
|
183
|
+
const target = scope.resolve(branch);
|
|
184
|
+
// bind this branch's edge (anchoring `target`), then descend `target`'s children through
|
|
185
|
+
// `element` hung off it. The nested placeholder rides `drain.mould` — the template entry's
|
|
186
|
+
// fragment or the projection binding's model — driving a union's variant descent (§5.4)
|
|
187
|
+
const placeholder = branch.drain?.mould;
|
|
188
|
+
const descent = fragment(link([anchor, branch.entry, target]), element(anchor, branch.entry, target, branch, placeholder));
|
|
189
|
+
// a path a value-implying constraint expects to exist is required (a missing value drops the
|
|
190
|
+
// resource, not surfaces it unbound); a plain retrieval path — or one whose set constraint
|
|
191
|
+
// admits a `null` option (matching absence) — stays optional
|
|
192
|
+
const required = isRequiredFlake(branch) && !hasNullOptions(branch);
|
|
193
|
+
return fragment(required ? descent : optional(descent), matchAllStored(branch, anchor));
|
|
194
|
+
}
|
|
195
|
+
else if (branch.entry.kind === "id") {
|
|
196
|
+
// a projected `id` binds to the anchor, so an expression / grouping key / cell ending in `id`
|
|
197
|
+
// reads the resource reference; a `!id` constraint conjoins per-option equalities on the anchor
|
|
198
|
+
return fragment(branch.drain?.alias !== undefined ? bind(variable(anchor), variable(scope.resolve(branch))) : nil(), matchAllStored(branch, anchor));
|
|
199
|
+
}
|
|
200
|
+
else if (branch.entry.kind === "type" && branch.drain?.alias !== undefined && clazz !== undefined) {
|
|
201
|
+
// a projected `type` resolves to the shape's own class, never the store (the store holds the
|
|
202
|
+
// whole class lineage)
|
|
203
|
+
return fragment(bind(reference(clazz), variable(scope.resolve(branch))), matchAllStored(branch, anchor));
|
|
204
|
+
}
|
|
205
|
+
else if (branch.entry.kind === "type" && isConstrainedFlake(branch)) {
|
|
206
|
+
// a `?type` constraint matches the stored `rdf:type` triples (denormalised over the class
|
|
207
|
+
// lineage, so a supertype filter spans its subtypes); a `!type` conjoins them via matchAllStored
|
|
208
|
+
return fragment(optional(pattern([anchor, named(rdf.type), scope.resolve(branch)])), matchAllStored(branch, anchor));
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
return nil();
|
|
212
|
+
}
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
function localised(node, anchor) {
|
|
216
|
+
return fragment(...getFlakeEntries(node)
|
|
217
|
+
.map(branch => localiser(branch, anchor)));
|
|
218
|
+
/**
|
|
219
|
+
* The coalesce binding of one branch under `anchor`: a `dictionary` branch coalesces (or, structurally,
|
|
220
|
+
* binds the owning reference for broker delegation); a resource/reference recurses; a union descends each
|
|
221
|
+
* variant, so a localised property nested in a variant is reached too.
|
|
222
|
+
*/
|
|
223
|
+
function localiser(branch, anchor) {
|
|
224
|
+
if (!isPropertyBranch(branch) || !(grouped ? isXComputed(branch) : isXScalar(branch))) {
|
|
225
|
+
return nil();
|
|
226
|
+
}
|
|
227
|
+
const range = branch.entry.range.shape;
|
|
228
|
+
// a structural localised property (a tag-range map) is expanded by the broker in the decoder, so the
|
|
229
|
+
// cell carries the owning reference (the anchor): bind it, no edge, so the tags never fan the row. A
|
|
230
|
+
// tagged-option constraint binds its raw edge in `entries`; anything else coalesces
|
|
231
|
+
return range.kind === "dictionary"
|
|
232
|
+
? isObject(branch.drain?.mould) ? bind(variable(anchor), variable(scope.resolve(branch)))
|
|
233
|
+
: hasDictionaryOptions(branch) ? nil()
|
|
234
|
+
: coalesced(anchor, branch)
|
|
235
|
+
: range.kind === "resource" || range.kind === "reference"
|
|
236
|
+
? localised(branch, scope.resolve(branch))
|
|
237
|
+
: range.kind === "union"
|
|
238
|
+
// the union's branches are folded (§5.8.1): a crossing property shared across variants is
|
|
239
|
+
// one branch, walked once off the union node, never once per declaring variant
|
|
240
|
+
? fragment(...getFlakeEntries(branch)
|
|
241
|
+
.map(nested => localiser(nested, scope.resolve(branch))))
|
|
242
|
+
: nil();
|
|
243
|
+
/**
|
|
244
|
+
* The coalesce binding of one localised branch (Appendix A.5): {@link coalesceGather} wrapped in the
|
|
245
|
+
* enclosing `optional`.
|
|
246
|
+
*/
|
|
247
|
+
function coalesced(anchor, branch) {
|
|
248
|
+
const gather = isPropertyBranch(branch)
|
|
249
|
+
? coalesceGather(anchor, branch.entry.forward, scope.resolve(branch))
|
|
250
|
+
: [];
|
|
251
|
+
return gather.length > 0 ? optional(...gather) : nil();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function coalesceGather(subject, forward, // !!! review
|
|
256
|
+
target) {
|
|
257
|
+
if (forward === undefined) {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
const tags = locale.length > 0 ? locale : ["und"];
|
|
262
|
+
const gathered = scope.resolve();
|
|
263
|
+
const probe = scope.resolve();
|
|
264
|
+
const fold = (value) => iif(eq(lang(value), string("")), string("und"), lang(value));
|
|
265
|
+
const present = (tag) => exists(pattern([subject, named(forward), probe]), filter(eq(fold(variable(probe)), string(tag))));
|
|
266
|
+
const winner = tags.reduceRight((rest, tag) => iif(present(tag), string(tag), rest), string(""));
|
|
267
|
+
// bind the coalesced value(s) as a plain xsd:string (§6): dropping the language tag makes the value
|
|
268
|
+
// itself, an aggregate, or a comparison over the coalesced path reduce ordinary strings
|
|
269
|
+
return [
|
|
270
|
+
pattern([subject, named(forward), gathered]),
|
|
271
|
+
filter(eq(fold(variable(gathered)), winner)),
|
|
272
|
+
bind(str(variable(gathered)), variable(target))
|
|
273
|
+
];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function computed(flake, anchor) {
|
|
277
|
+
return fragment(...getFlakeTransforms(flake).map(transform => transform === undefined || !isComputedFlake(transform) ? nil() // !!! undefined?
|
|
278
|
+
: isAggregateFlake(transform)
|
|
279
|
+
? grouped ? nil() : computed(transform, scope.resolve(transform))
|
|
280
|
+
: fragment(bind(expression(anchor, [transform.pipe[0]]), variable(scope.resolve(transform))), computed(transform, scope.resolve(transform)))), ...getFlakeEntries(flake).filter(isPropertyBranch).map(property => // !!! id/type?
|
|
281
|
+
computed(property, scope.resolve(property))));
|
|
282
|
+
}
|
|
283
|
+
function filters(flake, anchor) {
|
|
284
|
+
const value = isComputedFlake(flake) ? variable(scope.resolve(flake)) : variable(anchor);
|
|
285
|
+
// a single-variant string target (plain string, or a lexically-ordered / opaque temporal) compares
|
|
286
|
+
// lexically via `str(...)` (correct for ISO temporal formats); a single boolean by its 0/1 rank
|
|
287
|
+
// (backends do not order xsd:boolean); any other single type, and every multi-variant union, by the
|
|
288
|
+
// bound's typed term, so a union bound resolves in its own variant and excludes the rest by type
|
|
289
|
+
// mismatch (§5.7.1)
|
|
290
|
+
const single = flake.range.variants.length === 1 ? flake.range.variants[0] : undefined; // !!! why?
|
|
291
|
+
function compare(relate, limit) {
|
|
292
|
+
return single?.kind === "boolean" ? filter(relate(iif(value, number(1), number(0)), limit ? number(1) : number(0)))
|
|
293
|
+
: single?.kind === "string" || single?.kind === "dictionary" ? filter(relate(str(value), string(String(limit))))
|
|
294
|
+
: filter(relate(value, term(boundToTerm(limit, flake.range))));
|
|
295
|
+
}
|
|
296
|
+
return fragment(flake.lt !== undefined ? compare(lt, flake.lt) : nil(), flake.gt !== undefined ? compare(gt, flake.gt) : nil(), flake.lte !== undefined ? compare(lte, flake.lte) : nil(), flake.gte !== undefined ? compare(gte, flake.gte) : nil(), flake.like !== undefined ? filter(like(value, flake.like)) : nil(), flake.any !== undefined ? filter(any(value, optionsToTerms(flake.any, flake.range))) : nil(),
|
|
297
|
+
// stored `!` → `matchAllStored`, scalar-computed `!` → `matchAllComputed`; an aggregate `!` filters its
|
|
298
|
+
// single bound value inline here when ungrouped (grouped aggregates move to HAVING via `filtering`)
|
|
299
|
+
flake.all !== undefined && isComputedFlake(flake) && flake.pipe.some(isAggregate)
|
|
300
|
+
? filter(all(value, optionsToTerms(flake.all, flake.range)))
|
|
301
|
+
: nil(),
|
|
302
|
+
// under grouping an aggregate stage's constraint restricts groups post-aggregation (HAVING, emitted
|
|
303
|
+
// separately by havings), never rows, so skip it here to keep it out of the WHERE
|
|
304
|
+
getFlakeTransforms(flake).map(transform => grouped && isAggregateFlake(transform) ? nil() : filters(transform, anchor)), getFlakeEntries(flake).map(property => filters(property, property.entry.kind === "id" ? anchor : scope.resolve(property))));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function filtering(flake, anchor) {
|
|
308
|
+
return [
|
|
309
|
+
...getFlakeTransforms(flake).flatMap(transform => isAggregateFlake(transform)
|
|
310
|
+
? postAggregate(transform)
|
|
311
|
+
: filtering(transform, anchor)),
|
|
312
|
+
...getFlakeEntries(flake).flatMap(property => property.entry.kind === "id" || property.entry.kind === "type"
|
|
313
|
+
? filtering(property, anchor)
|
|
314
|
+
: filtering(property, scope.resolve(property)))
|
|
315
|
+
];
|
|
316
|
+
// an aggregate and every scalar transform wrapping it are post-aggregation, so their constraints move
|
|
317
|
+
// to HAVING; each wrapper carries the full pipe, so `constraints` renders e.g. `round(avg(…))` whole
|
|
318
|
+
function postAggregate(flake) {
|
|
319
|
+
const range = flake.range;
|
|
320
|
+
const value = expression(anchor, flake.pipe);
|
|
321
|
+
return [
|
|
322
|
+
flake.lt !== undefined ? lt(value, term(boundToTerm(flake.lt, range))) : nil(),
|
|
323
|
+
flake.gt !== undefined ? gt(value, term(boundToTerm(flake.gt, range))) : nil(),
|
|
324
|
+
flake.lte !== undefined ? lte(value, term(boundToTerm(flake.lte, range))) : nil(),
|
|
325
|
+
flake.gte !== undefined ? gte(value, term(boundToTerm(flake.gte, range))) : nil(),
|
|
326
|
+
flake.like !== undefined ? like(value, flake.like) : nil(),
|
|
327
|
+
flake.any !== undefined ? any(value, optionsToTerms(flake.any, range)) : nil(),
|
|
328
|
+
flake.all !== undefined ? all(value, optionsToTerms(flake.all, range)) : nil(),
|
|
329
|
+
...getFlakeTransforms(flake).flatMap(postAggregate)
|
|
330
|
+
];
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
function sorting(flake) {
|
|
334
|
+
return fragment(getFlakeFocusing(flake).map(flake => {
|
|
335
|
+
const value = variable(scope.resolve(flake));
|
|
336
|
+
return asc(iif(any(value, optionsToTerms(flake.focus, flake.range)), number(0), number(1)));
|
|
337
|
+
}), getFlakeOrdering(flake).flatMap(flake => {
|
|
338
|
+
const value = variable(scope.resolve(flake));
|
|
339
|
+
// a tier prefix orders each type-band before comparing within it; for a single-variant cell the
|
|
340
|
+
// datatype is homogeneous, so the tier collapses to a constant and the sort reduces to `sortable`
|
|
341
|
+
return [tier(value), sortable(value)].map(getOrderDirection(flake.order) < 0 ? desc : asc);
|
|
342
|
+
}), (isGroupingFlake(flake) ? getFlakeGrouping(flake) : [flake]).map(flake => // tiebreak
|
|
343
|
+
asc(variable(scope.resolve(flake)))));
|
|
344
|
+
function tier(value) {
|
|
345
|
+
return iif(eq(datatype(value), reference(xsd.boolean)), number(0), iif(isNumeric(value), number(1), iif(temporal(value), number(2), number(3))));
|
|
346
|
+
}
|
|
347
|
+
function sortable(value) {
|
|
348
|
+
return iif(or(isNumeric(value), temporal(value)), value, str(value));
|
|
349
|
+
}
|
|
350
|
+
function temporal(value) {
|
|
351
|
+
return isIn(datatype(value), [
|
|
352
|
+
reference(xsd.dateTime),
|
|
353
|
+
reference(xsd.date),
|
|
354
|
+
reference(xsd.time)
|
|
355
|
+
]);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function slicing(flake) {
|
|
359
|
+
return fragment(isNumber(flake.offset) ? offset(flake.offset) : nil(), isNumber(flake.limit) ? limit(flake.limit) : nil());
|
|
360
|
+
}
|
|
361
|
+
function like(value, keywords) {
|
|
362
|
+
return and(...String(keywords)
|
|
363
|
+
.toLowerCase()
|
|
364
|
+
.split(/\s+/)
|
|
365
|
+
.filter(token => token.length > 0)
|
|
366
|
+
.map(token => contains(lcase(value), string(token))));
|
|
367
|
+
}
|
|
368
|
+
function any(value, options) {
|
|
369
|
+
if (options.length === 0) {
|
|
370
|
+
return boolean(true);
|
|
371
|
+
}
|
|
372
|
+
else { // an empty option set is elided (§5)
|
|
373
|
+
const positive = options.filter(option => option !== null);
|
|
374
|
+
const negative = options.some(option => option === null);
|
|
375
|
+
const present = positive.length === 1
|
|
376
|
+
? eq(value, term(positive[0]))
|
|
377
|
+
: isIn(value, positive.map(term));
|
|
378
|
+
return coalesce(negative ? or(not(isBound(value)), present) : present, boolean(false) // guard against type mismatches
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
function all(value, options) {
|
|
383
|
+
if (options.length === 0) {
|
|
384
|
+
return boolean(true);
|
|
385
|
+
}
|
|
386
|
+
else { // an empty option set is elided (§5)
|
|
387
|
+
const positive = options.filter(option => option !== null);
|
|
388
|
+
const negative = options.some(option => option === null);
|
|
389
|
+
return and(negative ? not(isBound(value)) : nil(), ...positive.map(option => any(value, [option])));
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
function matchAllStored(branch, anchor) {
|
|
393
|
+
if (branch.all === undefined) {
|
|
394
|
+
return nil();
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
const options = optionsToTerms(branch.all, branch.range);
|
|
398
|
+
if (branch.entry.kind === "id") { // `id` is the anchor itself, single-valued
|
|
399
|
+
return filter(all(variable(anchor), options));
|
|
400
|
+
}
|
|
401
|
+
else if (branch.entry.kind === "type") {
|
|
402
|
+
return map(scope.resolve(), value => matchAll(variable(value), pattern([anchor, named(rdf.type), value]), options));
|
|
403
|
+
}
|
|
404
|
+
else if (isPropertyBranch(branch)) {
|
|
405
|
+
return map(scope.resolve(), value => matchAll(variable(value), link([anchor, branch.entry, value]), options));
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
return nil();
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
function matchAllComputed(flake) {
|
|
413
|
+
return walk(flake, root(flake), nil());
|
|
414
|
+
function walk(flake, anchor, path) {
|
|
415
|
+
return fragment(...getFlakeEntries(flake).map(property => descend(property, anchor, path)), ...getFlakeTransforms(flake).map(transform => matchStage(transform, anchor, path)));
|
|
416
|
+
}
|
|
417
|
+
function descend(branch, anchor, path) {
|
|
418
|
+
return isPropertyBranch(branch)
|
|
419
|
+
? map(scope.resolve(), target => walk(branch, target, fragment(path, link([anchor, branch.entry, target]))))
|
|
420
|
+
: walk(branch, anchor, path);
|
|
421
|
+
}
|
|
422
|
+
function matchStage(stage, anchor, path) {
|
|
423
|
+
return stage.all !== undefined && !stage.pipe.some(isAggregate)
|
|
424
|
+
? matchAll(expression(anchor, stage.pipe), path, optionsToTerms(stage.all, stage.range))
|
|
425
|
+
: nil();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
function matchAll(value, patterns, options) {
|
|
429
|
+
return fragment(...options.map(option => option === null
|
|
430
|
+
? filter(nexists(patterns))
|
|
431
|
+
: filter(exists(patterns, filter(any(value, [option]))))));
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/select/encode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Broker, Deferred, Select } from "@metreeca/keep/batching";
|
|
2
|
+
import { type RepositoryClient } from "@metreeca/wire-sparql";
|
|
3
|
+
/**
|
|
4
|
+
* Per-batch body for the select handler.
|
|
5
|
+
*
|
|
6
|
+
* Three phases run in sequence: **plan** every request by pairing it with its
|
|
7
|
+
* {@link _flake_!createFlake | flake} and unpacking the deferred callbacks; **fetch** by
|
|
8
|
+
* folding plans into one batched SELECT through
|
|
9
|
+
* {@link encode} and running it; **deliver** by {@link decode | decoding} each request,
|
|
10
|
+
* expanding nested-resource references through the supplied {@link Broker}, and settling
|
|
11
|
+
* each request's deferred. Variable allocation across the
|
|
12
|
+
* batched SELECT is shared between {@link encode} and {@link decode} via a single
|
|
13
|
+
* {@link createScope | Scope}, so the decoder recovers the same per-request slots.
|
|
14
|
+
*/
|
|
15
|
+
export declare function select(batch: readonly Deferred<Select>[], client: RepositoryClient, broker: Broker): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/select/index.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,KAAK,gBAAgB,EAAY,MAAM,uBAAuB,CAAC;AAKxE;;;;;;;;;;;GAWG;AACH,wBAAsB,MAAM,CAC3B,KAAK,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,EAClC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © 2025-2026 Metreeca srl
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { createScope } from "@metreeca/core/scope";
|
|
17
|
+
import { createFlake } from "@metreeca/keep-flake";
|
|
18
|
+
import { variable } from "@metreeca/wire-sparql";
|
|
19
|
+
import { decode } from "./decode.js";
|
|
20
|
+
import { encode } from "./encode.js";
|
|
21
|
+
/**
|
|
22
|
+
* Per-batch body for the select handler.
|
|
23
|
+
*
|
|
24
|
+
* Three phases run in sequence: **plan** every request by pairing it with its
|
|
25
|
+
* {@link _flake_!createFlake | flake} and unpacking the deferred callbacks; **fetch** by
|
|
26
|
+
* folding plans into one batched SELECT through
|
|
27
|
+
* {@link encode} and running it; **deliver** by {@link decode | decoding} each request,
|
|
28
|
+
* expanding nested-resource references through the supplied {@link Broker}, and settling
|
|
29
|
+
* each request's deferred. Variable allocation across the
|
|
30
|
+
* batched SELECT is shared between {@link encode} and {@link decode} via a single
|
|
31
|
+
* {@link createScope | Scope}, so the decoder recovers the same per-request slots.
|
|
32
|
+
*/
|
|
33
|
+
export async function select(batch, client, broker) {
|
|
34
|
+
const scope = createScope(variable);
|
|
35
|
+
const items = batch.map(select => ({ ...select, flake: createFlake(select.request.field.range.shape, select.request.query) }));
|
|
36
|
+
decode(scope, items, broker, await client.select(encode(scope, items)));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/select/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAyB,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC3B,KAAkC,EAClC,MAAwB,EACxB,MAAc;IAGd,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAChC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAC3F,CAAC;IAEF,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,CAC/C,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CACpB,CAAC,CAAC;AAEJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@metreeca/keep-sparql",
|
|
3
|
+
"version": "0.10.0",
|
|
4
|
+
"description": "SPARQL 1.1 repository connector for @metreeca/keep.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"typescript",
|
|
7
|
+
"json-ld",
|
|
8
|
+
"model-driven",
|
|
9
|
+
"sparql"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://metreeca.github.io/keep/",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/metreeca/keep/issues",
|
|
14
|
+
"email": "info@metreeca.com"
|
|
15
|
+
},
|
|
16
|
+
"license": "Apache-2.0",
|
|
17
|
+
"author": {
|
|
18
|
+
"name": "Metreeca",
|
|
19
|
+
"email": "info@metreeca.com",
|
|
20
|
+
"url": "https://www.metreeca.com/"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/metreeca/keep.git",
|
|
25
|
+
"directory": "packages/connectors/keep-sparql"
|
|
26
|
+
},
|
|
27
|
+
"type": "module",
|
|
28
|
+
"sideEffects": false,
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"@metreeca/source": "./src/index.ts",
|
|
32
|
+
"default": "./dist/index.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"README.md",
|
|
37
|
+
"LICENSE",
|
|
38
|
+
"dist"
|
|
39
|
+
],
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=22.0.0"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"clean": "rm -rf dist docs node_modules",
|
|
45
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
46
|
+
"check": "npx vitest --typecheck run"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@metreeca/blue": "^0.10.0",
|
|
50
|
+
"@metreeca/core": "^0.10.0",
|
|
51
|
+
"@metreeca/keep": "^0.10.0",
|
|
52
|
+
"@metreeca/keep-flake": "^0.10.0",
|
|
53
|
+
"@metreeca/qest": "^0.10.0",
|
|
54
|
+
"@metreeca/tape": "^0.10.1",
|
|
55
|
+
"@metreeca/trio": "^0.1.1",
|
|
56
|
+
"@metreeca/wire-sparql": "^0.10.0"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@metreeca/keep-suite": "^0.10.0",
|
|
60
|
+
"@metreeca/wire-sparql-http": "^0.10.0",
|
|
61
|
+
"@metreeca/wire-sparql-oxigraph": "^0.10.0",
|
|
62
|
+
"@metreeca/wire-sparql-rdf4j": "^0.10.0",
|
|
63
|
+
"oxigraph": "^0.5.8",
|
|
64
|
+
"testcontainers": "^11.14.0",
|
|
65
|
+
"typescript": "^5.9.3",
|
|
66
|
+
"vitest": "^4.0.13"
|
|
67
|
+
}
|
|
68
|
+
}
|