@lde/search 0.23.1 → 0.24.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/dist/adapter.d.ts +3 -3
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +165 -26
- package/dist/query.d.ts +84 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +145 -44
- package/dist/schema.d.ts +221 -21
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +487 -70
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +58 -1
- package/package.json +2 -2
package/dist/query.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { fieldNamed, filterOperatorFor, ID_FIELD, isoToUnixSeconds, } from './schema.js';
|
|
1
|
+
import { fieldNamed, filterOperatorFor, ID_FIELD, isoToUnixSeconds, nestedReferenceType, } from './schema.js';
|
|
2
2
|
import { MAX_JOIN_DEPTH } from './join-graph.js';
|
|
3
|
+
/** Whether a criterion welds conditions to one entry ({@link WeldedCriterion}). */
|
|
4
|
+
export function isWelded(criterion) {
|
|
5
|
+
return 'entry' in criterion;
|
|
6
|
+
}
|
|
3
7
|
// The kind→operator table lives with the field model in schema.ts (one source
|
|
4
8
|
// for the query IR, the surfaces, the adapters AND declaration validation);
|
|
5
9
|
// re-exported here so the query-IR module stays the natural import site.
|
|
@@ -50,6 +54,96 @@ export function isUnsatisfiable(query) {
|
|
|
50
54
|
criterion.in.length === 0);
|
|
51
55
|
});
|
|
52
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* The checks every leaf criterion answers to, wherever it sits: the field is
|
|
59
|
+
* declared and `filterable` on the type it constrains, its operator matches
|
|
60
|
+
* that field's kind, and a `date` range's bounds are readable.
|
|
61
|
+
*
|
|
62
|
+
* Shared by an ordinary criterion and by each condition welded to an entry, so
|
|
63
|
+
* a welded condition is held to exactly the same rules – there is no second,
|
|
64
|
+
* weaker validator for the inside of an edge. `field` is the path to report
|
|
65
|
+
* under, which differs between the two.
|
|
66
|
+
*/
|
|
67
|
+
function collectLeafIssues(criterion, constrained, field, issues) {
|
|
68
|
+
const declared = fieldNamed(constrained, criterion.field);
|
|
69
|
+
if (declared === undefined) {
|
|
70
|
+
issues.push({ part: 'where', field, reason: 'unknown-field' });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (declared.filterable !== true) {
|
|
74
|
+
issues.push({ part: 'where', field, reason: 'not-filterable' });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (filterOperatorFor(declared.kind) !== filterOperator(criterion)) {
|
|
78
|
+
issues.push({ part: 'where', field, reason: 'operator-mismatch' });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (declared.kind === 'date' && 'range' in criterion) {
|
|
82
|
+
// A `date` bound is ISO 8601 at the edge and Unix seconds in storage, so a
|
|
83
|
+
// bound the codec cannot read has nothing to compare against. Both bounds
|
|
84
|
+
// are checked, so a caller who wrote two bad ones is told about both
|
|
85
|
+
// instead of fixing one to be told about the other.
|
|
86
|
+
for (const bound of [criterion.range.min, criterion.range.max]) {
|
|
87
|
+
if (typeof bound === 'string' && isoToUnixSeconds(bound) === undefined) {
|
|
88
|
+
issues.push({
|
|
89
|
+
part: 'where',
|
|
90
|
+
field,
|
|
91
|
+
value: bound,
|
|
92
|
+
reason: 'unparseable-bound',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Resolve an {@link CriterionBase.on} path against the schema, classifying each
|
|
100
|
+
* hop by what the declaration says it is: a {@link ReferenceField.joinable}
|
|
101
|
+
* reference is a join, an inline reference is a nesting.
|
|
102
|
+
*
|
|
103
|
+
* **Nested hops must come last.** A join is a clause about another collection
|
|
104
|
+
* and a nesting is a clause about a field of this document, so a join can
|
|
105
|
+
* contain a nesting (`$people(…)` around `edge.role`) but a nesting cannot
|
|
106
|
+
* contain a join – there is no collection to address from inside an array
|
|
107
|
+
* element. Once inside a nesting, therefore, a joinable name is as unwalkable
|
|
108
|
+
* as an unknown one and both report `unknown-nesting`.
|
|
109
|
+
*
|
|
110
|
+
* Only join hops count against {@link MAX_JOIN_DEPTH}: the cap exists to bound
|
|
111
|
+
* round trips, and a nesting hop costs none.
|
|
112
|
+
*/
|
|
113
|
+
export function resolvePath(searchType, path, schema, joins) {
|
|
114
|
+
const joinPath = [];
|
|
115
|
+
const nestedPath = [];
|
|
116
|
+
let current = searchType;
|
|
117
|
+
for (const name of path) {
|
|
118
|
+
const field = fieldNamed(current, name);
|
|
119
|
+
const nested = field === undefined ? undefined : nestedReferenceType(schema, field);
|
|
120
|
+
if (nested !== undefined) {
|
|
121
|
+
nestedPath.push(name);
|
|
122
|
+
current = nested;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (nestedPath.length > 0) {
|
|
126
|
+
// Already inside a document, where the only hop that means anything is
|
|
127
|
+
// another nesting. A join addresses a collection and there is none to
|
|
128
|
+
// address from inside an array element, so a joinable name here is as
|
|
129
|
+
// unwalkable as an unknown one – one reason covers both.
|
|
130
|
+
return 'unknown-nesting';
|
|
131
|
+
}
|
|
132
|
+
// Checked as the budget is spent, not after the walk: a path over the cap
|
|
133
|
+
// is too deep whether or not its last hop would have resolved, and saying
|
|
134
|
+
// so is more use than reporting the hop that happened to fail first.
|
|
135
|
+
if (joinPath.length === MAX_JOIN_DEPTH) {
|
|
136
|
+
return 'join-too-deep';
|
|
137
|
+
}
|
|
138
|
+
const target = joins?.resolve(current, [name]);
|
|
139
|
+
if (target === undefined) {
|
|
140
|
+
return 'unknown-join';
|
|
141
|
+
}
|
|
142
|
+
joinPath.push(name);
|
|
143
|
+
current = target;
|
|
144
|
+
}
|
|
145
|
+
return { leafType: current, joinPath, nestedPath };
|
|
146
|
+
}
|
|
53
147
|
/** The `field` a joined issue is reported under: the path and the leaf name
|
|
54
148
|
* together, so a message says which hop and which field, not just which
|
|
55
149
|
* field. `dataset.publisher.id` reads the way the criterion was written. */
|
|
@@ -107,23 +201,29 @@ export function validateQuery(query, searchType, schema, joins) {
|
|
|
107
201
|
// supplied none cannot serve a joined criterion at all.
|
|
108
202
|
const on = criterion.on ?? [];
|
|
109
203
|
let constrained = searchType;
|
|
204
|
+
let nested = false;
|
|
110
205
|
if (on.length > 0) {
|
|
111
|
-
|
|
112
|
-
|
|
206
|
+
const resolved = resolvePath(searchType, on, schema, joins);
|
|
207
|
+
if (typeof resolved === 'string') {
|
|
208
|
+
issues.push({ part: 'where', field, reason: resolved });
|
|
113
209
|
continue;
|
|
114
210
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
issues.push({ part: 'where', field, reason: 'unknown-join' });
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
constrained = target;
|
|
211
|
+
constrained = resolved.leafType;
|
|
212
|
+
nested = resolved.nestedPath.length > 0;
|
|
121
213
|
}
|
|
122
214
|
// `id` is filterable on every type without being declared by any: it is
|
|
123
215
|
// the document’s IRI, so the lookup exists wherever documents do.
|
|
124
216
|
// Membership only – an IRI has no range and no truth value.
|
|
125
217
|
if (name === ID_FIELD) {
|
|
126
|
-
|
|
218
|
+
// …but only where documents do. An entry inside a nested reference is
|
|
219
|
+
// read, not addressed: it has no document key, and the `id` a `local`
|
|
220
|
+
// lookup stores is the ENDPOINT’s, which the identity companion is
|
|
221
|
+
// what filters on. Accepting it here would compile to the ROOT
|
|
222
|
+
// document’s `id` and silently answer a different question.
|
|
223
|
+
if (nested) {
|
|
224
|
+
issues.push({ part: 'where', field, reason: 'unknown-nesting' });
|
|
225
|
+
}
|
|
226
|
+
else if (filterOperator(criterion) !== 'in') {
|
|
127
227
|
issues.push({
|
|
128
228
|
part: 'where',
|
|
129
229
|
field,
|
|
@@ -133,36 +233,23 @@ export function validateQuery(query, searchType, schema, joins) {
|
|
|
133
233
|
continue;
|
|
134
234
|
}
|
|
135
235
|
const declared = fieldNamed(constrained, name);
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
part: 'where',
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
else if (declared.kind === 'date' && 'range' in criterion) {
|
|
150
|
-
// A `date` bound is ISO 8601 at the edge and Unix seconds in storage,
|
|
151
|
-
// so a bound the codec cannot read has nothing to compare against.
|
|
152
|
-
// Both bounds are checked, so a caller who wrote two bad ones is told
|
|
153
|
-
// about both instead of fixing one to be told about the other.
|
|
154
|
-
for (const bound of [criterion.range.min, criterion.range.max]) {
|
|
155
|
-
if (typeof bound === 'string' &&
|
|
156
|
-
isoToUnixSeconds(bound) === undefined) {
|
|
157
|
-
issues.push({
|
|
158
|
-
part: 'where',
|
|
159
|
-
field,
|
|
160
|
-
value: bound,
|
|
161
|
-
reason: 'unparseable-bound',
|
|
162
|
-
});
|
|
163
|
-
}
|
|
236
|
+
// A welded criterion names the NESTED REFERENCE and constrains fields of
|
|
237
|
+
// the type it nests, so each condition is checked one level in – against
|
|
238
|
+
// that reference type, and reported under the path a consumer wrote.
|
|
239
|
+
if (isWelded(criterion)) {
|
|
240
|
+
const entryType = declared === undefined
|
|
241
|
+
? undefined
|
|
242
|
+
: nestedReferenceType(schema, declared);
|
|
243
|
+
if (entryType === undefined) {
|
|
244
|
+
issues.push({ part: 'where', field, reason: 'not-weldable' });
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
for (const welded of criterion.entry) {
|
|
248
|
+
collectLeafIssues(welded, entryType, [...on, name, welded.field].join('.'), issues);
|
|
164
249
|
}
|
|
250
|
+
continue;
|
|
165
251
|
}
|
|
252
|
+
collectLeafIssues(criterion, constrained, field, issues);
|
|
166
253
|
}
|
|
167
254
|
}
|
|
168
255
|
for (const name of query.facets) {
|
|
@@ -188,12 +275,19 @@ export function validateQuery(query, searchType, schema, joins) {
|
|
|
188
275
|
return issues;
|
|
189
276
|
}
|
|
190
277
|
/**
|
|
191
|
-
* Walk a projection level by level
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
278
|
+
* Walk a projection level by level. A level is one of two things, and the
|
|
279
|
+
* difference is what it costs rather than how it is written:
|
|
280
|
+
*
|
|
281
|
+
* - a **lookup** level names a `lookup` reference, resolves against that
|
|
282
|
+
* target’s collection, and costs one batched round trip;
|
|
283
|
+
* - a **nested** level names an inline reference and descends into its entries,
|
|
284
|
+
* costing nothing – the entries are already in the hit. Its `fields` name
|
|
285
|
+
* nothing to fetch, because the entries carry what they carry; only the
|
|
286
|
+
* levels *below* it can ask for anything.
|
|
287
|
+
*
|
|
288
|
+
* A level whose reference is unresolvable stops there: its subtree belongs to a
|
|
289
|
+
* target that does not exist, so reporting it too would bury the one mistake
|
|
290
|
+
* under its consequences.
|
|
197
291
|
*/
|
|
198
292
|
function collectProjectionIssues(projection, searchType, schema, issues) {
|
|
199
293
|
for (const [name, level] of Object.entries(projection ?? {})) {
|
|
@@ -202,6 +296,13 @@ function collectProjectionIssues(projection, searchType, schema, issues) {
|
|
|
202
296
|
issues.push({ part: 'resolve', field: name, reason: 'unknown-field' });
|
|
203
297
|
continue;
|
|
204
298
|
}
|
|
299
|
+
// Descending into an inline reference is free, so a nested level is valid
|
|
300
|
+
// wherever the entries exist – what it is *for* is the lookup below it.
|
|
301
|
+
const nested = nestedReferenceType(schema, field);
|
|
302
|
+
if (nested !== undefined) {
|
|
303
|
+
collectProjectionIssues(level.resolve, nested, schema, issues);
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
205
306
|
if (field.kind !== 'reference' || field.ref?.strategy !== 'lookup') {
|
|
206
307
|
issues.push({ part: 'resolve', field: name, reason: 'not-resolvable' });
|
|
207
308
|
continue;
|
package/dist/schema.d.ts
CHANGED
|
@@ -186,7 +186,10 @@ export interface KeywordField extends SearchFieldBase, Searchable {
|
|
|
186
186
|
* `‹Target›Reference`, since type names must be unique).
|
|
187
187
|
* - `inline` carries fields denormalised from the **parent’s** RDF framing at
|
|
188
188
|
* index time, shaped by the declared {@link ReferenceType} `typeName` names –
|
|
189
|
-
* so its typeName can never name a root type.
|
|
189
|
+
* so its typeName can never name a root type. Pointed at a node the graph put
|
|
190
|
+
* *between* subject and endpoint, the nested node is the **edge**, and
|
|
191
|
+
* {@link ReferenceStrategy.identity `identity`} names the nested reference
|
|
192
|
+
* that carries the endpoint.
|
|
190
193
|
*/
|
|
191
194
|
export type ReferenceStrategy = {
|
|
192
195
|
readonly strategy: 'idOnly';
|
|
@@ -198,12 +201,67 @@ export type ReferenceStrategy = {
|
|
|
198
201
|
* that belong to no such set. */
|
|
199
202
|
readonly typeName?: string;
|
|
200
203
|
readonly target?: never;
|
|
204
|
+
readonly identity?: never;
|
|
201
205
|
} | {
|
|
202
206
|
readonly strategy: 'lookup';
|
|
203
207
|
readonly target: string;
|
|
208
|
+
/**
|
|
209
|
+
* Also project the target’s **own fields from this document’s frame**, so
|
|
210
|
+
* the reference stores what the referring document states about the
|
|
211
|
+
* referent alongside the id – and the resolved document overlays it at
|
|
212
|
+
* query time rather than being the only source of it.
|
|
213
|
+
*
|
|
214
|
+
* What it buys is one field where there were two. A referent the graph
|
|
215
|
+
* names inline – a literal, a blank node – has no id, so a plain
|
|
216
|
+
* reference stores nothing for it and a deployment needs a second, text
|
|
217
|
+
* field beside this one to show it at all; the two are then parallel
|
|
218
|
+
* arrays that cannot be paired. With `local`, an unidentified referent is
|
|
219
|
+
* an entry like any other, minus its `id`.
|
|
220
|
+
*
|
|
221
|
+
* Stored **unconditionally**, not only where there is no id, because the
|
|
222
|
+
* two failures differ: at index time the question is *is this referent
|
|
223
|
+
* identified*, at query time it is *is that document indexed*. A referent
|
|
224
|
+
* whose document is missing from the target’s collection therefore still
|
|
225
|
+
* carries what this document said about it, instead of degrading to a
|
|
226
|
+
* bare IRI.
|
|
227
|
+
*
|
|
228
|
+
* Opt-in, because it changes what the field stores – a nested object
|
|
229
|
+
* rather than an id – and because framing must reach one step further to
|
|
230
|
+
* read the target’s fields off the referent
|
|
231
|
+
* ({@link inlineFramingDepth}). A schema that declares none pays neither.
|
|
232
|
+
*/
|
|
233
|
+
readonly local?: boolean;
|
|
234
|
+
readonly identity?: never;
|
|
204
235
|
} | {
|
|
205
236
|
readonly strategy: 'inline';
|
|
206
237
|
readonly typeName: string;
|
|
238
|
+
/**
|
|
239
|
+
* The `name` of a **nested reference field** of this reference type whose
|
|
240
|
+
* ids identify each entry’s endpoint – required to declare `filterable`
|
|
241
|
+
* or `facetable` on the inline reference itself, and meaningless without
|
|
242
|
+
* one ({@link searchSchema} enforces both directions).
|
|
243
|
+
*
|
|
244
|
+
* A nested object is not something an engine can filter or facet, so an
|
|
245
|
+
* inline reference that opts into either fans out an **identity
|
|
246
|
+
* companion**: a flat physical field holding the ids its entries
|
|
247
|
+
* reference ({@link physicalFields}), which the engine filters and facets
|
|
248
|
+
* in the nested object’s place. The same mechanism `${name}_facet`
|
|
249
|
+
* already uses – one logical field, two physical fields, one holding a
|
|
250
|
+
* derived subset of the other.
|
|
251
|
+
*
|
|
252
|
+
* Declared rather than inferred, because a reference type may carry more
|
|
253
|
+
* than one nested reference and only the schema author knows which one
|
|
254
|
+
* identifies the edge. Naming it is also what gives the companion a
|
|
255
|
+
* **target**: the named field’s own `target` is the Root Type whose keys
|
|
256
|
+
* these ids are, which is what a facet policy is inherited through
|
|
257
|
+
* ({@link inheritedFacetKeys}) and what types the filter at the surface.
|
|
258
|
+
*
|
|
259
|
+
* The companion holds ids only, so a facet over it is exact and
|
|
260
|
+
* identity-keyed: an entry whose endpoint the graph named inline – a
|
|
261
|
+
* literal, a blank node – contributes no bucket rather than a bucket
|
|
262
|
+
* keyed on a label, so two endpoints that share a label are never merged.
|
|
263
|
+
*/
|
|
264
|
+
readonly identity?: string;
|
|
207
265
|
};
|
|
208
266
|
/** An IRI-valued reference to another entity, resolved at the surface. */
|
|
209
267
|
export interface ReferenceField extends SearchFieldBase, Searchable {
|
|
@@ -371,6 +429,40 @@ export interface KeyField {
|
|
|
371
429
|
*/
|
|
372
430
|
readonly pick?: (candidates: readonly string[]) => string | undefined;
|
|
373
431
|
}
|
|
432
|
+
/**
|
|
433
|
+
* A {@link RootType}’s **facet policy**: which of its documents get a facet
|
|
434
|
+
* bucket, as a predicate over the document key. Declared once, on the type,
|
|
435
|
+
* and inherited by every facetable reference that *names* the type – a
|
|
436
|
+
* `lookup`’s `target`, an `idOnly`’s `labelSource` ({@link labelSourceNameOf})
|
|
437
|
+
* – because *which of a type’s ids deserve a bucket* is a fact about the type,
|
|
438
|
+
* not about each field that points at it. A per-field policy would be one rule
|
|
439
|
+
* declared N times, and forgetting one would silently reintroduce the buckets
|
|
440
|
+
* on that facet alone.
|
|
441
|
+
*
|
|
442
|
+
* Only the facet narrows. The referring field keeps **every** value: a
|
|
443
|
+
* document still displays the excluded referent, and a `where` filter on its
|
|
444
|
+
* IRI still matches exactly. *Facets are discovery, filters are exact.*
|
|
445
|
+
*
|
|
446
|
+
* The mechanism is a second physical field per inheriting facet –
|
|
447
|
+
* `${name}_facet`, holding the admitted subset ({@link physicalFields}) – which
|
|
448
|
+
* the engine facets instead of the field itself, so the facet is exact under
|
|
449
|
+
* any bucket cap: the engine never sees an excluded value. Declaring a policy
|
|
450
|
+
* therefore changes the collection definition of every type that references
|
|
451
|
+
* this one; an engine adapter that reuses a live collection must notice.
|
|
452
|
+
*
|
|
453
|
+
* **The failure mode is silence.** A predicate that admits none of a type’s
|
|
454
|
+
* keys – a type whose alignments are not what it tests for, or stored values
|
|
455
|
+
* that are still node IRIs because the type was keyed after its references
|
|
456
|
+
* were indexed – empties every facet referencing the type without an error.
|
|
457
|
+
* Give each type its own predicate rather than reuse another’s, and key a type
|
|
458
|
+
* ({@link RootType.key}) before declaring a policy over its keys.
|
|
459
|
+
*/
|
|
460
|
+
export interface FacetKeys {
|
|
461
|
+
/** Whether a document key gets a bucket. Must be **pure**: it is applied per
|
|
462
|
+
* document at projection time, so an impure one would bucket one document
|
|
463
|
+
* and not its twin. */
|
|
464
|
+
readonly only: (id: string) => boolean;
|
|
465
|
+
}
|
|
374
466
|
/**
|
|
375
467
|
* A **Root Type**: a {@link SearchType} that is indexed. It declares a `class`,
|
|
376
468
|
* roots are selected for it, a Writer owns a collection for it, and the
|
|
@@ -386,6 +478,10 @@ export interface RootType extends SearchTypeBase {
|
|
|
386
478
|
/** Which declared field holds this type’s document key, when it is not the
|
|
387
479
|
* node’s own IRI ({@link KeyField}, {@link documentKeyOf}). */
|
|
388
480
|
readonly key?: KeyField;
|
|
481
|
+
/** Which of this type’s documents get a facet bucket, on every facetable
|
|
482
|
+
* reference that names this type ({@link FacetKeys}). Unset, every
|
|
483
|
+
* document does. */
|
|
484
|
+
readonly facetKeys?: FacetKeys;
|
|
389
485
|
}
|
|
390
486
|
/**
|
|
391
487
|
* A **Reference Type**: a {@link SearchType} reached only through an
|
|
@@ -407,6 +503,9 @@ export interface ReferenceType extends SearchTypeBase {
|
|
|
407
503
|
* referrer rather than keyed in a collection of its own. `never` for the
|
|
408
504
|
* same reason `class` is. */
|
|
409
505
|
readonly key?: never;
|
|
506
|
+
/** Nothing references a Reference Type by id, so there is no facet for a
|
|
507
|
+
* policy to narrow. `never` for the same reason `key` is. */
|
|
508
|
+
readonly facetKeys?: never;
|
|
410
509
|
}
|
|
411
510
|
/**
|
|
412
511
|
* One type’s complete search declaration: its logical API `name`, the queryable
|
|
@@ -499,14 +598,21 @@ export declare function isInlineReference(field: SearchField): field is Referenc
|
|
|
499
598
|
};
|
|
500
599
|
};
|
|
501
600
|
/**
|
|
502
|
-
* The {@link ReferenceType}
|
|
503
|
-
* `
|
|
504
|
-
*
|
|
505
|
-
*
|
|
506
|
-
*
|
|
507
|
-
*
|
|
508
|
-
*
|
|
509
|
-
*
|
|
601
|
+
* The {@link ReferenceType} an inline reference **stores entries of**, or
|
|
602
|
+
* `undefined` for every other field. The one predicate the collection
|
|
603
|
+
* definition, result reconstruction and the API surfaces share, so they cannot
|
|
604
|
+
* disagree about which fields carry nested Search Documents and which carry a
|
|
605
|
+
* bare IRI: a `labelOnly`/`idOnly` reference stays an id (plus a resolved
|
|
606
|
+
* label).
|
|
607
|
+
*
|
|
608
|
+
* The line is *any Role at all*, not `output`: an inline reference declaring no
|
|
609
|
+
* Role is a reading device, pruned before the writer
|
|
610
|
+
* ({@link isInternalField}), while one that is `filterable` or `facetable`
|
|
611
|
+
* without being `output` still has its entries stored – they are what a nested
|
|
612
|
+
* filter constrains and what the
|
|
613
|
+
* {@link ReferenceStrategy.identity identity companion} is harvested from. Only
|
|
614
|
+
* `output` decides whether they are *surfaced*, which is the surfaces’ own
|
|
615
|
+
* question ({@link outputFields}).
|
|
510
616
|
*
|
|
511
617
|
* A schema built by {@link searchSchema} always resolves the reference type of
|
|
512
618
|
* its own types; `undefined` for a type declared against another schema.
|
|
@@ -527,12 +633,27 @@ export declare function nestedReferenceType(schema: SearchSchema, field: SearchF
|
|
|
527
633
|
*/
|
|
528
634
|
export declare function nestedFieldName(parent: string, name: string): string;
|
|
529
635
|
/**
|
|
530
|
-
* The framing depth a Root Type needs: how
|
|
531
|
-
*
|
|
532
|
-
*
|
|
533
|
-
*
|
|
534
|
-
*
|
|
535
|
-
*
|
|
636
|
+
* The framing depth a Root Type needs: how far the **furthest value it declares**
|
|
637
|
+
* lies from it, in hops. Depth is a property of the declaration, bounded because
|
|
638
|
+
* {@link searchSchema} rejects inline cycles – never a knob or a constant.
|
|
639
|
+
* Framing bounded per batch keeps memory bounded by the unit of work (ADR 12),
|
|
640
|
+
* not the graph.
|
|
641
|
+
*
|
|
642
|
+
* Reach is measured in hops and depth in *intermediate* nodes, so depth is one
|
|
643
|
+
* less: reading `<a>/<b>` off a root needs the root’s own triples plus those of
|
|
644
|
+
* the node `<a>` reaches, which is depth 1. Floored at one, preserving the
|
|
645
|
+
* single-hop embed a non-inline reference has always had.
|
|
646
|
+
*
|
|
647
|
+
* Three things add hops, and counting only the first is what let a value fall
|
|
648
|
+
* outside the frame and be stored as absent, in silence:
|
|
649
|
+
*
|
|
650
|
+
* - **a property path**, which may traverse (`<a>/<b>` is two hops);
|
|
651
|
+
* - **an inline reference**, whose referent’s own fields reach on from wherever
|
|
652
|
+
* its path landed;
|
|
653
|
+
* - **a reference naming a keyed target**, whose document key is read one hop
|
|
654
|
+
* past the referent (ADR 22) – so a reference reached through an inline
|
|
655
|
+
* chain needs its key hop inside the frame too, or it stores an un-keyed id
|
|
656
|
+
* that matches nothing in the target’s collection.
|
|
536
657
|
*/
|
|
537
658
|
export declare function inlineFramingDepth(schema: SearchSchema, searchType: SearchType): number;
|
|
538
659
|
/** The label field name a type falls back to when it declares no
|
|
@@ -565,7 +686,7 @@ export declare function labelSourceNameOf(field: ReferenceField): string | undef
|
|
|
565
686
|
*/
|
|
566
687
|
export interface SearchTypeIssue {
|
|
567
688
|
readonly field: string;
|
|
568
|
-
readonly reason: 'duplicate-field-name' | 'invalid-field-name' | 'unknown-kind' | 'invalid-locale' | 'missing-ref' | 'missing-ref-type-name' | 'ref-not-allowed' | 'text-requires-locales' | 'locales-not-allowed' | 'facet-ranges-not-allowed' | 'searchable-not-allowed' | 'transform-not-allowed' | 'derive-with-path' | 'from-not-allowed' | 'from-with-path' | 'from-with-derive' | 'from-with-inline-ref' | 'unknown-projection-value' | 'duplicate-projection-value' | 'text-not-filterable' | 'text-not-facetable' | 'joinable-not-allowed' | 'joinable-without-label-source' | 'joinable-with-inline-ref' | 'reserved-field-name' | 'key-field-unknown' | 'key-field-not-reference' | 'key-field-without-path' | 'key-field-not-array' | 'key-field-inline' | 'key-pick-not-a-function' | 'key-not-allowed';
|
|
689
|
+
readonly reason: 'duplicate-field-name' | 'invalid-field-name' | 'unknown-kind' | 'invalid-locale' | 'missing-ref' | 'missing-ref-type-name' | 'ref-not-allowed' | 'text-requires-locales' | 'locales-not-allowed' | 'facet-ranges-not-allowed' | 'searchable-not-allowed' | 'transform-not-allowed' | 'derive-with-path' | 'from-not-allowed' | 'from-with-path' | 'from-with-derive' | 'from-with-inline-ref' | 'unknown-projection-value' | 'duplicate-projection-value' | 'text-not-filterable' | 'text-not-facetable' | 'joinable-not-allowed' | 'joinable-without-label-source' | 'joinable-with-inline-ref' | 'reserved-field-name' | 'key-field-unknown' | 'key-field-not-reference' | 'key-field-without-path' | 'key-field-not-array' | 'key-field-inline' | 'key-pick-not-a-function' | 'key-not-allowed' | 'facet-keys-only-not-a-function' | 'facet-keys-not-allowed';
|
|
569
690
|
}
|
|
570
691
|
/**
|
|
571
692
|
* The reserved logical name of a document’s IRI – the one field every indexed
|
|
@@ -638,7 +759,10 @@ export declare const OR_KEY = "or";
|
|
|
638
759
|
* the dataset off a declaration no rule picks between;
|
|
639
760
|
* - a {@link RootType.key} names a declared, `path`-bearing, `array`,
|
|
640
761
|
* non-`inline` `reference` field of this type, and its `pick` is a function
|
|
641
|
-
* ({@link keyIssues}); a {@link ReferenceType} declares no key at all
|
|
762
|
+
* ({@link keyIssues}); a {@link ReferenceType} declares no key at all;
|
|
763
|
+
* - a {@link RootType.facetKeys} policy’s `only` is a function
|
|
764
|
+
* ({@link facetKeysIssues}); a {@link ReferenceType} declares no policy at
|
|
765
|
+
* all.
|
|
642
766
|
*
|
|
643
767
|
* Pure and total: returns every issue rather than throwing;
|
|
644
768
|
* {@link assertValidSearchType} is the throwing entry point.
|
|
@@ -667,7 +791,56 @@ export interface PhysicalFields {
|
|
|
667
791
|
/** Per-locale folded sort keys `${name}_sort_${locale}` (localized text,
|
|
668
792
|
* `sortable`); a non-localized field sorts on its own `name` field. */
|
|
669
793
|
readonly sort: readonly string[];
|
|
794
|
+
/** The field a facet on this field reads, when `facetable`: the field’s own
|
|
795
|
+
* `name`, or the `${name}_facet` companion holding the subset its target’s
|
|
796
|
+
* {@link FacetKeys facet policy} admits. `undefined` for a field that is
|
|
797
|
+
* not facetable. */
|
|
798
|
+
readonly facet: string | undefined;
|
|
799
|
+
/**
|
|
800
|
+
* The **identity companion** an inline reference filters and facets through:
|
|
801
|
+
* `${name}_id`, holding the ids its entries reference
|
|
802
|
+
* ({@link ReferenceStrategy.identity}). `undefined` for every other field –
|
|
803
|
+
* an ordinary field filters on its own `name`.
|
|
804
|
+
*
|
|
805
|
+
* A nested object is not a value an engine filters or facets, so this is the
|
|
806
|
+
* flat field it filters and facets in its place. The logical field keeps one
|
|
807
|
+
* name at the surface; only the physical fanout knows there are two.
|
|
808
|
+
*/
|
|
809
|
+
readonly identity: string | undefined;
|
|
670
810
|
}
|
|
811
|
+
/** The physical name of an inline reference’s
|
|
812
|
+
* {@link ReferenceStrategy.identity identity companion}. */
|
|
813
|
+
export declare function identityFieldName(name: string): string;
|
|
814
|
+
/**
|
|
815
|
+
* The Root Type whose labels a reference’s **facet buckets** read – its own
|
|
816
|
+
* label source, or, for an inline reference, the one its
|
|
817
|
+
* {@link ReferenceStrategy.identity identity companion} points at.
|
|
818
|
+
*
|
|
819
|
+
* The same one-level-in reading {@link inheritedFacetKeys} makes, and for the
|
|
820
|
+
* same reason: the companion holds that field’s ids, so the type that names
|
|
821
|
+
* those ids is the type that can label them. Kept together with it so a facet
|
|
822
|
+
* cannot inherit a policy from one type and its labels from another – or, as
|
|
823
|
+
* happened first, inherit the policy and no labels at all.
|
|
824
|
+
*/
|
|
825
|
+
export declare function labelTargetNameOf(field: SearchField, schema: SearchSchema | undefined): string | undefined;
|
|
826
|
+
/**
|
|
827
|
+
* The Root Type a {@link ReferenceStrategy.local local} lookup projects its
|
|
828
|
+
* referents through, or `undefined` for every other field. Such a reference
|
|
829
|
+
* stores nested documents shaped by the **target’s own declaration** – so it
|
|
830
|
+
* needs no reference type of its own, and reconstructs through the same path a
|
|
831
|
+
* resolved referent does.
|
|
832
|
+
*/
|
|
833
|
+
export declare function localLookupTypeOf(field: SearchField, schema: SearchSchema | undefined): RootType | undefined;
|
|
834
|
+
/**
|
|
835
|
+
* The nested reference an inline reference’s
|
|
836
|
+
* {@link ReferenceStrategy.identity identity companion} harvests, or
|
|
837
|
+
* `undefined` where the field declares none (or the schema cannot resolve its
|
|
838
|
+
* reference type). The one reading of *which nested field identifies the edge*,
|
|
839
|
+
* so the projection (which harvests it), {@link inheritedFacetKeys} (which
|
|
840
|
+
* reads its target’s facet policy) and an adapter’s filter compiler cannot
|
|
841
|
+
* resolve it differently.
|
|
842
|
+
*/
|
|
843
|
+
export declare function identityFieldOf(field: SearchField, schema: SearchSchema | undefined): ReferenceField | undefined;
|
|
671
844
|
/**
|
|
672
845
|
* The display fields of a localized `text` field are pattern-based, not
|
|
673
846
|
* enumerated per declared locale: projection stores `${name}_${lang}` for
|
|
@@ -851,9 +1024,36 @@ export declare function isoToUnixSeconds(iso: string): number | undefined;
|
|
|
851
1024
|
export declare function unixSecondsToIso(seconds: number): string;
|
|
852
1025
|
/**
|
|
853
1026
|
* Derive the **indexed** physical engine field names a declaration produces:
|
|
854
|
-
* the per-locale `search`/`sort` fanout
|
|
855
|
-
* fields are pattern-based and not enumerated
|
|
856
|
-
* and its siblings.
|
|
1027
|
+
* the per-locale `search`/`sort` fanout, and the field a `facet` reads. A
|
|
1028
|
+
* localized `text` field’s display fields are pattern-based and not enumerated
|
|
1029
|
+
* here – see {@link displayFieldName} and its siblings.
|
|
1030
|
+
*
|
|
1031
|
+
* The facet is the one member that depends on more than the declaration: a
|
|
1032
|
+
* facetable reference whose target declares a {@link FacetKeys facet policy}
|
|
1033
|
+
* facets a `${name}_facet` companion rather than itself, and only the `schema`
|
|
1034
|
+
* can resolve that target ({@link inheritedFacetKeys}). Without one the field
|
|
1035
|
+
* facets on its own name – the same reading the projection makes without a
|
|
1036
|
+
* schema, where it cannot re-key a reference either.
|
|
1037
|
+
*/
|
|
1038
|
+
export declare function physicalFields(field: SearchField, schema?: SearchSchema): PhysicalFields;
|
|
1039
|
+
/**
|
|
1040
|
+
* The {@link FacetKeys facet policy} a field inherits: the `facetKeys` of the
|
|
1041
|
+
* Root Type it names ({@link labelSourceNameOf}), when the field is a facetable
|
|
1042
|
+
* reference and the schema resolves that type. The boundary is *naming the
|
|
1043
|
+
* target* – the same line along which a reference is re-keyed and a join is
|
|
1044
|
+
* drawn – so a reference that names no type inherits nothing, whatever type
|
|
1045
|
+
* its values happen to point at; and a `derive`d reference, which produces its
|
|
1046
|
+
* own values rather than reading a referent, is re-keyed by nothing and so
|
|
1047
|
+
* narrowed by nothing either. The one reading the projection (which writes the
|
|
1048
|
+
* companion) and {@link physicalFields} (which names it) share.
|
|
1049
|
+
*
|
|
1050
|
+
* An **inline** reference names its target one level in, through the nested
|
|
1051
|
+
* reference its {@link ReferenceStrategy.identity identity companion} harvests
|
|
1052
|
+
* ({@link identityFieldOf}). The boundary is the same one: the companion holds
|
|
1053
|
+
* that field’s ids, so the policy that narrows a facet over those ids is the
|
|
1054
|
+
* policy of the type that field names. Reading it through the nested field
|
|
1055
|
+
* rather than declaring it twice is what keeps *which of a type’s ids deserve
|
|
1056
|
+
* a bucket* a fact about the type.
|
|
857
1057
|
*/
|
|
858
|
-
export declare function
|
|
1058
|
+
export declare function inheritedFacetKeys(field: SearchField, schema: SearchSchema | undefined): FacetKeys | undefined;
|
|
859
1059
|
//# sourceMappingURL=schema.d.ts.map
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGrE;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GACnB,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/E;oEACoE;AACpE,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;AAcnD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAE7E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,MAAM,WAAW,GACrB,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,YAAY,CAAC;AAE1E,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B;wCACoC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;+EAC2E;IAC3E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;2DAGuD;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB;;yCAEqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,iCAAiC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAChB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,iBAAiB,KACvB,OAAO,CAAC;CACd;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC;AAExC;kEACkE;AAClE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,SAAU,SAAQ,eAAe,EAAE,UAAU;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;CAC9B;AAED;gCACgC;AAChC,MAAM,WAAW,YAAa,SAAQ,eAAe,EAAE,UAAU;IAC/D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;IAC7B;8CAC0C;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;CACjC;AAED
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|