IDC-1532 multiple series search google (#2026)
* Multiple series search for google cloud adapter.
* Revert IDC config.
* fix: 🐛 Series filtering on multiple series for google
* Revert changes to default config.
* Address reviewers comments.
* Fixed spelling mistakes
This commit is contained in:
parent
45ca88f5b8
commit
f38979037d
@ -11,12 +11,15 @@ import { retrieveStudyMetadata } from './retrieveStudyMetadata';
|
|||||||
* @param {Array} studyInstanceUIDs The UIDs of the Studies to be retrieved
|
* @param {Array} studyInstanceUIDs The UIDs of the Studies to be retrieved
|
||||||
* @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process
|
* @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process
|
||||||
* @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against
|
* @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against
|
||||||
|
* @param {boolean} [separateSeriesInstanceUIDFilters = false] - If true, split filtered metadata calls into multiple calls,
|
||||||
|
* as some DICOMWeb implementations only support single filters.
|
||||||
* @returns {Promise} that will be resolved with the metadata or rejected with the error
|
* @returns {Promise} that will be resolved with the metadata or rejected with the error
|
||||||
*/
|
*/
|
||||||
export default function retrieveStudiesMetadata(
|
export default function retrieveStudiesMetadata(
|
||||||
server,
|
server,
|
||||||
studyInstanceUIDs,
|
studyInstanceUIDs,
|
||||||
filters
|
filters,
|
||||||
|
separateSeriesInstanceUIDFilters = false
|
||||||
) {
|
) {
|
||||||
// Create an empty array to store the Promises for each metaData retrieval call
|
// Create an empty array to store the Promises for each metaData retrieval call
|
||||||
const promises = [];
|
const promises = [];
|
||||||
@ -24,7 +27,12 @@ export default function retrieveStudiesMetadata(
|
|||||||
// Loop through the array of studyInstanceUIDs
|
// Loop through the array of studyInstanceUIDs
|
||||||
studyInstanceUIDs.forEach(function(StudyInstanceUID) {
|
studyInstanceUIDs.forEach(function(StudyInstanceUID) {
|
||||||
// Send the call and resolve or reject the related promise based on its outcome
|
// Send the call and resolve or reject the related promise based on its outcome
|
||||||
const promise = retrieveStudyMetadata(server, StudyInstanceUID, filters);
|
const promise = retrieveStudyMetadata(
|
||||||
|
server,
|
||||||
|
StudyInstanceUID,
|
||||||
|
filters,
|
||||||
|
separateSeriesInstanceUIDFilters
|
||||||
|
);
|
||||||
|
|
||||||
// Add the current promise to the array of promises
|
// Add the current promise to the array of promises
|
||||||
promises.push(promise);
|
promises.push(promise);
|
||||||
|
|||||||
@ -11,9 +11,16 @@ const StudyMetaDataPromises = new Map();
|
|||||||
* @param {string} StudyInstanceUID The UID of the Study to be retrieved
|
* @param {string} StudyInstanceUID The UID of the Study to be retrieved
|
||||||
* @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process
|
* @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process
|
||||||
* @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against
|
* @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against
|
||||||
|
* @param {boolean} [separateSeriesInstanceUIDFilters = false] - If true, split filtered metadata calls into multiple calls,
|
||||||
|
* as some DICOMWeb implementations only support single filters.
|
||||||
* @returns {Promise} that will be resolved with the metadata or rejected with the error
|
* @returns {Promise} that will be resolved with the metadata or rejected with the error
|
||||||
*/
|
*/
|
||||||
export function retrieveStudyMetadata(server, StudyInstanceUID, filters) {
|
export function retrieveStudyMetadata(
|
||||||
|
server,
|
||||||
|
StudyInstanceUID,
|
||||||
|
filters,
|
||||||
|
separateSeriesInstanceUIDFilters = false
|
||||||
|
) {
|
||||||
// @TODO: Whenever a study metadata request has failed, its related promise will be rejected once and for all
|
// @TODO: Whenever a study metadata request has failed, its related promise will be rejected once and for all
|
||||||
// and further requests for that metadata will always fail. On failure, we probably need to remove the
|
// and further requests for that metadata will always fail. On failure, we probably need to remove the
|
||||||
// corresponding promise from the "StudyMetaDataPromises" map...
|
// corresponding promise from the "StudyMetaDataPromises" map...
|
||||||
@ -33,11 +40,29 @@ export function retrieveStudyMetadata(server, StudyInstanceUID, filters) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a promise to handle the data retrieval
|
// Create a promise to handle the data retrieval
|
||||||
const promise = new Promise((resolve, reject) => {
|
let promise;
|
||||||
RetrieveMetadata(server, StudyInstanceUID, filters).then(function(data) {
|
|
||||||
resolve(data);
|
if (
|
||||||
}, reject);
|
filters &&
|
||||||
});
|
filters.seriesInstanceUID &&
|
||||||
|
separateSeriesInstanceUIDFilters
|
||||||
|
) {
|
||||||
|
promise = __separateSeriesRequestToAggregatePromiseateSeriesRequestToAggregatePromise(
|
||||||
|
server,
|
||||||
|
StudyInstanceUID,
|
||||||
|
filters
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
promise = RetrieveMetadata(server, StudyInstanceUID, filters);
|
||||||
|
|
||||||
|
/*
|
||||||
|
promise = new Promise((resolve, reject) => {
|
||||||
|
RetrieveMetadata(server, StudyInstanceUID, filters).then(function(data) {
|
||||||
|
resolve(data);
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
// Store the promise in cache
|
// Store the promise in cache
|
||||||
StudyMetaDataPromises.set(StudyInstanceUID, promise);
|
StudyMetaDataPromises.set(StudyInstanceUID, promise);
|
||||||
@ -45,6 +70,49 @@ export function retrieveStudyMetadata(server, StudyInstanceUID, filters) {
|
|||||||
return promise;
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits up seriesInstanceUID filters to multiple calls for platforms
|
||||||
|
* @param {Object} server Object with server configuration parameters
|
||||||
|
* @param {string} StudyInstanceUID The UID of the Study to be retrieved
|
||||||
|
* @param {Object} filters - Object containing filters to be applied on retrieve metadata process
|
||||||
|
*/
|
||||||
|
function __separateSeriesRequestToAggregatePromiseateSeriesRequestToAggregatePromise(
|
||||||
|
server,
|
||||||
|
StudyInstanceUID,
|
||||||
|
filters
|
||||||
|
) {
|
||||||
|
const { seriesInstanceUID } = filters;
|
||||||
|
const seriesInstanceUIDs = seriesInstanceUID.split(',');
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const promises = [];
|
||||||
|
|
||||||
|
seriesInstanceUIDs.forEach(uid => {
|
||||||
|
const seriesSpecificFilters = Object.assign({}, filters, {
|
||||||
|
seriesInstanceUID: uid,
|
||||||
|
});
|
||||||
|
|
||||||
|
promises.push(
|
||||||
|
RetrieveMetadata(server, StudyInstanceUID, seriesSpecificFilters)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Promise.all(promises).then(results => {
|
||||||
|
const data = results[0];
|
||||||
|
|
||||||
|
let series = [];
|
||||||
|
|
||||||
|
results.forEach(result => {
|
||||||
|
series = [...series, ...result.series];
|
||||||
|
});
|
||||||
|
|
||||||
|
data.series = series;
|
||||||
|
|
||||||
|
resolve(data);
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete the cached study metadata retrieval promise to ensure that the browser will
|
* Delete the cached study metadata retrieval promise to ensure that the browser will
|
||||||
* re-retrieve the study metadata when it is next requested
|
* re-retrieve the study metadata when it is next requested
|
||||||
|
|||||||
@ -7,9 +7,11 @@ window.config = function(props) {
|
|||||||
enableGoogleCloudAdapter: true,
|
enableGoogleCloudAdapter: true,
|
||||||
enableGoogleCloudAdapterUI: false,
|
enableGoogleCloudAdapterUI: false,
|
||||||
showStudyList: true,
|
showStudyList: true,
|
||||||
|
filterQueryParam: true,
|
||||||
httpErrorHandler: error => {
|
httpErrorHandler: error => {
|
||||||
// This is 429 when rejected from the public idc sandbox too often.
|
// This is 429 when rejected from the public idc sandbox too often.
|
||||||
console.warn(error.status);
|
console.warn(error.status);
|
||||||
|
|
||||||
// Could use services manager here to bring up a dialog/modal if needed.
|
// Could use services manager here to bring up a dialog/modal if needed.
|
||||||
console.warn('test, navigate to https://ohif.org/');
|
console.warn('test, navigate to https://ohif.org/');
|
||||||
window.location = 'https://ohif.org/';
|
window.location = 'https://ohif.org/';
|
||||||
|
|||||||
@ -88,6 +88,7 @@ const _isQueryParamApplied = (study, filters = {}, isFilterStrategy) => {
|
|||||||
const { seriesInstanceUID } = filters;
|
const { seriesInstanceUID } = filters;
|
||||||
let applied = true;
|
let applied = true;
|
||||||
// skip in case no filter or no toast manager
|
// skip in case no filter or no toast manager
|
||||||
|
|
||||||
if (!seriesInstanceUID) {
|
if (!seriesInstanceUID) {
|
||||||
return applied;
|
return applied;
|
||||||
}
|
}
|
||||||
@ -340,6 +341,10 @@ function ViewerRetrieveStudyData({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (appConfig.enableGoogleCloudAdapter) {
|
||||||
|
retrieveParams.push(true); // Seperate SeriesInstanceUID filter calls.
|
||||||
|
}
|
||||||
|
|
||||||
cancelableStudiesPromises[studyInstanceUIDs] = makeCancelable(
|
cancelableStudiesPromises[studyInstanceUIDs] = makeCancelable(
|
||||||
retrieveStudiesMetadata(...retrieveParams)
|
retrieveStudiesMetadata(...retrieveParams)
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user