@comunica/actor-abstract-path 4.4.1 → 4.5.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.
|
@@ -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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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":";;;AAEA,2EAAkE;AAGlE,iDAAiD;AACjD,2CAA0C;AAG1C;;;GAGG;AACH,MAAa,0BAA2B,SAAQ,gCAA0B;IAMxE,YACmB,cAAuB,EACvB,OAAiB,EACjB,SAAqC,EACrC,KAAe,EACf,OAAuB,EACvB,sBAA8C,EAC/D,gBAAyB,EACR,uBAAuB,EAAE;QAE1C,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QATX,mBAAc,GAAd,cAAc,CAAS;QACvB,YAAO,GAAP,OAAO,CAAU;QACjB,cAAS,GAAT,SAAS,CAA4B;QACrC,UAAK,GAAL,KAAK,CAAU;QACf,YAAO,GAAP,OAAO,CAAgB;QACvB,2BAAsB,GAAtB,sBAAsB,CAAwB;QAE9C,yBAAoB,GAApB,oBAAoB,CAAK;QAb3B,eAAU,GAA0B,IAAI,GAAG,EAAE,CAAC;QAC9C,sBAAiB,GAA8B,EAAE,CAAC;QAClD,sBAAiB,GAA0D,EAAE,CAAC;QACvF,YAAO,GAAG,KAAK,CAAC;QActB,qCAAqC;QACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC7C,CAAC;IAEe,WAAW,CAAI,YAAoB,EAAE,QAA6B;QAChF,gDAAgD;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;YACjD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;iBAC3B,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAEkB,IAAI,CAAC,OAAiB;QACvC,8BAA8B;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxC,EAAE,CAAC,OAAO,EAAE,CAAC;QACf,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAEkB,KAAK,CAAC,IAAc,EAAE,YAAY,GAAG,IAAI;QAC1D,IAAI,UAAU,CAAC;QACf,IAAI,YAAY,EAAE,CAAC;YACjB,+CAA+C;YAC/C,UAAU,GAAG,IAAA,yBAAY,EAAC,IAAI,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAS,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC1B,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;SACtF,CAAC,CAAC;QAEH,8BAA8B;QAC9B,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACtC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAES,KAAK,CAAC,kBAAkB,CAAC,UAAmB;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAG,CAAC;QACvD,MAAM,OAAO,GAAG,IAAA,uCAAe,EAC7B,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAC5G,CAAC;QACF,MAAM,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CACjD,QAAQ,CAAC,EAAE,CAAY,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAC/D,CAAC;QAEF,IAAI,CAAC,
|
|
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 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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comunica/actor-abstract-path",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.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.
|
|
45
|
-
"@comunica/context-entries": "^4.
|
|
46
|
-
"@comunica/core": "^4.
|
|
47
|
-
"@comunica/types": "^4.
|
|
48
|
-
"@comunica/utils-bindings-factory": "^4.
|
|
49
|
-
"@comunica/utils-query-operation": "^4.
|
|
44
|
+
"@comunica/bus-query-operation": "^4.5.0",
|
|
45
|
+
"@comunica/context-entries": "^4.5.0",
|
|
46
|
+
"@comunica/core": "^4.5.0",
|
|
47
|
+
"@comunica/types": "^4.5.0",
|
|
48
|
+
"@comunica/utils-bindings-factory": "^4.5.0",
|
|
49
|
+
"@comunica/utils-query-operation": "^4.5.0",
|
|
50
50
|
"@rdfjs/types": "*",
|
|
51
51
|
"asynciterator": "^3.9.0",
|
|
52
52
|
"rdf-string": "^1.6.1",
|
|
53
|
-
"sparqlalgebrajs": "^
|
|
53
|
+
"sparqlalgebrajs": "^5.0.2"
|
|
54
54
|
},
|
|
55
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "2bcd98c387a021fc5c08d375793c205ca3d1bf0d"
|
|
56
56
|
}
|