@comunica/actor-rdf-join-inner-multi-smallest-filter-bindings 4.2.0 → 4.4.1
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.
|
@@ -149,7 +149,11 @@ class ActorRdfJoinMultiSmallestFilterBindings extends bus_rdf_join_1.ActorRdfJoi
|
|
|
149
149
|
}
|
|
150
150
|
const testingOperation = second.operation;
|
|
151
151
|
const selectorShape = await sourceWrapper.source.getSelectorShape(action.context);
|
|
152
|
-
|
|
152
|
+
const wildcardAcceptAllExtensionFunctions = action.context.get(context_entries_1.KeysInitQuery.extensionFunctionsAlwaysPushdown);
|
|
153
|
+
if (!(0, utils_query_operation_1.doesShapeAcceptOperation)(selectorShape, testingOperation, {
|
|
154
|
+
filterBindings: true,
|
|
155
|
+
wildcardAcceptAllExtensionFunctions,
|
|
156
|
+
})) {
|
|
153
157
|
return (0, core_1.failTest)(`Actor ${this.name} can only process if entries[1] accept filterBindings`);
|
|
154
158
|
}
|
|
155
159
|
// Determine cost coefficients
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActorRdfJoinMultiSmallestFilterBindings.js","sourceRoot":"","sources":["ActorRdfJoinMultiSmallestFilterBindings.ts"],"names":[],"mappings":";;;AAOA,yDAAsD;AAEtD,+DAAuE;AAEvE,yCAA0E;AAU1E,6EAAoE;AACpE,6DAA2D;AAC3D,2EAAgH;AAGhH,iDAA8C;AAC9C,qDAA0C;AAE1C;;GAEG;AACH,MAAa,uCAAwC,SAAQ,2BAAY;IAMvE,YAAmB,IAAkD;QACnE,KAAK,CAAC,IAAI,EAAE;YACV,WAAW,EAAE,OAAO;YACpB,YAAY,EAAE,gCAAgC;YAC9C,YAAY,EAAE,CAAC;YACf,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,eAAe,CAC1B,OAAiC,EACjC,OAAuB;QAMvB,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAElG,4EAA4E;QAC5E,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE;YAC3D,IAAI,SAAS,CAAC,iBAAiB,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;gBACjE,OAAO,CAAC,CAAC,CAAC;YACZ,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5C,8FAA8F;QAC9F,oCAAoC;QACpC,0CAA0C;QAC1C,IAAI,MAA0C,CAAC;QAC/C,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,qBAAqB,GAAG,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAE,CAAC,EAAE,KAAK,CAAE,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;YACnD,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS;iBAC7C,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS;iBAC9C,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5F,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,GAAG,qBAAqB;gBACrD,CAAC,eAAe,KAAK,qBAAqB;oBACxC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM;wBACjE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM;4BACnE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjF,MAAM,GAAG,KAAK,CAAC;gBACf,WAAW,GAAG,CAAC,CAAC;gBAChB,qBAAqB,GAAG,eAAe,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,qBAAqB,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,IAAA,eAAQ,EAAC,SAAS,IAAI,CAAC,IAAI,sCAAsC,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC;QAChC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,IAAA,eAAQ,EAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,MAAsB;QAC3C,MAAM,WAAW,GAAwB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,+BAAa,CAAC,WAAW,CAAC,CAAC;QAC3F,MAAM,cAAc,GAAG,IAAI,yBAAO,CAAC,WAAW,CAAC,CAAC;QAEhD,uEAAuE;QACvE,MAAM,eAAe,GAAG,MAAM,2BAAY,CAAC,uBAAuB,CAAC,CAAE,GAAG,MAAM,CAAC,OAAO,CAAE,CAAC,CAAC;QAC1F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CACrF,eAAe,EACf,MAAM,CAAC,OAAO,CACf,CAAC,CAAC,UAAU,EAAE,CAAC;QAEhB,mDAAmD;QACnD,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC;QACpD,KAAK,CAAC,MAAM,CAAC,cAAc,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC;QAEtD,0EAA0E;QAC1E,kHAAkH;QAClH,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS;aAC7C,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS;aACjD,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,MAAM,wBAAwB,GAAmB,eAAe,CAAC,KAAK,EAAE;aACrE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAC5C,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC9E,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAClB,MAAM,IAAI,GAAW,IAAA,yCAAgB,EAAC,OAAO,CAAC,CAAC;YAC/C,OAAO,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEL,iGAAiG;QACjG,MAAM,cAAc,GAA+C,IAAI,gCAAe,CACpF,wBAAwB,EACxB,IAAI,CAAC,SAAS,EACd,EAAE,SAAS,EAAE,KAAK,EAAE,CACrB,CAAC;QAEF,qEAAqE;QACrE,MAAM,aAAa,GAAyB,IAAA,0CAAkB,EAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,IAAI,6BAAa,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CACnG,QAAQ,CAAC,SAAS,EAClB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EACpF,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAC,CACjE,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAe;YACzB,MAAM,EAAE;gBACN,IAAI,EAAE,UAAU;gBAChB,cAAc,EAAE,YAAY;gBAC5B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;aACnC;YACD,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,iBAAiB,EAAE,IAAI;SACxB,CAAC;QAEF,4CAA4C;QAC5C,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAEzC,gCAAgC;QAChC,MAAM,WAAW,GAAe;YAC9B,MAAM,EAAE,IAAA,uCAAe,EAAC,MAAM,IAAI,CAAC,YAAY;iBAC5C,OAAO,CAAC;gBACP,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,CAAE,KAAK,EAAE,MAAM,CAAE;gBAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,6BAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC;aAC7E,CAAC,CAAC;YACL,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,CAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAE,EAAE,KAAK,CAAC;YAClF,iBAAiB,EAAE,IAAI;SACxB,CAAC;QAEF,sDAAsD;QACtD,MAAM,SAAS,GAAiB,WAAW,CAAC;QAC5C,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE/B,OAAO;YACL,MAAM,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;gBACtC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;YACF,oBAAoB,EAAE;gBACpB,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC1C,WAAW,EAAE,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC;aAC/C;SACF,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,MAAsB,EACtB,QAAmC;QAEnC,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QAE7B,2BAA2B;QAC3B,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,6BAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3E,OAAO,IAAA,eAAQ,EAAC,SAAS,IAAI,CAAC,IAAI,gCAAgC,CAAC,CAAC;QACtE,CAAC;QAED,SAAS,GAAG,CAAE,GAAG,SAAS,CAAE,CAAC;QAC7B,uEAAuE;QACvE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO;aAC3D,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC;QAExD,uDAAuD;QACvD,MAAM,aAAa,GAAoC,IAAA,0CAAkB,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5F,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAA,eAAQ,EAAC,SAAS,IAAI,CAAC,IAAI,8CAA8C,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC;QAC1C,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClF,IAAI,CAAC,IAAA,gDAAwB,EAAC,aAAa,EAAE,gBAAgB,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACzF,OAAO,IAAA,eAAQ,EAAC,SAAS,IAAI,CAAC,IAAI,uDAAuD,CAAC,CAAC;QAC7F,CAAC;QAED,8BAA8B;QAC9B,SAAS,GAAG,CAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAE,CAAC;QAC7F,MAAM,mBAAmB,GAAG,2BAAY,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,gBAAgB,GAAG,2BAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC;YACjE,OAAO,EAAE,CAAE,KAAK,EAAE,MAAM,CAAE;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,MAAM,oBAAoB,GAAG,SAAS;aACnC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAElG,OAAO,IAAA,2BAAoB,EAAC;YAC1B,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC,mBAAmB;gBAChD,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,oBAAoB;YAC1D,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK;YAChD,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK;YAC/C,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC;gBACxF,mBAAmB,CAAC,CAAC,CAAC,GAAG,oBAAoB,GAAG,gBAAgB,CAAC,CAAC,CAAC;SACtE,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;CACF;AAhND,0FAgNC","sourcesContent":["import type {\n IActionRdfJoin,\n IActorRdfJoinArgs,\n MediatorRdfJoin,\n IActorRdfJoinOutputInner,\n IActorRdfJoinTestSideData,\n} from '@comunica/bus-rdf-join';\nimport { ActorRdfJoin } from '@comunica/bus-rdf-join';\nimport type { MediatorRdfJoinEntriesSort } from '@comunica/bus-rdf-join-entries-sort';\nimport { KeysInitQuery, KeysRdfJoin } from '@comunica/context-entries';\nimport type { TestResult } from '@comunica/core';\nimport { passTestWithSideData, failTest, passTest } from '@comunica/core';\nimport type { IMediatorTypeJoinCoefficients } from '@comunica/mediatortype-join-coefficients';\nimport type {\n BindingsStream,\n ComunicaDataFactory,\n IActionContext,\n IJoinEntry,\n IJoinEntryWithMetadata,\n IQuerySourceWrapper,\n} from '@comunica/types';\nimport { bindingsToString } from '@comunica/utils-bindings-factory';\nimport { ChunkedIterator } from '@comunica/utils-iterator';\nimport { doesShapeAcceptOperation, getOperationSource, getSafeBindings } from '@comunica/utils-query-operation';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { UnionIterator } from 'asynciterator';\nimport { Factory } from 'sparqlalgebrajs';\n\n/**\n * A comunica Inner Multi Smallest Filter Bindings RDF Join Actor.\n */\nexport class ActorRdfJoinMultiSmallestFilterBindings extends ActorRdfJoin {\n public readonly selectivityModifier: number;\n public readonly blockSize: number;\n public readonly mediatorJoinEntriesSort: MediatorRdfJoinEntriesSort;\n public readonly mediatorJoin: MediatorRdfJoin;\n\n public constructor(args: IActorRdfJoinMultiSmallestFilterBindingsArgs) {\n super(args, {\n logicalType: 'inner',\n physicalName: 'multi-smallest-filter-bindings',\n limitEntries: 2,\n limitEntriesMin: true,\n isLeaf: false,\n });\n }\n\n /**\n * Order the given join entries using the join-entries-sort bus.\n * @param {IJoinEntryWithMetadata[]} entries An array of join entries.\n * @param context The action context.\n * @return {IJoinEntryWithMetadata[]} The sorted join entries.\n */\n public async sortJoinEntries(\n entries: IJoinEntryWithMetadata[],\n context: IActionContext,\n ): Promise<TestResult<{\n first: IJoinEntryWithMetadata;\n second: IJoinEntryWithMetadata;\n remaining: IJoinEntryWithMetadata[];\n }>> {\n let { entries: entriesSorted } = await this.mediatorJoinEntriesSort.mediate({ entries, context });\n\n // Prioritize entries with modified operations, so these are not re-executed\n entriesSorted = entriesSorted.sort((entryLeft, entryRight) => {\n if (entryLeft.operationModified && !entryRight.operationModified) {\n return -1;\n }\n return 0;\n });\n\n const first = entriesSorted.splice(0, 1)[0];\n\n // Let second entry first be prioritized for sharing as many variables with first as possible,\n // then having the fewest variables,\n // and then having the lowest cardinality.\n let second: IJoinEntryWithMetadata | undefined;\n let secondIndex = -1;\n let secondSharedVariables = 0;\n for (const [ i, entry ] of entriesSorted.entries()) {\n const sharedVariables = first.metadata.variables\n .filter(variableFirst => entry.metadata.variables\n .some(variableSecond => variableFirst.variable.equals(variableSecond.variable))).length;\n if (!second || (sharedVariables > secondSharedVariables ||\n (sharedVariables === secondSharedVariables &&\n (entry.metadata.variables.length < second.metadata.variables.length ||\n (entry.metadata.variables.length === second.metadata.variables.length &&\n entry.metadata.cardinality.value < second.metadata.cardinality.value))))) {\n second = entry;\n secondIndex = i;\n secondSharedVariables = sharedVariables;\n }\n }\n\n if (secondSharedVariables === 0) {\n return failTest(`Actor ${this.name} can only join with common variables`);\n }\n\n const remaining = entriesSorted;\n remaining.splice(secondIndex, 1);\n return passTest({ first, second: second!, remaining });\n }\n\n public async getOutput(action: IActionRdfJoin): Promise<IActorRdfJoinOutputInner> {\n const dataFactory: ComunicaDataFactory = action.context.getSafe(KeysInitQuery.dataFactory);\n const algebraFactory = new Factory(dataFactory);\n\n // Determine the two smallest streams by sorting (e.g. via cardinality)\n const entriesUnsorted = await ActorRdfJoin.getEntriesWithMetadatas([ ...action.entries ]);\n const { first, second: secondIn, remaining: remainingIn } = (await this.sortJoinEntries(\n entriesUnsorted,\n action.context,\n )).getOrThrow();\n\n // Clone first stream, because we will use it twice\n const smallestStream1 = first.output.bindingsStream;\n first.output.bindingsStream = smallestStream1.clone();\n\n // Project the first stream on common variables, and filter out duplicates\n // The common variables array is guaranteed to be non-empty, due to the way the test of this actor is implemented.\n const commonVariables = first.metadata.variables\n .filter(variableFirst => secondIn.metadata.variables\n .some(variableSecond => variableFirst.variable.equals(variableSecond.variable)));\n const hashes: Record<string, boolean> = {};\n const smallestStream1Projected: BindingsStream = smallestStream1.clone()\n .map(binding => binding.filter((value, key) =>\n commonVariables.some(commonVariable => commonVariable.variable.equals(key))))\n .filter((binding) => {\n const hash: string = bindingsToString(binding);\n return !(hash in hashes) && (hashes[hash] = true);\n });\n\n // Slice the first stream into chunks according to the block size, so we avoid blocking too long.\n const chunkedStreams: AsyncIterator<AsyncIterator<RDF.Bindings>> = new ChunkedIterator(\n smallestStream1Projected,\n this.blockSize,\n { autoStart: false },\n );\n\n // Push down bindings of first stream when querying for second stream\n const sourceWrapper = <IQuerySourceWrapper> getOperationSource(secondIn.operation);\n const secondStream = new UnionIterator(chunkedStreams.map(chunk => sourceWrapper.source.queryBindings(\n secondIn.operation,\n sourceWrapper.context ? action.context.merge(sourceWrapper.context) : action.context,\n { filterBindings: { bindings: chunk, metadata: first.metadata }},\n )));\n const second: IJoinEntry = {\n output: {\n type: 'bindings',\n bindingsStream: secondStream,\n metadata: secondIn.output.metadata,\n },\n operation: secondIn.operation,\n operationModified: true,\n };\n\n // Destroy the unused original second stream\n secondIn.output.bindingsStream.destroy();\n\n // Join the two selected streams\n const joinedEntry: IJoinEntry = {\n output: getSafeBindings(await this.mediatorJoin\n .mediate({\n type: action.type,\n entries: [ first, second ],\n context: action.context.set(KeysRdfJoin.lastPhysicalJoin, this.physicalName),\n })),\n operation: algebraFactory.createJoin([ first.operation, second.operation ], false),\n operationModified: true,\n };\n\n // And then join the result with the remaining streams\n const remaining: IJoinEntry[] = remainingIn;\n remaining.unshift(joinedEntry);\n\n return {\n result: await this.mediatorJoin.mediate({\n type: action.type,\n entries: remaining,\n context: action.context,\n }),\n physicalPlanMetadata: {\n firstIndex: entriesUnsorted.indexOf(first),\n secondIndex: entriesUnsorted.indexOf(secondIn),\n },\n };\n }\n\n public async getJoinCoefficients(\n action: IActionRdfJoin,\n sideData: IActorRdfJoinTestSideData,\n ): Promise<TestResult<IMediatorTypeJoinCoefficients, IActorRdfJoinTestSideData>> {\n let { metadatas } = sideData;\n\n // Avoid infinite recursion\n if (action.context.get(KeysRdfJoin.lastPhysicalJoin) === this.physicalName) {\n return failTest(`Actor ${this.name} can not be called recursively`);\n }\n\n metadatas = [ ...metadatas ];\n // Determine the two smallest streams by sorting (e.g. via cardinality)\n const sortedResult = await this.sortJoinEntries(action.entries\n .map((entry, i) => ({ ...entry, metadata: metadatas[i] })), action.context);\n if (sortedResult.isFailed()) {\n return sortedResult;\n }\n const { first, second, remaining } = sortedResult.get();\n\n // Only pass if the second entry accepts filterBindings\n const sourceWrapper: IQuerySourceWrapper | undefined = getOperationSource(second.operation);\n if (!sourceWrapper) {\n return failTest(`Actor ${this.name} can only process if entries[1] has a source`);\n }\n const testingOperation = second.operation;\n const selectorShape = await sourceWrapper.source.getSelectorShape(action.context);\n if (!doesShapeAcceptOperation(selectorShape, testingOperation, { filterBindings: true })) {\n return failTest(`Actor ${this.name} can only process if entries[1] accept filterBindings`);\n }\n\n // Determine cost coefficients\n metadatas = [ first.metadata, second.metadata, ...remaining.map(remain => remain.metadata) ];\n const requestInitialTimes = ActorRdfJoin.getRequestInitialTimes(metadatas);\n const requestItemTimes = ActorRdfJoin.getRequestItemTimes(metadatas);\n const { selectivity } = await this.mediatorJoinSelectivity.mediate({\n entries: [ first, second ],\n context: action.context,\n });\n const cardinalityRemaining = remaining\n .reduce((mul, remain) => mul * remain.metadata.cardinality.value * this.selectivityModifier, 1);\n\n return passTestWithSideData({\n iterations: selectivity * this.selectivityModifier *\n second.metadata.cardinality.value * cardinalityRemaining,\n persistedItems: first.metadata.cardinality.value,\n blockingItems: first.metadata.cardinality.value,\n requestTime: requestInitialTimes[0] + metadatas[0].cardinality.value * requestItemTimes[0] +\n requestInitialTimes[1] + cardinalityRemaining * requestItemTimes[1],\n }, sideData);\n }\n}\n\nexport interface IActorRdfJoinMultiSmallestFilterBindingsArgs extends IActorRdfJoinArgs {\n /**\n * Multiplier for selectivity values\n * @range {double}\n * @default {0.0001}\n */\n selectivityModifier: number;\n /**\n * The maximum amount of bindings to send to the source per block.\n * @default {64}\n */\n blockSize: number;\n /**\n * The join entries sort mediator\n */\n mediatorJoinEntriesSort: MediatorRdfJoinEntriesSort;\n /**\n * A mediator for joining Bindings streams\n */\n mediatorJoin: MediatorRdfJoin;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ActorRdfJoinMultiSmallestFilterBindings.js","sourceRoot":"","sources":["ActorRdfJoinMultiSmallestFilterBindings.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IActionRdfJoin,\n IActorRdfJoinArgs,\n MediatorRdfJoin,\n IActorRdfJoinOutputInner,\n IActorRdfJoinTestSideData,\n} from '@comunica/bus-rdf-join';\nimport { ActorRdfJoin } from '@comunica/bus-rdf-join';\nimport type { MediatorRdfJoinEntriesSort } from '@comunica/bus-rdf-join-entries-sort';\nimport { KeysInitQuery, KeysRdfJoin } from '@comunica/context-entries';\nimport type { TestResult } from '@comunica/core';\nimport { passTestWithSideData, failTest, passTest } from '@comunica/core';\nimport type { IMediatorTypeJoinCoefficients } from '@comunica/mediatortype-join-coefficients';\nimport type {\n BindingsStream,\n ComunicaDataFactory,\n IActionContext,\n IJoinEntry,\n IJoinEntryWithMetadata,\n IQuerySourceWrapper,\n} from '@comunica/types';\nimport { bindingsToString } from '@comunica/utils-bindings-factory';\nimport { ChunkedIterator } from '@comunica/utils-iterator';\nimport { doesShapeAcceptOperation, getOperationSource, getSafeBindings } from '@comunica/utils-query-operation';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { UnionIterator } from 'asynciterator';\nimport { Factory } from 'sparqlalgebrajs';\n\n/**\n * A comunica Inner Multi Smallest Filter Bindings RDF Join Actor.\n */\nexport class ActorRdfJoinMultiSmallestFilterBindings extends ActorRdfJoin {\n public readonly selectivityModifier: number;\n public readonly blockSize: number;\n public readonly mediatorJoinEntriesSort: MediatorRdfJoinEntriesSort;\n public readonly mediatorJoin: MediatorRdfJoin;\n\n public constructor(args: IActorRdfJoinMultiSmallestFilterBindingsArgs) {\n super(args, {\n logicalType: 'inner',\n physicalName: 'multi-smallest-filter-bindings',\n limitEntries: 2,\n limitEntriesMin: true,\n isLeaf: false,\n });\n }\n\n /**\n * Order the given join entries using the join-entries-sort bus.\n * @param {IJoinEntryWithMetadata[]} entries An array of join entries.\n * @param context The action context.\n * @return {IJoinEntryWithMetadata[]} The sorted join entries.\n */\n public async sortJoinEntries(\n entries: IJoinEntryWithMetadata[],\n context: IActionContext,\n ): Promise<TestResult<{\n first: IJoinEntryWithMetadata;\n second: IJoinEntryWithMetadata;\n remaining: IJoinEntryWithMetadata[];\n }>> {\n let { entries: entriesSorted } = await this.mediatorJoinEntriesSort.mediate({ entries, context });\n\n // Prioritize entries with modified operations, so these are not re-executed\n entriesSorted = entriesSorted.sort((entryLeft, entryRight) => {\n if (entryLeft.operationModified && !entryRight.operationModified) {\n return -1;\n }\n return 0;\n });\n\n const first = entriesSorted.splice(0, 1)[0];\n\n // Let second entry first be prioritized for sharing as many variables with first as possible,\n // then having the fewest variables,\n // and then having the lowest cardinality.\n let second: IJoinEntryWithMetadata | undefined;\n let secondIndex = -1;\n let secondSharedVariables = 0;\n for (const [ i, entry ] of entriesSorted.entries()) {\n const sharedVariables = first.metadata.variables\n .filter(variableFirst => entry.metadata.variables\n .some(variableSecond => variableFirst.variable.equals(variableSecond.variable))).length;\n if (!second || (sharedVariables > secondSharedVariables ||\n (sharedVariables === secondSharedVariables &&\n (entry.metadata.variables.length < second.metadata.variables.length ||\n (entry.metadata.variables.length === second.metadata.variables.length &&\n entry.metadata.cardinality.value < second.metadata.cardinality.value))))) {\n second = entry;\n secondIndex = i;\n secondSharedVariables = sharedVariables;\n }\n }\n\n if (secondSharedVariables === 0) {\n return failTest(`Actor ${this.name} can only join with common variables`);\n }\n\n const remaining = entriesSorted;\n remaining.splice(secondIndex, 1);\n return passTest({ first, second: second!, remaining });\n }\n\n public async getOutput(action: IActionRdfJoin): Promise<IActorRdfJoinOutputInner> {\n const dataFactory: ComunicaDataFactory = action.context.getSafe(KeysInitQuery.dataFactory);\n const algebraFactory = new Factory(dataFactory);\n\n // Determine the two smallest streams by sorting (e.g. via cardinality)\n const entriesUnsorted = await ActorRdfJoin.getEntriesWithMetadatas([ ...action.entries ]);\n const { first, second: secondIn, remaining: remainingIn } = (await this.sortJoinEntries(\n entriesUnsorted,\n action.context,\n )).getOrThrow();\n\n // Clone first stream, because we will use it twice\n const smallestStream1 = first.output.bindingsStream;\n first.output.bindingsStream = smallestStream1.clone();\n\n // Project the first stream on common variables, and filter out duplicates\n // The common variables array is guaranteed to be non-empty, due to the way the test of this actor is implemented.\n const commonVariables = first.metadata.variables\n .filter(variableFirst => secondIn.metadata.variables\n .some(variableSecond => variableFirst.variable.equals(variableSecond.variable)));\n const hashes: Record<string, boolean> = {};\n const smallestStream1Projected: BindingsStream = smallestStream1.clone()\n .map(binding => binding.filter((value, key) =>\n commonVariables.some(commonVariable => commonVariable.variable.equals(key))))\n .filter((binding) => {\n const hash: string = bindingsToString(binding);\n return !(hash in hashes) && (hashes[hash] = true);\n });\n\n // Slice the first stream into chunks according to the block size, so we avoid blocking too long.\n const chunkedStreams: AsyncIterator<AsyncIterator<RDF.Bindings>> = new ChunkedIterator(\n smallestStream1Projected,\n this.blockSize,\n { autoStart: false },\n );\n\n // Push down bindings of first stream when querying for second stream\n const sourceWrapper = <IQuerySourceWrapper> getOperationSource(secondIn.operation);\n const secondStream = new UnionIterator(chunkedStreams.map(chunk => sourceWrapper.source.queryBindings(\n secondIn.operation,\n sourceWrapper.context ? action.context.merge(sourceWrapper.context) : action.context,\n { filterBindings: { bindings: chunk, metadata: first.metadata }},\n )));\n const second: IJoinEntry = {\n output: {\n type: 'bindings',\n bindingsStream: secondStream,\n metadata: secondIn.output.metadata,\n },\n operation: secondIn.operation,\n operationModified: true,\n };\n\n // Destroy the unused original second stream\n secondIn.output.bindingsStream.destroy();\n\n // Join the two selected streams\n const joinedEntry: IJoinEntry = {\n output: getSafeBindings(await this.mediatorJoin\n .mediate({\n type: action.type,\n entries: [ first, second ],\n context: action.context.set(KeysRdfJoin.lastPhysicalJoin, this.physicalName),\n })),\n operation: algebraFactory.createJoin([ first.operation, second.operation ], false),\n operationModified: true,\n };\n\n // And then join the result with the remaining streams\n const remaining: IJoinEntry[] = remainingIn;\n remaining.unshift(joinedEntry);\n\n return {\n result: await this.mediatorJoin.mediate({\n type: action.type,\n entries: remaining,\n context: action.context,\n }),\n physicalPlanMetadata: {\n firstIndex: entriesUnsorted.indexOf(first),\n secondIndex: entriesUnsorted.indexOf(secondIn),\n },\n };\n }\n\n public async getJoinCoefficients(\n action: IActionRdfJoin,\n sideData: IActorRdfJoinTestSideData,\n ): Promise<TestResult<IMediatorTypeJoinCoefficients, IActorRdfJoinTestSideData>> {\n let { metadatas } = sideData;\n\n // Avoid infinite recursion\n if (action.context.get(KeysRdfJoin.lastPhysicalJoin) === this.physicalName) {\n return failTest(`Actor ${this.name} can not be called recursively`);\n }\n\n metadatas = [ ...metadatas ];\n // Determine the two smallest streams by sorting (e.g. via cardinality)\n const sortedResult = await this.sortJoinEntries(action.entries\n .map((entry, i) => ({ ...entry, metadata: metadatas[i] })), action.context);\n if (sortedResult.isFailed()) {\n return sortedResult;\n }\n const { first, second, remaining } = sortedResult.get();\n\n // Only pass if the second entry accepts filterBindings\n const sourceWrapper: IQuerySourceWrapper | undefined = getOperationSource(second.operation);\n if (!sourceWrapper) {\n return failTest(`Actor ${this.name} can only process if entries[1] has a source`);\n }\n const testingOperation = second.operation;\n const selectorShape = await sourceWrapper.source.getSelectorShape(action.context);\n const wildcardAcceptAllExtensionFunctions = action.context.get(KeysInitQuery.extensionFunctionsAlwaysPushdown);\n if (!doesShapeAcceptOperation(selectorShape, testingOperation, {\n filterBindings: true,\n wildcardAcceptAllExtensionFunctions,\n })) {\n return failTest(`Actor ${this.name} can only process if entries[1] accept filterBindings`);\n }\n\n // Determine cost coefficients\n metadatas = [ first.metadata, second.metadata, ...remaining.map(remain => remain.metadata) ];\n const requestInitialTimes = ActorRdfJoin.getRequestInitialTimes(metadatas);\n const requestItemTimes = ActorRdfJoin.getRequestItemTimes(metadatas);\n const { selectivity } = await this.mediatorJoinSelectivity.mediate({\n entries: [ first, second ],\n context: action.context,\n });\n const cardinalityRemaining = remaining\n .reduce((mul, remain) => mul * remain.metadata.cardinality.value * this.selectivityModifier, 1);\n\n return passTestWithSideData({\n iterations: selectivity * this.selectivityModifier *\n second.metadata.cardinality.value * cardinalityRemaining,\n persistedItems: first.metadata.cardinality.value,\n blockingItems: first.metadata.cardinality.value,\n requestTime: requestInitialTimes[0] + metadatas[0].cardinality.value * requestItemTimes[0] +\n requestInitialTimes[1] + cardinalityRemaining * requestItemTimes[1],\n }, sideData);\n }\n}\n\nexport interface IActorRdfJoinMultiSmallestFilterBindingsArgs extends IActorRdfJoinArgs {\n /**\n * Multiplier for selectivity values\n * @range {double}\n * @default {0.0001}\n */\n selectivityModifier: number;\n /**\n * The maximum amount of bindings to send to the source per block.\n * @default {64}\n */\n blockSize: number;\n /**\n * The join entries sort mediator\n */\n mediatorJoinEntriesSort: MediatorRdfJoinEntriesSort;\n /**\n * A mediator for joining Bindings streams\n */\n mediatorJoin: MediatorRdfJoin;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comunica/actor-rdf-join-inner-multi-smallest-filter-bindings",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.1",
|
|
4
4
|
"description": "A inner-multi-smallest-filter-bindings rdf-join actor",
|
|
5
5
|
"lsd:module": true,
|
|
6
6
|
"license": "MIT",
|
|
@@ -41,17 +41,17 @@
|
|
|
41
41
|
"build:components": "componentsjs-generator"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@comunica/bus-rdf-join": "^4.
|
|
45
|
-
"@comunica/bus-rdf-join-entries-sort": "^4.
|
|
46
|
-
"@comunica/context-entries": "^4.
|
|
47
|
-
"@comunica/core": "^4.
|
|
48
|
-
"@comunica/mediatortype-join-coefficients": "^4.
|
|
49
|
-
"@comunica/types": "^4.
|
|
50
|
-
"@comunica/utils-bindings-factory": "^4.
|
|
44
|
+
"@comunica/bus-rdf-join": "^4.4.1",
|
|
45
|
+
"@comunica/bus-rdf-join-entries-sort": "^4.4.0",
|
|
46
|
+
"@comunica/context-entries": "^4.4.1",
|
|
47
|
+
"@comunica/core": "^4.4.0",
|
|
48
|
+
"@comunica/mediatortype-join-coefficients": "^4.4.0",
|
|
49
|
+
"@comunica/types": "^4.4.0",
|
|
50
|
+
"@comunica/utils-bindings-factory": "^4.4.0",
|
|
51
51
|
"@comunica/utils-iterator": "^4.0.1",
|
|
52
|
-
"@comunica/utils-query-operation": "^4.
|
|
52
|
+
"@comunica/utils-query-operation": "^4.4.1",
|
|
53
53
|
"asynciterator": "^3.9.0",
|
|
54
54
|
"sparqlalgebrajs": "^4.3.8"
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "c5cc36caf88da31173a0969a7da88cadb7f469ac"
|
|
57
57
|
}
|