UNPKG

rdf-dataset-fragmenter

Version:
64 lines 2.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FragmentationStrategyResourceObject = void 0; const FragmentationStrategyStreamAdapter_1 = require("./FragmentationStrategyStreamAdapter"); /** * A fragmentation strategy that groups triples by (subject) resources, * and places quads into the document identified by the given predicate value. * * Blank nodes are not supported. */ class FragmentationStrategyResourceObject extends FragmentationStrategyStreamAdapter_1.FragmentationStrategyStreamAdapter { targetPredicate; resourceBuffer; constructor(targetPredicateRegex) { super(); this.targetPredicate = new RegExp(targetPredicateRegex, 'u'); this.resourceBuffer = {}; } async handleQuad(quad, quadSink) { // Create buffer if one doesn't exist yet if (!this.resourceBuffer[quad.subject.value]) { this.resourceBuffer[quad.subject.value] = []; } // Handle remaining quads const buffer = this.resourceBuffer[quad.subject.value]; if (Array.isArray(buffer)) { // Buffer remaining quads buffer.push(quad); } else { // If the target predicate was already set, flush immediately await quadSink.push(buffer.value, quad); } // Match the target predicate if (this.targetPredicate.test(quad.predicate.value)) { if (quad.object.termType !== 'NamedNode') { throw new Error(`Expected target predicate value of type NamedNode on resource '${quad.subject.value}', but got '${quad.object.value}' (${quad.object.termType})`); } // Flush the buffer of this resource await this.flushResourceBuffer(quadSink, quad.subject.value, quad.object.value); // Indicate that further triples of this resource should be emitted immediately this.resourceBuffer[quad.subject.value] = quad.object; } } async flush(quadSink) { await super.flush(quadSink); for (const resourceIri of Object.keys(this.resourceBuffer)) { if (Array.isArray(this.resourceBuffer[resourceIri])) { // eslint-disable-next-line no-console console.warn(`Detected quads of the resource ${resourceIri} without a defined target predicate.`); } } } async flushResourceBuffer(quadSink, resourceIri, targetIri) { const quads = this.resourceBuffer[resourceIri]; if (Array.isArray(quads)) { for (const quad of quads) { await quadSink.push(targetIri, quad); } } } } exports.FragmentationStrategyResourceObject = FragmentationStrategyResourceObject; //# sourceMappingURL=FragmentationStrategyResourceObject.js.map