diff --git a/shrine-webclient/src/main/html/js-i2b2/cells/CRC/CRC_ctrlr_QryStatus.js b/shrine-webclient/src/main/html/js-i2b2/cells/CRC/CRC_ctrlr_QryStatus.js index 6d5d18d83..19a689f36 100644 --- a/shrine-webclient/src/main/html/js-i2b2/cells/CRC/CRC_ctrlr_QryStatus.js +++ b/shrine-webclient/src/main/html/js-i2b2/cells/CRC/CRC_ctrlr_QryStatus.js @@ -1,657 +1,657 @@ /** * @projectDescription The Asynchronous Query Status controller (GUI-only controller). * @inherits i2b2.CRC.ctrlr * @namespace i2b2.CRC.ctrlr.QueryStatus * @author Nick Benik, Griffin Weber MD PhD * @version 1.0 * ---------------------------------------------------------------------------------------- * updated 8-10-09: Initial Creation [Nick Benik] */ function cgmUtcDateParser(dateString){ //Date format: 2011-02-21T14:35:03.480-05:00 try{ splitDateAndTime = dateString.split("T"); vrDate = splitDateAndTime[0].split("-"); vrTime = splitDateAndTime[1].split(":"); strYear = vrDate[0]; strMonth = vrDate[1] - 1; strDay = vrDate[2]; /* alert("Year: "+ strYear); alert("Month: "+ strMonth); alert("Day: "+ strDay);*/ strHours = vrTime[0]; strMins = vrTime[1]; strSecs = null; strMills = null; vSecs = vrTime[2].split("."); strSecs = vSecs[0]; vMills = vSecs[1].split("-"); strMills = vMills[0]; /* alert("Hours: "+ strHours); alert("Minutes: "+ strMins); alert("Seconds: "+ strSecs); alert("MilliSeconds: "+ strMills);*/ return new Date(strYear, strMonth, strDay, strHours, strMins, strSecs, strMills); } catch(e){ return null; } } i2b2.CRC.ctrlr.QueryStatus = function(dispDIV) { this.dispDIV = dispDIV; }; i2b2.CRC.ctrlr.currentQueryResults = null; function trim(sString) { while (sString.substring(0,1) == '\n') { sString = sString.substring(1, sString.length); } while (sString.substring(sString.length-1, sString.length) == '\n') { sString = sString.substring(0,sString.length-1); } return sString; } i2b2.CRC.ctrlr.QueryStatus.prototype = function() { var private_singleton_isRunning = false; var private_startTime = false; var private_refreshInterrupt = false; function private_refresh_status() { // callback processor to check the Query Instance var scopedCallbackQRSI = new i2b2_scopedCallback(); scopedCallbackQRSI.scope = self; scopedCallbackQRSI.callback = function(results) { if (results.error) { alert(results.errorMsg); return; } else { // find our query instance var ri_list = results.refXML.getElementsByTagName('query_result_instance'); var l = ri_list.length; for (var i=0; i" + description + ""; } var crc_xml = results.refXML.getElementsByTagName('crc_xml_result'); l = crc_xml.length; for (var i=0; i" + params[i2].getAttribute("column") + ": " + value + ""; } var ri_id = i2b2.h.XPath(temp, 'descendant-or-self::result_instance_id')[0].firstChild.nodeValue; } //self.dispDIV.innerHTML += this.dispMsg; } } var self = i2b2.CRC.ctrlr.currentQueryStatus; // this private function refreshes the display DIV var d = new Date(); var t = Math.floor((d.getTime() - private_startTime)/100)/10; var s = t.toString(); if (s.indexOf('.') < 0) { s += '.0'; } if (private_singleton_isRunning) { self.dispDIV.innerHTML = '
Running Query: "'+self.QM.name+'"
'; // display the current run duration self.dispDIV.innerHTML += '
['+s+' secs]
'; } else { self.dispDIV.innerHTML = '
Finished Query: "'+self.QM.name+'"
'; self.dispDIV.innerHTML += '
['+s+' secs]
'; // self.dispDIV.innerHTML += '
Compute Time: ' + (Math.floor((self.QI.end_date - self.QI.start_date)/100))/10 + ' secs
'; // self.dispDIV.innerHTML += '
'; $('runBoxText').innerHTML = "Run Query"; } self.dispDIV.innerHTML += '
'; if ((!private_singleton_isRunning) && (undefined != self.QI.end_date)){ self.dispDIV.innerHTML += '
Compute Time: '+ (Math.floor((self.QI.end_date - self.QI.start_date)/100))/10 +' secs
'; } var foundError = false; for (var i=0; i < self.QRS.length; i++) { var rec = self.QRS[i]; if (rec.QRS_time) { var t = '
ERROR
'; // self.dispDIV.innerHTML += '
ERROR
'; //['+rec.QRS_time+' secs]'; foundError = true; break; case "COMPLETED": case "FINISHED": foundError = false; //t += '#0000dd">'+rec.QRS_Status; break; case "INCOMPLETE": case "WAITTOPROCESS": case "PROCESSING": self.dispDIV.innerHTML += '
'+rec.title+'
PROCESSING
'; // self.dispDIV.innerHTML += '
PROCESSING
'; //['+rec.QRS_time+' secs]
'; alert('Your query has timed out and has been rescheduled to run in the background. The results will appear in "Previous Queries"'); foundError = true; //t += '#00dd00">'+rec.QRS_Status; break; } t += '
'; //self.dispDIV.innerHTML += '
'+t+'['+rec.QRS_time+' secs]
'; } self.dispDIV.innerHTML += ''; if (foundError == false) { if (rec.QRS_DisplayType == "CATNUM") { //make call to get QRSI. i2b2.CRC.ajax.getQueryResultInstanceList_fromQueryResultInstanceId("CRC:QueryStatus", {qr_key_value: rec.QRS_ID}, scopedCallbackQRSI); } else if ((rec.QRS_DisplayType == "LIST") && (foundError == false)) { self.dispDIV.innerHTML += "
" + rec.QRS_Description + "
"; } else if (i2b2.h.isDQ) { self.dispDIV.innerHTML += "
" + rec.title + "
" + rec.QRS_Status + " [" + rec.QRS_time + " secs]
"; } if (rec.QRS_Type == "PATIENTSET") { // Check to see if timeline is checked off, if so switch to timeline var t2 = $('dialogQryRun').select('INPUT.chkQueryType'); for (var i=0;i 0) && (curItem == " timeline") && !(i2b2.h.isBadObjPath('i2b2.Timeline.cfg.config.plugin')) ) { i2b2.hive.MasterView.setViewMode('Analysis'); i2b2.PLUGINMGR.ctrlr.main.selectPlugin("Timeline"); //Process PatientSet rec.QM_id = self.QM.id; rec.QI_id = self.QI.id; rec.PRS_id = rec.QRS_ID; rec.result_instance_id = rec.PRS_id; var sdxData = {}; sdxData[0] = i2b2.sdx.Master.EncapsulateData('PRS', rec); i2b2.Timeline.prsDropped(sdxData); i2b2.Timeline.setShowMetadataDialog(false); //Process Concepts, put all concepts in one large set sdxData = {}; for (var j2 = 0; j2 < i2b2.CRC.model.queryCurrent.panels.length; j2++) { var panel_list = i2b2.CRC.model.queryCurrent.panels[j2] var panel_cnt = panel_list.length; for (var p2 = 0; p2 < panel_cnt; p2++) { // Concepts for (var i2=0; i2 < panel_list[p2].items.length; i2++) { sdxData[0] = panel_list[p2].items[i2]; i2b2.Timeline.conceptDropped(sdxData); } } } //$('Timeline-pgstart').value = '1'; //$('Timeline-pgsize').value = '10'; //i2b2.Timeline.pgGo(0); i2b2.Timeline.yuiTabs.set('activeIndex', 1); i2b2.Timeline.setShowMetadataDialog(true); } } } } } if ((undefined != self.QI.message) && (foundError == false)) { self.dispDIV.innerHTML += '
Status
'; var mySplitResult = self.QI.message.split("' + i2b2.h.XPath(xml_v, 'descendant::name/text()/..')[i2].firstChild.nodeValue + ': ' + value + ' secs'; //self.dispDIV.innerHTML += '
: ' + i2b2.h.XPath(xml_v, 'descendant::total_time_second/text()/..')[i2].firstChild.nodeValue + ' secs
'; } catch (e) {} } } } self.dispDIV.style.display = 'none'; self.dispDIV.style.display = 'block'; if (!private_singleton_isRunning && private_refreshInterrupt) { // make sure our refresh interrupt is turned off try { clearInterval(private_refreshInterrupt); private_refreshInterrupt = false; } catch (e) {} } } function private_cancelQuery() { if (private_singleton_isRunning) { try { var self = i2b2.CRC.ctrlr.currentQueryStatus; i2b2.CRC.ctrlr.history.queryDeleteNoPrompt(self.QM.id); clearInterval(private_refreshInterrupt); private_refreshInterrupt = false; private_singleton_isRunning = false; $('runBoxText').innerHTML = "Run Query"; self.dispDIV.innerHTML += '
QUERY CANCELLED
'; i2b2.CRC.ctrlr.currentQueryStatus = false; } catch (e) {} } } function private_startQuery() { var self = i2b2.CRC.ctrlr.currentQueryStatus; var resultString = ""; //BG if (private_singleton_isRunning) { return false; } private_singleton_isRunning = true; //BG var downloadDataTab = $('infoDownloadStatusData'); if(downloadDataTab) downloadDataTab.innerHTML=""; i2b2.CRC.ctrlr.currentQueryResults = new i2b2.CRC.ctrlr.QueryResults(resultString); //BG self.dispDIV.innerHTML = 'Processing Query: "'+this.name+'"'; self.QM.name = this.name; self.QRS = []; self.QI = {}; // callback processor to run the query from definition this.callbackQueryDef = new i2b2_scopedCallback(); this.callbackQueryDef.scope = this; this.callbackQueryDef.callback = function(results) { try { //if error if (results.error) { var temp = results.refXML.getElementsByTagName('response_header')[0]; if (undefined != temp) { results.errorMsg = i2b2.h.XPath(temp, 'descendant-or-self::result_status/status')[0].firstChild.nodeValue; if (results.errorMsg.substring(0,9) == "LOCKEDOUT") { results.errorMsg = 'As an "obfuscated user" you have exceeded the allowed query repeat and are now LOCKED OUT, please notify your system administrator.'; } } alert(results.errorMsg); private_cancelQuery(); return; } //query was successful so update global settings. clearInterval(private_refreshInterrupt); private_refreshInterrupt = false; private_singleton_isRunning = false; resultString = ""; //BG //update the ui var self = i2b2.CRC.ctrlr.currentQueryStatus; // this private function refreshes the display DIV var d = new Date(); var t = Math.floor((d.getTime() - private_startTime)/100)/10; var s = t.toString(); if (s.indexOf('.') < 0) { s += '.0'; } self.dispDIV.innerHTML = '
Finished Query: "'+self.QM.name+'"
'; self.dispDIV.innerHTML += '
['+s+' secs]

'; resultString += 'Finished Query: "' + self.QM.name + '"\n'; //BG resultString += '[' + s + ' secs]\n'; //BG $('runBoxText').innerHTML = "Run Query"; //------------ QI Logic -------------------// //BG find user id var temp = results.refXML.getElementsByTagName('query_master')[0]; //Update the userid element when query is run first time var userId = i2b2.h.getXNodeVal(temp,'user_id'); if(userId) { var existingUserIdElemList = $$("#userIdElem"); if(existingUserIdElemList) { existingUserIdElemList.each(function(existingUserIdElem){ existingUserIdElem.remove(); }); } $("crcQueryToolBox.bodyBox").insert(new Element('input',{'type':'hidden','id':'userIdElem','value':userId})); } //End BG // find our query instance var qi_list = results.refXML.getElementsByTagName('query_instance'); //Original code commented by BG var l = qi_list.length; for (var i=0; i'; resultString += 'Compute Time: '+ s + ' secs\n'; //BG // -- query result instance vars -- // var qriNodeList = results.refXML.getElementsByTagName('query_result_instance'), qriIdx, qriNode, qriObj, breakdownType, errorObjects = [], brdNodeList, brdNode, brdIdx, brdObj; //iterate through each query result. for (qriIdx = 0; qriIdx < qriNodeList.length; qriIdx++) { //init qri vars. qriNode = qriNodeList[qriIdx]; qriObj = parseQueryResultInstance(qriNode); breakdownType = ''; //which hospital self.dispDIV.innerHTML += '

' + qriObj.description + ' "' +self.QM.name+ '"
'; resultString += '\n'; //BG resultString += qriObj.description + ' "' + self.QM.name+ '"\n'; //BG //if there was an error display it. if((qriObj.statusName == "ERROR") || (qriObj.statusName == "UNAVAILABLE")){ errorObjects.push(qriObj.problem); self.dispDIV.innerHTML += "  - " + qriObj.problem.summary+ ""; resultString += 'ERROR : ' + qriObj.problem.summary + '\n'; //BG continue; } else if((qriObj.statusName == "PROCESSING")){ self.dispDIV.innerHTML += " - Still Processing Request"; resultString += 'Still Processing Request : Still Processing Request\n'; //BG continue; } else if(["COMPLETED","FINISHED"].indexOf(qriObj.statusName) < 0){ self.dispDIV.innerHTML += " - Results not available"; resultString += 'Results not available : Results not available\n'; //BG continue; } self.dispDIV.innerHTML += "
" + "Patient Count" + ": " + getObfuscatedResult(qriObj.setSize, 10) + "
"; resultString += 'Patient Count' + getObfuscatedResult(qriObj.setSize, 10) + '\n'; //BG //grab breakdown data. brdNodeList = i2b2.h.XPath(qriNode, 'descendant-or-self::breakdown_data/column'); for(brdIdx = 0; brdIdx < brdNodeList.length; brdIdx ++){ //init brd vars. brdNode = brdNodeList[brdIdx]; brdObj = parseBreakdown(brdNode); if(brdObj.parentResultType !== breakdownType){ breakdownType = brdObj.parentResultType; self.dispDIV.innerHTML += "

" + getBreakdownTitle(brdObj.parentResultType) + ":
"; resultString += '\n'; //BG resultString += getBreakdownTitle(brdObj.parentResultType) + '\n'; //BG self.dispDIV.innerHTML += "
"; } self.dispDIV.innerHTML += "
" + brdObj.name + ": " + getObfuscatedResult(brdObj.value, 10) + "
"; resultString += brdObj.name + getObfuscatedResult(brdObj.value, 10) + '\n'; //BG } } i2b2.CRC.ctrlr.currentQueryResults = new i2b2.CRC.ctrlr.QueryResults(resultString); $hrine.EnhancedError.createErrorDialogue(self.dispDIV, errorObjects); i2b2.CRC.ctrlr.history.Refresh(); } catch(err) { console.error(err); } } /** * * @param qriNode * @returns {{qiStatusName: string, qiStatusDescription: string, qiSetSize: string, qiDescription: string, qiResultName: string, qiResultDescription: string}} */ function parseQueryResultInstance(qriNode){ var qriObj = { statusName: grabXmlNodeData(qriNode, 'descendant-or-self::query_status_type/name'), statusDescription: grabXmlNodeData(qriNode, 'descendant-or-self::query_status_type/description'), description: grabXmlNodeData(qriNode, 'descendant-or-self::description') }; if(qriObj.statusName == "ERROR"){ qriObj.problem = $hrine.EnhancedError.parseProblem(qriNode); return qriObj; } qriObj.setSize = grabXmlNodeData(qriNode, 'descendant-or-self::set_size'); qriObj.resultName = grabXmlNodeData(qriNode, 'descendant-or-self::query_result_type/name'); qriObj.resultDescription = grabXmlNodeData(qriNode, 'descendant-or-self::query_result_type/description'); return qriObj; } /** * * @param brdNode */ function parseBreakdown(brdNode){ var brdObj = { name: grabXmlNodeData(brdNode, 'name'), value: grabXmlNodeData(brdNode, 'value'), parentResultType: grabXmlNodeData(brdNode, 'parent::breakdown_data/resultType') } return brdObj; } /** * Return breakdown title based on breakdown type. * @param breakdownType * @returns {*} */ function getBreakdownTitle(breakdownType) { return { 'PATIENT_AGE_COUNT_XML': 'Patient Age Count Breakdown', 'PATIENT_GENDER_COUNT_XML': 'Patient Gender Count Breakdown', 'PATIENT_RACE_COUNT_XML': 'Patient Race Count Breakdown', 'PATIENT_VITALSTATUS_COUNT_XML':'Patient Vital Status Count Breakdown' }[breakdownType]; }; /** * Method for hiding the precise value of a query below a certain result. * @param resultCount - the number of results from a query. * @param obfuscationSetting - do not reveal this number of results */ function getObfuscatedResult(resultCount, obfuscationSetting) { var resultTitle = " - ", name = " patients", - offsetText = " +-3", + offsetText = " +-10", // todo fix with SHRINE-1716 isException = i2b2.PM.model.isObfuscated === false; //default to 10. obfuscationSetting = (arguments.length > 1) ? arguments[1] : 10; //if user role is an exception. return result. if (isException) { return resultTitle += resultCount + name; } resultTitle += ((resultCount >= obfuscationSetting)? resultCount + offsetText + name: obfuscationSetting + name + " or fewer"); return resultTitle; } /** * Grab data for node, return empty string if none. * @param node * @param xPathString * @returns {string} */ function grabXmlNodeData(node, xPathString){ var nodeVal = i2b2.h.XPath(node, xPathString); return (nodeVal.length)? nodeVal[0].firstChild.nodeValue : ''; } // switch to status tab i2b2.CRC.view.status.showDisplay(); // timer and display refresh stuff private_startTime = new Date(); private_refreshInterrupt = setInterval("i2b2.CRC.ctrlr.currentQueryStatus.refreshStatus()", 100); // AJAX call i2b2.CRC.ajax.runQueryInstance_fromQueryDefinition("CRC:QueryTool", this.params, this.callbackQueryDef); } return { name: "", polling_interval: 1000, QM: {id:false, status:""}, QI: {id:false, status:""}, QRS:{}, displayDIV: false, running: false, started: false, startQuery: function(queryName, ajaxParams) { this.name = queryName; this.params = ajaxParams; private_startQuery.call(this); }, cancelQuery: function() { private_cancelQuery(); }, isQueryRunning: function() { return private_singleton_isRunning; }, refreshStatus: function() { private_refresh_status(); } }; }(); i2b2.CRC.ctrlr.currentQueryStatus = false;