From ece9e856f302b2140119aae7c3717b1e301d6146 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Wed, 17 Jan 2024 19:22:36 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Sort=20merge=20results=20?= =?UTF-8?q?based=20on=20default=20data=20source=20(input)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sort merge results by default data source (input data) to avoid derived data sets arriving earlier and causing errors --- .../default/src/MergeDataSource/index.ts | 42 ++++++++++++++++--- .../default/src/MergeDataSource/types.ts | 2 + 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/extensions/default/src/MergeDataSource/index.ts b/extensions/default/src/MergeDataSource/index.ts index 9db282e8220..91852da2705 100644 --- a/extensions/default/src/MergeDataSource/index.ts +++ b/extensions/default/src/MergeDataSource/index.ts @@ -33,6 +33,7 @@ export const mergeMap: MergeMap = { * @param {unknown[]} options.args - The arguments to be passed to the function. * @param {ExtensionManager} options.extensionManager - The extension manager. * @param {string[]} options.dataSourceNames - The names of the data sources to be called. + * @param {string} options.defaultDataSourceName - The name of the default data source. * @returns {Promise} - A promise that resolves to the merged data from all data sources. */ export const callForAllDataSourcesAsync = async ({ @@ -41,12 +42,18 @@ export const callForAllDataSourcesAsync = async ({ args, extensionManager, dataSourceNames, + defaultDataSourceName, }: CallForAllDataSourcesAsyncOptions) => { const { mergeKey, tagFunc } = mergeMap[path] || { tagFunc: x => x }; - const dataSourceDefs = Object.values(extensionManager.dataSourceDefs); + /** Sort by default data source */ + const defs = Object.values(extensionManager.dataSourceDefs); + const defaultDataSourceDef = defs.find(def => def.sourceName === defaultDataSourceName); + const dataSourceDefs = defs.filter(def => def.sourceName !== defaultDataSourceName); + dataSourceDefs.unshift(defaultDataSourceDef); + const promises = []; - const mergedData = []; + const sourceNames = []; for (const dataSourceDef of dataSourceDefs) { const { configuration, sourceName } = dataSourceDef; @@ -54,11 +61,13 @@ export const callForAllDataSourcesAsync = async ({ const [dataSource] = extensionManager.getDataSources(sourceName); const func = get(dataSource, path); const promise = func.apply(dataSource, args); - promises.push(promise.then(data => mergedData.push(tagFunc(data, sourceName)))); + promises.push(promise); + sourceNames.push(sourceName); } } - await Promise.allSettled(promises); + const data = await Promise.allSettled(promises); + const mergedData = data.map((data, i) => tagFunc(data.value, sourceNames[i])); let results = []; if (mergeKey) { @@ -77,6 +86,7 @@ export const callForAllDataSourcesAsync = async ({ * @param options.args - The arguments to be passed to the function. * @param options.extensionManager - The extension manager instance. * @param options.dataSourceNames - The names of the data sources to be called. + * @param options.defaultDataSourceName - The name of the default data source. * @returns The merged data from all the matching data sources. */ export const callForAllDataSources = ({ @@ -84,8 +94,14 @@ export const callForAllDataSources = ({ args, extensionManager, dataSourceNames, + defaultDataSourceName, }: CallForAllDataSourcesOptions) => { - const dataSourceDefs = Object.values(extensionManager.dataSourceDefs); + /** Sort by default data source */ + const defs = Object.values(extensionManager.dataSourceDefs); + const defaultDataSourceDef = defs.find(def => def.sourceName === defaultDataSourceName); + const dataSourceDefs = defs.filter(def => def.sourceName !== defaultDataSourceName); + dataSourceDefs.unshift(defaultDataSourceDef); + const mergedData = []; for (const dataSourceDef of dataSourceDefs) { const { configuration, sourceName } = dataSourceDef; @@ -96,6 +112,7 @@ export const callForAllDataSources = ({ mergedData.push(data); } } + return mergedData.flat(); }; @@ -154,7 +171,13 @@ function createMergeDataSourceApi( const implementation = { initialize: (...args: unknown[]) => - callForAllDataSources({ path: 'initialize', args, extensionManager, dataSourceNames }), + callForAllDataSources({ + path: 'initialize', + args, + extensionManager, + dataSourceNames, + defaultDataSourceName, + }), query: { studies: { search: (...args: unknown[]) => @@ -164,6 +187,7 @@ function createMergeDataSourceApi( args, extensionManager, dataSourceNames, + defaultDataSourceName, }), }, series: { @@ -174,6 +198,7 @@ function createMergeDataSourceApi( args, extensionManager, dataSourceNames, + defaultDataSourceName, }), }, instances: { @@ -184,6 +209,7 @@ function createMergeDataSourceApi( args, extensionManager, dataSourceNames, + defaultDataSourceName, }), }, }, @@ -195,6 +221,7 @@ function createMergeDataSourceApi( args, extensionManager, dataSourceNames, + defaultDataSourceName, }), directURL: (...args: unknown[]) => callForDefaultDataSource({ @@ -211,6 +238,7 @@ function createMergeDataSourceApi( args, extensionManager, dataSourceNames, + defaultDataSourceName, }), }, }, @@ -229,6 +257,7 @@ function createMergeDataSourceApi( args, extensionManager, dataSourceNames, + defaultDataSourceName, }), getImageIdsForDisplaySet: (...args: unknown[]) => callByRetrieveAETitle({ @@ -250,6 +279,7 @@ function createMergeDataSourceApi( args, extensionManager, dataSourceNames, + defaultDataSourceName, }), }; diff --git a/extensions/default/src/MergeDataSource/types.ts b/extensions/default/src/MergeDataSource/types.ts index 3a0a3f83aa4..ef47b4ed2b2 100644 --- a/extensions/default/src/MergeDataSource/types.ts +++ b/extensions/default/src/MergeDataSource/types.ts @@ -13,6 +13,7 @@ export type CallForAllDataSourcesAsyncOptions = { args: unknown[]; dataSourceNames: string[]; extensionManager: ExtensionManager; + defaultDataSourceName: string; }; export type CallForAllDataSourcesOptions = { @@ -20,6 +21,7 @@ export type CallForAllDataSourcesOptions = { args: unknown[]; dataSourceNames: string[]; extensionManager: ExtensionManager; + defaultDataSourceName: string; }; export type CallForDefaultDataSourceOptions = {