@comunica/actor-rdf-join-inner-multi-smallest 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.
@@ -162,6 +162,14 @@
162
162
  "@id": "carjimsm:components/ActorRdfJoinMultiSmallest.jsonld#ActorRdfJoinMultiSmallest__member_constructor",
163
163
  "memberFieldName": "constructor"
164
164
  },
165
+ {
166
+ "@id": "carjimsm:components/ActorRdfJoinMultiSmallest.jsonld#ActorRdfJoinMultiSmallest__member_getJoinIndexes",
167
+ "memberFieldName": "getJoinIndexes"
168
+ },
169
+ {
170
+ "@id": "carjimsm:components/ActorRdfJoinMultiSmallest.jsonld#ActorRdfJoinMultiSmallest__member_hasCommonVariables",
171
+ "memberFieldName": "hasCommonVariables"
172
+ },
165
173
  {
166
174
  "@id": "carjimsm:components/ActorRdfJoinMultiSmallest.jsonld#ActorRdfJoinMultiSmallest__member_sortJoinEntries",
167
175
  "memberFieldName": "sortJoinEntries"
@@ -12,6 +12,12 @@ export declare class ActorRdfJoinMultiSmallest extends ActorRdfJoin<IActorRdfJoi
12
12
  readonly mediatorJoinEntriesSort: MediatorRdfJoinEntriesSort;
13
13
  readonly mediatorJoin: MediatorRdfJoin;
14
14
  constructor(args: IActorRdfJoinMultiSmallestArgs);
15
+ /**
16
+ * Finds join indexes of lowest cardinality result sets, with priority on result sets that have common variables
17
+ * @param entries A sorted array of entries, sorted on cardinality
18
+ */
19
+ getJoinIndexes(entries: IJoinEntryWithMetadata[]): [number, number];
20
+ hasCommonVariables(entry1: IJoinEntryWithMetadata, entry2: IJoinEntryWithMetadata): boolean;
15
21
  /**
16
22
  * Order the given join entries using the join-entries-sort bus.
17
23
  * @param {IJoinEntryWithMetadata[]} entries An array of join entries.
@@ -21,6 +21,28 @@ class ActorRdfJoinMultiSmallest extends bus_rdf_join_1.ActorRdfJoin {
21
21
  isLeaf: false,
22
22
  });
23
23
  }
24
+ /**
25
+ * Finds join indexes of lowest cardinality result sets, with priority on result sets that have common variables
26
+ * @param entries A sorted array of entries, sorted on cardinality
27
+ */
28
+ getJoinIndexes(entries) {
29
+ // Iterate over all combinations of join indexes,
30
+ // return the first combination that does not lead to a cartesian product
31
+ for (let i = 0; i < entries.length; i++) {
32
+ for (let j = i + 1; j < entries.length; j++) {
33
+ if (this.hasCommonVariables(entries[i], entries[j])) {
34
+ return [i, j];
35
+ }
36
+ }
37
+ }
38
+ // If all result sets are disjoint we just want the sets with lowest cardinality
39
+ return [0, 1];
40
+ }
41
+ hasCommonVariables(entry1, entry2) {
42
+ const variableNames1 = entry1.metadata.variables.map(x => x.variable.value);
43
+ const variableNames2 = new Set(entry2.metadata.variables.map(x => x.variable.value));
44
+ return variableNames1.some(v => variableNames2.has(v));
45
+ }
24
46
  /**
25
47
  * Order the given join entries using the join-entries-sort bus.
26
48
  * @param {IJoinEntryWithMetadata[]} entries An array of join entries.
@@ -35,9 +57,12 @@ class ActorRdfJoinMultiSmallest extends bus_rdf_join_1.ActorRdfJoin {
35
57
  const algebraFactory = new sparqlalgebrajs_1.Factory(dataFactory);
36
58
  // Determine the two smallest streams by sorting (e.g. via cardinality)
37
59
  const entries = sideData.sortedEntries;
38
- const smallestEntry1 = entries[0];
39
- const smallestEntry2 = entries[1];
40
- entries.splice(0, 2);
60
+ const entriesMetaData = await bus_rdf_join_1.ActorRdfJoin.getEntriesWithMetadatas(entries);
61
+ const bestJoinIndexes = this.getJoinIndexes(entriesMetaData);
62
+ const smallestEntry1 = entries[bestJoinIndexes[0]];
63
+ const smallestEntry2 = entries[bestJoinIndexes[1]];
64
+ entries.splice(bestJoinIndexes[1], 1);
65
+ entries.splice(bestJoinIndexes[0], 1);
41
66
  // Join the two selected streams, and then join the result with the remaining streams
42
67
  const firstEntry = {
43
68
  output: (0, utils_query_operation_1.getSafeBindings)(await this.mediatorJoin
@@ -64,14 +89,11 @@ class ActorRdfJoinMultiSmallest extends bus_rdf_join_1.ActorRdfJoin {
64
89
  const requestInitialTimes = bus_rdf_join_1.ActorRdfJoin.getRequestInitialTimes(metadatas);
65
90
  const requestItemTimes = bus_rdf_join_1.ActorRdfJoin.getRequestItemTimes(metadatas);
66
91
  return (0, core_1.passTestWithSideData)({
67
- iterations: metadatas[0].cardinality.value * metadatas[1].cardinality.value *
68
- metadatas.slice(2).reduce((acc, metadata) => acc * metadata.cardinality.value, 1),
92
+ iterations: metadatas.reduce((acc, metadata) => acc * metadata.cardinality.value, 1),
69
93
  persistedItems: 0,
70
94
  blockingItems: 0,
71
- requestTime: requestInitialTimes[0] + metadatas[0].cardinality.value * requestItemTimes[0] +
72
- requestInitialTimes[1] + metadatas[1].cardinality.value * requestItemTimes[1] +
73
- metadatas.slice(2).reduce((sum, metadata, i) => sum + requestInitialTimes.slice(2)[i] +
74
- metadata.cardinality.value * requestItemTimes.slice(2)[i], 0),
95
+ requestTime: metadatas.reduce((sum, metadata, i) => sum + requestInitialTimes[i] +
96
+ metadata.cardinality.value * requestItemTimes[i], 0),
75
97
  }, { ...sideData, sortedEntries });
76
98
  }
77
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ActorRdfJoinMultiSmallest.js","sourceRoot":"","sources":["ActorRdfJoinMultiSmallest.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IActionRdfJoin,\n IActorRdfJoinOutputInner,\n IActorRdfJoinArgs,\n MediatorRdfJoin,\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 } from '@comunica/context-entries';\nimport type { TestResult } from '@comunica/core';\nimport { passTestWithSideData } from '@comunica/core';\nimport type { IMediatorTypeJoinCoefficients } from '@comunica/mediatortype-join-coefficients';\nimport type {\n IJoinEntry,\n IActionContext,\n IJoinEntryWithMetadata,\n ComunicaDataFactory,\n} from '@comunica/types';\nimport { getSafeBindings } from '@comunica/utils-query-operation';\nimport { Factory } from 'sparqlalgebrajs';\n\n/**\n * A Multi Smallest RDF Join Actor.\n * It accepts 3 or more streams, joins the smallest two, and joins the result with the remaining streams.\n */\nexport class ActorRdfJoinMultiSmallest extends ActorRdfJoin<IActorRdfJoinMultiSmallestTestSideData> {\n public readonly mediatorJoinEntriesSort: MediatorRdfJoinEntriesSort;\n public readonly mediatorJoin: MediatorRdfJoin;\n\n public constructor(args: IActorRdfJoinMultiSmallestArgs) {\n super(args, {\n logicalType: 'inner',\n physicalName: 'multi-smallest',\n limitEntries: 3,\n limitEntriesMin: true,\n canHandleUndefs: 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<IJoinEntryWithMetadata[]> {\n return (await this.mediatorJoinEntriesSort.mediate({ entries, context })).entries;\n }\n\n protected async getOutput(\n action: IActionRdfJoin,\n sideData: IActorRdfJoinMultiSmallestTestSideData,\n ): 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 entries: IJoinEntry[] = sideData.sortedEntries;\n const smallestEntry1 = entries[0];\n const smallestEntry2 = entries[1];\n entries.splice(0, 2);\n\n // Join the two selected streams, and then join the result with the remaining streams\n const firstEntry: IJoinEntry = {\n output: getSafeBindings(await this.mediatorJoin\n .mediate({ type: action.type, entries: [ smallestEntry1, smallestEntry2 ], context: action.context })),\n operation: algebraFactory\n .createJoin([ smallestEntry1.operation, smallestEntry2.operation ], false),\n };\n entries.push(firstEntry);\n return {\n result: await this.mediatorJoin.mediate({\n type: action.type,\n entries,\n context: action.context,\n }),\n };\n }\n\n protected async getJoinCoefficients(\n action: IActionRdfJoin,\n sideData: IActorRdfJoinTestSideData,\n ): Promise<TestResult<IMediatorTypeJoinCoefficients, IActorRdfJoinMultiSmallestTestSideData>> {\n let { metadatas } = sideData;\n metadatas = [ ...metadatas ];\n // Determine the two smallest streams by sorting (e.g. via cardinality)\n const sortedEntries = await this.sortJoinEntries(action.entries\n .map((entry, i) => ({ ...entry, metadata: metadatas[i] })), action.context);\n metadatas = sortedEntries.map(entry => entry.metadata);\n const requestInitialTimes = ActorRdfJoin.getRequestInitialTimes(metadatas);\n const requestItemTimes = ActorRdfJoin.getRequestItemTimes(metadatas);\n\n return passTestWithSideData({\n iterations: metadatas[0].cardinality.value * metadatas[1].cardinality.value *\n metadatas.slice(2).reduce((acc, metadata) => acc * metadata.cardinality.value, 1),\n persistedItems: 0,\n blockingItems: 0,\n requestTime: requestInitialTimes[0] + metadatas[0].cardinality.value * requestItemTimes[0] +\n requestInitialTimes[1] + metadatas[1].cardinality.value * requestItemTimes[1] +\n metadatas.slice(2).reduce((sum, metadata, i) => sum + requestInitialTimes.slice(2)[i] +\n metadata.cardinality.value * requestItemTimes.slice(2)[i], 0),\n }, { ...sideData, sortedEntries });\n }\n}\n\nexport interface IActorRdfJoinMultiSmallestArgs extends IActorRdfJoinArgs<IActorRdfJoinMultiSmallestTestSideData> {\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\nexport interface IActorRdfJoinMultiSmallestTestSideData extends IActorRdfJoinTestSideData {\n sortedEntries: IJoinEntryWithMetadata[];\n}\n"]}
1
+ {"version":3,"file":"ActorRdfJoinMultiSmallest.js","sourceRoot":"","sources":["ActorRdfJoinMultiSmallest.ts"],"names":[],"mappings":";;;AAOA,yDAAsD;AAEtD,+DAA0D;AAE1D,yCAAsD;AAQtD,2EAAkE;AAClE,qDAA0C;AAE1C;;;GAGG;AACH,MAAa,yBAA0B,SAAQ,2BAAoD;IAIjG,YAAmB,IAAoC;QACrD,KAAK,CAAC,IAAI,EAAE;YACV,WAAW,EAAE,OAAO;YACpB,YAAY,EAAE,gBAAgB;YAC9B,YAAY,EAAE,CAAC;YACf,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,OAAiC;QACrD,iDAAiD;QACjD,yEAAyE;QACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpD,OAAO,CAAE,CAAC,EAAE,CAAC,CAAE,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QACD,gFAAgF;QAChF,OAAO,CAAE,CAAC,EAAE,CAAC,CAAE,CAAC;IAClB,CAAC;IAEM,kBAAkB,CAAC,MAA8B,EAAE,MAA8B;QACtF,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,eAAe,CAC1B,OAAiC,EACjC,OAAuB;QAEvB,OAAO,CAAC,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACpF,CAAC;IAES,KAAK,CAAC,SAAS,CACvB,MAAsB,EACtB,QAAgD;QAEhD,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,OAAO,GAAiB,QAAQ,CAAC,aAAa,CAAC;QACrD,MAAM,eAAe,GAAG,MAAM,2BAAY,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC5E,MAAM,eAAe,GAAa,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAEvE,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtC,qFAAqF;QACrF,MAAM,UAAU,GAAe;YAC7B,MAAM,EAAE,IAAA,uCAAe,EAAC,MAAM,IAAI,CAAC,YAAY;iBAC5C,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAE,cAAc,EAAE,cAAc,CAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACxG,SAAS,EAAE,cAAc;iBACtB,UAAU,CAAC,CAAE,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,SAAS,CAAE,EAAE,KAAK,CAAC;SAC7E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO;YACL,MAAM,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;gBACtC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO;gBACP,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;SACH,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,mBAAmB,CACjC,MAAsB,EACtB,QAAmC;QAEnC,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QAC7B,SAAS,GAAG,CAAE,GAAG,SAAS,CAAE,CAAC;QAC7B,uEAAuE;QACvE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO;aAC5D,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,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,mBAAmB,GAAG,2BAAY,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,gBAAgB,GAAG,2BAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAErE,OAAO,IAAA,2BAAoB,EAAC;YAC1B,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,cAAc,EAAE,CAAC;YACjB,aAAa,EAAE,CAAC;YAChB,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC;gBAC5E,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACzD,EAAE,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AA3GD,8DA2GC","sourcesContent":["import type {\n IActionRdfJoin,\n IActorRdfJoinOutputInner,\n IActorRdfJoinArgs,\n MediatorRdfJoin,\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 } from '@comunica/context-entries';\nimport type { TestResult } from '@comunica/core';\nimport { passTestWithSideData } from '@comunica/core';\nimport type { IMediatorTypeJoinCoefficients } from '@comunica/mediatortype-join-coefficients';\nimport type {\n IJoinEntry,\n IActionContext,\n IJoinEntryWithMetadata,\n ComunicaDataFactory,\n} from '@comunica/types';\nimport { getSafeBindings } from '@comunica/utils-query-operation';\nimport { Factory } from 'sparqlalgebrajs';\n\n/**\n * A Multi Smallest RDF Join Actor.\n * It accepts 3 or more streams, joins the smallest two, and joins the result with the remaining streams.\n */\nexport class ActorRdfJoinMultiSmallest extends ActorRdfJoin<IActorRdfJoinMultiSmallestTestSideData> {\n public readonly mediatorJoinEntriesSort: MediatorRdfJoinEntriesSort;\n public readonly mediatorJoin: MediatorRdfJoin;\n\n public constructor(args: IActorRdfJoinMultiSmallestArgs) {\n super(args, {\n logicalType: 'inner',\n physicalName: 'multi-smallest',\n limitEntries: 3,\n limitEntriesMin: true,\n canHandleUndefs: true,\n isLeaf: false,\n });\n }\n\n /**\n * Finds join indexes of lowest cardinality result sets, with priority on result sets that have common variables\n * @param entries A sorted array of entries, sorted on cardinality\n */\n public getJoinIndexes(entries: IJoinEntryWithMetadata[]): [number, number] {\n // Iterate over all combinations of join indexes,\n // return the first combination that does not lead to a cartesian product\n for (let i = 0; i < entries.length; i++) {\n for (let j = i + 1; j < entries.length; j++) {\n if (this.hasCommonVariables(entries[i], entries[j])) {\n return [ i, j ];\n }\n }\n }\n // If all result sets are disjoint we just want the sets with lowest cardinality\n return [ 0, 1 ];\n }\n\n public hasCommonVariables(entry1: IJoinEntryWithMetadata, entry2: IJoinEntryWithMetadata): boolean {\n const variableNames1 = entry1.metadata.variables.map(x => x.variable.value);\n const variableNames2 = new Set(entry2.metadata.variables.map(x => x.variable.value));\n return variableNames1.some(v => variableNames2.has(v));\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<IJoinEntryWithMetadata[]> {\n return (await this.mediatorJoinEntriesSort.mediate({ entries, context })).entries;\n }\n\n protected async getOutput(\n action: IActionRdfJoin,\n sideData: IActorRdfJoinMultiSmallestTestSideData,\n ): 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 entries: IJoinEntry[] = sideData.sortedEntries;\n const entriesMetaData = await ActorRdfJoin.getEntriesWithMetadatas(entries);\n const bestJoinIndexes: number[] = this.getJoinIndexes(entriesMetaData);\n\n const smallestEntry1 = entries[bestJoinIndexes[0]];\n const smallestEntry2 = entries[bestJoinIndexes[1]];\n entries.splice(bestJoinIndexes[1], 1);\n entries.splice(bestJoinIndexes[0], 1);\n\n // Join the two selected streams, and then join the result with the remaining streams\n const firstEntry: IJoinEntry = {\n output: getSafeBindings(await this.mediatorJoin\n .mediate({ type: action.type, entries: [ smallestEntry1, smallestEntry2 ], context: action.context })),\n operation: algebraFactory\n .createJoin([ smallestEntry1.operation, smallestEntry2.operation ], false),\n };\n entries.push(firstEntry);\n return {\n result: await this.mediatorJoin.mediate({\n type: action.type,\n entries,\n context: action.context,\n }),\n };\n }\n\n protected async getJoinCoefficients(\n action: IActionRdfJoin,\n sideData: IActorRdfJoinTestSideData,\n ): Promise<TestResult<IMediatorTypeJoinCoefficients, IActorRdfJoinMultiSmallestTestSideData>> {\n let { metadatas } = sideData;\n metadatas = [ ...metadatas ];\n // Determine the two smallest streams by sorting (e.g. via cardinality)\n const sortedEntries = await this.sortJoinEntries(action.entries\n .map((entry, i) => ({ ...entry, metadata: metadatas[i] })), action.context);\n metadatas = sortedEntries.map(entry => entry.metadata);\n const requestInitialTimes = ActorRdfJoin.getRequestInitialTimes(metadatas);\n const requestItemTimes = ActorRdfJoin.getRequestItemTimes(metadatas);\n\n return passTestWithSideData({\n iterations: metadatas.reduce((acc, metadata) => acc * metadata.cardinality.value, 1),\n persistedItems: 0,\n blockingItems: 0,\n requestTime: metadatas.reduce((sum, metadata, i) => sum + requestInitialTimes[i] +\n metadata.cardinality.value * requestItemTimes[i], 0),\n }, { ...sideData, sortedEntries });\n }\n}\n\nexport interface IActorRdfJoinMultiSmallestArgs extends IActorRdfJoinArgs<IActorRdfJoinMultiSmallestTestSideData> {\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\nexport interface IActorRdfJoinMultiSmallestTestSideData extends IActorRdfJoinTestSideData {\n sortedEntries: IJoinEntryWithMetadata[];\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comunica/actor-rdf-join-inner-multi-smallest",
3
- "version": "4.2.0",
3
+ "version": "4.4.1",
4
4
  "description": "A multi-smallest rdf-join actor",
5
5
  "lsd:module": true,
6
6
  "license": "MIT",
@@ -41,14 +41,14 @@
41
41
  "build:components": "componentsjs-generator"
42
42
  },
43
43
  "dependencies": {
44
- "@comunica/bus-rdf-join": "^4.2.0",
45
- "@comunica/bus-rdf-join-entries-sort": "^4.2.0",
46
- "@comunica/context-entries": "^4.2.0",
47
- "@comunica/core": "^4.2.0",
48
- "@comunica/mediatortype-join-coefficients": "^4.2.0",
49
- "@comunica/types": "^4.2.0",
50
- "@comunica/utils-query-operation": "^4.2.0",
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-query-operation": "^4.4.1",
51
51
  "sparqlalgebrajs": "^4.3.8"
52
52
  },
53
- "gitHead": "94e1eacab069551590cc250074b36bce08720c4c"
53
+ "gitHead": "c5cc36caf88da31173a0969a7da88cadb7f469ac"
54
54
  }