@comunica/actor-abstract-path 4.4.0 → 4.4.2-alpha.49.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.
@@ -15,7 +15,17 @@
15
15
  "@type": "GenericComponentExtension",
16
16
  "component": "cbqo:components/ActorQueryOperationTypedMediated.jsonld#ActorQueryOperationTypedMediated",
17
17
  "genericTypeInstances": [
18
- "urn:npm:sparqlalgebrajs:Path"
18
+ {
19
+ "@type": "ParameterRangeIntersection",
20
+ "parameterRangeElements": [
21
+ {
22
+ "@type": "ParameterRangeWildcard"
23
+ },
24
+ {
25
+ "@type": "ParameterRangeWildcard"
26
+ }
27
+ ]
28
+ }
19
29
  ]
20
30
  }
21
31
  ],
File without changes
File without changes
@@ -2,12 +2,12 @@ import type { IActorQueryOperationTypedMediatedArgs } from '@comunica/bus-query-
2
2
  import { ActorQueryOperationTypedMediated } from '@comunica/bus-query-operation';
3
3
  import type { IActorTest, TestResult } from '@comunica/core';
4
4
  import type { IQueryOperationResultBindings, Bindings, IActionContext, MetadataBindings, IQuerySourceWrapper, ComunicaDataFactory } from '@comunica/types';
5
+ import { Algebra } from '@comunica/utils-algebra';
6
+ import type { AlgebraFactory } from '@comunica/utils-algebra';
5
7
  import type { BindingsFactory } from '@comunica/utils-bindings-factory';
6
8
  import type * as RDF from '@rdfjs/types';
7
9
  import type { AsyncIterator } from 'asynciterator';
8
10
  import { BufferedIterator } from 'asynciterator';
9
- import type { Factory } from 'sparqlalgebrajs';
10
- import { Algebra } from 'sparqlalgebrajs';
11
11
  /**
12
12
  * An abstract actor that handles Path operations.
13
13
  *
@@ -18,7 +18,7 @@ export declare abstract class ActorAbstractPath extends ActorQueryOperationTyped
18
18
  protected constructor(args: IActorQueryOperationTypedMediatedArgs, predicateType: string);
19
19
  testOperation(operation: Algebra.Path, _context: IActionContext): Promise<TestResult<IActorTest>>;
20
20
  generateVariable(dataFactory: ComunicaDataFactory, path?: Algebra.Path, name?: string): RDF.Variable;
21
- isPathArbitraryLengthDistinct(algebraFactory: Factory, context: IActionContext, path: Algebra.Path): Promise<{
21
+ isPathArbitraryLengthDistinct(algebraFactory: AlgebraFactory, context: IActionContext, path: Algebra.Path): Promise<{
22
22
  context: IActionContext;
23
23
  operation: IQueryOperationResultBindings | undefined;
24
24
  }>;
@@ -36,7 +36,7 @@ export declare abstract class ActorAbstractPath extends ActorQueryOperationTyped
36
36
  * @param bindingsFactory The data factory.
37
37
  * @return {Promise<AsyncIterator<Bindings>} Iterator to where all bindings of query should have been pushed.
38
38
  */
39
- getObjectsPredicateStarEval(subject: RDF.Term, predicate: Algebra.PropertyPathSymbol, object: RDF.Variable, graph: RDF.Term, context: IActionContext, emitFirstSubject: boolean, algebraFactory: Factory, bindingsFactory: BindingsFactory): Promise<IPathResultStream>;
39
+ getObjectsPredicateStarEval(subject: RDF.Term, predicate: Algebra.Operation, object: RDF.Variable, graph: RDF.Term, context: IActionContext, emitFirstSubject: boolean, algebraFactory: AlgebraFactory, bindingsFactory: BindingsFactory): Promise<IPathResultStream>;
40
40
  /**
41
41
  * Pushes all terms to iterator `it` that are a solution of object predicate* ?o.
42
42
  * @param algebraFactory The algebra factory.
@@ -49,7 +49,7 @@ export declare abstract class ActorAbstractPath extends ActorQueryOperationTyped
49
49
  * @param {any} counter Counts how many searches are in progress to close it when needed (when counter == 0).
50
50
  * @return {Promise<IPathResultStream['metadata']>} The results metadata.
51
51
  */
52
- getObjectsPredicateStar(algebraFactory: Factory, object: RDF.Term, predicate: Algebra.PropertyPathSymbol, graph: RDF.Term, context: IActionContext, termHashes: Record<string, RDF.Term>, it: BufferedIterator<RDF.Term>, counter: any): Promise<IPathResultStream['metadata'] | undefined>;
52
+ getObjectsPredicateStar(algebraFactory: AlgebraFactory, object: RDF.Term, predicate: Algebra.Operation, graph: RDF.Term, context: IActionContext, termHashes: Record<string, RDF.Term>, it: BufferedIterator<RDF.Term>, counter: any): Promise<IPathResultStream['metadata'] | undefined>;
53
53
  /**
54
54
  * Pushes all terms to iterator `it` that are a solution of ?s predicate* ?o.
55
55
  * @param {string} subjectVar String representation of subjectVariable
@@ -69,13 +69,13 @@ export declare abstract class ActorAbstractPath extends ActorQueryOperationTyped
69
69
  * @param bindingsFactory The bindings factory.
70
70
  * @return {Promise<void>} All solutions of query should have been pushed to it by then.
71
71
  */
72
- getSubjectAndObjectBindingsPredicateStar(subjectVar: RDF.Variable, objectVar: RDF.Variable, subjectVal: RDF.Term, objectVal: RDF.Term, predicate: Algebra.PropertyPathSymbol, graph: RDF.Term, context: IActionContext, termHashesGlobal: Record<string, Promise<RDF.Term[]>>, termHashesCurrentSubject: Record<string, boolean>, it: BufferedIterator<Bindings>, counter: any, algebraFactory: Factory, bindingsFactory: BindingsFactory): Promise<void>;
72
+ getSubjectAndObjectBindingsPredicateStar(subjectVar: RDF.Variable, objectVar: RDF.Variable, subjectVal: RDF.Term, objectVal: RDF.Term, predicate: Algebra.Operation, graph: RDF.Term, context: IActionContext, termHashesGlobal: Record<string, Promise<RDF.Term[]>>, termHashesCurrentSubject: Record<string, boolean>, it: BufferedIterator<Bindings>, counter: any, algebraFactory: AlgebraFactory, bindingsFactory: BindingsFactory): Promise<void>;
73
73
  /**
74
74
  * Find all sources recursively contained in the given path operation.
75
75
  * @param operation
76
76
  */
77
- getPathSources(operation: Algebra.PropertyPathSymbol): IQuerySourceWrapper[];
78
- assignPatternSources(algebraFactory: Factory, pattern: Algebra.Pattern, sources: IQuerySourceWrapper[]): Algebra.Operation;
77
+ getPathSources(operation: Algebra.Operation): IQuerySourceWrapper[];
78
+ assignPatternSources(algebraFactory: AlgebraFactory, pattern: Algebra.Pattern, sources: IQuerySourceWrapper[]): Algebra.Operation;
79
79
  }
