Skip to content

Commit

Permalink
Allow Bindings to have contexts
Browse files Browse the repository at this point in the history
This allows annotating Bindings objects with custom metadata.

This also adds a new bus (`bus-merge-bindings-context`) to determine
how context entries in other Bindings contexts should be merged with
each other during operations such as joins.

Closes #1203
  • Loading branch information
rubensworks committed Feb 2, 2024
1 parent 1fe8472 commit aeaa306
Show file tree
Hide file tree
Showing 135 changed files with 2,013 additions and 564 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ node_modules
.rdf-test-suite-ldf-cache
.idea
.vscode
.yarn
lerna-debug.log
yarn-error.log
.eslintcache
Expand Down
2 changes: 2 additions & 0 deletions engines/config-query-sparql/config/config-default.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
"ccqs:config/http-invalidate/actors.json",
"ccqs:config/http-invalidate/mediators.json",
"ccqs:config/init/actors.json",
"ccqs:config/merge-bindings-context/actors.json",
"ccqs:config/merge-bindings-context/mediators.json",
"ccqs:config/optimize-query-operation/actors.json",
"ccqs:config/optimize-query-operation/mediators.json",
"ccqs:config/query-operation/actors.json",
Expand Down
3 changes: 3 additions & 0 deletions engines/config-query-sparql/config/config-rdfjs.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

"ccqs:config/http-invalidate/mediators.json",
"ccqs:config/init/actors.json",
"ccqs:config/merge-bindings-context/actors.json",
"ccqs:config/merge-bindings-context/mediators.json",
"ccqs:config/optimize-query-operation/actors.json",
"ccqs:config/optimize-query-operation/mediators.json",
"ccqs:config/query-operation/actors.json",
Expand All @@ -38,5 +40,6 @@

