@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.
Files changed (71) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +106 -0
  3. package/dist/_/_decode.d.ts +20 -0
  4. package/dist/_/_decode.d.ts.map +1 -0
  5. package/dist/_/_decode.js +55 -0
  6. package/dist/_/_decode.js.map +1 -0
  7. package/dist/_/_encode.d.ts +112 -0
  8. package/dist/_/_encode.d.ts.map +1 -0
  9. package/dist/_/_encode.js +262 -0
  10. package/dist/_/_encode.js.map +1 -0
  11. package/dist/_/_flake.d.ts +16 -0
  12. package/dist/_/_flake.d.ts.map +1 -0
  13. package/dist/_/_flake.js +65 -0
  14. package/dist/_/_flake.js.map +1 -0
  15. package/dist/_/_union.d.ts +28 -0
  16. package/dist/_/_union.d.ts.map +1 -0
  17. package/dist/_/_union.js +51 -0
  18. package/dist/_/_union.js.map +1 -0
  19. package/dist/detect/decode.d.ts +25 -0
  20. package/dist/detect/decode.d.ts.map +1 -0
  21. package/dist/detect/decode.js +34 -0
  22. package/dist/detect/decode.js.map +1 -0
  23. package/dist/detect/encode.d.ts +25 -0
  24. package/dist/detect/encode.d.ts.map +1 -0
  25. package/dist/detect/encode.js +30 -0
  26. package/dist/detect/encode.js.map +1 -0
  27. package/dist/detect/index.d.ts +17 -0
  28. package/dist/detect/index.d.ts.map +1 -0
  29. package/dist/detect/index.js +55 -0
  30. package/dist/detect/index.js.map +1 -0
  31. package/dist/index.d.ts +95 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +70 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/lookup/decode.d.ts +33 -0
  36. package/dist/lookup/decode.d.ts.map +1 -0
  37. package/dist/lookup/decode.js +193 -0
  38. package/dist/lookup/decode.js.map +1 -0
  39. package/dist/lookup/encode.d.ts +46 -0
  40. package/dist/lookup/encode.d.ts.map +1 -0
  41. package/dist/lookup/encode.js +111 -0
  42. package/dist/lookup/encode.js.map +1 -0
  43. package/dist/lookup/index.d.ts +21 -0
  44. package/dist/lookup/index.d.ts.map +1 -0
  45. package/dist/lookup/index.js +72 -0
  46. package/dist/lookup/index.js.map +1 -0
  47. package/dist/modify/decode.d.ts +22 -0
  48. package/dist/modify/decode.d.ts.map +1 -0
  49. package/dist/modify/decode.js +26 -0
  50. package/dist/modify/decode.js.map +1 -0
  51. package/dist/modify/encode.d.ts +21 -0
  52. package/dist/modify/encode.d.ts.map +1 -0
  53. package/dist/modify/encode.js +184 -0
  54. package/dist/modify/encode.js.map +1 -0
  55. package/dist/modify/index.d.ts +22 -0
  56. package/dist/modify/index.d.ts.map +1 -0
  57. package/dist/modify/index.js +44 -0
  58. package/dist/modify/index.js.map +1 -0
  59. package/dist/select/decode.d.ts +16 -0
  60. package/dist/select/decode.d.ts.map +1 -0
  61. package/dist/select/decode.js +229 -0
  62. package/dist/select/decode.js.map +1 -0
  63. package/dist/select/encode.d.ts +16 -0
  64. package/dist/select/encode.d.ts.map +1 -0
  65. package/dist/select/encode.js +434 -0
  66. package/dist/select/encode.js.map +1 -0
  67. package/dist/select/index.d.ts +16 -0
  68. package/dist/select/index.d.ts.map +1 -0
  69. package/dist/select/index.js +38 -0
  70. package/dist/select/index.js.map +1 -0
  71. 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
+ }