@comunica/actor-query-operation-update-deleteinsert
Version:
A update-deleteinsert query-operation actor
60 lines • 3.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActorQueryOperationUpdateDeleteInsert = void 0;
const actor_query_operation_construct_1 = require("@comunica/actor-query-operation-construct");
const bus_query_operation_1 = require("@comunica/bus-query-operation");
const context_entries_1 = require("@comunica/context-entries");
const utils_algebra_1 = require("@comunica/utils-algebra");
const utils_bindings_factory_1 = require("@comunica/utils-bindings-factory");
const utils_query_operation_1 = require("@comunica/utils-query-operation");
const asynciterator_1 = require("asynciterator");
/**
* A comunica Update DeleteInsert Query Operation Actor.
*/
class ActorQueryOperationUpdateDeleteInsert extends bus_query_operation_1.ActorQueryOperationTypedMediated {
mediatorUpdateQuads;
mediatorMergeBindingsContext;
blankNodeCounter = 0;
constructor(args) {
super(args, utils_algebra_1.Algebra.Types.DELETE_INSERT);
this.mediatorUpdateQuads = args.mediatorUpdateQuads;
this.mediatorMergeBindingsContext = args.mediatorMergeBindingsContext;
}
async testOperation(operation, context) {
return (0, utils_query_operation_1.testReadOnly)(context);
}
async runOperation(operation, context) {
const dataFactory = context.getSafe(context_entries_1.KeysInitQuery.dataFactory);
const bindingsFactory = await utils_bindings_factory_1.BindingsFactory.create(this.mediatorMergeBindingsContext, context, dataFactory);
// Evaluate the where clause
const whereBindings = operation.where ?
(0, utils_query_operation_1.getSafeBindings)(await this.mediatorQueryOperation
.mediate({ operation: operation.where, context })).bindingsStream :
new asynciterator_1.ArrayIterator([bindingsFactory.bindings()], { autoStart: false });
// Construct triples using the result based on the pattern.
let quadStreamInsert;
let quadStreamDelete;
if (operation.insert) {
// Localize blank nodes in pattern, to avoid clashes across different INSERT/DELETE calls
quadStreamInsert = new actor_query_operation_construct_1.BindingsToQuadsIterator(dataFactory, operation.insert.map(actor_query_operation_construct_1.BindingsToQuadsIterator.localizeQuad.bind(null, dataFactory, this.blankNodeCounter)), whereBindings.clone());
this.blankNodeCounter++;
}
if (operation.delete) {
// Localize blank nodes in pattern, to avoid clashes across different INSERT/DELETE calls
quadStreamDelete = new actor_query_operation_construct_1.BindingsToQuadsIterator(dataFactory, operation.delete.map(actor_query_operation_construct_1.BindingsToQuadsIterator.localizeQuad.bind(null, dataFactory, this.blankNodeCounter)), whereBindings.clone());
this.blankNodeCounter++;
}
// Evaluate the required modifications
const { execute } = await this.mediatorUpdateQuads.mediate({
quadStreamInsert,
quadStreamDelete,
context,
});
return {
type: 'void',
execute,
};
}
}
exports.ActorQueryOperationUpdateDeleteInsert = ActorQueryOperationUpdateDeleteInsert;
//# sourceMappingURL=ActorQueryOperationUpdateDeleteInsert.js.map