@comunica/actor-query-source-identify-hypermedia-sparql 4.1.0 → 4.4.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/README.md +3 -0
- package/components/ActorQuerySourceIdentifyHypermediaSparql.jsonld +100 -0
- package/components/QuerySourceSparql.jsonld +140 -6
- package/components/components.jsonld +0 -0
- package/components/context.jsonld +51 -0
- package/lib/ActorQuerySourceIdentifyHypermediaSparql.d.ts +27 -0
- package/lib/ActorQuerySourceIdentifyHypermediaSparql.js +6 -3
- package/lib/ActorQuerySourceIdentifyHypermediaSparql.js.map +1 -1
- package/lib/QuerySourceSparql.d.ts +23 -4
- package/lib/QuerySourceSparql.js +130 -26
- package/lib/QuerySourceSparql.js.map +1 -1
- package/lib/index.d.ts +0 -0
- package/lib/index.js +0 -0
- package/lib/index.js.map +0 -0
- package/package.json +12 -11
package/README.md
CHANGED
|
@@ -42,6 +42,9 @@ After installing, this package can be added to your engine's configuration as fo
|
|
|
42
42
|
* `mediatorMergeBindingsContext`: A mediator over the [Merge Bindings Context bus](https://github.com/comunica/comunica/tree/master/packages/bus-merge-bindings-context).
|
|
43
43
|
* `checkUrlSuffix`: If URLs ending with '/sparql' should also be considered SPARQL endpoints, defaults to `true`.
|
|
44
44
|
* `forceHttpGet`: If queries should be sent via HTTP GET instead of POST, defaults to `false`.
|
|
45
|
+
* `forceSourceType`: Forces all sources provided to be interpreted as SPARQL endpoints, defaults to `false`.
|
|
45
46
|
* `cacheSize`: The cache size for COUNT queries, defaults to `1024`.
|
|
46
47
|
* `bindMethod`: The query operation for communicating bindings, defaults to `'values'`, alt: `'union'` or `'filter'`.
|
|
47
48
|
* `countTimeout`: Timeout in ms of how long count queries are allowed to take. If the timeout is reached, an infinity cardinality is returned. Defaults to `3000`.
|
|
49
|
+
* `cardinalityCountQueries`: If count queries should be sent to obtain the cardinality of (sub)queries. If set to false, resulting cardinalities will always be considered infinity. Defaults to `true`
|
|
50
|
+
* `cardinalityEstimateConstruction`: If cardinality estimates for larger queries should be constructed locally from (sub)query cardinalities when possible. Defaults to `false`. If set to false, count queries will be sent for every operation at all levels.
|
|
@@ -51,6 +51,20 @@
|
|
|
51
51
|
"default": "1024",
|
|
52
52
|
"comment": "The cache size for COUNT queries."
|
|
53
53
|
},
|
|
54
|
+
{
|
|
55
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_forceSourceType",
|
|
56
|
+
"range": {
|
|
57
|
+
"@type": "ParameterRangeUnion",
|
|
58
|
+
"parameterRangeElements": [
|
|
59
|
+
"xsd:boolean",
|
|
60
|
+
{
|
|
61
|
+
"@type": "ParameterRangeUndefined"
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"default": "false",
|
|
66
|
+
"comment": "If provided, forces the source type of a source."
|
|
67
|
+
},
|
|
54
68
|
{
|
|
55
69
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_bindMethod",
|
|
56
70
|
"range": {
|
|
@@ -79,6 +93,32 @@
|
|
|
79
93
|
"default": "3000",
|
|
80
94
|
"comment": "Timeout in ms of how long count queries are allowed to take. If the timeout is reached, an infinity cardinality is returned."
|
|
81
95
|
},
|
|
96
|
+
{
|
|
97
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cardinalityCountQueries",
|
|
98
|
+
"range": "xsd:boolean",
|
|
99
|
+
"default": "true",
|
|
100
|
+
"comment": "If count queries should be sent to obtain the cardinality of (sub)queries. If set to false, resulting cardinalities will always be considered infinity."
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cardinalityEstimateConstruction",
|
|
104
|
+
"range": "xsd:boolean",
|
|
105
|
+
"default": "false",
|
|
106
|
+
"comment": "If estimates for queries should be constructed locally from sub-query cardinalities. If set to false, count queries will used for cardinality estimation at all levels."
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_forceGetIfUrlLengthBelow",
|
|
110
|
+
"range": {
|
|
111
|
+
"@type": "ParameterRangeUnion",
|
|
112
|
+
"parameterRangeElements": [
|
|
113
|
+
"xsd:number",
|
|
114
|
+
{
|
|
115
|
+
"@type": "ParameterRangeUndefined"
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"default": "600",
|
|
120
|
+
"comment": "Force an HTTP GET instead of default POST (when forceHttpGet is false) when the url length (including encoded query) is below this number."
|
|
121
|
+
},
|
|
82
122
|
{
|
|
83
123
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_name",
|
|
84
124
|
"range": "xsd:string",
|
|
@@ -217,6 +257,11 @@
|
|
|
217
257
|
"memberFieldName": "cacheSize",
|
|
218
258
|
"range": "xsd:number"
|
|
219
259
|
},
|
|
260
|
+
{
|
|
261
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql__member_forceSourceType",
|
|
262
|
+
"memberFieldName": "forceSourceType",
|
|
263
|
+
"range": "xsd:boolean"
|
|
264
|
+
},
|
|
220
265
|
{
|
|
221
266
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql__member_bindMethod",
|
|
222
267
|
"memberFieldName": "bindMethod",
|
|
@@ -243,6 +288,21 @@
|
|
|
243
288
|
"memberFieldName": "countTimeout",
|
|
244
289
|
"range": "xsd:number"
|
|
245
290
|
},
|
|
291
|
+
{
|
|
292
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql__member_cardinalityCountQueries",
|
|
293
|
+
"memberFieldName": "cardinalityCountQueries",
|
|
294
|
+
"range": "xsd:boolean"
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql__member_cardinalityEstimateConstruction",
|
|
298
|
+
"memberFieldName": "cardinalityEstimateConstruction",
|
|
299
|
+
"range": "xsd:boolean"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql__member_forceGetIfUrlLengthBelow",
|
|
303
|
+
"memberFieldName": "forceGetIfUrlLengthBelow",
|
|
304
|
+
"range": "xsd:number"
|
|
305
|
+
},
|
|
246
306
|
{
|
|
247
307
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql__member_constructor",
|
|
248
308
|
"memberFieldName": "constructor"
|
|
@@ -290,6 +350,12 @@
|
|
|
290
350
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cacheSize"
|
|
291
351
|
}
|
|
292
352
|
},
|
|
353
|
+
{
|
|
354
|
+
"keyRaw": "forceSourceType",
|
|
355
|
+
"value": {
|
|
356
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_forceSourceType"
|
|
357
|
+
}
|
|
358
|
+
},
|
|
293
359
|
{
|
|
294
360
|
"keyRaw": "bindMethod",
|
|
295
361
|
"value": {
|
|
@@ -302,6 +368,24 @@
|
|
|
302
368
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_countTimeout"
|
|
303
369
|
}
|
|
304
370
|
},
|
|
371
|
+
{
|
|
372
|
+
"keyRaw": "cardinalityCountQueries",
|
|
373
|
+
"value": {
|
|
374
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cardinalityCountQueries"
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
"keyRaw": "cardinalityEstimateConstruction",
|
|
379
|
+
"value": {
|
|
380
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cardinalityEstimateConstruction"
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
"keyRaw": "forceGetIfUrlLengthBelow",
|
|
385
|
+
"value": {
|
|
386
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_forceGetIfUrlLengthBelow"
|
|
387
|
+
}
|
|
388
|
+
},
|
|
305
389
|
{
|
|
306
390
|
"keyRaw": "name",
|
|
307
391
|
"value": {
|
|
@@ -356,6 +440,10 @@
|
|
|
356
440
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#IActorQuerySourceIdentifyHypermediaSparqlArgs__member_cacheSize",
|
|
357
441
|
"memberFieldName": "cacheSize"
|
|
358
442
|
},
|
|
443
|
+
{
|
|
444
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#IActorQuerySourceIdentifyHypermediaSparqlArgs__member_forceSourceType",
|
|
445
|
+
"memberFieldName": "forceSourceType"
|
|
446
|
+
},
|
|
359
447
|
{
|
|
360
448
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#IActorQuerySourceIdentifyHypermediaSparqlArgs__member_bindMethod",
|
|
361
449
|
"memberFieldName": "bindMethod"
|
|
@@ -363,6 +451,18 @@
|
|
|
363
451
|
{
|
|
364
452
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#IActorQuerySourceIdentifyHypermediaSparqlArgs__member_countTimeout",
|
|
365
453
|
"memberFieldName": "countTimeout"
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#IActorQuerySourceIdentifyHypermediaSparqlArgs__member_cardinalityCountQueries",
|
|
457
|
+
"memberFieldName": "cardinalityCountQueries"
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#IActorQuerySourceIdentifyHypermediaSparqlArgs__member_cardinalityEstimateConstruction",
|
|
461
|
+
"memberFieldName": "cardinalityEstimateConstruction"
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#IActorQuerySourceIdentifyHypermediaSparqlArgs__member_forceGetIfUrlLengthBelow",
|
|
465
|
+
"memberFieldName": "forceGetIfUrlLengthBelow"
|
|
366
466
|
}
|
|
367
467
|
],
|
|
368
468
|
"constructorArguments": []
|
|
@@ -33,6 +33,18 @@
|
|
|
33
33
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_countTimeout",
|
|
34
34
|
"range": "xsd:number"
|
|
35
35
|
},
|
|
36
|
+
{
|
|
37
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_cardinalityCountQueries",
|
|
38
|
+
"range": "xsd:boolean"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_cardinalityEstimateConstruction",
|
|
42
|
+
"range": "xsd:boolean"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_forceGetIfUrlLengthBelow",
|
|
46
|
+
"range": "xsd:number"
|
|
47
|
+
},
|
|
36
48
|
{
|
|
37
49
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_bindingsFactory",
|
|
38
50
|
"range": "urn:npm:@comunica/utils-bindings-factory:BindingsFactory"
|
|
@@ -65,6 +77,30 @@
|
|
|
65
77
|
]
|
|
66
78
|
}
|
|
67
79
|
},
|
|
80
|
+
{
|
|
81
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_defaultGraph",
|
|
82
|
+
"range": {
|
|
83
|
+
"@type": "ParameterRangeUnion",
|
|
84
|
+
"parameterRangeElements": [
|
|
85
|
+
"xsd:string",
|
|
86
|
+
{
|
|
87
|
+
"@type": "ParameterRangeUndefined"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_unionDefaultGraph",
|
|
94
|
+
"range": {
|
|
95
|
+
"@type": "ParameterRangeUnion",
|
|
96
|
+
"parameterRangeElements": [
|
|
97
|
+
"xsd:boolean",
|
|
98
|
+
{
|
|
99
|
+
"@type": "ParameterRangeUndefined"
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
},
|
|
68
104
|
{
|
|
69
105
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_dataFactory",
|
|
70
106
|
"range": {
|
|
@@ -76,16 +112,54 @@
|
|
|
76
112
|
}
|
|
77
113
|
]
|
|
78
114
|
}
|
|
79
|
-
}
|
|
80
|
-
],
|
|
81
|
-
"memberFields": [
|
|
115
|
+
},
|
|
82
116
|
{
|
|
83
|
-
"@id": "caqsihs:components/QuerySourceSparql.jsonld#
|
|
84
|
-
"memberFieldName": "SELECTOR_SHAPE",
|
|
117
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_extensionFunctions",
|
|
85
118
|
"range": {
|
|
86
|
-
"@type": "
|
|
119
|
+
"@type": "ParameterRangeUnion",
|
|
120
|
+
"parameterRangeElements": [
|
|
121
|
+
{
|
|
122
|
+
"@type": "ParameterRangeArray",
|
|
123
|
+
"parameterRangeValue": "xsd:string"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"@type": "ParameterRangeUndefined"
|
|
127
|
+
}
|
|
128
|
+
]
|
|
87
129
|
}
|
|
88
130
|
},
|
|
131
|
+
{
|
|
132
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_postAccepted",
|
|
133
|
+
"range": {
|
|
134
|
+
"@type": "ParameterRangeUnion",
|
|
135
|
+
"parameterRangeElements": [
|
|
136
|
+
{
|
|
137
|
+
"@type": "ParameterRangeArray",
|
|
138
|
+
"parameterRangeValue": "xsd:string"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"@type": "ParameterRangeUndefined"
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_datasets",
|
|
148
|
+
"range": {
|
|
149
|
+
"@type": "ParameterRangeUnion",
|
|
150
|
+
"parameterRangeElements": [
|
|
151
|
+
{
|
|
152
|
+
"@type": "ParameterRangeArray",
|
|
153
|
+
"parameterRangeValue": "ct:components/IDataset.jsonld#IDataset"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"@type": "ParameterRangeUndefined"
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
],
|
|
162
|
+
"memberFields": [
|
|
89
163
|
{
|
|
90
164
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_referenceValue",
|
|
91
165
|
"memberFieldName": "referenceValue",
|
|
@@ -111,6 +185,34 @@
|
|
|
111
185
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_countTimeout",
|
|
112
186
|
"memberFieldName": "countTimeout"
|
|
113
187
|
},
|
|
188
|
+
{
|
|
189
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_cardinalityCountQueries",
|
|
190
|
+
"memberFieldName": "cardinalityCountQueries"
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_cardinalityEstimateConstruction",
|
|
194
|
+
"memberFieldName": "cardinalityEstimateConstruction"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_defaultGraph",
|
|
198
|
+
"memberFieldName": "defaultGraph"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_unionDefaultGraph",
|
|
202
|
+
"memberFieldName": "unionDefaultGraph"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_datasets",
|
|
206
|
+
"memberFieldName": "datasets"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_extensionFunctions",
|
|
210
|
+
"memberFieldName": "extensionFunctions",
|
|
211
|
+
"range": {
|
|
212
|
+
"@type": "ParameterRangeArray",
|
|
213
|
+
"parameterRangeValue": "xsd:string"
|
|
214
|
+
}
|
|
215
|
+
},
|
|
114
216
|
{
|
|
115
217
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_dataFactory",
|
|
116
218
|
"memberFieldName": "dataFactory"
|
|
@@ -163,6 +265,14 @@
|
|
|
163
265
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_attachMetadata",
|
|
164
266
|
"memberFieldName": "attachMetadata"
|
|
165
267
|
},
|
|
268
|
+
{
|
|
269
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_operationToNormalizedCountQuery",
|
|
270
|
+
"memberFieldName": "operationToNormalizedCountQuery"
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_estimateOperationCardinality",
|
|
274
|
+
"memberFieldName": "estimateOperationCardinality"
|
|
275
|
+
},
|
|
166
276
|
{
|
|
167
277
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql__member_addBindingsToOperation",
|
|
168
278
|
"memberFieldName": "addBindingsToOperation"
|
|
@@ -222,6 +332,30 @@
|
|
|
222
332
|
},
|
|
223
333
|
{
|
|
224
334
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_countTimeout"
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_cardinalityCountQueries"
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_cardinalityEstimateConstruction"
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_forceGetIfUrlLengthBelow"
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_defaultGraph"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_unionDefaultGraph"
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_datasets"
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_extensionFunctions"
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_postAccepted"
|
|
225
359
|
}
|
|
226
360
|
]
|
|
227
361
|
}
|
|
File without changes
|
|
@@ -23,12 +23,24 @@
|
|
|
23
23
|
"args_cacheSize": {
|
|
24
24
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cacheSize"
|
|
25
25
|
},
|
|
26
|
+
"args_forceSourceType": {
|
|
27
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_forceSourceType"
|
|
28
|
+
},
|
|
26
29
|
"args_bindMethod": {
|
|
27
30
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_bindMethod"
|
|
28
31
|
},
|
|
29
32
|
"args_countTimeout": {
|
|
30
33
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_countTimeout"
|
|
31
34
|
},
|
|
35
|
+
"args_cardinalityCountQueries": {
|
|
36
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cardinalityCountQueries"
|
|
37
|
+
},
|
|
38
|
+
"args_cardinalityEstimateConstruction": {
|
|
39
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cardinalityEstimateConstruction"
|
|
40
|
+
},
|
|
41
|
+
"args_forceGetIfUrlLengthBelow": {
|
|
42
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_forceGetIfUrlLengthBelow"
|
|
43
|
+
},
|
|
32
44
|
"args_name": {
|
|
33
45
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_name"
|
|
34
46
|
},
|
|
@@ -57,12 +69,24 @@
|
|
|
57
69
|
"cacheSize": {
|
|
58
70
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cacheSize"
|
|
59
71
|
},
|
|
72
|
+
"forceSourceType": {
|
|
73
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_forceSourceType"
|
|
74
|
+
},
|
|
60
75
|
"bindMethod": {
|
|
61
76
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_bindMethod"
|
|
62
77
|
},
|
|
63
78
|
"countTimeout": {
|
|
64
79
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_countTimeout"
|
|
65
80
|
},
|
|
81
|
+
"cardinalityCountQueries": {
|
|
82
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cardinalityCountQueries"
|
|
83
|
+
},
|
|
84
|
+
"cardinalityEstimateConstruction": {
|
|
85
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_cardinalityEstimateConstruction"
|
|
86
|
+
},
|
|
87
|
+
"forceGetIfUrlLengthBelow": {
|
|
88
|
+
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_forceGetIfUrlLengthBelow"
|
|
89
|
+
},
|
|
66
90
|
"name": {
|
|
67
91
|
"@id": "caqsihs:components/ActorQuerySourceIdentifyHypermediaSparql.jsonld#ActorQuerySourceIdentifyHypermediaSparql_args_name"
|
|
68
92
|
},
|
|
@@ -102,6 +126,15 @@
|
|
|
102
126
|
"countTimeout": {
|
|
103
127
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_countTimeout"
|
|
104
128
|
},
|
|
129
|
+
"cardinalityCountQueries": {
|
|
130
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_cardinalityCountQueries"
|
|
131
|
+
},
|
|
132
|
+
"cardinalityEstimateConstruction": {
|
|
133
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_cardinalityEstimateConstruction"
|
|
134
|
+
},
|
|
135
|
+
"forceGetIfUrlLengthBelow": {
|
|
136
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_forceGetIfUrlLengthBelow"
|
|
137
|
+
},
|
|
105
138
|
"bindingsFactory": {
|
|
106
139
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_bindingsFactory"
|
|
107
140
|
},
|
|
@@ -114,8 +147,26 @@
|
|
|
114
147
|
"bindMethod": {
|
|
115
148
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_bindMethod"
|
|
116
149
|
},
|
|
150
|
+
"defaultGraph": {
|
|
151
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_defaultGraph"
|
|
152
|
+
},
|
|
153
|
+
"unionDefaultGraph": {
|
|
154
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_unionDefaultGraph"
|
|
155
|
+
},
|
|
117
156
|
"dataFactory": {
|
|
118
157
|
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_dataFactory"
|
|
158
|
+
},
|
|
159
|
+
"extensionFunctions": {
|
|
160
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_extensionFunctions",
|
|
161
|
+
"@container": "@list"
|
|
162
|
+
},
|
|
163
|
+
"postAccepted": {
|
|
164
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_postAccepted",
|
|
165
|
+
"@container": "@list"
|
|
166
|
+
},
|
|
167
|
+
"datasets": {
|
|
168
|
+
"@id": "caqsihs:components/QuerySourceSparql.jsonld#QuerySourceSparql_datasets",
|
|
169
|
+
"@container": "@list"
|
|
119
170
|
}
|
|
120
171
|
}
|
|
121
172
|
}
|
|
@@ -12,8 +12,12 @@ export declare class ActorQuerySourceIdentifyHypermediaSparql extends ActorQuery
|
|
|
12
12
|
readonly checkUrlSuffix: boolean;
|
|
13
13
|
readonly forceHttpGet: boolean;
|
|
14
14
|
readonly cacheSize: number;
|
|
15
|
+
readonly forceSourceType: boolean;
|
|
15
16
|
readonly bindMethod: BindMethod;
|
|
16
17
|
readonly countTimeout: number;
|
|
18
|
+
readonly cardinalityCountQueries: boolean;
|
|
19
|
+
readonly cardinalityEstimateConstruction: boolean;
|
|
20
|
+
readonly forceGetIfUrlLengthBelow: number;
|
|
17
21
|
constructor(args: IActorQuerySourceIdentifyHypermediaSparqlArgs);
|
|
18
22
|
testMetadata(action: IActionQuerySourceIdentifyHypermedia): Promise<TestResult<IActorQuerySourceIdentifyHypermediaTest>>;
|
|
19
23
|
run(action: IActionQuerySourceIdentifyHypermedia): Promise<IActorQuerySourceIdentifyHypermediaOutput>;
|
|
@@ -43,6 +47,11 @@ export interface IActorQuerySourceIdentifyHypermediaSparqlArgs extends IActorQue
|
|
|
43
47
|
* @default {1024}
|
|
44
48
|
*/
|
|
45
49
|
cacheSize?: number;
|
|
50
|
+
/**
|
|
51
|
+
* If provided, forces the source type of a source.
|
|
52
|
+
* @default {false}
|
|
53
|
+
*/
|
|
54
|
+
forceSourceType?: boolean;
|
|
46
55
|
/**
|
|
47
56
|
* The query operation for communicating bindings.
|
|
48
57
|
* @default {values}
|
|
@@ -54,5 +63,23 @@ export interface IActorQuerySourceIdentifyHypermediaSparqlArgs extends IActorQue
|
|
|
54
63
|
* @default {3000}
|
|
55
64
|
*/
|
|
56
65
|
countTimeout: number;
|
|
66
|
+
/**
|
|
67
|
+
* If count queries should be sent to obtain the cardinality of (sub)queries.
|
|
68
|
+
* If set to false, resulting cardinalities will always be considered infinity.
|
|
69
|
+
* @default {true}
|
|
70
|
+
*/
|
|
71
|
+
cardinalityCountQueries: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* If estimates for queries should be constructed locally from sub-query cardinalities.
|
|
74
|
+
* If set to false, count queries will used for cardinality estimation at all levels.
|
|
75
|
+
* @default {false}
|
|
76
|
+
*/
|
|
77
|
+
cardinalityEstimateConstruction: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Force an HTTP GET instead of default POST (when forceHttpGet is false)
|
|
80
|
+
* when the url length (including encoded query) is below this number.
|
|
81
|
+
* @default {600}
|
|
82
|
+
*/
|
|
83
|
+
forceGetIfUrlLengthBelow?: number;
|
|
57
84
|
}
|
|
58
85
|
export type BindMethod = 'values' | 'union' | 'filter';
|
|
@@ -15,8 +15,8 @@ class ActorQuerySourceIdentifyHypermediaSparql extends bus_query_source_identify
|
|
|
15
15
|
super(args, 'sparql');
|
|
16
16
|
}
|
|
17
17
|
async testMetadata(action) {
|
|
18
|
-
if (!action.forceSourceType && !action.metadata.sparqlService &&
|
|
19
|
-
!(this.checkUrlSuffix && action.url.endsWith('/sparql'))) {
|
|
18
|
+
if (!action.forceSourceType && !this.forceSourceType && !action.metadata.sparqlService &&
|
|
19
|
+
!(this.checkUrlSuffix && (action.url.endsWith('/sparql') || action.url.endsWith('/sparql/')))) {
|
|
20
20
|
return (0, core_1.failTest)(`Actor ${this.name} could not detect a SPARQL service description or URL ending on /sparql.`);
|
|
21
21
|
}
|
|
22
22
|
return (0, core_1.passTest)({ filterFactor: 1 });
|
|
@@ -25,7 +25,10 @@ class ActorQuerySourceIdentifyHypermediaSparql extends bus_query_source_identify
|
|
|
25
25
|
this.logInfo(action.context, `Identified ${action.url} as sparql source with service URL: ${action.metadata.sparqlService || action.url}`);
|
|
26
26
|
const dataFactory = action.context.getSafe(context_entries_1.KeysInitQuery.dataFactory);
|
|
27
27
|
const algebraFactory = new sparqlalgebrajs_1.Factory(dataFactory);
|
|
28
|
-
const
|
|
28
|
+
const isSingularSource = action.context.get(context_entries_1.KeysQueryOperation.querySources)?.length === 1;
|
|
29
|
+
const source = new QuerySourceSparql_1.QuerySourceSparql((action.forceSourceType ?? this.forceSourceType) ? action.url : action.metadata.sparqlService || action.url, action.context, this.mediatorHttp, this.bindMethod, dataFactory, algebraFactory, await utils_bindings_factory_1.BindingsFactory.create(this.mediatorMergeBindingsContext, action.context, dataFactory), this.forceHttpGet, this.cacheSize, this.countTimeout,
|
|
30
|
+
// Cardinalities can be infinity when we're querying just a single source.
|
|
31
|
+
this.cardinalityCountQueries && !isSingularSource, this.cardinalityEstimateConstruction, this.forceGetIfUrlLengthBelow, action.metadata.defaultGraph, action.metadata.unionDefaultGraph, action.metadata.datasets, action.metadata.extensionFunctions, action.metadata.postAccepted);
|
|
29
32
|
return { source };
|
|
30
33
|
}
|
|
31
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActorQuerySourceIdentifyHypermediaSparql.js","sourceRoot":"","sources":["ActorQuerySourceIdentifyHypermediaSparql.ts"],"names":[],"mappings":";;;AAQA,yGAEwD;AACxD,+
|
|
1
|
+
{"version":3,"file":"ActorQuerySourceIdentifyHypermediaSparql.js","sourceRoot":"","sources":["ActorQuerySourceIdentifyHypermediaSparql.ts"],"names":[],"mappings":";;;AAQA,yGAEwD;AACxD,+DAA8E;AAE9E,yCAAoD;AAEpD,6EAAmE;AACnE,qDAA0C;AAC1C,2DAAwD;AAExD;;GAEG;AACH,MAAa,wCAAyC,SAAQ,yEAAkC;IAa9F,YAAmB,IAAmD;QACpE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,MAA4C;QAE5C,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa;YACpF,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAChG,OAAO,IAAA,eAAQ,EAAC,SAAS,IAAI,CAAC,IAAI,0EAA0E,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,IAAA,eAAQ,EAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,MAA4C;QAC3D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,MAAM,CAAC,GAAG,uCAAuC,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAE3I,MAAM,WAAW,GAAwB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,+BAAa,CAAC,WAAW,CAAC,CAAC;QAC3F,MAAM,cAAc,GAAG,IAAI,yBAAO,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oCAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,IAAI,qCAAiB,CAClC,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,EAC3G,MAAM,CAAC,OAAO,EACd,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,WAAW,EACX,cAAc,EACd,MAAM,wCAAe,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,EAC5F,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,YAAY;QACjB,0EAA0E;QAC1E,IAAI,CAAC,uBAAuB,IAAI,CAAC,gBAAgB,EACjD,IAAI,CAAC,+BAA+B,EACpC,IAAI,CAAC,wBAAwB,EAC7B,MAAM,CAAC,QAAQ,CAAC,YAAY,EAC5B,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EACjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EACxB,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAClC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAC7B,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF;AAxDD,4FAwDC","sourcesContent":["import type { MediatorHttp } from '@comunica/bus-http';\nimport type { MediatorMergeBindingsContext } from '@comunica/bus-merge-bindings-context';\nimport type {\n IActionQuerySourceIdentifyHypermedia,\n IActorQuerySourceIdentifyHypermediaOutput,\n IActorQuerySourceIdentifyHypermediaArgs,\n IActorQuerySourceIdentifyHypermediaTest,\n} from '@comunica/bus-query-source-identify-hypermedia';\nimport {\n ActorQuerySourceIdentifyHypermedia,\n} from '@comunica/bus-query-source-identify-hypermedia';\nimport { KeysInitQuery, KeysQueryOperation } from '@comunica/context-entries';\nimport type { TestResult } from '@comunica/core';\nimport { failTest, passTest } from '@comunica/core';\nimport type { ComunicaDataFactory } from '@comunica/types';\nimport { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { Factory } from 'sparqlalgebrajs';\nimport { QuerySourceSparql } from './QuerySourceSparql';\n\n/**\n * A comunica SPARQL Query Source Identify Hypermedia Actor.\n */\nexport class ActorQuerySourceIdentifyHypermediaSparql extends ActorQuerySourceIdentifyHypermedia {\n public readonly mediatorHttp: MediatorHttp;\n public readonly mediatorMergeBindingsContext: MediatorMergeBindingsContext;\n public readonly checkUrlSuffix: boolean;\n public readonly forceHttpGet: boolean;\n public readonly cacheSize: number;\n public readonly forceSourceType: boolean;\n public readonly bindMethod: BindMethod;\n public readonly countTimeout: number;\n public readonly cardinalityCountQueries: boolean;\n public readonly cardinalityEstimateConstruction: boolean;\n public readonly forceGetIfUrlLengthBelow: number;\n\n public constructor(args: IActorQuerySourceIdentifyHypermediaSparqlArgs) {\n super(args, 'sparql');\n }\n\n public async testMetadata(\n action: IActionQuerySourceIdentifyHypermedia,\n ): Promise<TestResult<IActorQuerySourceIdentifyHypermediaTest>> {\n if (!action.forceSourceType && !this.forceSourceType && !action.metadata.sparqlService &&\n !(this.checkUrlSuffix && (action.url.endsWith('/sparql') || action.url.endsWith('/sparql/')))) {\n return failTest(`Actor ${this.name} could not detect a SPARQL service description or URL ending on /sparql.`);\n }\n return passTest({ filterFactor: 1 });\n }\n\n public async run(action: IActionQuerySourceIdentifyHypermedia): Promise<IActorQuerySourceIdentifyHypermediaOutput> {\n this.logInfo(action.context, `Identified ${action.url} as sparql source with service URL: ${action.metadata.sparqlService || action.url}`);\n\n const dataFactory: ComunicaDataFactory = action.context.getSafe(KeysInitQuery.dataFactory);\n const algebraFactory = new Factory(dataFactory);\n const isSingularSource = action.context.get(KeysQueryOperation.querySources)?.length === 1;\n const source = new QuerySourceSparql(\n (action.forceSourceType ?? this.forceSourceType) ? action.url : action.metadata.sparqlService || action.url,\n action.context,\n this.mediatorHttp,\n this.bindMethod,\n dataFactory,\n algebraFactory,\n await BindingsFactory.create(this.mediatorMergeBindingsContext, action.context, dataFactory),\n this.forceHttpGet,\n this.cacheSize,\n this.countTimeout,\n // Cardinalities can be infinity when we're querying just a single source.\n this.cardinalityCountQueries && !isSingularSource,\n this.cardinalityEstimateConstruction,\n this.forceGetIfUrlLengthBelow,\n action.metadata.defaultGraph,\n action.metadata.unionDefaultGraph,\n action.metadata.datasets,\n action.metadata.extensionFunctions,\n action.metadata.postAccepted,\n );\n return { source };\n }\n}\n\nexport interface IActorQuerySourceIdentifyHypermediaSparqlArgs extends IActorQuerySourceIdentifyHypermediaArgs {\n /**\n * The HTTP mediator\n */\n mediatorHttp: MediatorHttp;\n /**\n * A mediator for creating binding context merge handlers\n */\n mediatorMergeBindingsContext: MediatorMergeBindingsContext;\n /**\n * If URLs ending with '/sparql' should also be considered SPARQL endpoints.\n * @default {true}\n */\n checkUrlSuffix: boolean;\n /**\n * If non-update queries should be sent via HTTP GET instead of POST\n * @default {false}\n */\n forceHttpGet: boolean;\n /**\n * The cache size for COUNT queries.\n * @range {integer}\n * @default {1024}\n */\n cacheSize?: number;\n /**\n * If provided, forces the source type of a source.\n * @default {false}\n */\n forceSourceType?: boolean;\n /**\n * The query operation for communicating bindings.\n * @default {values}\n */\n bindMethod: BindMethod;\n /**\n * Timeout in ms of how long count queries are allowed to take.\n * If the timeout is reached, an infinity cardinality is returned.\n * @default {3000}\n */\n countTimeout: number;\n /**\n * If count queries should be sent to obtain the cardinality of (sub)queries.\n * If set to false, resulting cardinalities will always be considered infinity.\n * @default {true}\n */\n cardinalityCountQueries: boolean;\n /**\n * If estimates for queries should be constructed locally from sub-query cardinalities.\n * If set to false, count queries will used for cardinality estimation at all levels.\n * @default {false}\n */\n cardinalityEstimateConstruction: boolean;\n /**\n * Force an HTTP GET instead of default POST (when forceHttpGet is false)\n * when the url length (including encoded query) is below this number.\n * @default {600}\n */\n forceGetIfUrlLengthBelow?: number;\n}\n\nexport type BindMethod = 'values' | 'union' | 'filter';\n"]}
|
|
@@ -1,31 +1,50 @@
|
|
|
1
1
|
import type { MediatorHttp } from '@comunica/bus-http';
|
|
2
|
-
import type { BindingsStream, ComunicaDataFactory, FragmentSelectorShape, IActionContext, IQueryBindingsOptions, IQuerySource, MetadataBindings } from '@comunica/types';
|
|
2
|
+
import type { BindingsStream, ComunicaDataFactory, FragmentSelectorShape, IActionContext, IDataset, IQueryBindingsOptions, IQuerySource, MetadataBindings, QueryResultCardinality } from '@comunica/types';
|
|
3
3
|
import type { BindingsFactory } from '@comunica/utils-bindings-factory';
|
|
4
4
|
import type * as RDF from '@rdfjs/types';
|
|
5
5
|
import type { AsyncIterator } from 'asynciterator';
|
|
6
|
-
import type { Factory
|
|
6
|
+
import type { Factory } from 'sparqlalgebrajs';
|
|
7
|
+
import { Algebra } from 'sparqlalgebrajs';
|
|
7
8
|
import type { BindMethod } from './ActorQuerySourceIdentifyHypermediaSparql';
|
|
8
9
|
export declare class QuerySourceSparql implements IQuerySource {
|
|
9
|
-
protected static readonly SELECTOR_SHAPE: FragmentSelectorShape;
|
|
10
10
|
readonly referenceValue: string;
|
|
11
11
|
private readonly url;
|
|
12
12
|
private readonly context;
|
|
13
13
|
private readonly mediatorHttp;
|
|
14
14
|
private readonly bindMethod;
|
|
15
15
|
private readonly countTimeout;
|
|
16
|
+
private readonly cardinalityCountQueries;
|
|
17
|
+
private readonly cardinalityEstimateConstruction;
|
|
18
|
+
private readonly defaultGraph?;
|
|
19
|
+
private readonly unionDefaultGraph;
|
|
20
|
+
private readonly datasets?;
|
|
21
|
+
readonly extensionFunctions?: string[];
|
|
16
22
|
private readonly dataFactory;
|
|
17
23
|
private readonly algebraFactory;
|
|
18
24
|
private readonly bindingsFactory;
|
|
19
25
|
private readonly endpointFetcher;
|
|
20
26
|
private readonly cache;
|
|
21
27
|
private lastSourceContext;
|
|
22
|
-
constructor(url: string, context: IActionContext, mediatorHttp: MediatorHttp, bindMethod: BindMethod, dataFactory: ComunicaDataFactory, algebraFactory: Factory, bindingsFactory: BindingsFactory, forceHttpGet: boolean, cacheSize: number, countTimeout: number);
|
|
28
|
+
constructor(url: string, context: IActionContext, mediatorHttp: MediatorHttp, bindMethod: BindMethod, dataFactory: ComunicaDataFactory, algebraFactory: Factory, bindingsFactory: BindingsFactory, forceHttpGet: boolean, cacheSize: number, countTimeout: number, cardinalityCountQueries: boolean, cardinalityEstimateConstruction: boolean, forceGetIfUrlLengthBelow: number, defaultGraph?: string, unionDefaultGraph?: boolean, datasets?: IDataset[], extensionFunctions?: string[], postAccepted?: string[]);
|
|
23
29
|
getSelectorShape(): Promise<FragmentSelectorShape>;
|
|
24
30
|
queryBindings(operationIn: Algebra.Operation, context: IActionContext, options?: IQueryBindingsOptions): BindingsStream;
|
|
25
31
|
queryQuads(operation: Algebra.Operation, context: IActionContext): AsyncIterator<RDF.Quad>;
|
|
26
32
|
queryBoolean(operation: Algebra.Ask, context: IActionContext): Promise<boolean>;
|
|
27
33
|
queryVoid(operation: Algebra.Update, context: IActionContext): Promise<void>;
|
|
28
34
|
protected attachMetadata(target: AsyncIterator<any>, context: IActionContext, operationPromise: Promise<Algebra.Operation>): void;
|
|
35
|
+
/**
|
|
36
|
+
* Convert an algebra operation into a query string, and if the operation is a simple triple pattern,
|
|
37
|
+
* then also replace any variables with s, p, and o to increase the chance of cache hits.
|
|
38
|
+
* @param {Algebra.Operation} operation The operation to convert into a query string.
|
|
39
|
+
* @returns {string} Query string for a COUNT query over the operation.
|
|
40
|
+
*/
|
|
41
|
+
operationToNormalizedCountQuery(operation: Algebra.Operation): string;
|
|
42
|
+
/**
|
|
43
|
+
* Performs local cardinality estimation for the specified SPARQL algebra operation, which should
|
|
44
|
+
* result in better estimation performance at the expense of accuracy.
|
|
45
|
+
* @param {Algebra.Operation} operation A query operation.
|
|
46
|
+
*/
|
|
47
|
+
estimateOperationCardinality(operation: Algebra.Operation): Promise<QueryResultCardinality>;
|
|
29
48
|
/**
|
|
30
49
|
* Create an operation that includes the bindings from the given bindings stream.
|
|
31
50
|
* @param algebraFactory The algebra factory.
|
package/lib/QuerySourceSparql.js
CHANGED
|
@@ -4,14 +4,14 @@ exports.QuerySourceSparql = void 0;
|
|
|
4
4
|
const context_entries_1 = require("@comunica/context-entries");
|
|
5
5
|
const core_1 = require("@comunica/core");
|
|
6
6
|
const utils_metadata_1 = require("@comunica/utils-metadata");
|
|
7
|
+
const utils_query_operation_1 = require("@comunica/utils-query-operation");
|
|
7
8
|
const asynciterator_1 = require("asynciterator");
|
|
8
9
|
const fetch_sparql_endpoint_1 = require("fetch-sparql-endpoint");
|
|
9
10
|
const lru_cache_1 = require("lru-cache");
|
|
10
11
|
const rdf_terms_1 = require("rdf-terms");
|
|
11
12
|
const sparqlalgebrajs_1 = require("sparqlalgebrajs");
|
|
12
|
-
const COUNT_INFINITY = { type: 'estimate', value: Number.POSITIVE_INFINITY };
|
|
13
13
|
class QuerySourceSparql {
|
|
14
|
-
constructor(url, context, mediatorHttp, bindMethod, dataFactory, algebraFactory, bindingsFactory, forceHttpGet, cacheSize, countTimeout) {
|
|
14
|
+
constructor(url, context, mediatorHttp, bindMethod, dataFactory, algebraFactory, bindingsFactory, forceHttpGet, cacheSize, countTimeout, cardinalityCountQueries, cardinalityEstimateConstruction, forceGetIfUrlLengthBelow, defaultGraph, unionDefaultGraph, datasets, extensionFunctions, postAccepted) {
|
|
15
15
|
this.referenceValue = url;
|
|
16
16
|
this.url = url;
|
|
17
17
|
this.context = context;
|
|
@@ -25,14 +25,62 @@ class QuerySourceSparql {
|
|
|
25
25
|
fetch: (input, init) => this.mediatorHttp.mediate({ input, init, context: this.lastSourceContext }),
|
|
26
26
|
prefixVariableQuestionMark: true,
|
|
27
27
|
dataFactory,
|
|
28
|
+
forceGetIfUrlLengthBelow,
|
|
29
|
+
directPost: postAccepted && !postAccepted.includes('application/x-www-form-urlencoded'),
|
|
28
30
|
});
|
|
29
31
|
this.cache = cacheSize > 0 ?
|
|
30
32
|
new lru_cache_1.LRUCache({ max: cacheSize }) :
|
|
31
33
|
undefined;
|
|
32
34
|
this.countTimeout = countTimeout;
|
|
35
|
+
this.cardinalityCountQueries = cardinalityCountQueries;
|
|
36
|
+
this.cardinalityEstimateConstruction = cardinalityEstimateConstruction;
|
|
37
|
+
this.defaultGraph = defaultGraph;
|
|
38
|
+
this.unionDefaultGraph = unionDefaultGraph ?? false;
|
|
39
|
+
this.datasets = datasets;
|
|
40
|
+
this.extensionFunctions = extensionFunctions;
|
|
33
41
|
}
|
|
34
42
|
async getSelectorShape() {
|
|
35
|
-
|
|
43
|
+
const innerDisjunction = {
|
|
44
|
+
type: 'disjunction',
|
|
45
|
+
children: [
|
|
46
|
+
{
|
|
47
|
+
type: 'operation',
|
|
48
|
+
operation: { operationType: 'wildcard' },
|
|
49
|
+
joinBindings: true,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
if (this.extensionFunctions) {
|
|
54
|
+
innerDisjunction.children.push({
|
|
55
|
+
type: 'operation',
|
|
56
|
+
operation: {
|
|
57
|
+
operationType: 'type',
|
|
58
|
+
type: sparqlalgebrajs_1.Algebra.types.EXPRESSION,
|
|
59
|
+
extensionFunctions: this.extensionFunctions,
|
|
60
|
+
},
|
|
61
|
+
joinBindings: true,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
type: 'conjunction',
|
|
66
|
+
children: [
|
|
67
|
+
innerDisjunction,
|
|
68
|
+
{
|
|
69
|
+
// DISTINCT CONSTRUCT is not allowed in SPARQL 1.1, so we explicitly disallowed it.
|
|
70
|
+
type: 'negation',
|
|
71
|
+
child: {
|
|
72
|
+
type: 'operation',
|
|
73
|
+
operation: { operationType: 'type', type: sparqlalgebrajs_1.Algebra.types.DISTINCT },
|
|
74
|
+
children: [
|
|
75
|
+
{
|
|
76
|
+
type: 'operation',
|
|
77
|
+
operation: { operationType: 'type', type: sparqlalgebrajs_1.Algebra.types.CONSTRUCT },
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
};
|
|
36
84
|
}
|
|
37
85
|
queryBindings(operationIn, context, options) {
|
|
38
86
|
// If bindings are passed, modify the operations
|
|
@@ -48,7 +96,8 @@ class QuerySourceSparql {
|
|
|
48
96
|
const operation = await operationPromise;
|
|
49
97
|
const variables = sparqlalgebrajs_1.Util.inScopeVariables(operation);
|
|
50
98
|
const queryString = context.get(context_entries_1.KeysInitQuery.queryString);
|
|
51
|
-
const
|
|
99
|
+
const queryFormat = context.getSafe(context_entries_1.KeysInitQuery.queryFormat);
|
|
100
|
+
const selectQuery = !options?.joinBindings && queryString && queryFormat.language === 'sparql' ?
|
|
52
101
|
queryString :
|
|
53
102
|
QuerySourceSparql.operationToSelectQuery(this.algebraFactory, operation, variables);
|
|
54
103
|
const undefVariables = QuerySourceSparql.getOperationUndefs(operation);
|
|
@@ -59,7 +108,8 @@ class QuerySourceSparql {
|
|
|
59
108
|
}
|
|
60
109
|
queryQuads(operation, context) {
|
|
61
110
|
this.lastSourceContext = this.context.merge(context);
|
|
62
|
-
const
|
|
111
|
+
const query = context.get(context_entries_1.KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation);
|
|
112
|
+
const rawStream = this.endpointFetcher.fetchTriples(this.url, query);
|
|
63
113
|
this.lastSourceContext = undefined;
|
|
64
114
|
const quads = (0, asynciterator_1.wrap)(rawStream, { autoStart: false, maxBufferSize: Number.POSITIVE_INFINITY });
|
|
65
115
|
this.attachMetadata(quads, context, Promise.resolve(operation.input));
|
|
@@ -67,13 +117,15 @@ class QuerySourceSparql {
|
|
|
67
117
|
}
|
|
68
118
|
queryBoolean(operation, context) {
|
|
69
119
|
this.lastSourceContext = this.context.merge(context);
|
|
70
|
-
const
|
|
120
|
+
const query = context.get(context_entries_1.KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation);
|
|
121
|
+
const promise = this.endpointFetcher.fetchAsk(this.url, query);
|
|
71
122
|
this.lastSourceContext = undefined;
|
|
72
123
|
return promise;
|
|
73
124
|
}
|
|
74
125
|
queryVoid(operation, context) {
|
|
75
126
|
this.lastSourceContext = this.context.merge(context);
|
|
76
|
-
const
|
|
127
|
+
const query = context.get(context_entries_1.KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation);
|
|
128
|
+
const promise = this.endpointFetcher.fetchUpdate(this.url, query);
|
|
77
129
|
this.lastSourceContext = undefined;
|
|
78
130
|
return promise;
|
|
79
131
|
}
|
|
@@ -82,29 +134,48 @@ class QuerySourceSparql {
|
|
|
82
134
|
let variablesCount = [];
|
|
83
135
|
// eslint-disable-next-line no-async-promise-executor,ts/no-misused-promises
|
|
84
136
|
new Promise(async (resolve, reject) => {
|
|
85
|
-
// Prepare queries
|
|
86
|
-
let countQuery;
|
|
87
137
|
try {
|
|
88
138
|
const operation = await operationPromise;
|
|
89
139
|
const variablesScoped = sparqlalgebrajs_1.Util.inScopeVariables(operation);
|
|
90
|
-
countQuery =
|
|
140
|
+
const countQuery = this.operationToNormalizedCountQuery(operation);
|
|
91
141
|
const undefVariables = QuerySourceSparql.getOperationUndefs(operation);
|
|
92
142
|
variablesCount = variablesScoped.map(variable => ({
|
|
93
143
|
variable,
|
|
94
144
|
canBeUndef: undefVariables.some(undefVariable => undefVariable.equals(variable)),
|
|
95
145
|
}));
|
|
96
146
|
const cachedCardinality = this.cache?.get(countQuery);
|
|
97
|
-
if (cachedCardinality
|
|
147
|
+
if (cachedCardinality) {
|
|
98
148
|
return resolve(cachedCardinality);
|
|
99
149
|
}
|
|
100
|
-
|
|
150
|
+
// Attempt to estimate locally prior to sending a COUNT request, as this should be much faster.
|
|
151
|
+
// The estimates may be off by varying amounts, so this is set behind a configuration flag.
|
|
152
|
+
if (this.cardinalityEstimateConstruction) {
|
|
153
|
+
const localEstimate = await this.estimateOperationCardinality(operation);
|
|
154
|
+
if (Number.isFinite(localEstimate.value)) {
|
|
155
|
+
this.cache?.set(countQuery, localEstimate);
|
|
156
|
+
return resolve(localEstimate);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Don't send count queries if disabled.
|
|
160
|
+
if (!this.cardinalityCountQueries) {
|
|
161
|
+
return resolve({ type: 'estimate', value: Number.POSITIVE_INFINITY, dataset: this.url });
|
|
162
|
+
}
|
|
163
|
+
const timeoutHandler = setTimeout(() => resolve({
|
|
164
|
+
type: 'estimate',
|
|
165
|
+
value: Number.POSITIVE_INFINITY,
|
|
166
|
+
dataset: this.url,
|
|
167
|
+
}), this.countTimeout);
|
|
101
168
|
const varCount = this.dataFactory.variable('count');
|
|
102
169
|
const bindingsStream = await this
|
|
103
170
|
.queryBindingsRemote(this.url, countQuery, [varCount], context, []);
|
|
104
171
|
bindingsStream.on('data', (bindings) => {
|
|
105
172
|
clearTimeout(timeoutHandler);
|
|
106
173
|
const count = bindings.get(varCount);
|
|
107
|
-
const cardinality = {
|
|
174
|
+
const cardinality = {
|
|
175
|
+
type: 'estimate',
|
|
176
|
+
value: Number.POSITIVE_INFINITY,
|
|
177
|
+
dataset: this.url,
|
|
178
|
+
};
|
|
108
179
|
if (count) {
|
|
109
180
|
const cardinalityValue = Number.parseInt(count.value, 10);
|
|
110
181
|
if (!Number.isNaN(cardinalityValue)) {
|
|
@@ -117,11 +188,11 @@ class QuerySourceSparql {
|
|
|
117
188
|
});
|
|
118
189
|
bindingsStream.on('error', () => {
|
|
119
190
|
clearTimeout(timeoutHandler);
|
|
120
|
-
resolve(
|
|
191
|
+
resolve({ type: 'estimate', value: Number.POSITIVE_INFINITY, dataset: this.url });
|
|
121
192
|
});
|
|
122
193
|
bindingsStream.on('end', () => {
|
|
123
194
|
clearTimeout(timeoutHandler);
|
|
124
|
-
resolve(
|
|
195
|
+
resolve({ type: 'estimate', value: Number.POSITIVE_INFINITY, dataset: this.url });
|
|
125
196
|
});
|
|
126
197
|
}
|
|
127
198
|
catch (error) {
|
|
@@ -137,10 +208,53 @@ class QuerySourceSparql {
|
|
|
137
208
|
})
|
|
138
209
|
.catch(() => target.setProperty('metadata', {
|
|
139
210
|
state: new utils_metadata_1.MetadataValidationState(),
|
|
140
|
-
cardinality:
|
|
211
|
+
cardinality: { type: 'estimate', value: Number.POSITIVE_INFINITY, dataset: this.url },
|
|
141
212
|
variables: variablesCount,
|
|
142
213
|
}));
|
|
143
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Convert an algebra operation into a query string, and if the operation is a simple triple pattern,
|
|
217
|
+
* then also replace any variables with s, p, and o to increase the chance of cache hits.
|
|
218
|
+
* @param {Algebra.Operation} operation The operation to convert into a query string.
|
|
219
|
+
* @returns {string} Query string for a COUNT query over the operation.
|
|
220
|
+
*/
|
|
221
|
+
operationToNormalizedCountQuery(operation) {
|
|
222
|
+
const normalizedOperation = operation.type === sparqlalgebrajs_1.Algebra.types.PATTERN ?
|
|
223
|
+
this.algebraFactory.createPattern(operation.subject.termType === 'Variable' ? this.dataFactory.variable('s') : operation.subject, operation.predicate.termType === 'Variable' ? this.dataFactory.variable('p') : operation.predicate, operation.object.termType === 'Variable' ? this.dataFactory.variable('o') : operation.object) :
|
|
224
|
+
operation;
|
|
225
|
+
const operationString = QuerySourceSparql.operationToCountQuery(this.dataFactory, this.algebraFactory, normalizedOperation);
|
|
226
|
+
return operationString;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Performs local cardinality estimation for the specified SPARQL algebra operation, which should
|
|
230
|
+
* result in better estimation performance at the expense of accuracy.
|
|
231
|
+
* @param {Algebra.Operation} operation A query operation.
|
|
232
|
+
*/
|
|
233
|
+
async estimateOperationCardinality(operation) {
|
|
234
|
+
const dataset = {
|
|
235
|
+
getCardinality: (operation) => {
|
|
236
|
+
const queryString = this.operationToNormalizedCountQuery(operation);
|
|
237
|
+
const cachedCardinality = this.cache?.get(queryString);
|
|
238
|
+
if (cachedCardinality) {
|
|
239
|
+
return cachedCardinality;
|
|
240
|
+
}
|
|
241
|
+
if (this.datasets) {
|
|
242
|
+
const cardinalities = this.datasets
|
|
243
|
+
.filter(ds => this.unionDefaultGraph || (this.defaultGraph && ds.uri.endsWith(this.defaultGraph)))
|
|
244
|
+
.map(ds => (0, utils_query_operation_1.estimateCardinality)(operation, ds));
|
|
245
|
+
const cardinality = {
|
|
246
|
+
type: cardinalities.some(card => card.type === 'estimate') ? 'estimate' : 'exact',
|
|
247
|
+
value: cardinalities.length > 0 ? cardinalities.reduce((acc, card) => acc + card.value, 0) : 0,
|
|
248
|
+
dataset: this.url,
|
|
249
|
+
};
|
|
250
|
+
return cardinality;
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
source: this.url,
|
|
254
|
+
uri: this.url,
|
|
255
|
+
};
|
|
256
|
+
return (0, utils_query_operation_1.estimateCardinality)(operation, dataset);
|
|
257
|
+
}
|
|
144
258
|
/**
|
|
145
259
|
* Create an operation that includes the bindings from the given bindings stream.
|
|
146
260
|
* @param algebraFactory The algebra factory.
|
|
@@ -267,14 +381,4 @@ class QuerySourceSparql {
|
|
|
267
381
|
}
|
|
268
382
|
}
|
|
269
383
|
exports.QuerySourceSparql = QuerySourceSparql;
|
|
270
|
-
QuerySourceSparql.SELECTOR_SHAPE = {
|
|
271
|
-
type: 'disjunction',
|
|
272
|
-
children: [
|
|
273
|
-
{
|
|
274
|
-
type: 'operation',
|
|
275
|
-
operation: { operationType: 'wildcard' },
|
|
276
|
-
joinBindings: true,
|
|
277
|
-
},
|
|
278
|
-
],
|
|
279
|
-
};
|
|
280
384
|
//# sourceMappingURL=QuerySourceSparql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuerySourceSparql.js","sourceRoot":"","sources":["QuerySourceSparql.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediatorHttp } from '@comunica/bus-http';\nimport { KeysInitQuery } from '@comunica/context-entries';\nimport { Actor } from '@comunica/core';\nimport type {\n Bindings,\n BindingsStream,\n ComunicaDataFactory,\n FragmentSelectorShape,\n IActionContext,\n IQueryBindingsOptions,\n IQuerySource,\n MetadataBindings,\n MetadataVariable,\n} from '@comunica/types';\nimport type { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { MetadataValidationState } from '@comunica/utils-metadata';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { TransformIterator, wrap } from 'asynciterator';\nimport { SparqlEndpointFetcher } from 'fetch-sparql-endpoint';\nimport { LRUCache } from 'lru-cache';\nimport { uniqTerms } from 'rdf-terms';\nimport type { Factory, Algebra } from 'sparqlalgebrajs';\nimport { toSparql, Util } from 'sparqlalgebrajs';\nimport type { BindMethod } from './ActorQuerySourceIdentifyHypermediaSparql';\n\nconst COUNT_INFINITY: RDF.QueryResultCardinality = { type: 'estimate', value: Number.POSITIVE_INFINITY };\n\nexport class QuerySourceSparql implements IQuerySource {\n protected static readonly SELECTOR_SHAPE: FragmentSelectorShape = {\n type: 'disjunction',\n children: [\n {\n type: 'operation',\n operation: { operationType: 'wildcard' },\n joinBindings: true,\n },\n ],\n };\n\n public readonly referenceValue: string;\n private readonly url: string;\n private readonly context: IActionContext;\n private readonly mediatorHttp: MediatorHttp;\n private readonly bindMethod: BindMethod;\n private readonly countTimeout: number;\n private readonly dataFactory: ComunicaDataFactory;\n private readonly algebraFactory: Factory;\n private readonly bindingsFactory: BindingsFactory;\n\n private readonly endpointFetcher: SparqlEndpointFetcher;\n private readonly cache: LRUCache<string, RDF.QueryResultCardinality> | undefined;\n\n private lastSourceContext: IActionContext | undefined;\n\n public constructor(\n url: string,\n context: IActionContext,\n mediatorHttp: MediatorHttp,\n bindMethod: BindMethod,\n dataFactory: ComunicaDataFactory,\n algebraFactory: Factory,\n bindingsFactory: BindingsFactory,\n forceHttpGet: boolean,\n cacheSize: number,\n countTimeout: number,\n ) {\n this.referenceValue = url;\n this.url = url;\n this.context = context;\n this.mediatorHttp = mediatorHttp;\n this.bindMethod = bindMethod;\n this.dataFactory = dataFactory;\n this.algebraFactory = algebraFactory;\n this.bindingsFactory = bindingsFactory;\n this.endpointFetcher = new SparqlEndpointFetcher({\n method: forceHttpGet ? 'GET' : 'POST',\n fetch: (input: Request | string, init?: RequestInit) => this.mediatorHttp.mediate(\n { input, init, context: this.lastSourceContext! },\n ),\n prefixVariableQuestionMark: true,\n dataFactory,\n });\n this.cache = cacheSize > 0 ?\n new LRUCache<string, RDF.QueryResultCardinality>({ max: cacheSize }) :\n undefined;\n this.countTimeout = countTimeout;\n }\n\n public async getSelectorShape(): Promise<FragmentSelectorShape> {\n return QuerySourceSparql.SELECTOR_SHAPE;\n }\n\n public queryBindings(\n operationIn: Algebra.Operation,\n context: IActionContext,\n options?: IQueryBindingsOptions,\n ): BindingsStream {\n // If bindings are passed, modify the operations\n let operationPromise: Promise<Algebra.Operation>;\n if (options?.joinBindings) {\n operationPromise = QuerySourceSparql.addBindingsToOperation(\n this.algebraFactory,\n this.bindMethod,\n operationIn,\n options.joinBindings,\n );\n } else {\n operationPromise = Promise.resolve(operationIn);\n }\n\n const bindings: BindingsStream = new TransformIterator(async() => {\n // Prepare queries\n const operation = await operationPromise;\n const variables: RDF.Variable[] = Util.inScopeVariables(operation);\n const queryString = context.get<string>(KeysInitQuery.queryString);\n const selectQuery: string = !options?.joinBindings && queryString ?\n queryString :\n QuerySourceSparql.operationToSelectQuery(this.algebraFactory, operation, variables);\n const undefVariables = QuerySourceSparql.getOperationUndefs(operation);\n\n return this.queryBindingsRemote(this.url, selectQuery, variables, context, undefVariables);\n }, { autoStart: false });\n this.attachMetadata(bindings, context, operationPromise);\n\n return bindings;\n }\n\n public queryQuads(operation: Algebra.Operation, context: IActionContext): AsyncIterator<RDF.Quad> {\n this.lastSourceContext = this.context.merge(context);\n const rawStream = this.endpointFetcher.fetchTriples(\n this.url,\n context.get(KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation),\n );\n this.lastSourceContext = undefined;\n const quads = wrap<any>(rawStream, { autoStart: false, maxBufferSize: Number.POSITIVE_INFINITY });\n this.attachMetadata(quads, context, Promise.resolve(operation.input));\n return quads;\n }\n\n public queryBoolean(operation: Algebra.Ask, context: IActionContext): Promise<boolean> {\n this.lastSourceContext = this.context.merge(context);\n const promise = this.endpointFetcher.fetchAsk(\n this.url,\n context.get(KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation),\n );\n this.lastSourceContext = undefined;\n return promise;\n }\n\n public queryVoid(operation: Algebra.Update, context: IActionContext): Promise<void> {\n this.lastSourceContext = this.context.merge(context);\n const promise = this.endpointFetcher.fetchUpdate(\n this.url,\n context.get(KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation),\n );\n this.lastSourceContext = undefined;\n return promise;\n }\n\n protected attachMetadata(\n target: AsyncIterator<any>,\n context: IActionContext,\n operationPromise: Promise<Algebra.Operation>,\n ): void {\n // Emit metadata containing the estimated count\n let variablesCount: MetadataVariable[] = [];\n // eslint-disable-next-line no-async-promise-executor,ts/no-misused-promises\n new Promise<RDF.QueryResultCardinality>(async(resolve, reject) => {\n // Prepare queries\n let countQuery: string;\n try {\n const operation = await operationPromise;\n const variablesScoped = Util.inScopeVariables(operation);\n countQuery = QuerySourceSparql.operationToCountQuery(this.dataFactory, this.algebraFactory, operation);\n const undefVariables = QuerySourceSparql.getOperationUndefs(operation);\n variablesCount = variablesScoped.map(variable => ({\n variable,\n canBeUndef: undefVariables.some(undefVariable => undefVariable.equals(variable)),\n }));\n\n const cachedCardinality = this.cache?.get(countQuery);\n if (cachedCardinality !== undefined) {\n return resolve(cachedCardinality);\n }\n\n const timeoutHandler = setTimeout(() => resolve(COUNT_INFINITY), this.countTimeout);\n const varCount = this.dataFactory.variable('count');\n const bindingsStream: BindingsStream = await this\n .queryBindingsRemote(this.url, countQuery, [ varCount ], context, []);\n bindingsStream.on('data', (bindings: Bindings) => {\n clearTimeout(timeoutHandler);\n const count = bindings.get(varCount);\n const cardinality: RDF.QueryResultCardinality = { type: 'estimate', value: Number.POSITIVE_INFINITY };\n if (count) {\n const cardinalityValue: number = Number.parseInt(count.value, 10);\n if (!Number.isNaN(cardinalityValue)) {\n cardinality.type = 'exact';\n cardinality.value = cardinalityValue;\n this.cache?.set(countQuery, cardinality);\n }\n }\n return resolve(cardinality);\n });\n bindingsStream.on('error', () => {\n clearTimeout(timeoutHandler);\n resolve(COUNT_INFINITY);\n });\n bindingsStream.on('end', () => {\n clearTimeout(timeoutHandler);\n resolve(COUNT_INFINITY);\n });\n } catch (error: unknown) {\n return reject(error);\n }\n })\n .then((cardinality) => {\n target.setProperty('metadata', {\n state: new MetadataValidationState(),\n cardinality,\n variables: variablesCount,\n });\n })\n .catch(() => target.setProperty('metadata', {\n state: new MetadataValidationState(),\n cardinality: COUNT_INFINITY,\n variables: variablesCount,\n }));\n }\n\n /**\n * Create an operation that includes the bindings from the given bindings stream.\n * @param algebraFactory The algebra factory.\n * @param bindMethod A method for adding bindings to an operation.\n * @param operation The operation to bind to.\n * @param addBindings The bindings to add.\n * @param addBindings.bindings The bindings stream.\n * @param addBindings.metadata The bindings metadata.\n */\n public static async addBindingsToOperation(\n algebraFactory: Factory,\n bindMethod: BindMethod,\n operation: Algebra.Operation,\n addBindings: { bindings: BindingsStream; metadata: MetadataBindings },\n ): Promise<Algebra.Operation> {\n const bindings = await addBindings.bindings.toArray();\n\n switch (bindMethod) {\n case 'values':\n return algebraFactory.createJoin([\n algebraFactory.createValues(\n addBindings.metadata.variables.map(v => v.variable),\n bindings.map(binding => Object.fromEntries([ ...binding ]\n .map(([ key, value ]) => [ `?${key.value}`, <RDF.Literal | RDF.NamedNode> value ]))),\n ),\n operation,\n ], false);\n case 'union': { throw new Error('Not implemented yet: \"union\" case'); }\n case 'filter': { throw new Error('Not implemented yet: \"filter\" case'); }\n }\n }\n\n /**\n * Convert an operation to a select query for this pattern.\n * @param algebraFactory The algebra factory.\n * @param {Algebra.Operation} operation A query operation.\n * @param {RDF.Variable[]} variables The variables in scope for the operation.\n * @return {string} A select query string.\n */\n public static operationToSelectQuery(\n algebraFactory: Factory,\n operation: Algebra.Operation,\n variables: RDF.Variable[],\n ): string {\n return QuerySourceSparql.operationToQuery(algebraFactory.createProject(operation, variables));\n }\n\n /**\n * Convert an operation to a count query for the number of matching triples for this pattern.\n * @param dataFactory The data factory.\n * @param algebraFactory The algebra factory.\n * @param {Algebra.Operation} operation A query operation.\n * @return {string} A count query string.\n */\n public static operationToCountQuery(\n dataFactory: ComunicaDataFactory,\n algebraFactory: Factory,\n operation: Algebra.Operation,\n ): string {\n return QuerySourceSparql.operationToQuery(algebraFactory.createProject(\n algebraFactory.createExtend(\n algebraFactory.createGroup(\n operation,\n [],\n [ algebraFactory.createBoundAggregate(\n dataFactory.variable('var0'),\n 'count',\n algebraFactory.createWildcardExpression(),\n false,\n ) ],\n ),\n dataFactory.variable('count'),\n algebraFactory.createTermExpression(dataFactory.variable('var0')),\n ),\n [ dataFactory.variable('count') ],\n ));\n }\n\n /**\n * Convert an operation to a query for this pattern.\n * @param {Algebra.Operation} operation A query operation.\n * @return {string} A query string.\n */\n public static operationToQuery(operation: Algebra.Operation): string {\n return toSparql(operation, { sparqlStar: true });\n }\n\n /**\n * Check if the given operation may produce undefined values.\n * @param operation\n */\n public static getOperationUndefs(operation: Algebra.Operation): RDF.Variable[] {\n const variables: RDF.Variable[] = [];\n Util.recurseOperation(operation, {\n leftjoin(subOperation): boolean {\n const left = Util.inScopeVariables(subOperation.input[0]);\n const right = Util.inScopeVariables(subOperation.input[1]);\n for (const varRight of right) {\n if (!left.some(varLeft => varLeft.equals(varRight))) {\n variables.push(varRight);\n }\n }\n return false;\n },\n values(values: Algebra.Values): boolean {\n for (const variable of values.variables) {\n if (values.bindings.some(bindings => !(`?${variable.value}` in bindings))) {\n variables.push(variable);\n }\n }\n return false;\n },\n union(union: Algebra.Union): boolean {\n // Determine variables in scope of the union branches that are not occurring in every branch\n const scopedVariables = union.input.map(Util.inScopeVariables);\n for (const variable of uniqTerms(scopedVariables.flat())) {\n if (!scopedVariables.every(input => input.some(inputVar => inputVar.equals(variable)))) {\n variables.push(variable);\n }\n }\n\n return true;\n },\n });\n return uniqTerms(variables);\n }\n\n /**\n * Send a SPARQL query to a SPARQL endpoint and retrieve its bindings as a stream.\n * @param {string} endpoint A SPARQL endpoint URL.\n * @param {string} query A SPARQL query string.\n * @param {RDF.Variable[]} variables The expected variables.\n * @param {IActionContext} context The source context.\n * @param undefVariables Variables that may have undefs.\n * @return {BindingsStream} A stream of bindings.\n */\n public async queryBindingsRemote(\n endpoint: string,\n query: string,\n variables: RDF.Variable[],\n context: IActionContext,\n undefVariables: RDF.Variable[],\n ): Promise<BindingsStream> {\n // Index undef variables\n const undefVariablesIndex: Set<string> = new Set();\n for (const undefVariable of undefVariables) {\n undefVariablesIndex.add(undefVariable.value);\n }\n\n this.lastSourceContext = this.context.merge(context);\n const rawStream = await this.endpointFetcher.fetchBindings(endpoint, query);\n this.lastSourceContext = undefined;\n\n return wrap<any>(rawStream, { autoStart: false, maxBufferSize: Number.POSITIVE_INFINITY })\n .map<RDF.Bindings>((rawData: Record<string, RDF.Term>) => this.bindingsFactory.bindings(variables\n .map((variable) => {\n const value = rawData[`?${variable.value}`];\n if (!undefVariablesIndex.has(variable.value) && !value) {\n Actor.getContextLogger(this.context)?.warn(`The endpoint ${endpoint} failed to provide a binding for ${variable.value}.`);\n }\n return <[RDF.Variable, RDF.Term]>[ variable, value ];\n })\n .filter(([ _, v ]) => Boolean(v))));\n }\n\n public toString(): string {\n return `QuerySourceSparql(${this.url})`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"QuerySourceSparql.js","sourceRoot":"","sources":["QuerySourceSparql.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediatorHttp } from '@comunica/bus-http';\nimport { KeysInitQuery } from '@comunica/context-entries';\nimport { Actor } from '@comunica/core';\nimport type {\n Bindings,\n BindingsStream,\n ComunicaDataFactory,\n FragmentSelectorShape,\n IActionContext,\n IDataset,\n IQueryBindingsOptions,\n IQuerySource,\n MetadataBindings,\n MetadataVariable,\n QueryResultCardinality,\n} from '@comunica/types';\nimport type { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { MetadataValidationState } from '@comunica/utils-metadata';\nimport { estimateCardinality } from '@comunica/utils-query-operation';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { TransformIterator, wrap } from 'asynciterator';\nimport { SparqlEndpointFetcher } from 'fetch-sparql-endpoint';\nimport { LRUCache } from 'lru-cache';\nimport { uniqTerms } from 'rdf-terms';\nimport type { Factory } from 'sparqlalgebrajs';\nimport { toSparql, Algebra, Util } from 'sparqlalgebrajs';\nimport type { BindMethod } from './ActorQuerySourceIdentifyHypermediaSparql';\n\nexport class QuerySourceSparql implements IQuerySource {\n public readonly referenceValue: string;\n private readonly url: string;\n private readonly context: IActionContext;\n private readonly mediatorHttp: MediatorHttp;\n private readonly bindMethod: BindMethod;\n private readonly countTimeout: number;\n private readonly cardinalityCountQueries: boolean;\n private readonly cardinalityEstimateConstruction: boolean;\n private readonly defaultGraph?: string;\n private readonly unionDefaultGraph: boolean;\n private readonly datasets?: IDataset[];\n public readonly extensionFunctions?: string[];\n private readonly dataFactory: ComunicaDataFactory;\n private readonly algebraFactory: Factory;\n private readonly bindingsFactory: BindingsFactory;\n\n private readonly endpointFetcher: SparqlEndpointFetcher;\n private readonly cache: LRUCache<string, QueryResultCardinality> | undefined;\n\n private lastSourceContext: IActionContext | undefined;\n\n public constructor(\n url: string,\n context: IActionContext,\n mediatorHttp: MediatorHttp,\n bindMethod: BindMethod,\n dataFactory: ComunicaDataFactory,\n algebraFactory: Factory,\n bindingsFactory: BindingsFactory,\n forceHttpGet: boolean,\n cacheSize: number,\n countTimeout: number,\n cardinalityCountQueries: boolean,\n cardinalityEstimateConstruction: boolean,\n forceGetIfUrlLengthBelow: number,\n defaultGraph?: string,\n unionDefaultGraph?: boolean,\n datasets?: IDataset[],\n extensionFunctions?: string[],\n postAccepted?: string[],\n ) {\n this.referenceValue = url;\n this.url = url;\n this.context = context;\n this.mediatorHttp = mediatorHttp;\n this.bindMethod = bindMethod;\n this.dataFactory = dataFactory;\n this.algebraFactory = algebraFactory;\n this.bindingsFactory = bindingsFactory;\n this.endpointFetcher = new SparqlEndpointFetcher({\n method: forceHttpGet ? 'GET' : 'POST',\n fetch: (input: Request | string, init?: RequestInit) => this.mediatorHttp.mediate(\n { input, init, context: this.lastSourceContext! },\n ),\n prefixVariableQuestionMark: true,\n dataFactory,\n forceGetIfUrlLengthBelow,\n directPost: postAccepted && !postAccepted.includes('application/x-www-form-urlencoded'),\n });\n this.cache = cacheSize > 0 ?\n new LRUCache<string, QueryResultCardinality>({ max: cacheSize }) :\n undefined;\n this.countTimeout = countTimeout;\n this.cardinalityCountQueries = cardinalityCountQueries;\n this.cardinalityEstimateConstruction = cardinalityEstimateConstruction;\n this.defaultGraph = defaultGraph;\n this.unionDefaultGraph = unionDefaultGraph ?? false;\n this.datasets = datasets;\n this.extensionFunctions = extensionFunctions;\n }\n\n public async getSelectorShape(): Promise<FragmentSelectorShape> {\n const innerDisjunction: FragmentSelectorShape = {\n type: 'disjunction',\n children: [\n {\n type: 'operation',\n operation: { operationType: 'wildcard' },\n joinBindings: true,\n },\n ],\n };\n if (this.extensionFunctions) {\n innerDisjunction.children.push({\n type: 'operation',\n operation: {\n operationType: 'type',\n type: Algebra.types.EXPRESSION,\n extensionFunctions: this.extensionFunctions,\n },\n joinBindings: true,\n });\n }\n return {\n type: 'conjunction',\n children: [\n innerDisjunction,\n {\n // DISTINCT CONSTRUCT is not allowed in SPARQL 1.1, so we explicitly disallowed it.\n type: 'negation',\n child: {\n type: 'operation',\n operation: { operationType: 'type', type: Algebra.types.DISTINCT },\n children: [\n {\n type: 'operation',\n operation: { operationType: 'type', type: Algebra.types.CONSTRUCT },\n },\n ],\n },\n },\n ],\n };\n }\n\n public queryBindings(\n operationIn: Algebra.Operation,\n context: IActionContext,\n options?: IQueryBindingsOptions,\n ): BindingsStream {\n // If bindings are passed, modify the operations\n let operationPromise: Promise<Algebra.Operation>;\n if (options?.joinBindings) {\n operationPromise = QuerySourceSparql.addBindingsToOperation(\n this.algebraFactory,\n this.bindMethod,\n operationIn,\n options.joinBindings,\n );\n } else {\n operationPromise = Promise.resolve(operationIn);\n }\n\n const bindings: BindingsStream = new TransformIterator(async() => {\n // Prepare queries\n const operation = await operationPromise;\n const variables: RDF.Variable[] = Util.inScopeVariables(operation);\n const queryString = context.get<string>(KeysInitQuery.queryString);\n const queryFormat: RDF.QueryFormat = context.getSafe(KeysInitQuery.queryFormat);\n const selectQuery: string = !options?.joinBindings && queryString && queryFormat.language === 'sparql' ?\n queryString :\n QuerySourceSparql.operationToSelectQuery(this.algebraFactory, operation, variables);\n const undefVariables = QuerySourceSparql.getOperationUndefs(operation);\n\n return this.queryBindingsRemote(this.url, selectQuery, variables, context, undefVariables);\n }, { autoStart: false });\n this.attachMetadata(bindings, context, operationPromise);\n\n return bindings;\n }\n\n public queryQuads(operation: Algebra.Operation, context: IActionContext): AsyncIterator<RDF.Quad> {\n this.lastSourceContext = this.context.merge(context);\n const query: string = context.get(KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation);\n const rawStream = this.endpointFetcher.fetchTriples(this.url, query);\n this.lastSourceContext = undefined;\n const quads = wrap<any>(rawStream, { autoStart: false, maxBufferSize: Number.POSITIVE_INFINITY });\n this.attachMetadata(quads, context, Promise.resolve(operation.input));\n return quads;\n }\n\n public queryBoolean(operation: Algebra.Ask, context: IActionContext): Promise<boolean> {\n this.lastSourceContext = this.context.merge(context);\n const query: string = context.get(KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation);\n const promise = this.endpointFetcher.fetchAsk(this.url, query);\n this.lastSourceContext = undefined;\n return promise;\n }\n\n public queryVoid(operation: Algebra.Update, context: IActionContext): Promise<void> {\n this.lastSourceContext = this.context.merge(context);\n const query: string = context.get(KeysInitQuery.queryString) ?? QuerySourceSparql.operationToQuery(operation);\n const promise = this.endpointFetcher.fetchUpdate(this.url, query);\n this.lastSourceContext = undefined;\n return promise;\n }\n\n protected attachMetadata(\n target: AsyncIterator<any>,\n context: IActionContext,\n operationPromise: Promise<Algebra.Operation>,\n ): void {\n // Emit metadata containing the estimated count\n let variablesCount: MetadataVariable[] = [];\n // eslint-disable-next-line no-async-promise-executor,ts/no-misused-promises\n new Promise<QueryResultCardinality>(async(resolve, reject) => {\n try {\n const operation = await operationPromise;\n const variablesScoped = Util.inScopeVariables(operation);\n const countQuery = this.operationToNormalizedCountQuery(operation);\n const undefVariables = QuerySourceSparql.getOperationUndefs(operation);\n variablesCount = variablesScoped.map(variable => ({\n variable,\n canBeUndef: undefVariables.some(undefVariable => undefVariable.equals(variable)),\n }));\n\n const cachedCardinality = this.cache?.get(countQuery);\n if (cachedCardinality) {\n return resolve(cachedCardinality);\n }\n\n // Attempt to estimate locally prior to sending a COUNT request, as this should be much faster.\n // The estimates may be off by varying amounts, so this is set behind a configuration flag.\n if (this.cardinalityEstimateConstruction) {\n const localEstimate = await this.estimateOperationCardinality(operation);\n if (Number.isFinite(localEstimate.value)) {\n this.cache?.set(countQuery, localEstimate);\n return resolve(localEstimate);\n }\n }\n\n // Don't send count queries if disabled.\n if (!this.cardinalityCountQueries) {\n return resolve({ type: 'estimate', value: Number.POSITIVE_INFINITY, dataset: this.url });\n }\n\n const timeoutHandler = setTimeout(() => resolve({\n type: 'estimate',\n value: Number.POSITIVE_INFINITY,\n dataset: this.url,\n }), this.countTimeout);\n const varCount = this.dataFactory.variable('count');\n const bindingsStream: BindingsStream = await this\n .queryBindingsRemote(this.url, countQuery, [ varCount ], context, []);\n bindingsStream.on('data', (bindings: Bindings) => {\n clearTimeout(timeoutHandler);\n const count = bindings.get(varCount);\n const cardinality: QueryResultCardinality = {\n type: 'estimate',\n value: Number.POSITIVE_INFINITY,\n dataset: this.url,\n };\n if (count) {\n const cardinalityValue: number = Number.parseInt(count.value, 10);\n if (!Number.isNaN(cardinalityValue)) {\n cardinality.type = 'exact';\n cardinality.value = cardinalityValue;\n this.cache?.set(countQuery, cardinality);\n }\n }\n return resolve(cardinality);\n });\n bindingsStream.on('error', () => {\n clearTimeout(timeoutHandler);\n resolve({ type: 'estimate', value: Number.POSITIVE_INFINITY, dataset: this.url });\n });\n bindingsStream.on('end', () => {\n clearTimeout(timeoutHandler);\n resolve({ type: 'estimate', value: Number.POSITIVE_INFINITY, dataset: this.url });\n });\n } catch (error: unknown) {\n return reject(error);\n }\n })\n .then((cardinality) => {\n target.setProperty('metadata', {\n state: new MetadataValidationState(),\n cardinality,\n variables: variablesCount,\n });\n })\n .catch(() => target.setProperty('metadata', {\n state: new MetadataValidationState(),\n cardinality: { type: 'estimate', value: Number.POSITIVE_INFINITY, dataset: this.url },\n variables: variablesCount,\n }));\n }\n\n /**\n * Convert an algebra operation into a query string, and if the operation is a simple triple pattern,\n * then also replace any variables with s, p, and o to increase the chance of cache hits.\n * @param {Algebra.Operation} operation The operation to convert into a query string.\n * @returns {string} Query string for a COUNT query over the operation.\n */\n public operationToNormalizedCountQuery(operation: Algebra.Operation): string {\n const normalizedOperation = operation.type === Algebra.types.PATTERN ?\n this.algebraFactory.createPattern(\n operation.subject.termType === 'Variable' ? this.dataFactory.variable('s') : operation.subject,\n operation.predicate.termType === 'Variable' ? this.dataFactory.variable('p') : operation.predicate,\n operation.object.termType === 'Variable' ? this.dataFactory.variable('o') : operation.object,\n ) :\n operation;\n const operationString = QuerySourceSparql.operationToCountQuery(\n this.dataFactory,\n this.algebraFactory,\n normalizedOperation,\n );\n return operationString;\n }\n\n /**\n * Performs local cardinality estimation for the specified SPARQL algebra operation, which should\n * result in better estimation performance at the expense of accuracy.\n * @param {Algebra.Operation} operation A query operation.\n */\n public async estimateOperationCardinality(operation: Algebra.Operation): Promise<QueryResultCardinality> {\n const dataset: IDataset = {\n getCardinality: (operation: Algebra.Operation): QueryResultCardinality | undefined => {\n const queryString = this.operationToNormalizedCountQuery(operation);\n\n const cachedCardinality = this.cache?.get(queryString);\n if (cachedCardinality) {\n return cachedCardinality;\n }\n\n if (this.datasets) {\n const cardinalities = this.datasets\n .filter(ds => this.unionDefaultGraph || (this.defaultGraph && ds.uri.endsWith(this.defaultGraph)))\n .map(ds => estimateCardinality(operation, ds));\n\n const cardinality: QueryResultCardinality = {\n type: cardinalities.some(card => card.type === 'estimate') ? 'estimate' : 'exact',\n value: cardinalities.length > 0 ? cardinalities.reduce((acc, card) => acc + card.value, 0) : 0,\n dataset: this.url,\n };\n\n return cardinality;\n }\n },\n source: this.url,\n uri: this.url,\n };\n\n return estimateCardinality(operation, dataset);\n }\n\n /**\n * Create an operation that includes the bindings from the given bindings stream.\n * @param algebraFactory The algebra factory.\n * @param bindMethod A method for adding bindings to an operation.\n * @param operation The operation to bind to.\n * @param addBindings The bindings to add.\n * @param addBindings.bindings The bindings stream.\n * @param addBindings.metadata The bindings metadata.\n */\n public static async addBindingsToOperation(\n algebraFactory: Factory,\n bindMethod: BindMethod,\n operation: Algebra.Operation,\n addBindings: { bindings: BindingsStream; metadata: MetadataBindings },\n ): Promise<Algebra.Operation> {\n const bindings = await addBindings.bindings.toArray();\n\n switch (bindMethod) {\n case 'values':\n return algebraFactory.createJoin([\n algebraFactory.createValues(\n addBindings.metadata.variables.map(v => v.variable),\n bindings.map(binding => Object.fromEntries([ ...binding ]\n .map(([ key, value ]) => [ `?${key.value}`, <RDF.Literal | RDF.NamedNode> value ]))),\n ),\n operation,\n ], false);\n case 'union': { throw new Error('Not implemented yet: \"union\" case'); }\n case 'filter': { throw new Error('Not implemented yet: \"filter\" case'); }\n }\n }\n\n /**\n * Convert an operation to a select query for this pattern.\n * @param algebraFactory The algebra factory.\n * @param {Algebra.Operation} operation A query operation.\n * @param {RDF.Variable[]} variables The variables in scope for the operation.\n * @return {string} A select query string.\n */\n public static operationToSelectQuery(\n algebraFactory: Factory,\n operation: Algebra.Operation,\n variables: RDF.Variable[],\n ): string {\n return QuerySourceSparql.operationToQuery(algebraFactory.createProject(operation, variables));\n }\n\n /**\n * Convert an operation to a count query for the number of matching triples for this pattern.\n * @param dataFactory The data factory.\n * @param algebraFactory The algebra factory.\n * @param {Algebra.Operation} operation A query operation.\n * @return {string} A count query string.\n */\n public static operationToCountQuery(\n dataFactory: ComunicaDataFactory,\n algebraFactory: Factory,\n operation: Algebra.Operation,\n ): string {\n return QuerySourceSparql.operationToQuery(algebraFactory.createProject(\n algebraFactory.createExtend(\n algebraFactory.createGroup(\n operation,\n [],\n [ algebraFactory.createBoundAggregate(\n dataFactory.variable('var0'),\n 'count',\n algebraFactory.createWildcardExpression(),\n false,\n ) ],\n ),\n dataFactory.variable('count'),\n algebraFactory.createTermExpression(dataFactory.variable('var0')),\n ),\n [ dataFactory.variable('count') ],\n ));\n }\n\n /**\n * Convert an operation to a query for this pattern.\n * @param {Algebra.Operation} operation A query operation.\n * @return {string} A query string.\n */\n public static operationToQuery(operation: Algebra.Operation): string {\n return toSparql(operation, { sparqlStar: true });\n }\n\n /**\n * Check if the given operation may produce undefined values.\n * @param operation\n */\n public static getOperationUndefs(operation: Algebra.Operation): RDF.Variable[] {\n const variables: RDF.Variable[] = [];\n Util.recurseOperation(operation, {\n leftjoin(subOperation): boolean {\n const left = Util.inScopeVariables(subOperation.input[0]);\n const right = Util.inScopeVariables(subOperation.input[1]);\n for (const varRight of right) {\n if (!left.some(varLeft => varLeft.equals(varRight))) {\n variables.push(varRight);\n }\n }\n return false;\n },\n values(values: Algebra.Values): boolean {\n for (const variable of values.variables) {\n if (values.bindings.some(bindings => !(`?${variable.value}` in bindings))) {\n variables.push(variable);\n }\n }\n return false;\n },\n union(union: Algebra.Union): boolean {\n // Determine variables in scope of the union branches that are not occurring in every branch\n const scopedVariables = union.input.map(Util.inScopeVariables);\n for (const variable of uniqTerms(scopedVariables.flat())) {\n if (!scopedVariables.every(input => input.some(inputVar => inputVar.equals(variable)))) {\n variables.push(variable);\n }\n }\n\n return true;\n },\n });\n return uniqTerms(variables);\n }\n\n /**\n * Send a SPARQL query to a SPARQL endpoint and retrieve its bindings as a stream.\n * @param {string} endpoint A SPARQL endpoint URL.\n * @param {string} query A SPARQL query string.\n * @param {RDF.Variable[]} variables The expected variables.\n * @param {IActionContext} context The source context.\n * @param undefVariables Variables that may have undefs.\n * @return {BindingsStream} A stream of bindings.\n */\n public async queryBindingsRemote(\n endpoint: string,\n query: string,\n variables: RDF.Variable[],\n context: IActionContext,\n undefVariables: RDF.Variable[],\n ): Promise<BindingsStream> {\n // Index undef variables\n const undefVariablesIndex: Set<string> = new Set();\n for (const undefVariable of undefVariables) {\n undefVariablesIndex.add(undefVariable.value);\n }\n\n this.lastSourceContext = this.context.merge(context);\n const rawStream = await this.endpointFetcher.fetchBindings(endpoint, query);\n this.lastSourceContext = undefined;\n\n return wrap<any>(rawStream, { autoStart: false, maxBufferSize: Number.POSITIVE_INFINITY })\n .map<RDF.Bindings>((rawData: Record<string, RDF.Term>) => this.bindingsFactory.bindings(variables\n .map((variable) => {\n const value = rawData[`?${variable.value}`];\n if (!undefVariablesIndex.has(variable.value) && !value) {\n Actor.getContextLogger(this.context)?.warn(`The endpoint ${endpoint} failed to provide a binding for ${variable.value}.`);\n }\n return <[RDF.Variable, RDF.Term]>[ variable, value ];\n })\n .filter(([ _, v ]) => Boolean(v))));\n }\n\n public toString(): string {\n return `QuerySourceSparql(${this.url})`;\n }\n}\n"]}
|
package/lib/index.d.ts
CHANGED
|
File without changes
|
package/lib/index.js
CHANGED
|
File without changes
|
package/lib/index.js.map
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comunica/actor-query-source-identify-hypermedia-sparql",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
4
4
|
"description": "A sparql query-source-identify-hypermedia actor",
|
|
5
5
|
"lsd:module": true,
|
|
6
6
|
"license": "MIT",
|
|
@@ -41,20 +41,21 @@
|
|
|
41
41
|
"build:components": "componentsjs-generator"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@comunica/bus-http": "^4.
|
|
45
|
-
"@comunica/bus-merge-bindings-context": "^4.
|
|
46
|
-
"@comunica/bus-query-source-identify-hypermedia": "^4.
|
|
47
|
-
"@comunica/context-entries": "^4.
|
|
48
|
-
"@comunica/core": "^4.
|
|
49
|
-
"@comunica/types": "^4.
|
|
50
|
-
"@comunica/utils-bindings-factory": "^4.
|
|
51
|
-
"@comunica/utils-metadata": "^4.
|
|
44
|
+
"@comunica/bus-http": "^4.4.0",
|
|
45
|
+
"@comunica/bus-merge-bindings-context": "^4.4.0",
|
|
46
|
+
"@comunica/bus-query-source-identify-hypermedia": "^4.4.0",
|
|
47
|
+
"@comunica/context-entries": "^4.4.0",
|
|
48
|
+
"@comunica/core": "^4.4.0",
|
|
49
|
+
"@comunica/types": "^4.4.0",
|
|
50
|
+
"@comunica/utils-bindings-factory": "^4.4.0",
|
|
51
|
+
"@comunica/utils-metadata": "^4.4.0",
|
|
52
|
+
"@comunica/utils-query-operation": "^4.4.0",
|
|
52
53
|
"@rdfjs/types": "*",
|
|
53
54
|
"asynciterator": "^3.9.0",
|
|
54
|
-
"fetch-sparql-endpoint": "^
|
|
55
|
+
"fetch-sparql-endpoint": "^6.2.0",
|
|
55
56
|
"lru-cache": "^10.0.0",
|
|
56
57
|
"rdf-terms": "^1.11.0",
|
|
57
58
|
"sparqlalgebrajs": "^4.3.8"
|
|
58
59
|
},
|
|
59
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "27acde56dfe0c1ff1162c1f46818ad752296ca88"
|
|
60
61
|
}
|