@comunica/bus-query-source-identify 3.3.0 → 4.0.1
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/components/ActorQuerySourceIdentify.jsonld +56 -12
- package/components/components.jsonld +1 -1
- package/components/context.jsonld +7 -1
- package/lib/ActorQuerySourceIdentify.d.ts +6 -4
- package/lib/ActorQuerySourceIdentify.js +5 -1
- package/lib/ActorQuerySourceIdentify.js.map +1 -1
- package/lib/Utils.d.ts +10 -7
- package/lib/Utils.js +19 -22
- package/lib/Utils.js.map +1 -1
- package/package.json +12 -9
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@context": [
|
|
3
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-query-source-identify/^
|
|
4
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/core/^
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-query-source-identify/^4.0.0/components/context.jsonld",
|
|
4
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/core/^4.0.0/components/context.jsonld"
|
|
5
5
|
],
|
|
6
6
|
"@id": "npmd:@comunica/bus-query-source-identify",
|
|
7
7
|
"components": [
|
|
@@ -16,11 +16,23 @@
|
|
|
16
16
|
"genericTypeInstances": [
|
|
17
17
|
"cbqsi:components/ActorQuerySourceIdentify.jsonld#IActionQuerySourceIdentify",
|
|
18
18
|
"cc:components/Actor.jsonld#IActorTest",
|
|
19
|
-
"cbqsi:components/ActorQuerySourceIdentify.jsonld#IActorQuerySourceIdentifyOutput"
|
|
19
|
+
"cbqsi:components/ActorQuerySourceIdentify.jsonld#IActorQuerySourceIdentifyOutput",
|
|
20
|
+
{
|
|
21
|
+
"@type": "ParameterRangeGenericTypeReference",
|
|
22
|
+
"parameterRangeGenericType": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify__generic_TS"
|
|
23
|
+
}
|
|
20
24
|
]
|
|
21
25
|
}
|
|
22
26
|
],
|
|
23
27
|
"comment": "A comunica actor for query-source-identify events. Actor types: * Input: IActionQuerySourceIdentify: An unidentified query source. * Test: <none> * Output: IActorQuerySourceIdentifyOutput: An identified query source.",
|
|
28
|
+
"genericTypeParameters": [
|
|
29
|
+
{
|
|
30
|
+
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify__generic_TS",
|
|
31
|
+
"default": {
|
|
32
|
+
"@type": "ParameterRangeUndefined"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
],
|
|
24
36
|
"parameters": [
|
|
25
37
|
{
|
|
26
38
|
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_name",
|
|
@@ -42,29 +54,37 @@
|
|
|
42
54
|
"genericTypeInstances": [
|
|
43
55
|
{
|
|
44
56
|
"@type": "ParameterRangeGenericTypeReference",
|
|
45
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
57
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
|
|
46
58
|
},
|
|
47
59
|
{
|
|
48
60
|
"@type": "ParameterRangeGenericTypeReference",
|
|
49
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
61
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
|
|
50
62
|
},
|
|
51
63
|
{
|
|
52
64
|
"@type": "ParameterRangeGenericTypeReference",
|
|
53
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
65
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"@type": "ParameterRangeGenericTypeReference",
|
|
69
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
|
|
54
70
|
}
|
|
55
71
|
]
|
|
56
72
|
},
|
|
57
73
|
{
|
|
58
74
|
"@type": "ParameterRangeGenericTypeReference",
|
|
59
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
75
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"@type": "ParameterRangeGenericTypeReference",
|
|
79
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
|
|
60
80
|
},
|
|
61
81
|
{
|
|
62
82
|
"@type": "ParameterRangeGenericTypeReference",
|
|
63
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
83
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
|
|
64
84
|
},
|
|
65
85
|
{
|
|
66
86
|
"@type": "ParameterRangeGenericTypeReference",
|
|
67
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
87
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
|
|
68
88
|
}
|
|
69
89
|
]
|
|
70
90
|
},
|
|
@@ -74,6 +94,20 @@
|
|
|
74
94
|
},
|
|
75
95
|
"comment": "The bus this actor subscribes to."
|
|
76
96
|
},
|
|
97
|
+
{
|
|
98
|
+
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_busFailMessage",
|
|
99
|
+
"range": {
|
|
100
|
+
"@type": "ParameterRangeUnion",
|
|
101
|
+
"parameterRangeElements": [
|
|
102
|
+
"xsd:string",
|
|
103
|
+
{
|
|
104
|
+
"@type": "ParameterRangeUndefined"
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"default": "Query source identification failed: none of the configured actors were able to identify ${action.querySourceUnidentified.value}",
|
|
109
|
+
"comment": "The message that will be configured in the bus for reporting failures. This message may be a template string that contains references to the executed `action`. For example, the following templated string is allowed: \"RDF dereferencing failed: no actors could handle ${action.handle.mediaType}\""
|
|
110
|
+
},
|
|
77
111
|
{
|
|
78
112
|
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_beforeActors",
|
|
79
113
|
"range": {
|
|
@@ -87,15 +121,19 @@
|
|
|
87
121
|
"genericTypeInstances": [
|
|
88
122
|
{
|
|
89
123
|
"@type": "ParameterRangeGenericTypeReference",
|
|
90
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
124
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
|
|
91
125
|
},
|
|
92
126
|
{
|
|
93
127
|
"@type": "ParameterRangeGenericTypeReference",
|
|
94
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
128
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
|
|
95
129
|
},
|
|
96
130
|
{
|
|
97
131
|
"@type": "ParameterRangeGenericTypeReference",
|
|
98
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
132
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"@type": "ParameterRangeGenericTypeReference",
|
|
136
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^4.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
|
|
99
137
|
}
|
|
100
138
|
]
|
|
101
139
|
}
|
|
@@ -130,6 +168,12 @@
|
|
|
130
168
|
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_bus"
|
|
131
169
|
}
|
|
132
170
|
},
|
|
171
|
+
{
|
|
172
|
+
"keyRaw": "busFailMessage",
|
|
173
|
+
"value": {
|
|
174
|
+
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_busFailMessage"
|
|
175
|
+
}
|
|
176
|
+
},
|
|
133
177
|
{
|
|
134
178
|
"keyRaw": "beforeActors",
|
|
135
179
|
"value": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@context": [
|
|
3
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-query-source-identify/^
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-query-source-identify/^4.0.0/components/context.jsonld"
|
|
4
4
|
],
|
|
5
5
|
"@id": "npmd:@comunica/bus-query-source-identify",
|
|
6
6
|
"@type": "Module",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^6.0.0/components/context.jsonld",
|
|
4
4
|
{
|
|
5
5
|
"npmd": "https://linkedsoftwaredependencies.org/bundles/npm/",
|
|
6
|
-
"cbqsi": "npmd:@comunica/bus-query-source-identify/^
|
|
6
|
+
"cbqsi": "npmd:@comunica/bus-query-source-identify/^4.0.0/",
|
|
7
7
|
"ActorQuerySourceIdentify": {
|
|
8
8
|
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify",
|
|
9
9
|
"@prefix": true,
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
"args_bus": {
|
|
15
15
|
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_bus"
|
|
16
16
|
},
|
|
17
|
+
"args_busFailMessage": {
|
|
18
|
+
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_busFailMessage"
|
|
19
|
+
},
|
|
17
20
|
"args_beforeActors": {
|
|
18
21
|
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_beforeActors",
|
|
19
22
|
"@container": "@list"
|
|
@@ -24,6 +27,9 @@
|
|
|
24
27
|
"bus": {
|
|
25
28
|
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_bus"
|
|
26
29
|
},
|
|
30
|
+
"busFailMessage": {
|
|
31
|
+
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_busFailMessage"
|
|
32
|
+
},
|
|
27
33
|
"beforeActors": {
|
|
28
34
|
"@id": "cbqsi:components/ActorQuerySourceIdentify.jsonld#ActorQuerySourceIdentify_args_beforeActors",
|
|
29
35
|
"@container": "@list"
|
|
@@ -12,11 +12,13 @@ import type { IQuerySourceWrapper, QuerySourceUnidentifiedExpanded } from '@comu
|
|
|
12
12
|
* @see IActionQuerySourceIdentify
|
|
13
13
|
* @see IActorQuerySourceIdentifyOutput
|
|
14
14
|
*/
|
|
15
|
-
export declare abstract class ActorQuerySourceIdentify extends Actor<IActionQuerySourceIdentify, IActorTest, IActorQuerySourceIdentifyOutput> {
|
|
15
|
+
export declare abstract class ActorQuerySourceIdentify<TS = undefined> extends Actor<IActionQuerySourceIdentify, IActorTest, IActorQuerySourceIdentifyOutput, TS> {
|
|
16
16
|
/**
|
|
17
|
-
* @param args -
|
|
17
|
+
* @param args -
|
|
18
|
+
* \ @defaultNested {<default_bus> a <cc:components/Bus.jsonld#Bus>} bus
|
|
19
|
+
* \ @defaultNested {Query source identification failed: none of the configured actors were able to identify ${action.querySourceUnidentified.value}} busFailMessage
|
|
18
20
|
*/
|
|
19
|
-
constructor(args: IActorQuerySourceIdentifyArgs);
|
|
21
|
+
constructor(args: IActorQuerySourceIdentifyArgs<TS>);
|
|
20
22
|
}
|
|
21
23
|
export interface IActionQuerySourceIdentify extends IAction {
|
|
22
24
|
/**
|
|
@@ -30,5 +32,5 @@ export interface IActorQuerySourceIdentifyOutput extends IActorOutput {
|
|
|
30
32
|
*/
|
|
31
33
|
querySource: IQuerySourceWrapper;
|
|
32
34
|
}
|
|
33
|
-
export type IActorQuerySourceIdentifyArgs = IActorArgs<IActionQuerySourceIdentify, IActorTest, IActorQuerySourceIdentifyOutput>;
|
|
35
|
+
export type IActorQuerySourceIdentifyArgs<TS = undefined> = IActorArgs<IActionQuerySourceIdentify, IActorTest, IActorQuerySourceIdentifyOutput, TS>;
|
|
34
36
|
export type MediatorQuerySourceIdentify = Mediate<IActionQuerySourceIdentify, IActorQuerySourceIdentifyOutput>;
|
|
@@ -14,9 +14,13 @@ const core_1 = require("@comunica/core");
|
|
|
14
14
|
* @see IActorQuerySourceIdentifyOutput
|
|
15
15
|
*/
|
|
16
16
|
class ActorQuerySourceIdentify extends core_1.Actor {
|
|
17
|
+
/* eslint-disable max-len */
|
|
17
18
|
/**
|
|
18
|
-
* @param args -
|
|
19
|
+
* @param args -
|
|
20
|
+
* \ @defaultNested {<default_bus> a <cc:components/Bus.jsonld#Bus>} bus
|
|
21
|
+
* \ @defaultNested {Query source identification failed: none of the configured actors were able to identify ${action.querySourceUnidentified.value}} busFailMessage
|
|
19
22
|
*/
|
|
23
|
+
/* eslint-enable max-len */
|
|
20
24
|
constructor(args) {
|
|
21
25
|
super(args);
|
|
22
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActorQuerySourceIdentify.js","sourceRoot":"","sources":["ActorQuerySourceIdentify.ts"],"names":[],"mappings":";;;AACA,yCAAuC;AAGvC;;;;;;;;;;GAUG;AACH,MAAsB,wBACpB,SAAQ,
|
|
1
|
+
{"version":3,"file":"ActorQuerySourceIdentify.js","sourceRoot":"","sources":["ActorQuerySourceIdentify.ts"],"names":[],"mappings":";;;AACA,yCAAuC;AAGvC;;;;;;;;;;GAUG;AACH,MAAsB,wBACpB,SAAQ,YAAkF;IAC1F,4BAA4B;IAC5B;;;;OAIG;IACH,2BAA2B;IAC3B,YAAmB,IAAuC;QACxD,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACF;AAZD,4DAYC","sourcesContent":["import type { IAction, IActorArgs, IActorOutput, IActorTest, Mediate } from '@comunica/core';\nimport { Actor } from '@comunica/core';\nimport type { IQuerySourceWrapper, QuerySourceUnidentifiedExpanded } from '@comunica/types';\n\n/**\n * A comunica actor for query-source-identify events.\n *\n * Actor types:\n * * Input: IActionQuerySourceIdentify: An unidentified query source.\n * * Test: <none>\n * * Output: IActorQuerySourceIdentifyOutput: An identified query source.\n *\n * @see IActionQuerySourceIdentify\n * @see IActorQuerySourceIdentifyOutput\n */\nexport abstract class ActorQuerySourceIdentify<TS = undefined>\n extends Actor<IActionQuerySourceIdentify, IActorTest, IActorQuerySourceIdentifyOutput, TS> {\n /* eslint-disable max-len */\n /**\n * @param args -\n * \\ @defaultNested {<default_bus> a <cc:components/Bus.jsonld#Bus>} bus\n * \\ @defaultNested {Query source identification failed: none of the configured actors were able to identify ${action.querySourceUnidentified.value}} busFailMessage\n */\n /* eslint-enable max-len */\n public constructor(args: IActorQuerySourceIdentifyArgs<TS>) {\n super(args);\n }\n}\n\nexport interface IActionQuerySourceIdentify extends IAction {\n /**\n * An unidentified query source.\n */\n querySourceUnidentified: QuerySourceUnidentifiedExpanded;\n}\n\nexport interface IActorQuerySourceIdentifyOutput extends IActorOutput {\n /**\n * An identified query source.\n */\n querySource: IQuerySourceWrapper;\n}\n\nexport type IActorQuerySourceIdentifyArgs<TS = undefined> = IActorArgs<\nIActionQuerySourceIdentify,\nIActorTest,\nIActorQuerySourceIdentifyOutput,\nTS\n>;\n\nexport type MediatorQuerySourceIdentify = Mediate<\nIActionQuerySourceIdentify,\nIActorQuerySourceIdentifyOutput\n>;\n"]}
|
package/lib/Utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { BindingsStream, ComunicaDataFactory, MetadataBindings, MetadataQuads, TermsOrder } from '@comunica/types';
|
|
2
|
+
import type { BindingsFactory } from '@comunica/utils-bindings-factory';
|
|
3
3
|
import type * as RDF from '@rdfjs/types';
|
|
4
4
|
import type { AsyncIterator } from 'asynciterator';
|
|
5
5
|
import type { QuadTermName } from 'rdf-terms';
|
|
@@ -9,12 +9,13 @@ import type { Algebra } from 'sparqlalgebrajs';
|
|
|
9
9
|
* @param quads The quads to convert.
|
|
10
10
|
* @param pattern The pattern to get variables from to determine bindings.
|
|
11
11
|
* All quads are also assumed to match the pattern.
|
|
12
|
+
* @param dataFactory The data factory.
|
|
12
13
|
* @param bindingsFactory The factory for creating bindings.
|
|
13
14
|
* @param unionDefaultGraph If union default graph mode is enabled.
|
|
14
15
|
* If true, variable graphs will match all graphs, including the default graph.
|
|
15
16
|
* If false, variable graphs will only match named graphs, and not the default graph.
|
|
16
17
|
*/
|
|
17
|
-
export declare function quadsToBindings(quads: AsyncIterator<RDF.Quad>, pattern: Algebra.Pattern, bindingsFactory: BindingsFactory, unionDefaultGraph: boolean): BindingsStream;
|
|
18
|
+
export declare function quadsToBindings(quads: AsyncIterator<RDF.Quad>, pattern: Algebra.Pattern, dataFactory: ComunicaDataFactory, bindingsFactory: BindingsFactory, unionDefaultGraph: boolean): BindingsStream;
|
|
18
19
|
/**
|
|
19
20
|
* Check if a term is a variable.
|
|
20
21
|
* @param {RDF.Term} term An RDF term.
|
|
@@ -52,7 +53,7 @@ export declare function getVariables(pattern: RDF.BaseQuad): RDF.Variable[];
|
|
|
52
53
|
export declare function getDuplicateElementLinks(pattern: RDF.BaseQuad): Record<string, QuadTermName[][]> | undefined;
|
|
53
54
|
/**
|
|
54
55
|
* Set the metadata of the bindings stream derived from the metadata of the quads stream.
|
|
55
|
-
*
|
|
56
|
+
* @param dataFactory The data factory.
|
|
56
57
|
* @param {BindingsStream} bindings The bindings stream that will receive the metadata property.
|
|
57
58
|
* @param {AsyncIterator<Quad>} quads The quads stream that is guaranteed to emit the metadata property.
|
|
58
59
|
* @param elementVariables Mapping of quad term name to variable name.
|
|
@@ -60,20 +61,22 @@ export declare function getDuplicateElementLinks(pattern: RDF.BaseQuad): Record<
|
|
|
60
61
|
* @param forceEstimateCardinality Set the cardinality to estimate
|
|
61
62
|
* @return {() => Promise<{[p: string]: any}>} A lazy promise behind a callback resolving to a metadata object.
|
|
62
63
|
*/
|
|
63
|
-
export declare function setMetadata(bindings: BindingsStream, quads: AsyncIterator<RDF.Quad>, elementVariables: Record<string, string>, variables: RDF.Variable[], forceEstimateCardinality: boolean): void;
|
|
64
|
+
export declare function setMetadata(dataFactory: ComunicaDataFactory, bindings: BindingsStream, quads: AsyncIterator<RDF.Quad>, elementVariables: Record<string, string>, variables: RDF.Variable[], forceEstimateCardinality: boolean): void;
|
|
64
65
|
/**
|
|
65
66
|
* Convert the metadata of quads to the metadata of bindings.
|
|
67
|
+
* @param dataFactory The data factory.
|
|
66
68
|
* @param metadataQuads Quads metadata.
|
|
67
69
|
* @param elementVariables A mapping from quad elements to variables.
|
|
68
70
|
* @param variables The variables in the bindings.
|
|
69
71
|
*/
|
|
70
|
-
export declare function quadsMetadataToBindingsMetadata(metadataQuads: MetadataQuads, elementVariables: Record<string, string>, variables: RDF.Variable[]): MetadataBindings;
|
|
72
|
+
export declare function quadsMetadataToBindingsMetadata(dataFactory: ComunicaDataFactory, metadataQuads: MetadataQuads, elementVariables: Record<string, string>, variables: RDF.Variable[]): MetadataBindings;
|
|
71
73
|
/**
|
|
72
74
|
* Convert the quads order metadata element to a bindings order metadata element.
|
|
75
|
+
* @param dataFactory The data factory.
|
|
73
76
|
* @param quadsOrder Quads order.
|
|
74
77
|
* @param elementVariables A mapping from quad elements to variables.
|
|
75
78
|
*/
|
|
76
|
-
export declare function quadsOrderToBindingsOrder(quadsOrder: TermsOrder<RDF.QuadTermName>, elementVariables: Record<string, string>): TermsOrder<RDF.Variable>;
|
|
79
|
+
export declare function quadsOrderToBindingsOrder(dataFactory: ComunicaDataFactory, quadsOrder: TermsOrder<RDF.QuadTermName>, elementVariables: Record<string, string>): TermsOrder<RDF.Variable>;
|
|
77
80
|
/**
|
|
78
81
|
* Perform post-match-filtering if the source does not support quoted triple filtering,
|
|
79
82
|
* but we have a variable inside a quoted triple.
|
package/lib/Utils.js
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.filterMatchingQuotedQuads = exports.quadsOrderToBindingsOrder = exports.quadsMetadataToBindingsMetadata = exports.setMetadata = exports.getDuplicateElementLinks = exports.getVariables = exports.isTermVariable = exports.quadsToBindings = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const rdf_data_factory_1 = require("rdf-data-factory");
|
|
4
|
+
const utils_iterator_1 = require("@comunica/utils-iterator");
|
|
5
|
+
const utils_metadata_1 = require("@comunica/utils-metadata");
|
|
7
6
|
const rdf_string_1 = require("rdf-string");
|
|
8
7
|
const rdf_terms_1 = require("rdf-terms");
|
|
9
8
|
const QuadTermUtil_1 = require("rdf-terms/lib/QuadTermUtil");
|
|
10
|
-
const DF = new rdf_data_factory_1.DataFactory();
|
|
11
9
|
/**
|
|
12
10
|
* Convert an iterator of quads to an iterator of bindings.
|
|
13
11
|
* @param quads The quads to convert.
|
|
14
12
|
* @param pattern The pattern to get variables from to determine bindings.
|
|
15
13
|
* All quads are also assumed to match the pattern.
|
|
14
|
+
* @param dataFactory The data factory.
|
|
16
15
|
* @param bindingsFactory The factory for creating bindings.
|
|
17
16
|
* @param unionDefaultGraph If union default graph mode is enabled.
|
|
18
17
|
* If true, variable graphs will match all graphs, including the default graph.
|
|
19
18
|
* If false, variable graphs will only match named graphs, and not the default graph.
|
|
20
19
|
*/
|
|
21
|
-
function quadsToBindings(quads, pattern, bindingsFactory, unionDefaultGraph) {
|
|
20
|
+
function quadsToBindings(quads, pattern, dataFactory, bindingsFactory, unionDefaultGraph) {
|
|
22
21
|
const variables = getVariables(pattern);
|
|
23
22
|
// If non-default-graph triples need to be filtered out
|
|
24
23
|
const filterNonDefaultQuads = pattern.graph.termType === 'Variable' && !unionDefaultGraph;
|
|
@@ -56,17 +55,17 @@ function quadsToBindings(quads, pattern, bindingsFactory, unionDefaultGraph) {
|
|
|
56
55
|
});
|
|
57
56
|
}
|
|
58
57
|
// Wrap it in a ClosableIterator, so we can propagate destroy calls
|
|
59
|
-
const it = new
|
|
58
|
+
const it = new utils_iterator_1.ClosableIterator(filteredOutput.map(quad => bindingsFactory
|
|
60
59
|
.bindings(Object.keys(elementVariables).map((key) => {
|
|
61
60
|
const keys = key.split('_');
|
|
62
61
|
const variable = elementVariables[key];
|
|
63
62
|
const term = (0, rdf_terms_1.getValueNestedPath)(quad, keys);
|
|
64
|
-
return [
|
|
63
|
+
return [dataFactory.variable(variable), term];
|
|
65
64
|
}))), {
|
|
66
65
|
onClose: () => quads.destroy(),
|
|
67
66
|
});
|
|
68
67
|
// Set the metadata property
|
|
69
|
-
setMetadata(it, quads, elementVariables, variables, filterNonDefaultQuads || Boolean(duplicateElementLinks));
|
|
68
|
+
setMetadata(dataFactory, it, quads, elementVariables, variables, filterNonDefaultQuads || Boolean(duplicateElementLinks));
|
|
70
69
|
return it;
|
|
71
70
|
}
|
|
72
71
|
exports.quadsToBindings = quadsToBindings;
|
|
@@ -139,7 +138,7 @@ function getDuplicateElementLinks(pattern) {
|
|
|
139
138
|
exports.getDuplicateElementLinks = getDuplicateElementLinks;
|
|
140
139
|
/**
|
|
141
140
|
* Set the metadata of the bindings stream derived from the metadata of the quads stream.
|
|
142
|
-
*
|
|
141
|
+
* @param dataFactory The data factory.
|
|
143
142
|
* @param {BindingsStream} bindings The bindings stream that will receive the metadata property.
|
|
144
143
|
* @param {AsyncIterator<Quad>} quads The quads stream that is guaranteed to emit the metadata property.
|
|
145
144
|
* @param elementVariables Mapping of quad term name to variable name.
|
|
@@ -147,19 +146,16 @@ exports.getDuplicateElementLinks = getDuplicateElementLinks;
|
|
|
147
146
|
* @param forceEstimateCardinality Set the cardinality to estimate
|
|
148
147
|
* @return {() => Promise<{[p: string]: any}>} A lazy promise behind a callback resolving to a metadata object.
|
|
149
148
|
*/
|
|
150
|
-
function setMetadata(bindings, quads, elementVariables, variables, forceEstimateCardinality) {
|
|
149
|
+
function setMetadata(dataFactory, bindings, quads, elementVariables, variables, forceEstimateCardinality) {
|
|
151
150
|
const getMetadataCb = (metadataRaw) => {
|
|
152
|
-
if (!('canContainUndefs' in metadataRaw)) {
|
|
153
|
-
metadataRaw.canContainUndefs = false;
|
|
154
|
-
}
|
|
155
151
|
if (forceEstimateCardinality) {
|
|
156
152
|
metadataRaw.cardinality.type = 'estimate';
|
|
157
153
|
}
|
|
158
|
-
bindings.setProperty('metadata', quadsMetadataToBindingsMetadata((0,
|
|
154
|
+
bindings.setProperty('metadata', quadsMetadataToBindingsMetadata(dataFactory, (0, utils_metadata_1.validateMetadataQuads)(metadataRaw), elementVariables, variables));
|
|
159
155
|
// Propagate metadata invalidations
|
|
160
156
|
if (metadataRaw.state) {
|
|
161
157
|
metadataRaw.state.addInvalidateListener(() => {
|
|
162
|
-
setMetadata(bindings, quads, elementVariables, variables, forceEstimateCardinality);
|
|
158
|
+
setMetadata(dataFactory, bindings, quads, elementVariables, variables, forceEstimateCardinality);
|
|
163
159
|
});
|
|
164
160
|
}
|
|
165
161
|
};
|
|
@@ -176,33 +172,34 @@ function setMetadata(bindings, quads, elementVariables, variables, forceEstimate
|
|
|
176
172
|
exports.setMetadata = setMetadata;
|
|
177
173
|
/**
|
|
178
174
|
* Convert the metadata of quads to the metadata of bindings.
|
|
175
|
+
* @param dataFactory The data factory.
|
|
179
176
|
* @param metadataQuads Quads metadata.
|
|
180
177
|
* @param elementVariables A mapping from quad elements to variables.
|
|
181
178
|
* @param variables The variables in the bindings.
|
|
182
179
|
*/
|
|
183
|
-
function quadsMetadataToBindingsMetadata(metadataQuads, elementVariables, variables) {
|
|
180
|
+
function quadsMetadataToBindingsMetadata(dataFactory, metadataQuads, elementVariables, variables) {
|
|
184
181
|
return {
|
|
185
182
|
...metadataQuads,
|
|
186
|
-
canContainUndefs: false,
|
|
187
183
|
order: metadataQuads.order ?
|
|
188
|
-
quadsOrderToBindingsOrder(metadataQuads.order, elementVariables) :
|
|
184
|
+
quadsOrderToBindingsOrder(dataFactory, metadataQuads.order, elementVariables) :
|
|
189
185
|
undefined,
|
|
190
186
|
availableOrders: metadataQuads.availableOrders ?
|
|
191
187
|
metadataQuads.availableOrders.map(orderDef => ({
|
|
192
188
|
cost: orderDef.cost,
|
|
193
|
-
terms: quadsOrderToBindingsOrder(orderDef.terms, elementVariables),
|
|
189
|
+
terms: quadsOrderToBindingsOrder(dataFactory, orderDef.terms, elementVariables),
|
|
194
190
|
})) :
|
|
195
191
|
undefined,
|
|
196
|
-
variables,
|
|
192
|
+
variables: variables.map(variable => ({ variable, canBeUndef: false })),
|
|
197
193
|
};
|
|
198
194
|
}
|
|
199
195
|
exports.quadsMetadataToBindingsMetadata = quadsMetadataToBindingsMetadata;
|
|
200
196
|
/**
|
|
201
197
|
* Convert the quads order metadata element to a bindings order metadata element.
|
|
198
|
+
* @param dataFactory The data factory.
|
|
202
199
|
* @param quadsOrder Quads order.
|
|
203
200
|
* @param elementVariables A mapping from quad elements to variables.
|
|
204
201
|
*/
|
|
205
|
-
function quadsOrderToBindingsOrder(quadsOrder, elementVariables) {
|
|
202
|
+
function quadsOrderToBindingsOrder(dataFactory, quadsOrder, elementVariables) {
|
|
206
203
|
const mappedVariables = {};
|
|
207
204
|
return quadsOrder.map((entry) => {
|
|
208
205
|
// Omit entries that do not map to a variable
|
|
@@ -218,7 +215,7 @@ function quadsOrderToBindingsOrder(quadsOrder, elementVariables) {
|
|
|
218
215
|
}
|
|
219
216
|
mappedVariables[variableName] = true;
|
|
220
217
|
return {
|
|
221
|
-
term:
|
|
218
|
+
term: dataFactory.variable(variableName),
|
|
222
219
|
direction: entry.direction,
|
|
223
220
|
};
|
|
224
221
|
}).filter(Boolean);
|
package/lib/Utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["Utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BindingsFactory } from '@comunica/bindings-factory';\nimport { ClosableIterator } from '@comunica/bus-query-operation';\nimport { validateMetadataQuads } from '@comunica/metadata';\nimport type { BindingsStream, MetadataBindings, MetadataQuads, TermsOrder } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'rdf-data-factory';\nimport { termToString } from 'rdf-string';\nimport type { QuadTermName } from 'rdf-terms';\nimport {\n forEachTermsNested,\n getTermsNested,\n getValueNestedPath,\n reduceTermsNested,\n someTerms,\n uniqTerms,\n} from 'rdf-terms';\nimport { matchPatternMappings } from 'rdf-terms/lib/QuadTermUtil';\nimport type { Algebra } from 'sparqlalgebrajs';\n\nconst DF = new DataFactory();\n\n/**\n * Convert an iterator of quads to an iterator of bindings.\n * @param quads The quads to convert.\n * @param pattern The pattern to get variables from to determine bindings.\n * All quads are also assumed to match the pattern.\n * @param bindingsFactory The factory for creating bindings.\n * @param unionDefaultGraph If union default graph mode is enabled.\n * If true, variable graphs will match all graphs, including the default graph.\n * If false, variable graphs will only match named graphs, and not the default graph.\n */\nexport function quadsToBindings(\n quads: AsyncIterator<RDF.Quad>,\n pattern: Algebra.Pattern,\n bindingsFactory: BindingsFactory,\n unionDefaultGraph: boolean,\n): BindingsStream {\n const variables = getVariables(pattern);\n\n // If non-default-graph triples need to be filtered out\n const filterNonDefaultQuads = pattern.graph.termType === 'Variable' && !unionDefaultGraph;\n\n // Detect duplicate variables in the pattern\n const duplicateElementLinks: Record<string, QuadTermName[][]> | undefined = getDuplicateElementLinks(pattern);\n\n // Convenience datastructure for mapping quad elements to variables\n const elementVariables: Record<string, string> = reduceTermsNested(\n pattern,\n (acc: Record<string, string>, term: RDF.Term, keys: QuadTermName[]) => {\n if (term.termType === 'Variable') {\n acc[keys.join('_')] = term.value;\n }\n return acc;\n },\n {},\n );\n\n // Optionally filter, and construct bindings\n let filteredOutput = quads;\n\n // SPARQL query semantics allow graph variables to only match with named graphs, excluding the default graph\n // But this is not the case when using union default graph semantics\n if (filterNonDefaultQuads) {\n filteredOutput = filteredOutput.filter(quad => quad.graph.termType !== 'DefaultGraph');\n }\n\n // If there are duplicate variables in the search pattern,\n // make sure that we filter out the triples that don't have equal values for those triple elements,\n // as the rdf-resolve-quad-pattern bus ignores variable names.\n if (duplicateElementLinks) {\n filteredOutput = filteredOutput.filter((quad) => {\n for (const keyLeft in duplicateElementLinks) {\n const keysLeft: QuadTermName[] = <QuadTermName[]> keyLeft.split('_');\n const valueLeft = getValueNestedPath(quad, keysLeft);\n for (const keysRight of duplicateElementLinks[keyLeft]) {\n if (!valueLeft.equals(getValueNestedPath(quad, keysRight))) {\n return false;\n }\n }\n }\n return true;\n });\n }\n\n // Wrap it in a ClosableIterator, so we can propagate destroy calls\n const it = new ClosableIterator(filteredOutput.map<RDF.Bindings>(quad => bindingsFactory\n .bindings(Object.keys(elementVariables).map((key) => {\n const keys: QuadTermName[] = <any>key.split('_');\n const variable = elementVariables[key];\n const term = getValueNestedPath(quad, keys);\n return [ DF.variable(variable), term ];\n }))), {\n onClose: () => quads.destroy(),\n });\n\n // Set the metadata property\n setMetadata(it, quads, elementVariables, variables, filterNonDefaultQuads || Boolean(duplicateElementLinks));\n\n return it;\n}\n\n/**\n * Check if a term is a variable.\n * @param {RDF.Term} term An RDF term.\n * @return {any} If the term is a variable or blank node.\n */\nexport function isTermVariable(term: RDF.Term): term is RDF.Variable {\n return term.termType === 'Variable';\n}\n\n/**\n * Get all variables in the given pattern.\n * No duplicates are returned.\n * @param {RDF.BaseQuad} pattern A quad pattern.\n */\nexport function getVariables(pattern: RDF.BaseQuad): RDF.Variable[] {\n return uniqTerms(getTermsNested(pattern).filter(isTermVariable));\n}\n\n/**\n * A helper function to find a hash with quad elements that have duplicate variables.\n *\n * @param {RDF.Quad} pattern A quad pattern.\n *\n * @return {{[p: string]: string[]}} If no equal variable names are present in the four terms, this returns undefined.\n * Otherwise, this maps quad elements paths (['subject'], ['predicate'], ['object'],\n * ['graph'])\n * to the list of quad elements it shares a variable name with.\n * For quoted triples, paths such as ['subject', 'object'] may occur.\n * If no links for a certain element exist, this element will\n * not be included in the hash.\n * Note 1: Quad elements will never have a link to themselves.\n * So this can never occur: { subject: [[ 'subject']] },\n * instead 'null' would be returned.\n * Note 2: Links only exist in one direction,\n * this means that { subject: [[ 'predicate']], predicate: [[ 'subject' ]] }\n * will not occur, instead only { subject: [[ 'predicate']] }\n * will be returned.\n * Note 3: Keys can also be paths, but they are delimited by '_', such as:\n * { subject_object_subject: [[ 'predicate']] }\n */\nexport function getDuplicateElementLinks(pattern: RDF.BaseQuad): Record<string, QuadTermName[][]> | undefined {\n // Collect a variable to quad elements mapping.\n const variableElements: Record<string, QuadTermName[][]> = {};\n let duplicateVariables = false;\n forEachTermsNested(pattern, (value, keys) => {\n if (value.termType === 'Variable') {\n const val = termToString(value);\n const length = (variableElements[val] || (variableElements[val] = [])).push(keys);\n duplicateVariables = duplicateVariables || length > 1;\n }\n });\n\n if (!duplicateVariables) {\n return;\n }\n\n // Collect quad element to elements with equal variables mapping.\n const duplicateElementLinks: Record<string, QuadTermName[][]> = {};\n for (const variable in variableElements) {\n const elements = variableElements[variable];\n const remainingElements = elements.slice(1);\n // Only store the elements that have at least one equal element.\n if (remainingElements.length > 0) {\n duplicateElementLinks[elements[0].join('_')] = remainingElements;\n }\n }\n\n return duplicateElementLinks;\n}\n\n/**\n * Set the metadata of the bindings stream derived from the metadata of the quads stream.\n *\n * @param {BindingsStream} bindings The bindings stream that will receive the metadata property.\n * @param {AsyncIterator<Quad>} quads The quads stream that is guaranteed to emit the metadata property.\n * @param elementVariables Mapping of quad term name to variable name.\n * @param variables Variables to include in the metadata\n * @param forceEstimateCardinality Set the cardinality to estimate\n * @return {() => Promise<{[p: string]: any}>} A lazy promise behind a callback resolving to a metadata object.\n */\nexport function setMetadata(\n bindings: BindingsStream,\n quads: AsyncIterator<RDF.Quad>,\n elementVariables: Record<string, string>,\n variables: RDF.Variable[],\n forceEstimateCardinality: boolean,\n): void {\n const getMetadataCb = (metadataRaw: Record<string, any>): void => {\n if (!('canContainUndefs' in metadataRaw)) {\n metadataRaw.canContainUndefs = false;\n }\n if (forceEstimateCardinality) {\n metadataRaw.cardinality.type = 'estimate';\n }\n bindings.setProperty(\n 'metadata',\n quadsMetadataToBindingsMetadata(validateMetadataQuads(metadataRaw), elementVariables, variables),\n );\n\n // Propagate metadata invalidations\n if (metadataRaw.state) {\n metadataRaw.state.addInvalidateListener(() => {\n setMetadata(bindings, quads, elementVariables, variables, forceEstimateCardinality);\n });\n }\n };\n\n const metadata = quads.getProperty('metadata');\n if (metadata) {\n // This is to enforce sync metadata setting, because AsyncIterator will always call it async,\n // even if the property was already defined.\n getMetadataCb(metadata);\n } else {\n quads.getProperty('metadata', getMetadataCb);\n }\n}\n\n/**\n * Convert the metadata of quads to the metadata of bindings.\n * @param metadataQuads Quads metadata.\n * @param elementVariables A mapping from quad elements to variables.\n * @param variables The variables in the bindings.\n */\nexport function quadsMetadataToBindingsMetadata(\n metadataQuads: MetadataQuads,\n elementVariables: Record<string, string>,\n variables: RDF.Variable[],\n): MetadataBindings {\n return {\n ...metadataQuads,\n canContainUndefs: false,\n order: metadataQuads.order ?\n quadsOrderToBindingsOrder(metadataQuads.order, elementVariables) :\n undefined,\n availableOrders: metadataQuads.availableOrders ?\n metadataQuads.availableOrders.map(orderDef => ({\n cost: orderDef.cost,\n terms: quadsOrderToBindingsOrder(orderDef.terms, elementVariables),\n })) :\n undefined,\n variables,\n };\n}\n\n/**\n * Convert the quads order metadata element to a bindings order metadata element.\n * @param quadsOrder Quads order.\n * @param elementVariables A mapping from quad elements to variables.\n */\nexport function quadsOrderToBindingsOrder(\n quadsOrder: TermsOrder<RDF.QuadTermName>,\n elementVariables: Record<string, string>,\n): TermsOrder<RDF.Variable> {\n const mappedVariables: Record<string, boolean> = {};\n return <TermsOrder<RDF.Variable>> quadsOrder.map((entry) => {\n // Omit entries that do not map to a variable\n const variableName = elementVariables[entry.term];\n if (!variableName) {\n // eslint-disable-next-line array-callback-return\n return;\n }\n\n // Omit entries that have been mapped already\n if (mappedVariables[variableName]) {\n // eslint-disable-next-line array-callback-return\n return;\n }\n\n mappedVariables[variableName] = true;\n return {\n term: DF.variable(variableName),\n direction: entry.direction,\n };\n }).filter(Boolean);\n}\n\n/**\n * Perform post-match-filtering if the source does not support quoted triple filtering,\n * but we have a variable inside a quoted triple.\n * @param pattern The current quad pattern operation.\n * @param it The iterator to filter.\n */\nexport function filterMatchingQuotedQuads(pattern: RDF.BaseQuad, it: AsyncIterator<RDF.Quad>): AsyncIterator<RDF.Quad> {\n if (someTerms(pattern, term => term.termType === 'Quad')) {\n it = it.filter(quad => matchPatternMappings(quad, pattern));\n }\n return it;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["Utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BindingsStream, ComunicaDataFactory, MetadataBindings, MetadataQuads, TermsOrder } from '@comunica/types';\nimport type { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { ClosableIterator } from '@comunica/utils-iterator';\nimport { validateMetadataQuads } from '@comunica/utils-metadata';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { termToString } from 'rdf-string';\nimport type { QuadTermName } from 'rdf-terms';\nimport {\n forEachTermsNested,\n getTermsNested,\n getValueNestedPath,\n reduceTermsNested,\n someTerms,\n uniqTerms,\n} from 'rdf-terms';\nimport { matchPatternMappings } from 'rdf-terms/lib/QuadTermUtil';\nimport type { Algebra } from 'sparqlalgebrajs';\n\n/**\n * Convert an iterator of quads to an iterator of bindings.\n * @param quads The quads to convert.\n * @param pattern The pattern to get variables from to determine bindings.\n * All quads are also assumed to match the pattern.\n * @param dataFactory The data factory.\n * @param bindingsFactory The factory for creating bindings.\n * @param unionDefaultGraph If union default graph mode is enabled.\n * If true, variable graphs will match all graphs, including the default graph.\n * If false, variable graphs will only match named graphs, and not the default graph.\n */\nexport function quadsToBindings(\n quads: AsyncIterator<RDF.Quad>,\n pattern: Algebra.Pattern,\n dataFactory: ComunicaDataFactory,\n bindingsFactory: BindingsFactory,\n unionDefaultGraph: boolean,\n): BindingsStream {\n const variables = getVariables(pattern);\n\n // If non-default-graph triples need to be filtered out\n const filterNonDefaultQuads = pattern.graph.termType === 'Variable' && !unionDefaultGraph;\n\n // Detect duplicate variables in the pattern\n const duplicateElementLinks: Record<string, QuadTermName[][]> | undefined = getDuplicateElementLinks(pattern);\n\n // Convenience datastructure for mapping quad elements to variables\n const elementVariables: Record<string, string> = reduceTermsNested(\n pattern,\n (acc: Record<string, string>, term: RDF.Term, keys: QuadTermName[]) => {\n if (term.termType === 'Variable') {\n acc[keys.join('_')] = term.value;\n }\n return acc;\n },\n {},\n );\n\n // Optionally filter, and construct bindings\n let filteredOutput = quads;\n\n // SPARQL query semantics allow graph variables to only match with named graphs, excluding the default graph\n // But this is not the case when using union default graph semantics\n if (filterNonDefaultQuads) {\n filteredOutput = filteredOutput.filter(quad => quad.graph.termType !== 'DefaultGraph');\n }\n\n // If there are duplicate variables in the search pattern,\n // make sure that we filter out the triples that don't have equal values for those triple elements,\n // as the rdf-resolve-quad-pattern bus ignores variable names.\n if (duplicateElementLinks) {\n filteredOutput = filteredOutput.filter((quad) => {\n for (const keyLeft in duplicateElementLinks) {\n const keysLeft: QuadTermName[] = <QuadTermName[]> keyLeft.split('_');\n const valueLeft = getValueNestedPath(quad, keysLeft);\n for (const keysRight of duplicateElementLinks[keyLeft]) {\n if (!valueLeft.equals(getValueNestedPath(quad, keysRight))) {\n return false;\n }\n }\n }\n return true;\n });\n }\n\n // Wrap it in a ClosableIterator, so we can propagate destroy calls\n const it = new ClosableIterator(filteredOutput.map<RDF.Bindings>(quad => bindingsFactory\n .bindings(Object.keys(elementVariables).map((key) => {\n const keys: QuadTermName[] = <any>key.split('_');\n const variable = elementVariables[key];\n const term = getValueNestedPath(quad, keys);\n return [ dataFactory.variable(variable), term ];\n }))), {\n onClose: () => quads.destroy(),\n });\n\n // Set the metadata property\n setMetadata(\n dataFactory,\n it,\n quads,\n elementVariables,\n variables,\n filterNonDefaultQuads || Boolean(duplicateElementLinks),\n );\n\n return it;\n}\n\n/**\n * Check if a term is a variable.\n * @param {RDF.Term} term An RDF term.\n * @return {any} If the term is a variable or blank node.\n */\nexport function isTermVariable(term: RDF.Term): term is RDF.Variable {\n return term.termType === 'Variable';\n}\n\n/**\n * Get all variables in the given pattern.\n * No duplicates are returned.\n * @param {RDF.BaseQuad} pattern A quad pattern.\n */\nexport function getVariables(pattern: RDF.BaseQuad): RDF.Variable[] {\n return uniqTerms(getTermsNested(pattern).filter(isTermVariable));\n}\n\n/**\n * A helper function to find a hash with quad elements that have duplicate variables.\n *\n * @param {RDF.Quad} pattern A quad pattern.\n *\n * @return {{[p: string]: string[]}} If no equal variable names are present in the four terms, this returns undefined.\n * Otherwise, this maps quad elements paths (['subject'], ['predicate'], ['object'],\n * ['graph'])\n * to the list of quad elements it shares a variable name with.\n * For quoted triples, paths such as ['subject', 'object'] may occur.\n * If no links for a certain element exist, this element will\n * not be included in the hash.\n * Note 1: Quad elements will never have a link to themselves.\n * So this can never occur: { subject: [[ 'subject']] },\n * instead 'null' would be returned.\n * Note 2: Links only exist in one direction,\n * this means that { subject: [[ 'predicate']], predicate: [[ 'subject' ]] }\n * will not occur, instead only { subject: [[ 'predicate']] }\n * will be returned.\n * Note 3: Keys can also be paths, but they are delimited by '_', such as:\n * { subject_object_subject: [[ 'predicate']] }\n */\nexport function getDuplicateElementLinks(pattern: RDF.BaseQuad): Record<string, QuadTermName[][]> | undefined {\n // Collect a variable to quad elements mapping.\n const variableElements: Record<string, QuadTermName[][]> = {};\n let duplicateVariables = false;\n forEachTermsNested(pattern, (value, keys) => {\n if (value.termType === 'Variable') {\n const val = termToString(value);\n const length = (variableElements[val] || (variableElements[val] = [])).push(keys);\n duplicateVariables = duplicateVariables || length > 1;\n }\n });\n\n if (!duplicateVariables) {\n return;\n }\n\n // Collect quad element to elements with equal variables mapping.\n const duplicateElementLinks: Record<string, QuadTermName[][]> = {};\n for (const variable in variableElements) {\n const elements = variableElements[variable];\n const remainingElements = elements.slice(1);\n // Only store the elements that have at least one equal element.\n if (remainingElements.length > 0) {\n duplicateElementLinks[elements[0].join('_')] = remainingElements;\n }\n }\n\n return duplicateElementLinks;\n}\n\n/**\n * Set the metadata of the bindings stream derived from the metadata of the quads stream.\n * @param dataFactory The data factory.\n * @param {BindingsStream} bindings The bindings stream that will receive the metadata property.\n * @param {AsyncIterator<Quad>} quads The quads stream that is guaranteed to emit the metadata property.\n * @param elementVariables Mapping of quad term name to variable name.\n * @param variables Variables to include in the metadata\n * @param forceEstimateCardinality Set the cardinality to estimate\n * @return {() => Promise<{[p: string]: any}>} A lazy promise behind a callback resolving to a metadata object.\n */\nexport function setMetadata(\n dataFactory: ComunicaDataFactory,\n bindings: BindingsStream,\n quads: AsyncIterator<RDF.Quad>,\n elementVariables: Record<string, string>,\n variables: RDF.Variable[],\n forceEstimateCardinality: boolean,\n): void {\n const getMetadataCb = (metadataRaw: Record<string, any>): void => {\n if (forceEstimateCardinality) {\n metadataRaw.cardinality.type = 'estimate';\n }\n bindings.setProperty(\n 'metadata',\n quadsMetadataToBindingsMetadata(dataFactory, validateMetadataQuads(metadataRaw), elementVariables, variables),\n );\n\n // Propagate metadata invalidations\n if (metadataRaw.state) {\n metadataRaw.state.addInvalidateListener(() => {\n setMetadata(dataFactory, bindings, quads, elementVariables, variables, forceEstimateCardinality);\n });\n }\n };\n\n const metadata = quads.getProperty('metadata');\n if (metadata) {\n // This is to enforce sync metadata setting, because AsyncIterator will always call it async,\n // even if the property was already defined.\n getMetadataCb(metadata);\n } else {\n quads.getProperty('metadata', getMetadataCb);\n }\n}\n\n/**\n * Convert the metadata of quads to the metadata of bindings.\n * @param dataFactory The data factory.\n * @param metadataQuads Quads metadata.\n * @param elementVariables A mapping from quad elements to variables.\n * @param variables The variables in the bindings.\n */\nexport function quadsMetadataToBindingsMetadata(\n dataFactory: ComunicaDataFactory,\n metadataQuads: MetadataQuads,\n elementVariables: Record<string, string>,\n variables: RDF.Variable[],\n): MetadataBindings {\n return {\n ...metadataQuads,\n order: metadataQuads.order ?\n quadsOrderToBindingsOrder(dataFactory, metadataQuads.order, elementVariables) :\n undefined,\n availableOrders: metadataQuads.availableOrders ?\n metadataQuads.availableOrders.map(orderDef => ({\n cost: orderDef.cost,\n terms: quadsOrderToBindingsOrder(dataFactory, orderDef.terms, elementVariables),\n })) :\n undefined,\n variables: variables.map(variable => ({ variable, canBeUndef: false })),\n };\n}\n\n/**\n * Convert the quads order metadata element to a bindings order metadata element.\n * @param dataFactory The data factory.\n * @param quadsOrder Quads order.\n * @param elementVariables A mapping from quad elements to variables.\n */\nexport function quadsOrderToBindingsOrder(\n dataFactory: ComunicaDataFactory,\n quadsOrder: TermsOrder<RDF.QuadTermName>,\n elementVariables: Record<string, string>,\n): TermsOrder<RDF.Variable> {\n const mappedVariables: Record<string, boolean> = {};\n return <TermsOrder<RDF.Variable>> quadsOrder.map((entry) => {\n // Omit entries that do not map to a variable\n const variableName = elementVariables[entry.term];\n if (!variableName) {\n // eslint-disable-next-line array-callback-return\n return;\n }\n\n // Omit entries that have been mapped already\n if (mappedVariables[variableName]) {\n // eslint-disable-next-line array-callback-return\n return;\n }\n\n mappedVariables[variableName] = true;\n return {\n term: dataFactory.variable(variableName),\n direction: entry.direction,\n };\n }).filter(Boolean);\n}\n\n/**\n * Perform post-match-filtering if the source does not support quoted triple filtering,\n * but we have a variable inside a quoted triple.\n * @param pattern The current quad pattern operation.\n * @param it The iterator to filter.\n */\nexport function filterMatchingQuotedQuads(pattern: RDF.BaseQuad, it: AsyncIterator<RDF.Quad>): AsyncIterator<RDF.Quad> {\n if (someTerms(pattern, term => term.termType === 'Quad')) {\n it = it.filter(quad => matchPatternMappings(quad, pattern));\n }\n return it;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comunica/bus-query-source-identify",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "A comunica bus for query-source-identify events.",
|
|
5
5
|
"lsd:module": true,
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"funding": {
|
|
8
|
+
"type": "opencollective",
|
|
9
|
+
"url": "https://opencollective.com/comunica-association"
|
|
10
|
+
},
|
|
7
11
|
"homepage": "https://comunica.dev/",
|
|
8
12
|
"repository": {
|
|
9
13
|
"type": "git",
|
|
@@ -36,17 +40,16 @@
|
|
|
36
40
|
"build:components": "componentsjs-generator"
|
|
37
41
|
},
|
|
38
42
|
"dependencies": {
|
|
39
|
-
"@comunica/
|
|
40
|
-
"@comunica/
|
|
41
|
-
"@comunica/
|
|
42
|
-
"@comunica/
|
|
43
|
-
"@comunica/
|
|
43
|
+
"@comunica/core": "^4.0.1",
|
|
44
|
+
"@comunica/types": "^4.0.1",
|
|
45
|
+
"@comunica/utils-bindings-factory": "^4.0.1",
|
|
46
|
+
"@comunica/utils-iterator": "^4.0.1",
|
|
47
|
+
"@comunica/utils-metadata": "^4.0.1",
|
|
44
48
|
"@rdfjs/types": "*",
|
|
45
49
|
"asynciterator": "^3.9.0",
|
|
46
|
-
"rdf-data-factory": "^1.1.2",
|
|
47
50
|
"rdf-string": "^1.6.3",
|
|
48
51
|
"rdf-terms": "^1.11.0",
|
|
49
|
-
"sparqlalgebrajs": "^4.3.
|
|
52
|
+
"sparqlalgebrajs": "^4.3.8"
|
|
50
53
|
},
|
|
51
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "67831ba79e45ea1ced41fe3f83c5d6e8802dbeaa"
|
|
52
55
|
}
|