Skip to content

Commit

Permalink
feat(qido-rs): support time query
Browse files Browse the repository at this point in the history
# Examples of time query
- 00080030=121200
- 00080030=-230000
> End to 23:00:00
- 00080030=1800-2300
> Alternative, 00080030=180000-230000
- 00080030=120000-
> Start from 12:00:00
  • Loading branch information
Chinlinlee committed May 6, 2023
1 parent e270a6c commit 9d7ec94
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 8 deletions.
9 changes: 6 additions & 3 deletions api/dicom-web/controller/QIDO-RS/service/QIDO-RS.service.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const urlObj = require("url");
const mongoose = require("mongoose");
const _ = require("lodash");
const { mongoDateQuery } = require("../../../../../models/mongodb/service");
const { mongoDateQuery, timeQuery } = require("../../../../../models/mongodb/service");
const { dictionary } = require("../../../../../models/DICOM/dicom-tags-dic");
const {
tagsOfRequiredMatching
Expand Down Expand Up @@ -290,6 +290,9 @@ const vrQueryLookup = {
[`${tag}.suffix`] : queryValue
}
]};
},
TM: async (value, tag) => {
value[tag] = timeQuery(value, tag);
}
};

Expand Down Expand Up @@ -330,12 +333,12 @@ async function getStudyDicomJson(queryOptions) {

try {
let query = await convertRequestQueryToMongoQuery(queryOptions.query);
logger.info(`[QIDO-RS] [Query for MongoDB: ${JSON.stringify(query)}]`);

queryOptions.query = {
...query.$match
};

logger.info(`[QIDO-RS] [Query for MongoDB: ${JSON.stringify(queryOptions.query)}]`);

let docs = await mongoose.model("dicomStudy").getDicomJson(queryOptions);

let sortedTagsStudyDicomJson = sortArrayObjByFieldKey(docs);
Expand Down
119 changes: 114 additions & 5 deletions models/mongodb/service.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,112 @@ function mongoDateQuery(iQuery, colName, isRegex, format = "YYYYMMDD") {
return iQuery;
}

//#region Time Query Operations
function timeQuery(iQuery, colName) {
/** @type {string} */
let value = iQuery[colName];

let dashIndex = value.indexOf("-");
if (dashIndex === 0) { // -HHMMSS
let timeStr = value.substring(1);
let time = getTimeFloatFromString(timeStr);

return getLessThanOrEqualTimeQuery(time);
} else if (dashIndex === value.length - 1) { // HHMMSS-
let timeStr = value.substring(0, dashIndex);
let time = getTimeFloatFromString(timeStr);

return getGreaterThanOrEqualTimeQuery(time);
} else if (dashIndex > 0) { //HHMMSS-HHMMSS
let startTimeStr = value.substring(0, dashIndex);
let endTimeStr = value.substring(dashIndex + 1);

let startTime = getTimeFloatFromString(startTimeStr);
let endTime = getTimeFloatFromString(endTimeStr);

return getBetweenTimeQuery(startTime, endTime);
} else {
let time = getTimeFloatFromString(value);
return getEqualTimeQuery(time);
}
}

/**
*
* @param {number} time
*/
function getEqualTimeQuery(time) {
return {
$eq : time
};
}

/**
*
* @param {number} time
*/
function getGreaterThanOrEqualTimeQuery(time) {
return {
$gte: time
};
}

/**
*
* @param {number} time
*/
function getLessThanOrEqualTimeQuery(time) {
return {
$lte : time
};
}

/**
*
* @param {number} startTime
* @param {number} endTime
* @returns
*/
function getBetweenTimeQuery(startTime, endTime) {
return {
$gte: startTime,
$lte: endTime
};
}

/**
*
* @param {string} str
* @returns {number}
*/
function getTimeFloatFromString(str) {
let fullTimeStr = getTimePadding(str);
if (str.includes(".")) {
let timeStrSplit = str.split("\\.");
let timeStr = timeStrSplit[0];
let millionthSecondStr = timeStrSplit[1];
fullTimeStr = getTimePadding(timeStr) + "." + millionthSecondStr;
}
return Number.parseFloat(fullTimeStr);
}

/**
*
* @param {string} str
* @returns {string}
*/
function getTimePadding(str) {
let hhmmssTimeStr = str.padEnd(6, '0');
if (str.length == 5) {
hhmmssTimeStr = str.padStart(6, '0');
}
return hhmmssTimeStr;
}

//#endregion

//#region Date operation

function getDateCondition(iDate) {
if (iDate.indexOf("-") == 0) {
//Only end date (end to date)
Expand Down Expand Up @@ -120,6 +226,8 @@ const dateCallBack = {
"=": eq_Date
};

//#endregion

function getStoreDicomFullPathGroup(pathGroup) {
let fullPathGroup = [];

Expand All @@ -141,8 +249,8 @@ function getStoreDicomFullPath(storeInstanceObj) {


class IncludeFieldsFactory {
constructor(includeFields=[]) {
constructor(includeFields = []) {

this.includeFields = includeFields;
this.all = false;
if (this.includeFields.indexOf("all") >= 0) this.all = true;
Expand Down Expand Up @@ -193,9 +301,9 @@ class IncludeFieldsFactory {
studyUID: 0,
seriesUID: 0,
instanceUID: 0,
studyPath : 0,
seriesPath : 0,
instancePath : 0
studyPath: 0,
seriesPath: 0,
instancePath: 0
};
}

Expand Down Expand Up @@ -224,6 +332,7 @@ class IncludeFieldsFactory {
}

module.exports.mongoDateQuery = mongoDateQuery;
module.exports.timeQuery = timeQuery;
module.exports.getStoreDicomFullPathGroup = getStoreDicomFullPathGroup;
module.exports.getStoreDicomFullPath = getStoreDicomFullPath;
module.exports.IncludeFieldsFactory = IncludeFieldsFactory;

0 comments on commit 9d7ec94

Please sign in to comment.