@comunica/actor-rdf-join-optional-hash 3.2.2 → 3.2.4-alpha.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -58,6 +58,10 @@
58
58
  {
59
59
  "@type": "ParameterRangeGenericTypeReference",
60
60
  "parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
61
+ },
62
+ {
63
+ "@type": "ParameterRangeGenericTypeReference",
64
+ "parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
61
65
  }
62
66
  ]
63
67
  },
@@ -72,6 +76,10 @@
72
76
  {
73
77
  "@type": "ParameterRangeGenericTypeReference",
74
78
  "parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
79
+ },
80
+ {
81
+ "@type": "ParameterRangeGenericTypeReference",
82
+ "parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
75
83
  }
76
84
  ]
77
85
  },
@@ -81,6 +89,20 @@
81
89
  },
82
90
  "comment": "The bus this actor subscribes to."
83
91
  },
92
+ {
93
+ "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_busFailMessage",
94
+ "range": {
95
+ "@type": "ParameterRangeUnion",
96
+ "parameterRangeElements": [
97
+ "xsd:string",
98
+ {
99
+ "@type": "ParameterRangeUndefined"
100
+ }
101
+ ]
102
+ },
103
+ "default": "RDF joining failed: none of the configured actors were able to handle the join type ${action.type}",
104
+ "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}\""
105
+ },
84
106
  {
85
107
  "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_beforeActors",
86
108
  "range": {
@@ -103,6 +125,10 @@
103
125
  {
104
126
  "@type": "ParameterRangeGenericTypeReference",
105
127
  "parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
128
+ },
129
+ {
130
+ "@type": "ParameterRangeGenericTypeReference",
131
+ "parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^3.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
106
132
  }
107
133
  ]
108
134
  }
@@ -171,6 +197,12 @@
171
197
  "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_bus"
172
198
  }
173
199
  },
