@comunica/actor-rdf-join-inner-multi-smallest-filter-bindings 4.4.2-alpha.49.0 → 4.5.0
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.
- package/components/ActorRdfJoinMultiSmallestFilterBindings.jsonld +0 -0
- package/components/components.jsonld +0 -0
- package/components/context.jsonld +0 -0
- package/lib/ActorRdfJoinMultiSmallestFilterBindings.d.ts +0 -0
- package/lib/ActorRdfJoinMultiSmallestFilterBindings.js +2 -2
- package/lib/ActorRdfJoinMultiSmallestFilterBindings.js.map +1 -1
- package/lib/index.d.ts +0 -0
- package/lib/index.js +0 -0
- package/lib/index.js.map +0 -0
- package/package.json +13 -13
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -4,11 +4,11 @@ exports.ActorRdfJoinMultiSmallestFilterBindings = void 0;
|
|
|
4
4
|
const bus_rdf_join_1 = require("@comunica/bus-rdf-join");
|
|
5
5
|
const context_entries_1 = require("@comunica/context-entries");
|
|
6
6
|
const core_1 = require("@comunica/core");
|
|
7
|
-
const utils_algebra_1 = require("@comunica/utils-algebra");
|
|
8
7
|
const utils_bindings_factory_1 = require("@comunica/utils-bindings-factory");
|
|
9
8
|
const utils_iterator_1 = require("@comunica/utils-iterator");
|
|
10
9
|
const utils_query_operation_1 = require("@comunica/utils-query-operation");
|
|
11
10
|
const asynciterator_1 = require("asynciterator");
|
|
11
|
+
const sparqlalgebrajs_1 = require("sparqlalgebrajs");
|
|
12
12
|
/**
|
|
13
13
|
* A comunica Inner Multi Smallest Filter Bindings RDF Join Actor.
|
|
14
14
|
*/
|
|
@@ -67,7 +67,7 @@ class ActorRdfJoinMultiSmallestFilterBindings extends bus_rdf_join_1.ActorRdfJoi
|
|
|
67
67
|
}
|
|
68
68
|
async getOutput(action) {
|
|
69
69
|
const dataFactory = action.context.getSafe(context_entries_1.KeysInitQuery.dataFactory);
|
|
70
|
-
const algebraFactory = new
|
|
70
|
+
const algebraFactory = new sparqlalgebrajs_1.Factory(dataFactory);
|
|
71
71
|
// Determine the two smallest streams by sorting (e.g. via cardinality)
|
|
72
72
|
const entriesUnsorted = await bus_rdf_join_1.ActorRdfJoin.getEntriesWithMetadatas([...action.entries]);
|
|
73
73
|
const { first, second: secondIn, remaining: remainingIn } = (await this.sortJoinEntries(entriesUnsorted, action.context)).getOrThrow();
|
|
@@ -1 +1 @@
|
|
|
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 { AlgebraFactory } from '@comunica/utils-algebra';\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';\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 AlgebraFactory(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"]}
|
|
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/lib/index.d.ts
CHANGED
|
File without changes
|
package/lib/index.js
CHANGED
|
File without changes
|
package/lib/index.js.map
CHANGED
|
File without changes
|
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.5.0",
|
|
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-
|
|
51
|
-
"@comunica/utils-
|
|
52
|
-
"@comunica/utils-
|
|
53
|
-
"
|
|
54
|
-
"
|
|
44
|
+
"@comunica/bus-rdf-join": "^4.5.0",
|
|
45
|
+
"@comunica/bus-rdf-join-entries-sort": "^4.5.0",
|
|
46
|
+
"@comunica/context-entries": "^4.5.0",
|
|
47
|
+
"@comunica/core": "^4.5.0",
|
|
48
|
+
"@comunica/mediatortype-join-coefficients": "^4.5.0",
|
|
49
|
+
"@comunica/types": "^4.5.0",
|
|
50
|
+
"@comunica/utils-bindings-factory": "^4.5.0",
|
|
51
|
+
"@comunica/utils-iterator": "^4.5.0",
|
|
52
|
+
"@comunica/utils-query-operation": "^4.5.0",
|
|
53
|
+
"asynciterator": "^3.9.0",
|
|
54
|
+
"sparqlalgebrajs": "^5.0.2"
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "2bcd98c387a021fc5c08d375793c205ca3d1bf0d"
|
|
57
57
|
}
|