80
80
  export interface IPathResultStream {
81
81
  bindingsStream: AsyncIterator<Bindings>;
@@ -4,10 +4,10 @@ exports.ActorAbstractPath = void 0;
4
4
  const bus_query_operation_1 = require("@comunica/bus-query-operation");
5
5
  const context_entries_1 = require("@comunica/context-entries");
6
6
  const core_1 = require("@comunica/core");
7
+ const utils_algebra_1 = require("@comunica/utils-algebra");
7
8
  const utils_query_operation_1 = require("@comunica/utils-query-operation");
8
9
  const asynciterator_1 = require("asynciterator");
9
10
  const rdf_string_1 = require("rdf-string");
10
- const sparqlalgebrajs_1 = require("sparqlalgebrajs");
11
11
  const PathVariableObjectIterator_1 = require("./PathVariableObjectIterator");
12
12
  /**
13
13
  * An abstract actor that handles Path operations.
@@ -233,25 +233,22 @@ class ActorAbstractPath extends bus_query_operation_1.ActorQueryOperationTypedMe
233
233
  * @param operation
234
234
  */
235
235
  getPathSources(operation) {
236
- switch (operation.type) {
237
- case sparqlalgebrajs_1.Algebra.types.ALT:
238
- case sparqlalgebrajs_1.Algebra.types.SEQ:
239
- return operation.input
240
- .flatMap((subOp) => this.getPathSources(subOp));
241
- case sparqlalgebrajs_1.Algebra.types.INV:
242
- case sparqlalgebrajs_1.Algebra.types.ONE_OR_MORE_PATH:
243
- case sparqlalgebrajs_1.Algebra.types.ZERO_OR_MORE_PATH:
244
- case sparqlalgebrajs_1.Algebra.types.ZERO_OR_ONE_PATH:
245
- return this.getPathSources(operation.path);
246
- case sparqlalgebrajs_1.Algebra.types.LINK:
247
- case sparqlalgebrajs_1.Algebra.types.NPS: {
248
- const source = (0, utils_query_operation_1.getOperationSource)(operation);
249
- if (!source) {
250
- throw new Error(`Could not find a required source on a link path operation`);
251
- }
252
- return [source];
236
+ if ((0, utils_algebra_1.isKnownOperation)(operation, utils_algebra_1.Algebra.Types.ALT) || (0, utils_algebra_1.isKnownOperation)(operation, utils_algebra_1.Algebra.Types.SEQ)) {
237
+ return operation.input.flatMap(subOp => this.getPathSources(subOp));
238
+ }
239
+ if ((0, utils_algebra_1.isKnownOperation)(operation, utils_algebra_1.Algebra.Types.INV) || (0, utils_algebra_1.isKnownOperation)(operation, utils_algebra_1.Algebra.Types.ONE_OR_MORE_PATH) ||
240
+ (0, utils_algebra_1.isKnownOperation)(operation, utils_algebra_1.Algebra.Types.ZERO_OR_MORE_PATH) ||
241
+ (0, utils_algebra_1.isKnownOperation)(operation, utils_algebra_1.Algebra.Types.ZERO_OR_ONE_PATH)) {
242
+ return this.getPathSources(operation.path);
243
+ }
244
+ if ((0, utils_algebra_1.isKnownOperation)(operation, utils_algebra_1.Algebra.Types.LINK) || (0, utils_algebra_1.isKnownOperation)(operation, utils_algebra_1.Algebra.Types.NPS)) {
245
+ const source = (0, utils_query_operation_1.getOperationSource)(operation);
246
+ if (!source) {
247
+ throw new Error(`Could not find a required source on a link path operation`);
253
248
  }
249
+ return [source];
254
250
  }
251
+ throw new Error(`Can not extract path sources from operation of type ${operation.type}`);
255
252
  }
256
253
  assignPatternSources(algebraFactory, pattern, sources) {
257
254
  if (sources.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"ActorAbstractPath.js","sourceRoot":"","sources":["ActorAbstractPath.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IActorQueryOperationTypedMediatedArgs } from '@comunica/bus-query-operation';\nimport {\n ActorQueryOperationTypedMediated,\n} from '@comunica/bus-query-operation';\nimport { KeysQueryOperation } from '@comunica/context-entries';\nimport type { IActorTest, TestResult } from '@comunica/core';\nimport { failTest, passTestVoid } from '@comunica/core';\nimport type {\n IQueryOperationResultBindings,\n Bindings,\n IActionContext,\n MetadataBindings,\n IQuerySourceWrapper,\n ComunicaDataFactory,\n} from '@comunica/types';\nimport type { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { assignOperationSource, getOperationSource, getSafeBindings } from '@comunica/utils-query-operation';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport {\n BufferedIterator,\n MultiTransformIterator,\n TransformIterator,\n EmptyIterator,\n} from 'asynciterator';\nimport { termToString } from 'rdf-string';\nimport type { Factory } from 'sparqlalgebrajs';\nimport { Algebra } from 'sparqlalgebrajs';\nimport { PathVariableObjectIterator } from './PathVariableObjectIterator';\n\n/**\n * An abstract actor that handles Path operations.\n *\n * Provides multiple helper functions used by the Path operation actors.\n */\nexport abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated<Algebra.Path> {\n protected readonly predicateType: string;\n\n protected constructor(args: IActorQueryOperationTypedMediatedArgs, predicateType: string) {\n super(args, 'path');\n this.predicateType = predicateType;\n }\n\n public async testOperation(operation: Algebra.Path, _context: IActionContext): Promise<TestResult<IActorTest>> {\n if (operation.predicate.type !== this.predicateType) {\n return failTest(`This Actor only supports ${this.predicateType} Path operations.`);\n }\n\n return passTestVoid();\n }\n\n // Generates a variable that does not yet occur in the path\n public generateVariable(dataFactory: ComunicaDataFactory, path?: Algebra.Path, name?: string): RDF.Variable {\n if (!name) {\n return this.generateVariable(dataFactory, path, 'b');\n }\n\n // Path predicates can't contain variables\n if (path && (path.subject.value === name || path.object.value === name)) {\n return this.generateVariable(dataFactory, path, `${name}b`);\n }\n\n return dataFactory.variable(name);\n }\n\n // Such connectivity matching does not introduce duplicates (it does not incorporate any count of the number\n // of ways the connection can be made) even if the repeated path itself would otherwise result in duplicates.\n // https://www.w3.org/TR/sparql11-query/#propertypaths\n public async isPathArbitraryLengthDistinct(algebraFactory: Factory, context: IActionContext, path: Algebra.Path):\n Promise<{ context: IActionContext; operation: IQueryOperationResultBindings | undefined }> {\n if (!context.get(KeysQueryOperation.isPathArbitraryLengthDistinctKey)) {\n context = context.set(KeysQueryOperation.isPathArbitraryLengthDistinctKey, true);\n return { context, operation: getSafeBindings(await this.mediatorQueryOperation.mediate({\n operation: algebraFactory.createDistinct(path),\n context,\n })) };\n }\n\n context = context.set(KeysQueryOperation.isPathArbitraryLengthDistinctKey, false);\n return { context, operation: undefined };\n }\n\n private async predicateStarGraphVariable(\n subject: RDF.Term,\n object: RDF.Variable,\n predicate: Algebra.PropertyPathSymbol,\n graph: RDF.Variable,\n context: IActionContext,\n algebraFactory: Factory,\n bindingsFactory: BindingsFactory,\n ): Promise<IPathResultStream> {\n const sources = this.getPathSources(predicate);\n // TODO: refactor this with an iterator just like PathVariableObjectIterator so we handle backpressure correctly\n // Construct path to obtain all graphs where subject exists\n const predVar = this.generateVariable(<ComunicaDataFactory> algebraFactory.dataFactory, algebraFactory\n .createPath(subject, predicate, object, graph));\n const findGraphs = algebraFactory.createUnion([\n this.assignPatternSources(algebraFactory, algebraFactory.createPattern(subject, predVar, object, graph), sources),\n this.assignPatternSources(algebraFactory, algebraFactory.createPattern(object, predVar, subject, graph), sources),\n ]);\n const results = getSafeBindings(\n await this.mediatorQueryOperation.mediate({ context, operation: findGraphs }),\n );\n\n const passedGraphs: Set<string> = new Set();\n\n const bindingsStream = new MultiTransformIterator<Bindings, Bindings>(\n results.bindingsStream,\n {\n multiTransform: (bindings: Bindings) => {\n // Extract the graph and start a predicate* search starting from subject in each graph\n const graphValue: RDF.Term = bindings.get(graph)!;\n if (passedGraphs.has(graphValue.value)) {\n return new EmptyIterator();\n }\n passedGraphs.add(graphValue.value);\n return new TransformIterator<Bindings>(\n async() => {\n const it = new BufferedIterator<RDF.Term>();\n await this\n .getObjectsPredicateStar(algebraFactory, subject, predicate, graphValue, context, {}, it, { count: 0 });\n return it.map<Bindings>(item => bindingsFactory.bindings([\n [ object, item ],\n [ graph, graphValue ],\n ]));\n },\n { maxBufferSize: 128 },\n );\n },\n autoStart: false,\n },\n );\n\n return {\n bindingsStream,\n metadata: results.metadata,\n };\n }\n\n /**\n * Returns an iterator with Bindings of the query subject predicate* ?o or subject predicate+ ?o\n * If graph is a variable, it will also be in those bindings\n * @param {Term} subject Term of where we start the predicate* search.\n * @param {Algebra.PropertyPathSymbol} predicate Predicate of the *-path.\n * @param {Variable} object Variable of the zeroOrMore-query.\n * @param {Term} graph The graph in which we search for the pattern. (Possibly a variable)\n * @param {ActionContext} context The context to pass to sub-opertations\n * @param emitFirstSubject If the path operation is predicate*, otherwise it is predicate+.\n * @param algebraFactory The algebra factory.\n * @param bindingsFactory The data factory.\n * @return {Promise<AsyncIterator<Bindings>} Iterator to where all bindings of query should have been pushed.\n */\n public async getObjectsPredicateStarEval(\n subject: RDF.Term,\n predicate: Algebra.PropertyPathSymbol,\n object: RDF.Variable,\n graph: RDF.Term,\n context: IActionContext,\n emitFirstSubject: boolean,\n algebraFactory: Factory,\n bindingsFactory: BindingsFactory,\n ): Promise<IPathResultStream> {\n if (graph.termType === 'Variable') {\n return this\n .predicateStarGraphVariable(subject, object, predicate, graph, context, algebraFactory, bindingsFactory);\n }\n\n const it = new PathVariableObjectIterator(\n algebraFactory,\n subject,\n predicate,\n graph,\n context,\n this.mediatorQueryOperation,\n emitFirstSubject,\n );\n\n const bindingsStream = it.map<Bindings>(item => bindingsFactory.bindings([[ object, item ]]));\n\n return {\n bindingsStream,\n async metadata() {\n const metadata: MetadataBindings = await new Promise((resolve) => {\n it.getProperty('metadata', (metadataInner: any) => resolve(metadataInner()));\n });\n // Increment cardinality by one, because we always have at least one result once we reach this stage.\n // See the transformation above where we push a single binding.\n metadata.cardinality.value++;\n return metadata;\n },\n };\n }\n\n /**\n * Pushes all terms to iterator `it` that are a solution of object predicate* ?o.\n * @param algebraFactory The algebra factory.\n * @param {Term} object Term of where we start the predicate* search.\n * @param {Algebra.PropertyPathSymbol} predicate Predicate of the *-path.\n * @param {Term} graph The graph in which we search for the pattern.\n * @param {ActionContext} context\n * @param {Record<string, Term>} termHashes Remembers the objects we've already searched for.\n * @param {BufferedIterator<Term>} it Iterator to push terms to.\n * @param {any} counter Counts how many searches are in progress to close it when needed (when counter == 0).\n * @return {Promise<IPathResultStream['metadata']>} The results metadata.\n */\n public async getObjectsPredicateStar(\n algebraFactory: Factory,\n object: RDF.Term,\n predicate: Algebra.PropertyPathSymbol,\n graph: RDF.Term,\n context: IActionContext,\n termHashes: Record<string, RDF.Term>,\n it: BufferedIterator<RDF.Term>,\n counter: any,\n ): Promise<IPathResultStream['metadata'] | undefined> {\n const termString = termToString(object);\n if (termHashes[termString]) {\n return;\n }\n\n (<any> it)._push(object);\n termHashes[termString] = object;\n counter.count++;\n\n const thisVariable = this.generateVariable(<ComunicaDataFactory> algebraFactory.dataFactory);\n const path = algebraFactory.createPath(object, predicate, thisVariable, graph);\n const results = getSafeBindings(\n await this.mediatorQueryOperation.mediate({ operation: path, context }),\n );\n\n // TODO: fixme\n // eslint-disable-next-line ts/no-misused-promises\n results.bindingsStream.on('data', async(bindings: Bindings) => {\n const result = bindings.get(thisVariable);\n await this.getObjectsPredicateStar(algebraFactory, result!, predicate, graph, context, termHashes, it, counter);\n });\n results.bindingsStream.on('end', () => {\n if (--counter.count === 0) {\n it.close();\n }\n });\n\n return results.metadata;\n }\n\n /**\n * Pushes all terms to iterator `it` that are a solution of ?s predicate* ?o.\n * @param {string} subjectVar String representation of subjectVariable\n * @param {string} objectVar String representation of objectVariable\n * @param {Term} subjectVal Term of where we start the predicate* search.\n * @param {Term} objectVal Found solution for an object, start for the new step.\n * @param {Algebra.PropertyPathSymbol} predicate Predicate of the *-path.\n * @param {Term} graph The graph in which we search for the pattern.\n * @param {ActionContext} context\n * @param {{[id: string]: Promise<Term[]>}} termHashesGlobal\n * Remembers solutions for when objectVal is already been calculated, can be reused when same objectVal occurs\n * @param {{[id: string]: Term}} termHashesCurrentSubject\n * Remembers the pairs we've already searched for, can stop searching if so.\n * @param {BufferedIterator<Bindings>} it Iterator to push terms to.\n * @param {any} counter Counts how many searches are in progress to close it when needed (when counter == 0).\n * @param algebraFactory The algebra factory.\n * @param bindingsFactory The bindings factory.\n * @return {Promise<void>} All solutions of query should have been pushed to it by then.\n */\n // Let the iterator `it` emit all bindings of size 2, with subjectStringVariable as value subjectVal\n // and objectStringVariable as value all nodes reachable through predicate* beginning at objectVal\n public async getSubjectAndObjectBindingsPredicateStar(\n subjectVar: RDF.Variable,\n objectVar: RDF.Variable,\n subjectVal: RDF.Term,\n objectVal: RDF.Term,\n predicate: Algebra.PropertyPathSymbol,\n graph: RDF.Term,\n context: IActionContext,\n termHashesGlobal: Record<string, Promise<RDF.Term[]>>,\n termHashesCurrentSubject: Record<string, boolean>,\n it: BufferedIterator<Bindings>,\n counter: any,\n algebraFactory: Factory,\n bindingsFactory: BindingsFactory,\n ): Promise<void> {\n const termString = termToString(objectVal) + termToString(graph);\n\n // If this combination of subject and object already done, return nothing\n if (termHashesCurrentSubject[termString]) {\n return;\n }\n\n counter.count++;\n termHashesCurrentSubject[termString] = true;\n (<any> it)._push(bindingsFactory.bindings([\n [ subjectVar, subjectVal ],\n [ objectVar, objectVal ],\n ]));\n\n // If every reachable node from object has already been calculated, use these for current subject too\n if (termString in termHashesGlobal) {\n const objects = await termHashesGlobal[termString];\n for (const object of objects) {\n await this.getSubjectAndObjectBindingsPredicateStar(\n subjectVar,\n objectVar,\n subjectVal,\n object,\n predicate,\n graph,\n context,\n termHashesGlobal,\n termHashesCurrentSubject,\n it,\n counter,\n algebraFactory,\n bindingsFactory,\n );\n }\n if (--counter.count === 0) {\n it.close();\n }\n\n return;\n }\n\n // Construct promise to calculate all reachable nodes from this object\n // TODO: fixme\n // eslint-disable-next-line no-async-promise-executor,ts/no-misused-promises\n const promise = new Promise<RDF.Term[]>(async(resolve, reject) => {\n const objectsArray: RDF.Term[] = [];\n\n // Construct path that leads us one step through predicate\n const thisVariable = this.generateVariable(<ComunicaDataFactory> algebraFactory.dataFactory);\n const path = algebraFactory.createPath(objectVal, predicate, thisVariable, graph);\n const results = getSafeBindings(\n await this.mediatorQueryOperation.mediate({ operation: path, context }),\n );\n\n // Recursive call on all neighbours\n // TODO: fixme\n // eslint-disable-next-line ts/no-misused-promises\n results.bindingsStream.on('data', async(bindings: RDF.Bindings) => {\n const result: RDF.Term = bindings.get(thisVariable)!;\n objectsArray.push(result);\n await this.getSubjectAndObjectBindingsPredicateStar(\n subjectVar,\n objectVar,\n subjectVal,\n result,\n predicate,\n graph,\n context,\n termHashesGlobal,\n termHashesCurrentSubject,\n it,\n counter,\n algebraFactory,\n bindingsFactory,\n );\n });\n results.bindingsStream.on('error', reject);\n results.bindingsStream.on('end', () => {\n if (--counter.count === 0) {\n it.close();\n }\n resolve(objectsArray);\n });\n });\n\n // Set it in the termHashesGlobal when this object occurs again they can wait for this promise\n termHashesGlobal[termString] = promise;\n }\n\n /**\n * Find all sources recursively contained in the given path operation.\n * @param operation\n */\n public getPathSources(operation: Algebra.PropertyPathSymbol): IQuerySourceWrapper[] {\n switch (operation.type) {\n case Algebra.types.ALT:\n case Algebra.types.SEQ:\n return operation.input\n .flatMap((subOp: Algebra.PropertyPathSymbol) => this.getPathSources(subOp));\n case Algebra.types.INV:\n case Algebra.types.ONE_OR_MORE_PATH:\n case Algebra.types.ZERO_OR_MORE_PATH:\n case Algebra.types.ZERO_OR_ONE_PATH:\n return this.getPathSources(operation.path);\n case Algebra.types.LINK:\n case Algebra.types.NPS: {\n const source = getOperationSource(operation);\n if (!source) {\n throw new Error(`Could not find a required source on a link path operation`);\n }\n return [ source ];\n }\n }\n }\n\n public assignPatternSources(\n algebraFactory: Factory,\n pattern: Algebra.Pattern,\n sources: IQuerySourceWrapper[],\n ): Algebra.Operation {\n if (sources.length === 0) {\n throw new Error(`Attempted to assign zero sources to a pattern during property path handling`);\n }\n if (sources.length === 1) {\n return assignOperationSource(pattern, sources[0]);\n }\n return algebraFactory.createUnion(sources\n .map(source => assignOperationSource(pattern, source)), true);\n }\n}\n\nexport interface IPathResultStream {\n bindingsStream: AsyncIterator<Bindings>;\n metadata: () => Promise<MetadataBindings>;\n}\n"]}
1
+ {"version":3,"file":"ActorAbstractPath.js","sourceRoot":"","sources":["ActorAbstractPath.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IActorQueryOperationTypedMediatedArgs } from '@comunica/bus-query-operation';\nimport {\n ActorQueryOperationTypedMediated,\n} from '@comunica/bus-query-operation';\nimport { KeysQueryOperation } from '@comunica/context-entries';\nimport type { IActorTest, TestResult } from '@comunica/core';\nimport { failTest, passTestVoid } from '@comunica/core';\nimport type {\n IQueryOperationResultBindings,\n Bindings,\n IActionContext,\n MetadataBindings,\n IQuerySourceWrapper,\n ComunicaDataFactory,\n} from '@comunica/types';\nimport { Algebra, isKnownOperation } from '@comunica/utils-algebra';\nimport type { AlgebraFactory } from '@comunica/utils-algebra';\nimport type { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { assignOperationSource, getOperationSource, getSafeBindings } from '@comunica/utils-query-operation';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport {\n BufferedIterator,\n MultiTransformIterator,\n TransformIterator,\n EmptyIterator,\n} from 'asynciterator';\nimport { termToString } from 'rdf-string';\nimport { PathVariableObjectIterator } from './PathVariableObjectIterator';\n\n/**\n * An abstract actor that handles Path operations.\n *\n * Provides multiple helper functions used by the Path operation actors.\n */\nexport abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated<Algebra.Path> {\n protected readonly predicateType: string;\n\n protected constructor(args: IActorQueryOperationTypedMediatedArgs, predicateType: string) {\n super(args, 'path');\n this.predicateType = predicateType;\n }\n\n public async testOperation(operation: Algebra.Path, _context: IActionContext): Promise<TestResult<IActorTest>> {\n if (operation.predicate.type !== this.predicateType) {\n return failTest(`This Actor only supports ${this.predicateType} Path operations.`);\n }\n\n return passTestVoid();\n }\n\n // Generates a variable that does not yet occur in the path\n public generateVariable(dataFactory: ComunicaDataFactory, path?: Algebra.Path, name?: string): RDF.Variable {\n if (!name) {\n return this.generateVariable(dataFactory, path, 'b');\n }\n\n // Path predicates can't contain variables\n if (path && (path.subject.value === name || path.object.value === name)) {\n return this.generateVariable(dataFactory, path, `${name}b`);\n }\n\n return dataFactory.variable(name);\n }\n\n // Such connectivity matching does not introduce duplicates (it does not incorporate any count of the number\n // of ways the connection can be made) even if the repeated path itself would otherwise result in duplicates.\n // https://www.w3.org/TR/sparql11-query/#propertypaths\n public async isPathArbitraryLengthDistinct(\n algebraFactory: AlgebraFactory,\n context: IActionContext,\n path: Algebra.Path,\n ): Promise<{ context: IActionContext; operation: IQueryOperationResultBindings | undefined }> {\n if (!context.get(KeysQueryOperation.isPathArbitraryLengthDistinctKey)) {\n context = context.set(KeysQueryOperation.isPathArbitraryLengthDistinctKey, true);\n return { context, operation: getSafeBindings(await this.mediatorQueryOperation.mediate({\n operation: algebraFactory.createDistinct(path),\n context,\n })) };\n }\n\n context = context.set(KeysQueryOperation.isPathArbitraryLengthDistinctKey, false);\n return { context, operation: undefined };\n }\n\n private async predicateStarGraphVariable(\n subject: RDF.Term,\n object: RDF.Variable,\n predicate: Algebra.Operation,\n graph: RDF.Variable,\n context: IActionContext,\n algebraFactory: AlgebraFactory,\n bindingsFactory: BindingsFactory,\n ): Promise<IPathResultStream> {\n const sources = this.getPathSources(predicate);\n // TODO: refactor this with an iterator just like PathVariableObjectIterator so we handle backpressure correctly\n // Construct path to obtain all graphs where subject exists\n const predVar = this.generateVariable(<ComunicaDataFactory> algebraFactory.dataFactory, algebraFactory\n .createPath(subject, predicate, object, graph));\n const findGraphs = algebraFactory.createUnion([\n this.assignPatternSources(algebraFactory, algebraFactory.createPattern(subject, predVar, object, graph), sources),\n this.assignPatternSources(algebraFactory, algebraFactory.createPattern(object, predVar, subject, graph), sources),\n ]);\n const results = getSafeBindings(\n await this.mediatorQueryOperation.mediate({ context, operation: findGraphs }),\n );\n\n const passedGraphs: Set<string> = new Set();\n\n const bindingsStream = new MultiTransformIterator<Bindings, Bindings>(\n results.bindingsStream,\n {\n multiTransform: (bindings: Bindings) => {\n // Extract the graph and start a predicate* search starting from subject in each graph\n const graphValue: RDF.Term = bindings.get(graph)!;\n if (passedGraphs.has(graphValue.value)) {\n return new EmptyIterator();\n }\n passedGraphs.add(graphValue.value);\n return new TransformIterator<Bindings>(\n async() => {\n const it = new BufferedIterator<RDF.Term>();\n await this\n .getObjectsPredicateStar(algebraFactory, subject, predicate, graphValue, context, {}, it, { count: 0 });\n return it.map<Bindings>(item => bindingsFactory.bindings([\n [ object, item ],\n [ graph, graphValue ],\n ]));\n },\n { maxBufferSize: 128 },\n );\n },\n autoStart: false,\n },\n );\n\n return {\n bindingsStream,\n metadata: results.metadata,\n };\n }\n\n /**\n * Returns an iterator with Bindings of the query subject predicate* ?o or subject predicate+ ?o\n * If graph is a variable, it will also be in those bindings\n * @param {Term} subject Term of where we start the predicate* search.\n * @param {Algebra.PropertyPathSymbol} predicate Predicate of the *-path.\n * @param {Variable} object Variable of the zeroOrMore-query.\n * @param {Term} graph The graph in which we search for the pattern. (Possibly a variable)\n * @param {ActionContext} context The context to pass to sub-opertations\n * @param emitFirstSubject If the path operation is predicate*, otherwise it is predicate+.\n * @param algebraFactory The algebra factory.\n * @param bindingsFactory The data factory.\n * @return {Promise<AsyncIterator<Bindings>} Iterator to where all bindings of query should have been pushed.\n */\n public async getObjectsPredicateStarEval(\n subject: RDF.Term,\n predicate: Algebra.Operation,\n object: RDF.Variable,\n graph: RDF.Term,\n context: IActionContext,\n emitFirstSubject: boolean,\n algebraFactory: AlgebraFactory,\n bindingsFactory: BindingsFactory,\n ): Promise<IPathResultStream> {\n if (graph.termType === 'Variable') {\n return this\n .predicateStarGraphVariable(subject, object, predicate, graph, context, algebraFactory, bindingsFactory);\n }\n\n const it = new PathVariableObjectIterator(\n algebraFactory,\n subject,\n predicate,\n graph,\n context,\n this.mediatorQueryOperation,\n emitFirstSubject,\n );\n\n const bindingsStream = it.map<Bindings>(item => bindingsFactory.bindings([[ object, item ]]));\n\n return {\n bindingsStream,\n async metadata() {\n const metadata: MetadataBindings = await new Promise((resolve) => {\n it.getProperty('metadata', (metadataInner: any) => resolve(metadataInner()));\n });\n // Increment cardinality by one, because we always have at least one result once we reach this stage.\n // See the transformation above where we push a single binding.\n metadata.cardinality.value++;\n return metadata;\n },\n };\n }\n\n /**\n * Pushes all terms to iterator `it` that are a solution of object predicate* ?o.\n * @param algebraFactory The algebra factory.\n * @param {Term} object Term of where we start the predicate* search.\n * @param {Algebra.PropertyPathSymbol} predicate Predicate of the *-path.\n * @param {Term} graph The graph in which we search for the pattern.\n * @param {ActionContext} context\n * @param {Record<string, Term>} termHashes Remembers the objects we've already searched for.\n * @param {BufferedIterator<Term>} it Iterator to push terms to.\n * @param {any} counter Counts how many searches are in progress to close it when needed (when counter == 0).\n * @return {Promise<IPathResultStream['metadata']>} The results metadata.\n */\n public async getObjectsPredicateStar(\n algebraFactory: AlgebraFactory,\n object: RDF.Term,\n predicate: Algebra.Operation,\n graph: RDF.Term,\n context: IActionContext,\n termHashes: Record<string, RDF.Term>,\n it: BufferedIterator<RDF.Term>,\n counter: any,\n ): Promise<IPathResultStream['metadata'] | undefined> {\n const termString = termToString(object);\n if (termHashes[termString]) {\n return;\n }\n\n (<any> it)._push(object);\n termHashes[termString] = object;\n counter.count++;\n\n const thisVariable = this.generateVariable(<ComunicaDataFactory> algebraFactory.dataFactory);\n const path = algebraFactory.createPath(object, predicate, thisVariable, graph);\n const results = getSafeBindings(\n await this.mediatorQueryOperation.mediate({ operation: path, context }),\n );\n\n // TODO: fixme\n // eslint-disable-next-line ts/no-misused-promises\n results.bindingsStream.on('data', async(bindings: Bindings) => {\n const result = bindings.get(thisVariable);\n await this.getObjectsPredicateStar(algebraFactory, result!, predicate, graph, context, termHashes, it, counter);\n });\n results.bindingsStream.on('end', () => {\n if (--counter.count === 0) {\n it.close();\n }\n });\n\n return results.metadata;\n }\n\n /**\n * Pushes all terms to iterator `it` that are a solution of ?s predicate* ?o.\n * @param {string} subjectVar String representation of subjectVariable\n * @param {string} objectVar String representation of objectVariable\n * @param {Term} subjectVal Term of where we start the predicate* search.\n * @param {Term} objectVal Found solution for an object, start for the new step.\n * @param {Algebra.PropertyPathSymbol} predicate Predicate of the *-path.\n * @param {Term} graph The graph in which we search for the pattern.\n * @param {ActionContext} context\n * @param {{[id: string]: Promise<Term[]>}} termHashesGlobal\n * Remembers solutions for when objectVal is already been calculated, can be reused when same objectVal occurs\n * @param {{[id: string]: Term}} termHashesCurrentSubject\n * Remembers the pairs we've already searched for, can stop searching if so.\n * @param {BufferedIterator<Bindings>} it Iterator to push terms to.\n * @param {any} counter Counts how many searches are in progress to close it when needed (when counter == 0).\n * @param algebraFactory The algebra factory.\n * @param bindingsFactory The bindings factory.\n * @return {Promise<void>} All solutions of query should have been pushed to it by then.\n */\n // Let the iterator `it` emit all bindings of size 2, with subjectStringVariable as value subjectVal\n // and objectStringVariable as value all nodes reachable through predicate* beginning at objectVal\n public async getSubjectAndObjectBindingsPredicateStar(\n subjectVar: RDF.Variable,\n objectVar: RDF.Variable,\n subjectVal: RDF.Term,\n objectVal: RDF.Term,\n predicate: Algebra.Operation,\n graph: RDF.Term,\n context: IActionContext,\n termHashesGlobal: Record<string, Promise<RDF.Term[]>>,\n termHashesCurrentSubject: Record<string, boolean>,\n it: BufferedIterator<Bindings>,\n counter: any,\n algebraFactory: AlgebraFactory,\n bindingsFactory: BindingsFactory,\n ): Promise<void> {\n const termString = termToString(objectVal) + termToString(graph);\n\n // If this combination of subject and object already done, return nothing\n if (termHashesCurrentSubject[termString]) {\n return;\n }\n\n counter.count++;\n termHashesCurrentSubject[termString] = true;\n (<any> it)._push(bindingsFactory.bindings([\n [ subjectVar, subjectVal ],\n [ objectVar, objectVal ],\n ]));\n\n // If every reachable node from object has already been calculated, use these for current subject too\n if (termString in termHashesGlobal) {\n const objects = await termHashesGlobal[termString];\n for (const object of objects) {\n await this.getSubjectAndObjectBindingsPredicateStar(\n subjectVar,\n objectVar,\n subjectVal,\n object,\n predicate,\n graph,\n context,\n termHashesGlobal,\n termHashesCurrentSubject,\n it,\n counter,\n algebraFactory,\n bindingsFactory,\n );\n }\n if (--counter.count === 0) {\n it.close();\n }\n\n return;\n }\n\n // Construct promise to calculate all reachable nodes from this object\n // TODO: fixme\n // eslint-disable-next-line no-async-promise-executor,ts/no-misused-promises\n const promise = new Promise<RDF.Term[]>(async(resolve, reject) => {\n const objectsArray: RDF.Term[] = [];\n\n // Construct path that leads us one step through predicate\n const thisVariable = this.generateVariable(<ComunicaDataFactory> algebraFactory.dataFactory);\n const path = algebraFactory.createPath(objectVal, predicate, thisVariable, graph);\n const results = getSafeBindings(\n await this.mediatorQueryOperation.mediate({ operation: path, context }),\n );\n\n // Recursive call on all neighbours\n // TODO: fixme\n // eslint-disable-next-line ts/no-misused-promises\n results.bindingsStream.on('data', async(bindings: RDF.Bindings) => {\n const result: RDF.Term = bindings.get(thisVariable)!;\n objectsArray.push(result);\n await this.getSubjectAndObjectBindingsPredicateStar(\n subjectVar,\n objectVar,\n subjectVal,\n result,\n predicate,\n graph,\n context,\n termHashesGlobal,\n termHashesCurrentSubject,\n it,\n counter,\n algebraFactory,\n bindingsFactory,\n );\n });\n results.bindingsStream.on('error', reject);\n results.bindingsStream.on('end', () => {\n if (--counter.count === 0) {\n it.close();\n }\n resolve(objectsArray);\n });\n });\n\n // Set it in the termHashesGlobal when this object occurs again they can wait for this promise\n termHashesGlobal[termString] = promise;\n }\n\n /**\n * Find all sources recursively contained in the given path operation.\n * @param operation\n */\n public getPathSources(operation: Algebra.Operation): IQuerySourceWrapper[] {\n if (isKnownOperation(operation, Algebra.Types.ALT) || isKnownOperation(operation, Algebra.Types.SEQ)) {\n return operation.input.flatMap(subOp => this.getPathSources(subOp));\n }\n if (isKnownOperation(operation, Algebra.Types.INV) || isKnownOperation(operation, Algebra.Types.ONE_OR_MORE_PATH) ||\n isKnownOperation(operation, Algebra.Types.ZERO_OR_MORE_PATH) ||\n isKnownOperation(operation, Algebra.Types.ZERO_OR_ONE_PATH)) {\n return this.getPathSources(operation.path);\n }\n if (isKnownOperation(operation, Algebra.Types.LINK) || isKnownOperation(operation, Algebra.Types.NPS)) {\n const source = getOperationSource(operation);\n if (!source) {\n throw new Error(`Could not find a required source on a link path operation`);\n }\n return [ source ];\n }\n throw new Error(`Can not extract path sources from operation of type ${operation.type}`);\n }\n\n public assignPatternSources(\n algebraFactory: AlgebraFactory,\n pattern: Algebra.Pattern,\n sources: IQuerySourceWrapper[],\n ): Algebra.Operation {\n if (sources.length === 0) {\n throw new Error(`Attempted to assign zero sources to a pattern during property path handling`);\n }\n if (sources.length === 1) {\n return assignOperationSource(pattern, sources[0]);\n }\n return algebraFactory.createUnion(sources\n .map(source => assignOperationSource(pattern, source)), true);\n }\n}\n\nexport interface IPathResultStream {\n bindingsStream: AsyncIterator<Bindings>;\n metadata: () => Promise<MetadataBindings>;\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import type { MediatorQueryOperation } from '@comunica/bus-query-operation';
2
2
  import type { IActionContext } from '@comunica/types';
3
+ import type { Algebra, AlgebraFactory } from '@comunica/utils-algebra';
3
4
  import type * as RDF from '@rdfjs/types';
4
5
  import { BufferedIterator } from 'asynciterator';
5
- import type { Algebra, Factory } from 'sparqlalgebrajs';
6
6
  /**
7
7
  * An iterator that implements the multi-length property path operation (* and +)
8
8
  * for a fixed subject and predicate, and a variable object.
@@ -19,7 +19,7 @@ export declare class PathVariableObjectIterator extends BufferedIterator<RDF.Ter
19
19
  private readonly runningOperations;
20
20
  private readonly pendingOperations;
21
21
  private started;
22
- constructor(algebraFactory: Factory, subject: RDF.Term, predicate: Algebra.PropertyPathSymbol, graph: RDF.Term, context: IActionContext, mediatorQueryOperation: MediatorQueryOperation, emitFirstSubject: boolean, maxRunningOperations?: number);
22
+ constructor(algebraFactory: AlgebraFactory, subject: RDF.Term, predicate: Algebra.Operation, graph: RDF.Term, context: IActionContext, mediatorQueryOperation: MediatorQueryOperation, emitFirstSubject: boolean, maxRunningOperations?: number);
23
23
  getProperty<P>(propertyName: string, callback?: (value: P) => void): P | undefined;
24
24
  protected _end(destroy?: boolean): void;
25
25
  protected _push(item: RDF.Term, pushAsResult?: boolean): boolean;
@@ -67,23 +67,21 @@ class PathVariableObjectIterator extends asynciterator_1.BufferedIterator {
67
67
  const pendingOperation = this.pendingOperations.pop();
68
68
  const results = (0, utils_query_operation_1.getSafeBindings)(await this.mediatorQueryOperation.mediate({ operation: pendingOperation.operation, context: this.context }));
69
69
  const runningOperation = results.bindingsStream.map(bindings => bindings.get(pendingOperation.variable));
70
- if (!runningOperation.done) {
71
- this.runningOperations.push(runningOperation);
72
- runningOperation.on('error', error => this.destroy(error));
73
- runningOperation.on('readable', () => {
74
- if (fillBuffer) {
75
- this._fillBufferAsync();
76
- }
77
- this.readable = true;
78
- });
79
- runningOperation.on('end', () => {
80
- this.runningOperations.splice(this.runningOperations.indexOf(runningOperation), 1);
81
- if (fillBuffer) {
82
- this._fillBufferAsync();
83
- }
84
- this.readable = true;
85
- });
86
- }
70
+ this.runningOperations.push(runningOperation);
71
+ runningOperation.on('error', error => this.destroy(error));
72
+ runningOperation.on('readable', () => {
73
+ if (fillBuffer) {
74
+ this._fillBufferAsync();
75
+ }
76
+ this.readable = true;
77
+ });
78
+ runningOperation.on('end', () => {
79
+ this.runningOperations.splice(this.runningOperations.indexOf(runningOperation), 1);
80
+ if (fillBuffer) {
81
+ this._fillBufferAsync();
82
+ }
83
+ this.readable = true;
84
+ });
87
85
  if (!this.getProperty('metadata')) {
88
86
  this.setProperty('metadata', results.metadata);
89
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PathVariableObjectIterator.js","sourceRoot":"","sources":["PathVariableObjectIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediatorQueryOperation } from '@comunica/bus-query-operation';\nimport type { IActionContext } from '@comunica/types';\nimport { getSafeBindings } from '@comunica/utils-query-operation';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { BufferedIterator } from 'asynciterator';\nimport { termToString } from 'rdf-string';\nimport type { Algebra, Factory } from 'sparqlalgebrajs';\n\n/**\n * An iterator that implements the multi-length property path operation (* and +)\n * for a fixed subject and predicate, and a variable object.\n */\nexport class PathVariableObjectIterator extends BufferedIterator<RDF.Term> {\n private readonly termHashes: Map<string, RDF.Term> = new Map();\n private readonly runningOperations: AsyncIterator<RDF.Term>[] = [];\n private readonly pendingOperations: { variable: RDF.Variable; operation: Algebra.Path }[] = [];\n private started = false;\n\n public constructor(\n private readonly algebraFactory: Factory,\n private readonly subject: RDF.Term,\n private readonly predicate: Algebra.PropertyPathSymbol,\n private readonly graph: RDF.Term,\n private readonly context: IActionContext,\n private readonly mediatorQueryOperation: MediatorQueryOperation,\n emitFirstSubject: boolean,\n private readonly maxRunningOperations = 16,\n ) {\n super({ autoStart: false });\n\n // Push the subject as starting point\n this._push(this.subject, emitFirstSubject);\n }\n\n public override getProperty<P>(propertyName: string, callback?: (value: P) => void): P | undefined {\n // Kickstart iterator when metadata is requested\n if (!this.started && propertyName === 'metadata') {\n this.startNextOperation(false)\n .catch(error => this.emit('error', error));\n }\n return super.getProperty(propertyName, callback);\n }\n\n protected override _end(destroy?: boolean): void {\n // Close all running iterators\n for (const it of this.runningOperations) {\n it.destroy();\n }\n\n super._end(destroy);\n }\n\n protected override _push(item: RDF.Term, pushAsResult = true): boolean {\n let termString;\n if (pushAsResult) {\n // Don't push if this subject was already found\n termString = termToString(item);\n if (this.termHashes.has(termString)) {\n return false;\n }\n }\n\n // Add a pending path operation for this item\n const variable = this.algebraFactory.dataFactory.variable!('b');\n this.pendingOperations.push({\n variable,\n operation: this.algebraFactory.createPath(item, this.predicate, variable, this.graph),\n });\n\n // Otherwise, push the subject\n if (termString) {\n this.termHashes.set(termString, item);\n super._push(item);\n }\n return true;\n }\n\n protected async startNextOperation(fillBuffer: boolean): Promise<void> {\n this.started = true;\n\n const pendingOperation = this.pendingOperations.pop()!;\n const results = getSafeBindings(\n await this.mediatorQueryOperation.mediate({ operation: pendingOperation.operation, context: this.context }),\n );\n const runningOperation = results.bindingsStream.map<RDF.Term>(\n bindings => <RDF.Term> bindings.get(pendingOperation.variable),\n );\n\n if (!runningOperation.done) {\n this.runningOperations.push(runningOperation);\n runningOperation.on('error', error => this.destroy(error));\n runningOperation.on('readable', () => {\n if (fillBuffer) {\n this._fillBufferAsync();\n }\n this.readable = true;\n });\n runningOperation.on('end', () => {\n this.runningOperations.splice(this.runningOperations.indexOf(runningOperation), 1);\n if (fillBuffer) {\n this._fillBufferAsync();\n }\n this.readable = true;\n });\n }\n\n if (!this.getProperty('metadata')) {\n this.setProperty('metadata', results.metadata);\n }\n }\n\n protected override _read(count: number, done: () => void): void {\n // eslint-disable-next-line ts/no-this-alias\n const self = this;\n (async function() {\n // Open as many operations as possible\n while (self.runningOperations.length < self.maxRunningOperations) {\n if (self.pendingOperations.length === 0) {\n break;\n }\n await self.startNextOperation(true);\n }\n\n // Try to read `count` items (based on UnionIterator)\n let lastCount = 0;\n let item: RDF.Term | null;\n let pushSucceeded = true;\n // eslint-disable-next-line no-cond-assign\n while (!pushSucceeded || lastCount !== (lastCount = count)) {\n pushSucceeded = true;\n // Prioritize the operations that have been added first\n for (let i = 0; i < self.runningOperations.length && count > 0; i++) {\n // eslint-disable-next-line no-cond-assign\n if ((item = self.runningOperations[i].read()) !== null) {\n if (self._push(item)) {\n count--;\n } else {\n pushSucceeded = false;\n }\n }\n }\n }\n\n // Close if everything has been read\n self.closeIfNeeded();\n })().then(() => {\n done();\n }, error => this.destroy(error));\n }\n\n protected closeIfNeeded(): void {\n if (this.runningOperations.length === 0 && this.pendingOperations.length === 0) {\n this.close();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"PathVariableObjectIterator.js","sourceRoot":"","sources":["PathVariableObjectIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediatorQueryOperation } from '@comunica/bus-query-operation';\nimport type { IActionContext } from '@comunica/types';\nimport type { Algebra, AlgebraFactory } from '@comunica/utils-algebra';\nimport { getSafeBindings } from '@comunica/utils-query-operation';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { BufferedIterator } from 'asynciterator';\nimport { termToString } from 'rdf-string';\n\n/**\n * An iterator that implements the multi-length property path operation (* and +)\n * for a fixed subject and predicate, and a variable object.\n */\nexport class PathVariableObjectIterator extends BufferedIterator<RDF.Term> {\n private readonly termHashes: Map<string, RDF.Term> = new Map();\n private readonly runningOperations: AsyncIterator<RDF.Term>[] = [];\n private readonly pendingOperations: { variable: RDF.Variable; operation: Algebra.Path }[] = [];\n private started = false;\n\n public constructor(\n private readonly algebraFactory: AlgebraFactory,\n private readonly subject: RDF.Term,\n private readonly predicate: Algebra.Operation,\n private readonly graph: RDF.Term,\n private readonly context: IActionContext,\n private readonly mediatorQueryOperation: MediatorQueryOperation,\n emitFirstSubject: boolean,\n private readonly maxRunningOperations = 16,\n ) {\n super({ autoStart: false });\n\n // Push the subject as starting point\n this._push(this.subject, emitFirstSubject);\n }\n\n public override getProperty<P>(propertyName: string, callback?: (value: P) => void): P | undefined {\n // Kickstart iterator when metadata is requested\n if (!this.started && propertyName === 'metadata') {\n this.startNextOperation(false)\n .catch(error => this.emit('error', error));\n }\n return super.getProperty(propertyName, callback);\n }\n\n protected override _end(destroy?: boolean): void {\n // Close all running iterators\n for (const it of this.runningOperations) {\n it.destroy();\n }\n\n super._end(destroy);\n }\n\n protected override _push(item: RDF.Term, pushAsResult = true): boolean {\n let termString;\n if (pushAsResult) {\n // Don't push if this subject was already found\n termString = termToString(item);\n if (this.termHashes.has(termString)) {\n return false;\n }\n }\n\n // Add a pending path operation for this item\n const variable = this.algebraFactory.dataFactory.variable!('b');\n this.pendingOperations.push({\n variable,\n operation: this.algebraFactory.createPath(item, this.predicate, variable, this.graph),\n });\n\n // Otherwise, push the subject\n if (termString) {\n this.termHashes.set(termString, item);\n super._push(item);\n }\n return true;\n }\n\n protected async startNextOperation(fillBuffer: boolean): Promise<void> {\n this.started = true;\n\n const pendingOperation = this.pendingOperations.pop()!;\n const results = getSafeBindings(\n await this.mediatorQueryOperation.mediate({ operation: pendingOperation.operation, context: this.context }),\n );\n const runningOperation = results.bindingsStream.map<RDF.Term>(\n bindings => <RDF.Term> bindings.get(pendingOperation.variable),\n );\n\n this.runningOperations.push(runningOperation);\n runningOperation.on('error', error => this.destroy(error));\n runningOperation.on('readable', () => {\n if (fillBuffer) {\n this._fillBufferAsync();\n }\n this.readable = true;\n });\n runningOperation.on('end', () => {\n this.runningOperations.splice(this.runningOperations.indexOf(runningOperation), 1);\n if (fillBuffer) {\n this._fillBufferAsync();\n }\n this.readable = true;\n });\n\n if (!this.getProperty('metadata')) {\n this.setProperty('metadata', results.metadata);\n }\n }\n\n protected override _read(count: number, done: () => void): void {\n // eslint-disable-next-line ts/no-this-alias\n const self = this;\n (async function() {\n // Open as many operations as possible\n while (self.runningOperations.length < self.maxRunningOperations) {\n if (self.pendingOperations.length === 0) {\n break;\n }\n await self.startNextOperation(true);\n }\n\n // Try to read `count` items (based on UnionIterator)\n let lastCount = 0;\n let item: RDF.Term | null;\n let pushSucceeded = true;\n // eslint-disable-next-line no-cond-assign\n while (!pushSucceeded || lastCount !== (lastCount = count)) {\n pushSucceeded = true;\n // Prioritize the operations that have been added first\n for (let i = 0; i < self.runningOperations.length && count > 0; i++) {\n // eslint-disable-next-line no-cond-assign\n if ((item = self.runningOperations[i].read()) !== null) {\n if (self._push(item)) {\n count--;\n } else {\n pushSucceeded = false;\n }\n }\n }\n }\n\n // Close if everything has been read\n self.closeIfNeeded();\n })().then(() => {\n done();\n }, error => this.destroy(error));\n }\n\n protected closeIfNeeded(): void {\n if (this.runningOperations.length === 0 && this.pendingOperations.length === 0) {\n this.close();\n }\n }\n}\n"]}
package/lib/index.d.ts CHANGED
File without changes
package/lib/index.js CHANGED
File without changes
package/lib/index.js.map CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comunica/actor-abstract-path",
3
- "version": "4.4.0",
3
+ "version": "4.4.2-alpha.49.0",
4
4
  "description": "An abstract actor for handling mediatypes",
5
5
  "lsd:module": true,
6
6
  "license": "MIT",
@@ -41,16 +41,16 @@
41
41
  "build:components": "componentsjs-generator"
42
42
  },
43
43
  "dependencies": {
44
- "@comunica/bus-query-operation": "^4.4.0",
45
- "@comunica/context-entries": "^4.4.0",
46
- "@comunica/core": "^4.4.0",
47
- "@comunica/types": "^4.4.0",
48
- "@comunica/utils-bindings-factory": "^4.4.0",
49
- "@comunica/utils-query-operation": "^4.4.0",
44
+ "@comunica/bus-query-operation": "4.4.2-alpha.49.0",
45
+ "@comunica/context-entries": "4.4.2-alpha.49.0",
46
+ "@comunica/core": "4.4.2-alpha.49.0",
47
+ "@comunica/types": "4.4.2-alpha.49.0",
48
+ "@comunica/utils-algebra": "4.4.2-alpha.49.0",
49
+ "@comunica/utils-bindings-factory": "4.4.2-alpha.49.0",
50
+ "@comunica/utils-query-operation": "4.4.2-alpha.49.0",
50
51
  "@rdfjs/types": "*",
51
- "asynciterator": "^3.9.0",
52
- "rdf-string": "^1.6.1",
53
- "sparqlalgebrajs": "^4.3.8"
52
+ "asynciterator": "^3.10.0",
53
+ "rdf-string": "^2.0.1"
54
54
  },
55
- "gitHead": "27acde56dfe0c1ff1162c1f46818ad752296ca88"
55
+ "gitHead": "ef6f96cfd8faf7c37955bb7e0fe9f6fc6a994bdf"
56
56
  }