200
+ {
201
+ "keyRaw": "busFailMessage",
202
+ "value": {
203
+ "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_busFailMessage"
204
+ }
205
+ },
174
206
  {
175
207
  "keyRaw": "beforeActors",
176
208
  "value": {
@@ -23,6 +23,9 @@
23
23
  "args_bus": {
24
24
  "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_bus"
25
25
  },
26
+ "args_busFailMessage": {
27
+ "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_busFailMessage"
28
+ },
26
29
  "args_beforeActors": {
27
30
  "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_beforeActors",
28
31
  "@container": "@list"
@@ -42,6 +45,9 @@
42
45
  "bus": {
43
46
  "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_bus"
44
47
  },
48
+ "busFailMessage": {
49
+ "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_busFailMessage"
50
+ },
45
51
  "beforeActors": {
46
52
  "@id": "carjoh:components/ActorRdfJoinOptionalHash.jsonld#ActorRdfJoinOptionalHash_args_beforeActors",
47
53
  "@container": "@list"
@@ -1,18 +1,18 @@
1
1
  import { ActorRdfJoin } from '@comunica/bus-rdf-join';
2
- import type { IActionRdfJoin, IActorRdfJoinArgs, IActorRdfJoinOutputInner } from '@comunica/bus-rdf-join';
2
+ import type { IActionRdfJoin, IActorRdfJoinArgs, IActorRdfJoinOutputInner, IActorRdfJoinTestSideData } from '@comunica/bus-rdf-join';
3
+ import type { TestResult } from '@comunica/core';
3
4
  import type { IMediatorTypeJoinCoefficients } from '@comunica/mediatortype-join-coefficients';
4
- import type { MetadataBindings } from '@comunica/types';
5
- import type * as RDF from '@rdfjs/types';
6
- import type { IBindingsIndex } from './IBindingsIndex';
5
+ import type { MetadataVariable } from '@comunica/types';
6
+ import type { IBindingsIndex } from '@comunica/utils-bindings-index';
7
7
  /**
8
8
  * A comunica Optional Hash RDF Join Actor.
9
9
  */
10
10
  export declare class ActorRdfJoinOptionalHash extends ActorRdfJoin {
11
11
  private readonly blocking;
12
12
  constructor(args: IActorRdfJoinOptionalHashArgs);
13
- static constructIndex<V>(undef: boolean, commonVariables: RDF.Variable[]): IBindingsIndex<V>;
13
+ static constructIndex<V>(undef: boolean, commonVariables: MetadataVariable[]): IBindingsIndex<V>;
14
14
  getOutput(action: IActionRdfJoin): Promise<IActorRdfJoinOutputInner>;
15
- protected getJoinCoefficients(action: IActionRdfJoin, metadatas: MetadataBindings[]): Promise<IMediatorTypeJoinCoefficients>;
15
+ protected getJoinCoefficients(action: IActionRdfJoin, sideData: IActorRdfJoinTestSideData): Promise<TestResult<IMediatorTypeJoinCoefficients, IActorRdfJoinTestSideData>>;
16
16
  }
17
17
  export interface IActorRdfJoinOptionalHashArgs extends IActorRdfJoinArgs {
18
18
  /**
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ActorRdfJoinOptionalHash = void 0;
4
- const bus_query_operation_1 = require("@comunica/bus-query-operation");
5
4
  const bus_rdf_join_1 = require("@comunica/bus-rdf-join");
5
+ const core_1 = require("@comunica/core");
6
+ const utils_bindings_factory_1 = require("@comunica/utils-bindings-factory");
7
+ const utils_bindings_index_1 = require("@comunica/utils-bindings-index");
8
+ const utils_iterator_1 = require("@comunica/utils-iterator");
6
9
  const asynciterator_1 = require("asynciterator");
7
10
  const rdf_string_1 = require("rdf-string");
8
- const BindingsIndexDef_1 = require("./BindingsIndexDef");
9
- const BindingsIndexUndef_1 = require("./BindingsIndexUndef");
10
11
  /**
11
12
  * A comunica Optional Hash RDF Join Actor.
12
13
  */
@@ -22,8 +23,8 @@ class ActorRdfJoinOptionalHash extends bus_rdf_join_1.ActorRdfJoin {
22
23
  }
23
24
  static constructIndex(undef, commonVariables) {
24
25
  return undef ?
25
- new BindingsIndexUndef_1.BindingsIndexUndef(commonVariables, (term) => term && term.termType !== 'Variable' ? (0, rdf_string_1.termToString)(term) : '') :
26
- new BindingsIndexDef_1.BindingsIndexDef(commonVariables, bus_rdf_join_1.ActorRdfJoin.hashNonClashing);
26
+ new utils_bindings_index_1.BindingsIndexUndef(commonVariables, (term) => term && term.termType !== 'Variable' ? (0, rdf_string_1.termToString)(term) : '', true) :
27
+ new utils_bindings_index_1.BindingsIndexDef(commonVariables, utils_bindings_factory_1.bindingsToCompactString);
27
28
  }
28
29
  async getOutput(action) {
29
30
  const buffer = action.entries[1].output;
@@ -33,13 +34,13 @@ class ActorRdfJoinOptionalHash extends bus_rdf_join_1.ActorRdfJoin {
33
34
  let bindingsStream;
34
35
  if (this.blocking) {
35
36
  // -- Blocking optional ---
36
- bindingsStream = new bus_query_operation_1.ClosableTransformIterator(async () => {
37
+ bindingsStream = new utils_iterator_1.ClosableTransformIterator(async () => {
37
38
  // We index all bindings from the right-hand OPTIONAL iterator first in a blocking manner.
38
39
  const index = ActorRdfJoinOptionalHash
39
40
  .constructIndex(this.canHandleUndefs, commonVariables);
40
41
  await new Promise((resolve) => {
41
42
  buffer.bindingsStream.on('data', (bindings) => {
42
- const iterator = index.getFirst(bindings) ?? index.put(bindings, []);
43
+ const iterator = index.getFirst(bindings, true) ?? index.put(bindings, []);
43
44
  iterator.push(bindings);
44
45
  });
45
46
  buffer.bindingsStream.on('end', resolve);
@@ -66,14 +67,14 @@ class ActorRdfJoinOptionalHash extends bus_rdf_join_1.ActorRdfJoin {
66
67
  else {
67
68
  // -- Non-blocking optional ---
68
69
  // This can be slightly slower than the blocking one above, due to the streaming overhead.
69
- bindingsStream = new bus_query_operation_1.ClosableTransformIterator(async () => {
70
+ bindingsStream = new utils_iterator_1.ClosableTransformIterator(async () => {
70
71
  // We index all bindings from the right-hand OPTIONAL iterator.
71
72
  // They are indexed with iterator values, so our main stream can already get started.
72
73
  const index = ActorRdfJoinOptionalHash
73
74
  .constructIndex(this.canHandleUndefs, commonVariables);
74
75
  let indexActive = true;
75
76
  buffer.bindingsStream.on('data', (bindings) => {
76
- const iterator = index.getFirst(bindings) ??
77
+ const iterator = index.getFirst(bindings, true) ??
77
78
  index.put(bindings, new asynciterator_1.BufferedIterator({ autoStart: false }));
78
79
  iterator._push(bindings);
79
80
  });
@@ -121,11 +122,12 @@ class ActorRdfJoinOptionalHash extends bus_rdf_join_1.ActorRdfJoin {
121
122
  result: {
122
123
  type: 'bindings',
123
124
  bindingsStream,
124
- metadata: async () => await this.constructResultMetadata(action.entries, await bus_rdf_join_1.ActorRdfJoin.getMetadatas(action.entries), action.context, { canContainUndefs: true }, true),
125
+ metadata: async () => await this.constructResultMetadata(action.entries, metadatas, action.context, {}, true),
125
126
  },
126
127
  };
127
128
  }
128
- async getJoinCoefficients(action, metadatas) {
129
+ async getJoinCoefficients(action, sideData) {
130
+ const { metadatas } = sideData;
129
131
  const requestInitialTimes = bus_rdf_join_1.ActorRdfJoin.getRequestInitialTimes(metadatas);
130
132
  const requestItemTimes = bus_rdf_join_1.ActorRdfJoin.getRequestItemTimes(metadatas);
131
133
  let iterations = metadatas[0].cardinality.value + metadatas[1].cardinality.value;
@@ -137,13 +139,13 @@ class ActorRdfJoinOptionalHash extends bus_rdf_join_1.ActorRdfJoin {
137
139
  // Our blocking implementation is slightly more performant.
138
140
  iterations *= 0.9;
139
141
  }
140
- return {
142
+ return (0, core_1.passTestWithSideData)({
141
143
  iterations,
142
144
  persistedItems: metadatas[0].cardinality.value,
143
145
  blockingItems: this.blocking ? metadatas[0].cardinality.value : 0,
144
146
  requestTime: requestInitialTimes[0] + metadatas[0].cardinality.value * requestItemTimes[0] +
145
147
  requestInitialTimes[1] + metadatas[1].cardinality.value * requestItemTimes[1],
146
- };
148
+ }, sideData);
147
149
  }
148
150
  }
149
151
  exports.ActorRdfJoinOptionalHash = ActorRdfJoinOptionalHash;
@@ -1 +1 @@
1
- {"version":3,"file":"ActorRdfJoinOptionalHash.js","sourceRoot":"","sources":["ActorRdfJoinOptionalHash.ts"],"names":[],"mappings":"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","sourcesContent":["import { ClosableTransformIterator } from '@comunica/bus-query-operation';\nimport { ActorRdfJoin } from '@comunica/bus-rdf-join';\nimport type {\n IActionRdfJoin,\n IActorRdfJoinArgs,\n IActorRdfJoinOutputInner,\n} from '@comunica/bus-rdf-join';\nimport type { IMediatorTypeJoinCoefficients } from '@comunica/mediatortype-join-coefficients';\nimport type { BindingsStream, MetadataBindings } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { UnionIterator, ArrayIterator, MultiTransformIterator, BufferedIterator } from 'asynciterator';\nimport { termToString } from 'rdf-string';\nimport { BindingsIndexDef } from './BindingsIndexDef';\nimport { BindingsIndexUndef } from './BindingsIndexUndef';\nimport type { IBindingsIndex } from './IBindingsIndex';\n\n/**\n * A comunica Optional Hash RDF Join Actor.\n */\nexport class ActorRdfJoinOptionalHash extends ActorRdfJoin {\n private readonly blocking: boolean;\n\n public constructor(args: IActorRdfJoinOptionalHashArgs) {\n super(args, {\n logicalType: 'optional',\n physicalName: `hash-${args.canHandleUndefs ? 'undef' : 'def'}-${args.blocking ? 'blocking' : 'nonblocking'}`,\n limitEntries: 2,\n canHandleUndefs: args.canHandleUndefs,\n requiresVariableOverlap: true,\n });\n }\n\n public static constructIndex<V>(undef: boolean, commonVariables: RDF.Variable[]): IBindingsIndex<V> {\n return undef ?\n new BindingsIndexUndef(\n commonVariables,\n (term: RDF.Term | undefined) => term && term.termType !== 'Variable' ? termToString(term) : '',\n ) :\n new BindingsIndexDef(commonVariables, ActorRdfJoin.hashNonClashing);\n }\n\n public async getOutput(action: IActionRdfJoin): Promise<IActorRdfJoinOutputInner> {\n const buffer = action.entries[1].output;\n const output = action.entries[0].output;\n\n const metadatas = await ActorRdfJoin.getMetadatas(action.entries);\n const commonVariables: RDF.Variable[] = ActorRdfJoin.overlappingVariables(metadatas);\n\n let bindingsStream: BindingsStream;\n if (this.blocking) {\n // -- Blocking optional ---\n\n bindingsStream = new ClosableTransformIterator(async() => {\n // We index all bindings from the right-hand OPTIONAL iterator first in a blocking manner.\n const index: IBindingsIndex<RDF.Bindings[]> = ActorRdfJoinOptionalHash\n .constructIndex(this.canHandleUndefs, commonVariables);\n await new Promise((resolve) => {\n buffer.bindingsStream.on('data', (bindings) => {\n const iterator = index.getFirst(bindings) ?? index.put(bindings, []);\n iterator.push(bindings);\n });\n buffer.bindingsStream.on('end', resolve);\n buffer.bindingsStream.on('error', (error) => {\n bindingsStream.emit('error', error);\n });\n });\n\n // Start our left-hand iterator and try to join with the index\n return new MultiTransformIterator(\n output.bindingsStream,\n {\n multiTransform: (bindings: RDF.Bindings): AsyncIterator<RDF.Bindings> => new ArrayIterator<RDF.Bindings>(\n <RDF.Bindings[]>(index.get(bindings).flat())\n .map(indexBindings => ActorRdfJoin.joinBindings(bindings, indexBindings))\n .filter(b => b !== null),\n { autoStart: false },\n ),\n optional: true,\n autoStart: false,\n },\n );\n }, {\n autoStart: false,\n onClose() {\n buffer.bindingsStream.destroy();\n output.bindingsStream.destroy();\n },\n });\n } else {\n // -- Non-blocking optional ---\n // This can be slightly slower than the blocking one above, due to the streaming overhead.\n\n bindingsStream = new ClosableTransformIterator(async() => {\n // We index all bindings from the right-hand OPTIONAL iterator.\n // They are indexed with iterator values, so our main stream can already get started.\n const index: IBindingsIndex<BufferedIterator<RDF.Bindings>> = ActorRdfJoinOptionalHash\n .constructIndex(this.canHandleUndefs, commonVariables);\n let indexActive = true;\n buffer.bindingsStream.on('data', (bindings) => {\n const iterator = index.getFirst(bindings) ??\n index.put(bindings, new BufferedIterator<RDF.Bindings>({ autoStart: false }));\n (<any> iterator)._push(bindings);\n });\n buffer.bindingsStream.on('end', () => {\n for (const iterator of index.values()) {\n iterator.close();\n }\n indexActive = false;\n });\n buffer.bindingsStream.on('error', (error) => {\n bindingsStream.emit('error', error);\n });\n\n // Start our left-hand iterator and try to join with the index\n return new MultiTransformIterator(\n output.bindingsStream,\n {\n multiTransform: (bindings: RDF.Bindings): AsyncIterator<RDF.Bindings> => {\n // Find iterators from the index\n let iterators: AsyncIterator<RDF.Bindings>[] = index.get(bindings);\n\n // If no index entry was found, set an empty iterator.\n // If we index has been closed already, don't modify the index, but just use an empty dummy iterator.\n if (iterators.length === 0) {\n if (indexActive) {\n iterators = [ index.put(bindings, new BufferedIterator<RDF.Bindings>({ autoStart: false })) ];\n } else {\n iterators = [];\n }\n }\n\n // Merge all iterators in a single one,\n // and clone each one to make sure we can still use them in the future.\n const iterator = new UnionIterator<RDF.Bindings>(iterators.map(it => it.clone()), { autoStart: false });\n return iterator.map(indexBindings => ActorRdfJoin.joinBindings(bindings, indexBindings));\n },\n optional: true,\n autoStart: false,\n },\n );\n }, {\n autoStart: false,\n onClose() {\n buffer.bindingsStream.destroy();\n output.bindingsStream.destroy();\n },\n });\n }\n\n return {\n result: {\n type: 'bindings',\n bindingsStream,\n metadata: async() => await this.constructResultMetadata(\n action.entries,\n await ActorRdfJoin.getMetadatas(action.entries),\n action.context,\n { canContainUndefs: true },\n true,\n ),\n },\n };\n }\n\n protected async getJoinCoefficients(\n action: IActionRdfJoin,\n metadatas: MetadataBindings[],\n ): Promise<IMediatorTypeJoinCoefficients> {\n const requestInitialTimes = ActorRdfJoin.getRequestInitialTimes(metadatas);\n const requestItemTimes = ActorRdfJoin.getRequestItemTimes(metadatas);\n let iterations = metadatas[0].cardinality.value + metadatas[1].cardinality.value;\n if (!this.canHandleUndefs) {\n // Our non-undef implementation is slightly more performant.\n iterations *= 0.8;\n }\n if (this.blocking) {\n // Our blocking implementation is slightly more performant.\n iterations *= 0.9;\n }\n return {\n iterations,\n persistedItems: metadatas[0].cardinality.value,\n blockingItems: this.blocking ? metadatas[0].cardinality.value : 0,\n requestTime: requestInitialTimes[0] + metadatas[0].cardinality.value * requestItemTimes[0] +\n requestInitialTimes[1] + metadatas[1].cardinality.value * requestItemTimes[1],\n };\n }\n}\n\nexport interface IActorRdfJoinOptionalHashArgs extends IActorRdfJoinArgs {\n /**\n * If this actor can handle undefined values.\n * If false, performance will be slightly better.\n */\n canHandleUndefs: boolean;\n /**\n * If the join will block when collecting the optional stream.\n * If true, performance will be better.\n */\n blocking: boolean;\n}\n"]}
1
+ {"version":3,"file":"ActorRdfJoinOptionalHash.js","sourceRoot":"","sources":["ActorRdfJoinOptionalHash.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActorRdfJoin,\n} from '@comunica/bus-rdf-join';\nimport type {\n IActionRdfJoin,\n IActorRdfJoinArgs,\n IActorRdfJoinOutputInner,\n IActorRdfJoinTestSideData,\n} from '@comunica/bus-rdf-join';\nimport type { TestResult } from '@comunica/core';\nimport { passTestWithSideData } from '@comunica/core';\nimport type { IMediatorTypeJoinCoefficients } from '@comunica/mediatortype-join-coefficients';\nimport type { BindingsStream, MetadataVariable } from '@comunica/types';\nimport { bindingsToCompactString } from '@comunica/utils-bindings-factory';\nimport type { IBindingsIndex } from '@comunica/utils-bindings-index';\nimport { BindingsIndexDef, BindingsIndexUndef } from '@comunica/utils-bindings-index';\nimport { ClosableTransformIterator } from '@comunica/utils-iterator';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { UnionIterator, ArrayIterator, MultiTransformIterator, BufferedIterator } from 'asynciterator';\nimport { termToString } from 'rdf-string';\n\n/**\n * A comunica Optional Hash RDF Join Actor.\n */\nexport class ActorRdfJoinOptionalHash extends ActorRdfJoin {\n private readonly blocking: boolean;\n\n public constructor(args: IActorRdfJoinOptionalHashArgs) {\n super(args, {\n logicalType: 'optional',\n physicalName: `hash-${args.canHandleUndefs ? 'undef' : 'def'}-${args.blocking ? 'blocking' : 'nonblocking'}`,\n limitEntries: 2,\n canHandleUndefs: args.canHandleUndefs,\n requiresVariableOverlap: true,\n });\n }\n\n public static constructIndex<V>(undef: boolean, commonVariables: MetadataVariable[]): IBindingsIndex<V> {\n return undef ?\n new BindingsIndexUndef(\n commonVariables,\n (term: RDF.Term | undefined) => term && term.termType !== 'Variable' ? termToString(term) : '',\n true,\n ) :\n new BindingsIndexDef(commonVariables, bindingsToCompactString);\n }\n\n public async getOutput(action: IActionRdfJoin): Promise<IActorRdfJoinOutputInner> {\n const buffer = action.entries[1].output;\n const output = action.entries[0].output;\n\n const metadatas = await ActorRdfJoin.getMetadatas(action.entries);\n const commonVariables = ActorRdfJoin.overlappingVariables(metadatas);\n\n let bindingsStream: BindingsStream;\n if (this.blocking) {\n // -- Blocking optional ---\n\n bindingsStream = new ClosableTransformIterator(async() => {\n // We index all bindings from the right-hand OPTIONAL iterator first in a blocking manner.\n const index: IBindingsIndex<RDF.Bindings[]> = ActorRdfJoinOptionalHash\n .constructIndex(this.canHandleUndefs, commonVariables);\n await new Promise((resolve) => {\n buffer.bindingsStream.on('data', (bindings) => {\n const iterator = index.getFirst(bindings, true) ?? index.put(bindings, []);\n iterator.push(bindings);\n });\n buffer.bindingsStream.on('end', resolve);\n buffer.bindingsStream.on('error', (error) => {\n bindingsStream.emit('error', error);\n });\n });\n\n // Start our left-hand iterator and try to join with the index\n return new MultiTransformIterator(\n output.bindingsStream,\n {\n multiTransform: (bindings: RDF.Bindings): AsyncIterator<RDF.Bindings> => new ArrayIterator<RDF.Bindings>(\n <RDF.Bindings[]>(index.get(bindings).flat())\n .map(indexBindings => ActorRdfJoin.joinBindings(bindings, indexBindings))\n .filter(b => b !== null),\n { autoStart: false },\n ),\n optional: true,\n autoStart: false,\n },\n );\n }, {\n autoStart: false,\n onClose() {\n buffer.bindingsStream.destroy();\n output.bindingsStream.destroy();\n },\n });\n } else {\n // -- Non-blocking optional ---\n // This can be slightly slower than the blocking one above, due to the streaming overhead.\n\n bindingsStream = new ClosableTransformIterator(async() => {\n // We index all bindings from the right-hand OPTIONAL iterator.\n // They are indexed with iterator values, so our main stream can already get started.\n const index: IBindingsIndex<BufferedIterator<RDF.Bindings>> = ActorRdfJoinOptionalHash\n .constructIndex(this.canHandleUndefs, commonVariables);\n let indexActive = true;\n buffer.bindingsStream.on('data', (bindings) => {\n const iterator = index.getFirst(bindings, true) ??\n index.put(bindings, new BufferedIterator<RDF.Bindings>({ autoStart: false }));\n (<any> iterator)._push(bindings);\n });\n buffer.bindingsStream.on('end', () => {\n for (const iterator of index.values()) {\n iterator.close();\n }\n indexActive = false;\n });\n buffer.bindingsStream.on('error', (error) => {\n bindingsStream.emit('error', error);\n });\n\n // Start our left-hand iterator and try to join with the index\n return new MultiTransformIterator(\n output.bindingsStream,\n {\n multiTransform: (bindings: RDF.Bindings): AsyncIterator<RDF.Bindings> => {\n // Find iterators from the index\n let iterators: AsyncIterator<RDF.Bindings>[] = index.get(bindings);\n\n // If no index entry was found, set an empty iterator.\n // If we index has been closed already, don't modify the index, but just use an empty dummy iterator.\n if (iterators.length === 0) {\n if (indexActive) {\n iterators = [ index.put(bindings, new BufferedIterator<RDF.Bindings>({ autoStart: false })) ];\n } else {\n iterators = [];\n }\n }\n\n // Merge all iterators in a single one,\n // and clone each one to make sure we can still use them in the future.\n const iterator = new UnionIterator<RDF.Bindings>(iterators.map(it => it.clone()), { autoStart: false });\n return iterator.map(indexBindings => ActorRdfJoin.joinBindings(bindings, indexBindings));\n },\n optional: true,\n autoStart: false,\n },\n );\n }, {\n autoStart: false,\n onClose() {\n buffer.bindingsStream.destroy();\n output.bindingsStream.destroy();\n },\n });\n }\n\n return {\n result: {\n type: 'bindings',\n bindingsStream,\n metadata: async() => await this.constructResultMetadata(\n action.entries,\n metadatas,\n action.context,\n {},\n true,\n ),\n },\n };\n }\n\n protected async getJoinCoefficients(\n action: IActionRdfJoin,\n sideData: IActorRdfJoinTestSideData,\n ): Promise<TestResult<IMediatorTypeJoinCoefficients, IActorRdfJoinTestSideData>> {\n const { metadatas } = sideData;\n const requestInitialTimes = ActorRdfJoin.getRequestInitialTimes(metadatas);\n const requestItemTimes = ActorRdfJoin.getRequestItemTimes(metadatas);\n let iterations = metadatas[0].cardinality.value + metadatas[1].cardinality.value;\n if (!this.canHandleUndefs) {\n // Our non-undef implementation is slightly more performant.\n iterations *= 0.8;\n }\n if (this.blocking) {\n // Our blocking implementation is slightly more performant.\n iterations *= 0.9;\n }\n return passTestWithSideData({\n iterations,\n persistedItems: metadatas[0].cardinality.value,\n blockingItems: this.blocking ? metadatas[0].cardinality.value : 0,\n requestTime: requestInitialTimes[0] + metadatas[0].cardinality.value * requestItemTimes[0] +\n requestInitialTimes[1] + metadatas[1].cardinality.value * requestItemTimes[1],\n }, sideData);\n }\n}\n\nexport interface IActorRdfJoinOptionalHashArgs extends IActorRdfJoinArgs {\n /**\n * If this actor can handle undefined values.\n * If false, performance will be slightly better.\n */\n canHandleUndefs: boolean;\n /**\n * If the join will block when collecting the optional stream.\n * If true, performance will be better.\n */\n blocking: boolean;\n}\n"]}
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "@comunica/actor-rdf-join-optional-hash",
3
- "version": "3.2.2",
3
+ "version": "3.2.4-alpha.47.0",
4
4
  "description": "A optional-hash rdf-join actor",
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",
@@ -37,13 +41,15 @@
37
41
  "build:components": "componentsjs-generator"
38
42
  },
39
43
  "dependencies": {
40
- "@comunica/bus-query-operation": "^3.2.2",
41
- "@comunica/bus-rdf-join": "^3.2.1",
42
- "@comunica/mediatortype-join-coefficients": "^3.2.1",
43
- "@comunica/types": "^3.2.1",
44
- "@rdfjs/types": "*",
44
+ "@comunica/bus-rdf-join": "3.2.4-alpha.47.0",
45
+ "@comunica/core": "3.2.4-alpha.47.0",
46
+ "@comunica/mediatortype-join-coefficients": "3.2.4-alpha.47.0",
47
+ "@comunica/types": "3.2.4-alpha.47.0",
48
+ "@comunica/utils-bindings-factory": "3.2.4-alpha.47.0",
49
+ "@comunica/utils-bindings-index": "3.2.4-alpha.47.0",
50
+ "@comunica/utils-iterator": "3.2.4-alpha.47.0",
45
51
  "asynciterator": "^3.9.0",
46
52
  "rdf-string": "^1.6.3"
47
53
  },
48
- "gitHead": "fbcc3a81f87738633ddf69ede5ca504236f7edd9"
54
+ "gitHead": "85bd4c5cf07dfc293ebbc3a1416b70e2db8bfc48"
49
55
  }
@@ -1,18 +0,0 @@
1
- import type * as RDF from '@rdfjs/types';
2
- import type { IBindingsIndex } from './IBindingsIndex';
3
- /**
4
- * A simple efficient hash-based index for maintaining bindings,
5
- * and checking whether or not a bindings is contained in this index.
6
- *
7
- * This can not handle bindings with undefined values.
8
- */
9
- export declare class BindingsIndexDef<V> implements IBindingsIndex<V> {
10
- private readonly keys;
11
- private readonly hashFn;
12
- private readonly index;
13
- constructor(keys: RDF.Variable[], hashFn: (term: RDF.Bindings, keys: RDF.Variable[]) => string);
14
- put(bindings: RDF.Bindings, value: V): V;
15
- get(bindings: RDF.Bindings): V[];
16
- getFirst(bindings: RDF.Bindings): V | undefined;
17
- values(): V[];
18
- }
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BindingsIndexDef = void 0;
4
- /**
5
- * A simple efficient hash-based index for maintaining bindings,
6
- * and checking whether or not a bindings is contained in this index.
7
- *
8
- * This can not handle bindings with undefined values.
9
- */
10
- class BindingsIndexDef {
11
- constructor(keys, hashFn) {
12
- this.keys = keys;
13
- this.hashFn = hashFn;
14
- this.index = {};
15
- }
16
- put(bindings, value) {
17
- return this.index[this.hashFn(bindings, this.keys)] = value;
18
- }
19
- get(bindings) {
20
- const v = this.getFirst(bindings);
21
- return v ? [v] : [];
22
- }
23
- getFirst(bindings) {
24
- return this.index[this.hashFn(bindings, this.keys)];
25
- }
26
- values() {
27
- return Object.values(this.index);
28
- }
29
- }
30
- exports.BindingsIndexDef = BindingsIndexDef;
31
- //# sourceMappingURL=BindingsIndexDef.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BindingsIndexDef.js","sourceRoot":"","sources":["BindingsIndexDef.ts"],"names":[],"mappings":";;;AAGA;;;;;GAKG;AACH,MAAa,gBAAgB;IAK3B,YAAmB,IAAoB,EAAE,MAA4D;QACnG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAEM,GAAG,CAAC,QAAsB,EAAE,KAAQ;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IAC9D,CAAC;IAEM,GAAG,CAAC,QAAsB;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,CAAC;IAEM,QAAQ,CAAC,QAAsB;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAEM,MAAM;QACX,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF;AA3BD,4CA2BC","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport type { IBindingsIndex } from './IBindingsIndex';\n\n/**\n * A simple efficient hash-based index for maintaining bindings,\n * and checking whether or not a bindings is contained in this index.\n *\n * This can not handle bindings with undefined values.\n */\nexport class BindingsIndexDef<V> implements IBindingsIndex<V> {\n private readonly keys: RDF.Variable[];\n private readonly hashFn: (term: RDF.Bindings, keys: RDF.Variable[]) => string;\n private readonly index: Record<string, V>;\n\n public constructor(keys: RDF.Variable[], hashFn: (term: RDF.Bindings, keys: RDF.Variable[]) => string) {\n this.keys = keys;\n this.hashFn = hashFn;\n this.index = {};\n }\n\n public put(bindings: RDF.Bindings, value: V): V {\n return this.index[this.hashFn(bindings, this.keys)] = value;\n }\n\n public get(bindings: RDF.Bindings): V[] {\n const v = this.getFirst(bindings);\n return v ? [ v ] : [];\n }\n\n public getFirst(bindings: RDF.Bindings): V | undefined {\n return this.index[this.hashFn(bindings, this.keys)];\n }\n\n public values(): V[] {\n return Object.values(this.index);\n }\n}\n"]}
@@ -1,41 +0,0 @@
1
- import type { Bindings } from '@comunica/types';
2
- import type * as RDF from '@rdfjs/types';
3
- import type { IBindingsIndex } from './IBindingsIndex';
4
- /**
5
- * A simple efficient tree-based index for maintaining bindings,
6
- * and checking whether or not a bindings is contained in this index.
7
- *
8
- * This will consider bindings with a variable term or an undefined term
9
- * as a 'match-all' with other terms.
10
- */
11
- export declare class BindingsIndexUndef<V> implements IBindingsIndex<V> {
12
- private readonly keys;
13
- private readonly data;
14
- private readonly hashFn;
15
- constructor(keys: RDF.Variable[], hashFn: (term: RDF.Term | undefined) => string);
16
- /**
17
- * Add the given bindings to the index.
18
- * @param {Bindings} bindings A bindings.
19
- * @param {V} value The value to put.
20
- */
21
- put(bindings: Bindings, value: V): V;
22
- protected isBindingsValid(bindings: Bindings): boolean;
23
- /**
24
- * Get the value of the given bindings is contained in this index.
25
- * @param {Bindings} bindings A bindings.
26
- * @return {V[]} The values.
27
- */
28
- get(bindings: Bindings): V[];
29
- protected getRecursive(bindings: Bindings | undefined, keys: RDF.Variable[], dataIndexes: IDataIndex<V>[]): V[];
30
- /**
31
- * Get the first value of the given bindings is contained in this index.
32
- * @param {Bindings} bindings A bindings.
33
- * @return {V | undefined} The value.
34
- */
35
- getFirst(bindings: Bindings): V | undefined;
36
- protected getRecursiveFirst(bindings: Bindings, keys: RDF.Variable[], dataIndexes: IDataIndex<V>[]): V | undefined;
37
- values(): V[];
38
- }
39
- export interface IDataIndex<V> {
40
- [key: string]: IDataIndex<V> | V;
41
- }
@@ -1,141 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BindingsIndexUndef = void 0;
4
- /**
5
- * A simple efficient tree-based index for maintaining bindings,
6
- * and checking whether or not a bindings is contained in this index.
7
- *
8
- * This will consider bindings with a variable term or an undefined term
9
- * as a 'match-all' with other terms.
10
- */
11
- class BindingsIndexUndef {
12
- constructor(keys, hashFn) {
13
- this.data = {};
14
- this.keys = keys;
15
- this.hashFn = hashFn;
16
- }
17
- /**
18
- * Add the given bindings to the index.
19
- * @param {Bindings} bindings A bindings.
20
- * @param {V} value The value to put.
21
- */
22
- put(bindings, value) {
23
- if (this.isBindingsValid(bindings)) {
24
- let dataIt = this.data;
25
- for (let i = 0; i < this.keys.length; i++) {
26
- const key = this.keys[i];
27
- const dataKey = this.hashFn(bindings.get(key));
28
- let subDataIt = dataIt[dataKey];
29
- if (!subDataIt) {
30
- subDataIt = dataIt[dataKey] = i === this.keys.length - 1 ? value : {};
31
- }
32
- dataIt = subDataIt;
33
- }
34
- }
35
- return value;
36
- }
37
- isBindingsValid(bindings) {
38
- let validKeys = false;
39
- for (const key of this.keys) {
40
- if (bindings.has(key)) {
41
- validKeys = true;
42
- break;
43
- }
44
- }
45
- return validKeys;
46
- }
47
- /**
48
- * Get the value of the given bindings is contained in this index.
49
- * @param {Bindings} bindings A bindings.
50
- * @return {V[]} The values.
51
- */
52
- get(bindings) {
53
- // Always return undefined if the bindings contain none of the expected keys
54
- if (!this.isBindingsValid(bindings)) {
55
- return [];
56
- }
57
- return this.getRecursive(bindings, this.keys, [this.data]);
58
- }
59
- getRecursive(bindings, keys, dataIndexes) {
60
- if (keys.length === 0) {
61
- return dataIndexes;
62
- }
63
- let key;
64
- // eslint-disable-next-line prefer-const
65
- [key, ...keys] = keys;
66
- const matchingRecursive = [];
67
- for (const data of dataIndexes) {
68
- // If the index contained a variable, all terms will match.
69
- const dataKey = this.hashFn(bindings?.get(key));
70
- if (dataKey) {
71
- // Check the entry for the term, and the variable term.
72
- const subDatas = [data[dataKey], data['']].filter(Boolean);
73
- if (subDatas.length === 0) {
74
- continue;
75
- }
76
- matchingRecursive.push(this.getRecursive(bindings, keys, subDatas));
77
- }
78
- else {
79
- // Iterate over all entries
80
- const subDatas = Object.values(data);
81
- if (subDatas.length === 0) {
82
- continue;
83
- }
84
- matchingRecursive.push(this.getRecursive(bindings, keys, subDatas));
85
- }
86
- }
87
- return matchingRecursive.flat();
88
- }
89
- /**
90
- * Get the first value of the given bindings is contained in this index.
91
- * @param {Bindings} bindings A bindings.
92
- * @return {V | undefined} The value.
93
- */
94
- getFirst(bindings) {
95
- // Always return undefined if the bindings contain none of the expected keys
96
- if (!this.isBindingsValid(bindings)) {
97
- return undefined;
98
- }
99
- return this.getRecursiveFirst(bindings, this.keys, [this.data]);
100
- }
101
- getRecursiveFirst(bindings, keys, dataIndexes) {
102
- if (keys.length === 0) {
103
- return dataIndexes[0];
104
- }
105
- let key;
106
- // eslint-disable-next-line prefer-const
107
- [key, ...keys] = keys;
108
- for (const data of dataIndexes) {
109
- // If the index contained a variable, all terms will match.
110
- const dataKey = this.hashFn(bindings.get(key));
111
- if (dataKey) {
112
- // Check the entry for the term, and the variable term.
113
- const subDatas = [data[dataKey], data['']].filter(Boolean);
114
- if (subDatas.length === 0) {
115
- continue;
116
- }
117
- const ret = this.getRecursiveFirst(bindings, keys, subDatas);
118
- if (ret) {
119
- return ret;
120
- }
121
- }
122
- else {
123
- // Iterate over all entries
124
- const subDatas = Object.values(data);
125
- if (subDatas.length === 0) {
126
- continue;
127
- }
128
- const ret = this.getRecursiveFirst(bindings, keys, subDatas);
129
- if (ret) {
130
- return ret;
131
- }
132
- }
133
- }
134
- return undefined;
135
- }
136
- values() {
137
- return this.keys.length === 0 ? [] : this.getRecursive(undefined, this.keys, [this.data]);
138
- }
139
- }
140
- exports.BindingsIndexUndef = BindingsIndexUndef;
141
- //# sourceMappingURL=BindingsIndexUndef.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BindingsIndexUndef.js","sourceRoot":"","sources":["BindingsIndexUndef.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Bindings } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport type { IBindingsIndex } from './IBindingsIndex';\n\n/**\n * A simple efficient tree-based index for maintaining bindings,\n * and checking whether or not a bindings is contained in this index.\n *\n * This will consider bindings with a variable term or an undefined term\n * as a 'match-all' with other terms.\n */\nexport class BindingsIndexUndef<V> implements IBindingsIndex<V> {\n private readonly keys: RDF.Variable[];\n private readonly data: IDataIndex<V> = {};\n private readonly hashFn: (term: RDF.Term | undefined) => string;\n\n public constructor(keys: RDF.Variable[], hashFn: (term: RDF.Term | undefined) => string) {\n this.keys = keys;\n this.hashFn = hashFn;\n }\n\n /**\n * Add the given bindings to the index.\n * @param {Bindings} bindings A bindings.\n * @param {V} value The value to put.\n */\n public put(bindings: Bindings, value: V): V {\n if (this.isBindingsValid(bindings)) {\n let dataIt: IDataIndex<V> | V = this.data;\n for (let i = 0; i < this.keys.length; i++) {\n const key = this.keys[i];\n const dataKey = this.hashFn(bindings.get(key));\n let subDataIt: IDataIndex<V> | V | undefined = (<IDataIndex<V>> dataIt)[dataKey];\n if (!subDataIt) {\n subDataIt = ((<IDataIndex<V>> dataIt))[dataKey] = i === this.keys.length - 1 ? value : {};\n }\n dataIt = subDataIt;\n }\n }\n return value;\n }\n\n protected isBindingsValid(bindings: Bindings): boolean {\n let validKeys = false;\n for (const key of this.keys) {\n if (bindings.has(key)) {\n validKeys = true;\n break;\n }\n }\n return validKeys;\n }\n\n /**\n * Get the value of the given bindings is contained in this index.\n * @param {Bindings} bindings A bindings.\n * @return {V[]} The values.\n */\n public get(bindings: Bindings): V[] {\n // Always return undefined if the bindings contain none of the expected keys\n if (!this.isBindingsValid(bindings)) {\n return [];\n }\n\n return this.getRecursive(bindings, this.keys, [ this.data ]);\n }\n\n protected getRecursive(bindings: Bindings | undefined, keys: RDF.Variable[], dataIndexes: IDataIndex<V>[]): V[] {\n if (keys.length === 0) {\n return <V[]> dataIndexes;\n }\n\n let key: RDF.Variable;\n // eslint-disable-next-line prefer-const\n [ key, ...keys ] = keys;\n const matchingRecursive: V[][] = [];\n for (const data of dataIndexes) {\n // If the index contained a variable, all terms will match.\n const dataKey = this.hashFn(bindings?.get(key));\n if (dataKey) {\n // Check the entry for the term, and the variable term.\n const subDatas = <IDataIndex<V>[]> [ data[dataKey], data[''] ].filter(Boolean);\n if (subDatas.length === 0) {\n continue;\n }\n matchingRecursive.push(this.getRecursive(bindings, keys, subDatas));\n } else {\n // Iterate over all entries\n const subDatas = <IDataIndex<V>[]> Object.values(data);\n if (subDatas.length === 0) {\n continue;\n }\n matchingRecursive.push(this.getRecursive(bindings, keys, subDatas));\n }\n }\n return matchingRecursive.flat();\n }\n\n /**\n * Get the first value of the given bindings is contained in this index.\n * @param {Bindings} bindings A bindings.\n * @return {V | undefined} The value.\n */\n public getFirst(bindings: Bindings): V | undefined {\n // Always return undefined if the bindings contain none of the expected keys\n if (!this.isBindingsValid(bindings)) {\n return undefined;\n }\n\n return this.getRecursiveFirst(bindings, this.keys, [ this.data ]);\n }\n\n protected getRecursiveFirst(bindings: Bindings, keys: RDF.Variable[], dataIndexes: IDataIndex<V>[]): V | undefined {\n if (keys.length === 0) {\n return <V> dataIndexes[0];\n }\n\n let key: RDF.Variable;\n // eslint-disable-next-line prefer-const\n [ key, ...keys ] = keys;\n for (const data of dataIndexes) {\n // If the index contained a variable, all terms will match.\n const dataKey = this.hashFn(bindings.get(key));\n if (dataKey) {\n // Check the entry for the term, and the variable term.\n const subDatas = <IDataIndex<V>[]> [ data[dataKey], data[''] ].filter(Boolean);\n if (subDatas.length === 0) {\n continue;\n }\n const ret = this.getRecursiveFirst(bindings, keys, subDatas);\n if (ret) {\n return ret;\n }\n } else {\n // Iterate over all entries\n const subDatas = <IDataIndex<V>[]> Object.values(data);\n if (subDatas.length === 0) {\n continue;\n }\n const ret = this.getRecursiveFirst(bindings, keys, subDatas);\n if (ret) {\n return ret;\n }\n }\n }\n return undefined;\n }\n\n public values(): V[] {\n return this.keys.length === 0 ? [] : this.getRecursive(undefined, this.keys, [ this.data ]);\n }\n}\n\nexport interface IDataIndex<V> {\n [key: string]: IDataIndex<V> | V;\n}\n"]}
@@ -1,10 +0,0 @@
1
- import type { Bindings } from '@comunica/types';
2
- /**
3
- * An index for mapping bindings to values.
4
- */
5
- export interface IBindingsIndex<V> {
6
- put: (bindings: Bindings, value: V) => V;
7
- get: (bindings: Bindings) => V[];
8
- getFirst: (bindings: Bindings) => V | undefined;
9
- values: () => V[];
10
- }
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=IBindingsIndex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"IBindingsIndex.js","sourceRoot":"","sources":["IBindingsIndex.ts"],"names":[],"mappings":"","sourcesContent":["import type { Bindings } from '@comunica/types';\n\n/**\n * An index for mapping bindings to values.\n */\nexport interface IBindingsIndex<V> {\n put: (bindings: Bindings, value: V) => V;\n get: (bindings: Bindings) => V[];\n getFirst: (bindings: Bindings) => V | undefined;\n values: () => V[];\n}\n"]}