@comunica/actor-query-operation-leftjoin
Version:
A leftjoin query-operation actor
47 lines • 2.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActorQueryOperationLeftJoin = void 0;
const bus_query_operation_1 = require("@comunica/bus-query-operation");
const context_entries_1 = require("@comunica/context-entries");
const core_1 = require("@comunica/core");
const utils_algebra_1 = require("@comunica/utils-algebra");
const utils_query_operation_1 = require("@comunica/utils-query-operation");
/**
* A comunica LeftJoin Query Operation Actor.
*/
class ActorQueryOperationLeftJoin extends bus_query_operation_1.ActorQueryOperationTypedMediated {
mediatorJoin;
constructor(args) {
super(args, utils_algebra_1.Algebra.Types.LEFT_JOIN);
this.mediatorJoin = args.mediatorJoin;
}
async testOperation(_operation, _context) {
return (0, core_1.passTestVoid)();
}
async runOperation(operationOriginal, context) {
const dataFactory = context.getSafe(context_entries_1.KeysInitQuery.dataFactory);
const algebraFactory = new utils_algebra_1.AlgebraFactory(dataFactory);
// Delegate to join bus
const entries = (await Promise.all(operationOriginal.input
.map(async (subOperation, index) => {
const output = (0, utils_query_operation_1.getSafeBindings)(await this.mediatorQueryOperation.mediate({ operation: subOperation, context }));
// If we have an expression in the left join,
// we attach the expression to the right-hand operation,
// and enforce a bind-join.
if (operationOriginal.expression && index === 1) {
return {
output,
operation: algebraFactory.createFilter(subOperation, operationOriginal.expression),
operationRequired: true,
};
}
return {
output,
operation: subOperation,
};
})));
return await this.mediatorJoin.mediate({ type: 'optional', entries, context });
}
}
exports.ActorQueryOperationLeftJoin = ActorQueryOperationLeftJoin;
//# sourceMappingURL=ActorQueryOperationLeftJoin.js.map