123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448 |
- //not tested yet.
- //to use, add crfTecant/crfData.js to requiresScript and in the call-back, run init
- //will work with crfSetup as setup object
- var crfData={};
- crfData.init=
- function(cb=null){
- this.print('[crfData:init]');
- let that=this;
- let action=function(){that.afterScripts(cb);};
- LABKEY.requiresScript(["crf/runQuery.js","crf/variableList.js"],action);
- }
- crfData.afterScripts=
- function(cb=null){
- if (cb) cb();
- }
- crfData.setSetup=
- function(setup){
- this.setup=setup;
- }
- crfData.getContainer=
- function(label){
- return this.setup.getContainer(label);
- }
- crfData.print=
- function(msg){
- console.log(msg);
- }
- //getters
- crfData.getSnapshotObject=
- function(){
- if (!("dataQueriesSnapshot" in this))
- this.dataQueriesSnapshot=new Object();
- return this.dataQueriesSnapshot;
- }
- crfData.getQuerySnapshot=
- function(queryName){
- //check whether queryName is in snapshotObject?
- return this.getSnapshotObject()[queryName];
- }
- crfData.getLayoutObject=
- function(){
- if (!("dataQueriesLayout" in this))
- this.dataQueriesLayout=new Object();
- return this.dataQueriesLayout;
- }
- crfData.getQueryLayout=
- function(queryName){
- //check whether queryName is in snapshotObject?
- return this.getLayoutObject()[queryName];
- }
- crfData.getLookupObject=
- function(){
- if (!("lookup" in this))
- this.lookup=new Object();
- return this.lookup;
- }
- crfData.getLookup=
- function(queryName){
- let x=this.getLookupObject();
- if (queryName in x) return x[queryName];
- return null;
- }
- crfData.getRegistration=
- function(){
- let fName='[getRegistration]';
- let regQueryPars=variableList.parseVariables(this.setup.getSettings('registrationQuery'));
- let query=regQueryPars['query'];
- this.print(fName+' query '+query);
- return this.getQuerySnapshot(query).rows;
- }
- crfData.getCrfEntry=
- function(){
- return this.getQuerySnapshot('crfEntry').rows[0];
- }
- crfData.getActiveQueries=
- function(){
- if (!("activeQueries" in this))
- this.activeQueries=new Object();
- return this.activeQueries;
- }
- crfData.getActiveQuery=
- function(queryName){
- let aq=this.getActiveQueries();
- if (queryName in aq) return aq[queryName];
- return null;
- }
- crfData.getRegistrationMap=
- function(value=null){
- let rows=this.getRegistration();
- let qMap=new Object();
- let key='Key';
- if (!value) value='participantStudyId';
- for (let i=0;i<rows.length;i++){
- qMap[rows[i][key]]=rows[i][value];
- }
- return qMap;
- }
- crfData.getRegistrationEntryMap=
- function(key=null){
- let rows=this.getRegistration();
- let qMap=new Object();
- if (!key) key='Key';
- for (let i=0;i<rows.length;i++){
- qMap[rows[i][key]]=rows[i];
- }
- return qMap;
- }
- crfData.getCrfRefForData=
- function(){
- let parentCrf=this.getCrfEntry()['parentCrf'];
- if (!parentCrf) return this.getCrfEntry()['entryId'];
- return parentCrf;
- }
- crfData.setDataLayout=
- function(formId,role,cb){
- let fName='[setDataLayout]';
- this.print(fName);
- let rowsSetup=this.setup.selectFormSetupRows(formId);
- let queryArray=new Array();
- let dS=this.getLayoutObject();//reference only
- let qMap=this.setup.getMap('inputLists');
- let qMapInverse=this.setup.invertMap(qMap);
- this.clearActiveQueries();
- //config.formConfig.lookup=new Object();
- for (let i=0;i<rowsSetup.length;i++){
- let entry=rowsSetup[i];
- //skip review rows
- if (entry['showFlag']=='REVIEW')
- continue;
- let accessMode=role+'Mode';
- //skipField
- if (entry[accessMode]=="NONE") continue;
- let queryId=entry['queryName'];
- let q=qMap[queryId];
- queryArray.push(runQuery.makeQuery(dS,'data',q,q,[]));
- this.addActiveQuery(crfSetup.getEntryMap('inputLists')[queryId]);
- this.print(fName+' adding '+q);
- if (entry['showQuery']!="NONE"){
- let sq=entry['showQuery'];
- queryArray.push(runQuery.makeQuery(dS,'data',sq,sq,[]));
- //need inverse of qMap
- let sQueryId=qMapInverse[sq];
- this.addActiveQuery(crfSetup.getEntryMap('inputLists')[sQueryId]);
- this.print(fName+' adding '+sq);
-
- }
- }
- //always add reviews
- let q='reviewComments';
- queryArray.push(runQuery.makeQuery(dS,'data',q,q,[]));
- let rQueryId=qMapInverse[q];
- if (!rQueryId){
- this.print(fName+' missing query '+q+' in inputLists');
- return
- }
- this.addActiveQuery(crfSetup.getEntryMap('inputLists')[rQueryId]);
-
- //debug
- this.print("List of datasets in form : ");
- for (f in this.getActiveQueries()){
- let entry=this.getActiveQuery(f);
- this.print("\t"+f+" ID: "+entry['Key']+' title '+entry['title']);
- }
- let that=this;
- let action=function(){that.processLayout(cb);};
- runQuery.getDataFromQueries(this,queryArray,action);
- }
- //this happens after the for loop, so all dataQueries objects are set
- crfData.processLayout=
- function(cb=null){
- let fName='[processLayout]';
- let qList=this.getActiveQueries();
- //for layouts
- let queryArray=new Array();
- let targetObject=this.getLookupObject();
- let lookupSet=new Object();
- for (let qId in qList){
- let entry=this.getActiveQuery(qId);
- let q=entry['queryName'];
- let qobject=this.getQueryLayout(q);
- this.print(fName+" inspecting layout for "+q+" "+qobject);
- qobject.fields=qobject.metaData.fields;
- qobject.title=entry['title'];
- //check for lookups
- for (let f in qobject.fields){
- //anything else is simple but lookup
- let field=qobject.fields[f];
- if (!("lookup" in field)) continue;
- let lookup=field.lookup;
- let qObject=this.getLookup(lookup.queryName);
- if (qObject) continue;
- //add to list
- let qName=lookup.queryName;
- let qCode=qName+':'+lookup.keyColumn+':'+lookup.displayColumn;
- let e=runQuery.makeQuery(targetObject,'data',qName,qCode,[]);
- //adjust minor settings
- if (lookup.containerPath) e.containerPath=lookup.containerPath;
- e.schemaName=lookup.schemaName;
- e.columns=lookup.keyColumn+','+lookup.displayColumn;
- lookupSet[qCode]=e;
- this.print(fName+' inserting '+qCode);
- }
- }
- for (let x in lookupSet){
- queryArray.push(lookupSet[x]);
- this.print(fName+' adding '+x);
- for (let v in lookupSet[x]){
- this.print(fName+' value ['+v+'] '+lookupSet[x][v]);
- }
- }
- //this.print(fName+' print '+targetObject.print);
- let that=this;
- let action=function(){that.processLookup(cb);};
- this.print(fName+' getDataFromQueries');
- runQuery.getDataFromQueries(this,queryArray,action);
- this.print(fName+' getDataFromQueries done');
- }
- crfData.processLookup=
- function(cb=null){
- let fName="[processLookup]";
- let obj=this.getLookupObject();
- for (let q in obj){
- this.print(fName+" "+q);
- let a=q.split(':');
- if (a.length<3) continue;
- let lookupName=a[0];
- let key=a[1];
- let val=a[2];
- obj[lookupName]=new Object();
- this.print(fName+' adding ['+lookupName+'] '+key+'/'+val);
- let lObject=obj[lookupName];
- lObject.LUT=new Array();//key to value
- lObject.ValToKey=new Array();//value to key
- lObject.keyColumn=key
- lObject.displayColumn=val;
-
- let qRows=obj[q].rows;
- for (let i=0;i<qRows.length;i++){
- let r=qRows[i];
- this.print(fName+' LUT ['+r[key]+'] '+r[val]);
- lObject.LUT[r[key]]=r[val];
- lObject.ValToKey[r[val]]=r[key];
- }
- }
- if (cb) cb();
- }
- crfData.setData=
- function(crfRef,cb=null, schemaName=null){
- fName='[setData]';
- //let crfMatch=this.getCRFref();
- //let parentCrf=config.formConfig.crfEntry['parentCrf'];
- //if (parentCrf!=undefined) crfMatch=parentCrf;
- this.print(fName+' form crf ['+crfRef+'] ');
- let queryArray=new Array();
- let targetObject=this.getSnapshotObject();
- //collect data and execute callback cb for queries in cb.queryList
- let qList=this.getActiveQueries();
- for (let qId in qList){
- let entry=qList[qId];
- let q=entry['queryName'];
- let filters=[LABKEY.Filter.create("crfRef",crfRef)];
- let fieldName=q;
- if (schemaName=='study') fieldName=q+'Study';
- queryArray.push(runQuery.makeQuery(targetObject,'data',q,fieldName,filters,schemaName));
- }
- runQuery.getDataFromQueries(this,queryArray,cb);
- }
- crfData.setDataForQuery=
- function(queryName,crfRef=null,cb=null,schemaName='lists',crfField='crfRef'){
- let queryArray=new Array();
- let targetObject=this.getSnapshotObject();
-
- let filters=[LABKEY.Filter.create(crfField,crfRef)];
- let fieldName=q;
- if (schemaName=='study') fieldName=q+'Study';
- queryArray.push(runQuery.makeQuery(targetObject,'data',q,fieldName,filters,schemaName));
- runQuery.getDataFromQueries(this,queryArray,cb);
- }
- crfData.uploadData=
- function(id,crfRef,cb=null){
- let fName='[uploadData['+id+']'+crfRef+']';
- this.print(fName);
- let qList=this.getActiveQueries();
- let modArray=new Array();
- let schemaName='study';
- let containerName='data';
- for (let qId in qList){
- let entry=qList[qId];
- let q=entry['queryName'];
- this.print(fName+' working on '+q);
-
- //determine rows that need to be updated form querySnapshot
- let studyRows=this.getQuerySnapshot(q+'Study').rows;
- let listRows=this.getQuerySnapshot(q).rows;
- this.print(fName+' studies '+studyRows.length+' lists '+listRows.length);
- //rows to be UPDATED (already in dataset)
- let modRows=new Array();
- for (let i=0;i<studyRows.length;i++){
- let entry=studyRows[i];
- //
- if (! (i<listRows.length) ) continue;
- let entryList=listRows[i];
- //keeps study only variables (ParticipantId, SequenceNum)
- for (let f in entryList) {
- entry[f]=entryList[f];
- this.print(fName+" copying ["+f+"]: "+entry[f]+"/"+entryList[f]);
- }
- modRows.push(entry);
- }
- //rows to be INSERTED
- let insRows=new Array();
- let participantField=crfSetup.getRows('studyData')[0]["SubjectColumnName"];
- for (let i=studyRows.length;i<listRows.length;i++){
- let entry=listRows[i];
- //make sure you have the participantField right
- //
- entry[participantField]=id;
- entry.crfRef=crfRef;;
- entry.SequenceNum=crfRef;
- entry.SequenceNum=entry.SequenceNum % 1000000000;
-
- if (listRows.length>1){
- entry.SequenceNum+=i/100;
- }
- this.print( "Adding sequence number "+entry.SequenceNum);
- insRows.push(entry);
- }
- if (modRows.length>0)
- modArray.push(runQuery.makeModification('update',containerName,schemaName,q,modRows));
- //determine rows that need to be inserted from querySnapshot
- if (insRows.length>0)
- modArray.push(runQuery.makeModification('insert',containerName,schemaName,q,insRows));
- }
- //do the whole batch
- runQuery.modifyDataFromQueries(this,modArray,cb);
- }
- crfData.removeData=
- function(cb=null){
- let qList=this.getActiveQueries();
- let modArray=new Array();
- for (let qId in qList){
- let entry=qList[qId];
- let q=entry['queryName'];
-
- //determine rows that need to be updated form querySnapshot
- let studyRows=this.getQuerySnapshot(q+'Study').rows;
- if (studyRows.length>0)
- modArray.push(runQuery.makeModification('delete','data','study',q,studyRows));
- let listRows=this.getQuerySnapshot(q).rows;
- if (listRows.length>0)
- modArray.push(runQuery.makeModification('delete','data','lists',q,listRows));
- }
- //do the whole batch
- runQuery.modifyDataFromQueries(this,modArray,cb);
- }
- crfData.setRegistration=
- function(cb=null){
- let regQueryPars=variableList.parseVariables(this.setup.getSettings('registrationQuery'));
- let q=regQueryPars['query'];
- let queryArray=new Array();
- let targetObject=this.getSnapshotObject();
- let filters=[];
- queryArray.push(runQuery.makeQuery(targetObject,'data',q,q,filters));
- runQuery.getDataFromQueries(this,queryArray,cb);
- }
- crfData.setCrfEntry=
- function(crfRef,cb=null){
- let q='crfEntry';
- let queryArray=new Array();
- let targetObject=this.getSnapshotObject();
- let filters=[LABKEY.Filter.create('entryId',crfRef)];
- queryArray.push(runQuery.makeQuery(targetObject,'data',q,q,filters));
- runQuery.getDataFromQueries(this,queryArray,cb);
- }
- crfData.createCrfStatus=
- function(crfEntry){
- let crfStatus=new Object();
- crfStatus.entryId=crfEntry.entryId;
- crfStatus.submissionDate=new Date();
- crfStatus.FormStatus=crfEntry.FormStatus;
- crfStatus.User=crfEntry.UserId;
- crfStatus.Form=crfEntry.Form;
- return crfStatus;
- }
- crfData.addActiveQuery=
- function(entry){
- let aq=this.getActiveQueries();
- let qName=entry['queryName'];
- if (qName in aq) return;
- aq[qName]=entry;
- return;
- }
- crfData.clearActiveQueries=
- function(){
- let aq=this.getActiveQueries();
- for (q in aq){
- delete aq[q];
- }
- }
|