"ccqs:config/rdf-update-quads/actors-rdfjs.json",
"ccqs:config/rdf-update-quads/mediators.json"

]
}
3 changes: 2 additions & 1 deletion engines/config-query-sparql/config/init/actors.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"mediatorQueryResultSerializeMediaTypeCombiner": { "@id": "urn:comunica:default:query-result-serialize/mediators#mediaType" },
"mediatorQueryResultSerializeMediaTypeFormatCombiner": { "@id": "urn:comunica:default:query-result-serialize/mediators#mediaTypeFormat" },
"mediatorContextPreprocess": { "@id": "urn:comunica:default:context-preprocess/mediators#main" },
"mediatorHttpInvalidate": { "@id": "urn:comunica:default:http-invalidate/mediators#main" }
"mediatorHttpInvalidate": { "@id": "urn:comunica:default:http-invalidate/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"@context": [
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/runner/^2.0.0/components/context.jsonld",
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-merge-bindings-context-union/^2.0.0/components/context.jsonld"
],
"@id": "urn:comunica:default:Runner",
"@type": "Runner",
"actors": []
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"@context": [
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-merge-bindings-context/^2.0.0/components/context.jsonld",
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/mediator-combine-union/^2.0.0/components/context.jsonld"
],
"@id": "urn:comunica:default:merge-bindings-context/mediators#main",
"@type": "MediatorCombineUnion",
"field": "mergeHandlers",
"bus": { "@id": "ActorMergeBindingsContext:_default_bus" }
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#extend",
"@type": "ActorQueryOperationExtend",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#filter",
"@type": "ActorQueryOperationFilterSparqlee",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"@id": "urn:comunica:default:query-operation/actors#group",
"@type": "ActorQueryOperationGroup",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorHashBindings": { "@id": "urn:comunica:default:hash-bindings/mediators#main" }
"mediatorHashBindings": { "@id": "urn:comunica:default:hash-bindings/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"@id": "urn:comunica:default:query-operation/actors#leftjoin",
"@type": "ActorQueryOperationLeftJoin",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorJoin": { "@id": "urn:comunica:default:rdf-join/mediators#main" }
"mediatorJoin": { "@id": "urn:comunica:default:rdf-join/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#nop",
"@type": "ActorQueryOperationNop",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#orderby",
"@type": "ActorQueryOperationOrderBySparqlee",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#path-one-or-more",
"@type": "ActorQueryOperationPathOneOrMore",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#path-zero-or-more",
"@type": "ActorQueryOperationPathZeroOrMore",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#path-zero-or-one",
"@type": "ActorQueryOperationPathZeroOrOne",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#quadpattern",
"@type": "ActorQueryOperationQuadpattern",
"mediatorResolveQuadPattern": { "@id": "urn:comunica:default:rdf-resolve-quad-pattern/mediators#main" }
"mediatorResolveQuadPattern": { "@id": "urn:comunica:default:rdf-resolve-quad-pattern/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"@id": "urn:comunica:default:query-operation/actors#service",
"@type": "ActorQueryOperationService",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"forceSparqlEndpoint": false
"forceSparqlEndpoint": false,
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"@id": "urn:comunica:default:query-operation/actors#sparql-endpoint",
"@type": "ActorQueryOperationSparqlEndpoint",
"mediatorHttp": { "@id": "urn:comunica:default:http/mediators#main" }
"mediatorHttp": { "@id": "urn:comunica:default:http/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
"actors": [
{
"@id": "urn:comunica:default:query-operation/actors#values",
"@type": "ActorQueryOperationValues"
"@type": "ActorQueryOperationValues",
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"@id": "urn:comunica:default:query-operation/actors#update-delete-insert",
"@type": "ActorQueryOperationUpdateDeleteInsert",
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorUpdateQuads": { "@id": "urn:comunica:default:rdf-update-quads/mediators#main" }
"mediatorUpdateQuads": { "@id": "urn:comunica:default:rdf-update-quads/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
}
]
}
6 changes: 4 additions & 2 deletions engines/config-query-sparql/config/rdf-join/actors-inner.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
{
"@id": "urn:comunica:default:rdf-join/actors#inner-none",
"@type": "ActorRdfJoinNone",
"mediatorJoinSelectivity": { "@id": "urn:comunica:default:rdf-join-selectivity/mediators#main" }
"mediatorJoinSelectivity": { "@id": "urn:comunica:default:rdf-join-selectivity/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
},
{
"@id": "urn:comunica:default:rdf-join/actors#inner-single",
Expand All @@ -34,7 +35,8 @@
"@type": "ActorRdfJoinMultiBind",
"mediatorJoinSelectivity": { "@id": "urn:comunica:default:rdf-join-selectivity/mediators#main" },
"mediatorJoinEntriesSort": { "@id": "urn:comunica:default:rdf-join-entries-sort/mediators#main" },
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
},
{
"@id": "urn:comunica:default:rdf-join/actors#inner-hash",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
"@id": "urn:comunica:default:rdf-join/actors#optional-bind",
"@type": "ActorRdfJoinOptionalBind",
"mediatorJoinSelectivity": { "@id": "urn:comunica:default:rdf-join-selectivity/mediators#main" },
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" }
"mediatorQueryOperation": { "@id": "urn:comunica:default:query-operation/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
},
{
"@id": "urn:comunica:default:rdf-join/actors#optional-nested-loop",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
{
"@id": "urn:comunica:default:rdf-resolve-quad-pattern/actors#sparql",
"@type": "ActorRdfResolveHypermediaSparql",
"mediatorHttp": { "@id": "urn:comunica:default:http/mediators#main" }
"mediatorHttp": { "@id": "urn:comunica:default:http/mediators#main" },
"mediatorMergeBindingsContext": { "@id": "urn:comunica:default:merge-bindings-context/mediators#main" }
},
{
"@id": "urn:comunica:default:rdf-resolve-hypermedia/actors#none",
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"babel-loader": "^9.1.0",
"componentsjs-generator": "^3.1.0",
"depcheck": "^1.4.3",
"eslint": "^8.48.0",
"eslint": "8.48.0",
"jest": "^29.5.0",
"jest-mock": "^29.3.1",
"jest-rdf": "^1.7.1",
Expand Down Expand Up @@ -55,7 +55,7 @@
"streamify-string": "^1.0.1",
"ts-jest": "^29.0.5",
"ts-loader": "^9.4.1",
"typedoc": "^0.25.0",
"typedoc": "^0.25.7",
"typescript": "^5.2.2",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.0"
Expand Down
16 changes: 10 additions & 6 deletions packages/actor-abstract-path/lib/ActorAbstractPath.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BindingsFactory } from '@comunica/bindings-factory';
import type { BindingsFactory } from '@comunica/bindings-factory';
import type { IActorQueryOperationTypedMediatedArgs } from '@comunica/bus-query-operation';
import {
ActorQueryOperation,
Expand All @@ -20,7 +20,6 @@ import { Factory } from 'sparqlalgebrajs';
import { PathVariableObjectIterator } from './PathVariableObjectIterator';

const DF = new DataFactory();
const BF = new BindingsFactory();

/**
* An abstract actor that handles Path operations.
Expand Down Expand Up @@ -83,6 +82,7 @@ export abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated
predicate: Algebra.PropertyPathSymbol,
graph: RDF.Variable,
context: IActionContext,
bindingsFactory: BindingsFactory,
): Promise<IPathResultStream> {
// TODO: refactor this with an iterator just like PathVariableObjectIterator so we handle backpressure correctly
// Construct path to obtain all graphs where subject exists
Expand Down Expand Up @@ -114,7 +114,7 @@ export abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated
await this.getObjectsPredicateStar(subject, predicate, graphValue, context, {}, it, { count: 0 });
return it.transform<Bindings>({
transform(item, next, push) {
push(BF.bindings([
push(bindingsFactory.bindings([
[ object, item ],
[ graph, graphValue ],
]));
Expand Down Expand Up @@ -152,9 +152,10 @@ export abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated
graph: RDF.Term,
context: IActionContext,
emitFirstSubject: boolean,
bindingsFactory: BindingsFactory,
): Promise<IPathResultStream> {
if (graph.termType === 'Variable') {
return this.predicateStarGraphVariable(subject, object, predicate, graph, context);
return this.predicateStarGraphVariable(subject, object, predicate, graph, context, bindingsFactory);
}

const it = new PathVariableObjectIterator(
Expand All @@ -169,7 +170,7 @@ export abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated
const bindingsStream = it.transform<Bindings>({
autoStart: false,
transform(item, next, push) {
push(BF.bindings([[ object, item ]]));
push(bindingsFactory.bindings([[ object, item ]]));
next();
},
});
Expand Down Expand Up @@ -266,6 +267,7 @@ export abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated
termHashesCurrentSubject: Record<string, boolean>,
it: BufferedIterator<Bindings>,
counter: any,
bindingsFactory: BindingsFactory,
): Promise<void> {
const termString = termToString(objectVal) + termToString(graph);

Expand All @@ -276,7 +278,7 @@ export abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated

counter.count++;
termHashesCurrentSubject[termString] = true;
(<any> it)._push(BF.bindings([
(<any> it)._push(bindingsFactory.bindings([
[ subjectVar, subjectVal ],
[ objectVar, objectVal ],
]));
Expand All @@ -297,6 +299,7 @@ export abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated
termHashesCurrentSubject,
it,
counter,
bindingsFactory,
);
}
if (--counter.count === 0) {
Expand Down Expand Up @@ -333,6 +336,7 @@ export abstract class ActorAbstractPath extends ActorQueryOperationTypedMediated
termHashesCurrentSubject,
it,
counter,
bindingsFactory,
);
});
results.bindingsStream.on('error', reject);
Expand Down
7 changes: 7 additions & 0 deletions packages/actor-init-query/lib/ActorInitQueryBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { MediatorContextPreprocess } from '@comunica/bus-context-preprocess
import type { MediatorHttpInvalidate } from '@comunica/bus-http-invalidate';
import type { IActionInit, IActorInitArgs, IActorOutputInit } from '@comunica/bus-init';
import { ActorInit } from '@comunica/bus-init';
import type { MediatorMergeBindingsContext } from '@comunica/bus-merge-bindings-context';
import type { MediatorOptimizeQueryOperation } from '@comunica/bus-optimize-query-operation';
import type { MediatorQueryOperation } from '@comunica/bus-query-operation';
import type { MediatorQueryParse } from '@comunica/bus-query-parse';
Expand All @@ -24,6 +25,7 @@ export class ActorInitQueryBase<QueryContext extends IQueryContextCommon = IQuer
public readonly mediatorQueryResultSerializeMediaTypeFormatCombiner: MediatorQueryResultSerializeMediaTypeFormats;
public readonly mediatorContextPreprocess: MediatorContextPreprocess;
public readonly mediatorHttpInvalidate: MediatorHttpInvalidate;
public readonly mediatorMergeBindingsContext: MediatorMergeBindingsContext;

public readonly logger: Logger;
public readonly queryString?: string;
Expand Down Expand Up @@ -97,6 +99,11 @@ export interface IActorInitQueryBaseArgs<QueryContext extends IQueryContextCommo
* The HTTP cache invalidation mediator
*/
mediatorHttpInvalidate: MediatorHttpInvalidate;
/**
* A mediator for creating binding context merge handlers
*/
mediatorMergeBindingsContext: MediatorMergeBindingsContext;

/**
* The logger of this actor
* @default {a <npmd:@comunica/logger-void/^2.0.0/components/LoggerVoid.jsonld#LoggerVoid>}
Expand Down
5 changes: 4 additions & 1 deletion packages/actor-init-query/lib/QueryEngineBase.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BindingsFactory } from '@comunica/bindings-factory';
import { materializeOperation } from '@comunica/bus-query-operation';
import type { IActionSparqlSerialize, IActorQueryResultSerializeOutput } from '@comunica/bus-query-result-serialize';
import { KeysCore, KeysInitQuery, KeysRdfResolveQuadPattern } from '@comunica/context-entries';
Expand Down Expand Up @@ -184,7 +185,9 @@ implements IQueryEngine<QueryContext, QueryStringContextInner, QueryAlgebraConte

// Apply initial bindings in context
if (actionContext.has(KeysInitQuery.initialBindings)) {
operation = materializeOperation(operation, actionContext.get(KeysInitQuery.initialBindings)!);
const bindingsFactory = await BindingsFactory
.create(this.actorInitQuery.mediatorMergeBindingsContext, actionContext);
operation = materializeOperation(operation, actionContext.get(KeysInitQuery.initialBindings)!, bindingsFactory);

// Delete the query string from the context, since our initial query might have changed
actionContext = actionContext.delete(KeysInitQuery.queryString);
Expand Down

0 comments on commit aeaa306

Please sign in to comment.