@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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "@context": [
3
- "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-query-source-identify/^3.0.0/components/context.jsonld",
4
- "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/core/^3.0.0/components/context.jsonld"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
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/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
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.0.0/components/context.jsonld"
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/^3.0.0/",
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 - @defaultNested {<default_bus> a <cc:components/Bus.jsonld#Bus>} bus
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 - @defaultNested {<default_bus> a <cc:components/Bus.jsonld#Bus>} bus
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,YAA8E;IACtF;;OAEG;IACH,YAAmB,IAAmC;QACpD,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACF;AARD,4DAQC","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\n extends Actor<IActionQuerySourceIdentify, IActorTest, IActorQuerySourceIdentifyOutput> {\n /**\n * @param args - @defaultNested {<default_bus> a <cc:components/Bus.jsonld#Bus>} bus\n */\n public constructor(args: IActorQuerySourceIdentifyArgs) {\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 = IActorArgs<\nIActionQuerySourceIdentify,\nIActorTest,\nIActorQuerySourceIdentifyOutput\n>;\n\nexport type MediatorQuerySourceIdentify = Mediate<\nIActionQuerySourceIdentify,\nIActorQuerySourceIdentifyOutput\n>;\n"]}
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 { BindingsFactory } from '@comunica/bindings-factory';
2
- import type { BindingsStream, MetadataBindings, MetadataQuads, TermsOrder } from '@comunica/types';
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 bus_query_operation_1 = require("@comunica/bus-query-operation");
5
- const metadata_1 = require("@comunica/metadata");
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 bus_query_operation_1.ClosableIterator(filteredOutput.map(quad => bindingsFactory
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 [DF.variable(variable), term];
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, metadata_1.validateMetadataQuads)(metadataRaw), elementVariables, variables));
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: DF.variable(variableName),
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.3.0",
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/bindings-factory": "^3.3.0",
40
- "@comunica/bus-query-operation": "^3.3.0",
41
- "@comunica/core": "^3.3.0",
42
- "@comunica/metadata": "^3.3.0",
43
- "@comunica/types": "^3.3.0",
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.7"
52
+ "sparqlalgebrajs": "^4.3.8"
50
53
  },
51
- "gitHead": "02bde397d206f1f5a523643a6a604c89e792e2f9"
54
+ "gitHead": "67831ba79e45ea1ced41fe3f83c5d6e8802dbeaa"
52
55
  }