package edu.harvard.i2b2.crc.dao.setfinder.querybuilder;
import java.util.List;
import edu.harvard.i2b2.crc.dao.CRCDAO;
import edu.harvard.i2b2.crc.datavo.db.DataSourceLookup;
public class BuildPanelSql extends CRCDAO {
private String tempTableName = null;
private DataSourceLookup dataSourceLookup = null;
public BuildPanelSql(DataSourceLookup dataSourceLookup, String tempTableName) {
this.setDbSchemaName(dataSourceLookup.getFullSchema());
this.dataSourceLookup = dataSourceLookup;
this.tempTableName = tempTableName;
}
public String buildPanelSql(List<String> itemSqlList, int panelCount,int oldPanelCount,
boolean firstPanelFlag, boolean encounterFlag,
boolean instanceNumFlag, boolean panelInvertFlag, boolean invertQueryFlag, boolean invertOnlyQueryFlag, String firstItemJoinTiming) {
StringBuffer panelSqlBuffer = new StringBuffer();
boolean firstItemFlag = true;
for (String itemSql : itemSqlList) {
// add the item sql to the temp table
if (firstPanelFlag && invertOnlyQueryFlag == false ) {
panelSqlBuffer.append(firstPanelItemSql(itemSql,
getTempTableName(), encounterFlag, instanceNumFlag,firstItemJoinTiming));
} else {
panelSqlBuffer.append(nonFirstPanelItemSql(itemSql,
getTempTableName(), panelCount, oldPanelCount, encounterFlag,
instanceNumFlag,panelInvertFlag,firstPanelFlag, invertQueryFlag,firstItemFlag));
}
panelSqlBuffer.append(this.getSqlDelimitor());
firstItemFlag = false;
}
return panelSqlBuffer.toString();
}
private String getTempTableName() {
return this.tempTableName;
}
public String getSqlDelimitor() {
return "\n<*>\n";
}
private String firstPanelItemSql(String totalOccuranceSql,
String tempTableName, boolean encounterFlag, boolean instanceNumFlag, String firstItemJoinTiming) {
String selectClause = " patient_num , panel_count";
String selectInvJoinClause = " invjoinof.patient_num , invjoinitem.panel_count";
if (instanceNumFlag) {
selectClause = " provider_id, start_date, concept_cd, instance_num, encounter_num, " + selectClause;
selectInvJoinClause = " invjoinof.provider_id, invjoinof.start_date, invjoinof.concept_cd, invjoinof.instance_num, invjoinof.encounter_num, " + selectClause;
} else if (encounterFlag) {
selectClause = " encounter_num, " + selectClause;
selectInvJoinClause = " invjoinof.encounter_num, " + selectClause;
}
String firstPanelItemSql = "";
if (!firstItemJoinTiming.equalsIgnoreCase(QueryTimingHandler.ANY)) {
String invJoinOf = this.getDbSchemaName() + "visit_dimension ";
String whereEncounter = " ", onEncounter = " ";
if (firstItemJoinTiming.equalsIgnoreCase(QueryTimingHandler.SAMEINSTANCENUM)) {
invJoinOf = this.getDbSchemaName() + "observation_fact ";
whereEncounter = " and invjoinof.encounter_num = invjoinitem.encounter_num ";
onEncounter = whereEncounter;
}
firstPanelItemSql = " insert into " + this.getDbSchemaName()+ tempTableName + " (" + selectClause + ")" + "\n" +
" select " + selectInvJoinClause + " from " + invJoinOf + " invjoinof left outer join (" +
totalOccuranceSql + " ) invjoinitem " +
" on invjoinof.patient_num = invjoinitem.patient_num " +
onEncounter +
" where invjoinof.patient_num = invjoinitem.patient_num " +
whereEncounter;
} else {
firstPanelItemSql = " insert into " + this.getDbSchemaName()
+ tempTableName + " (" + selectClause + ")" + "\n"
+ totalOccuranceSql;
}
return firstPanelItemSql;
}
private String nonFirstPanelItemSql(String totalOccuranceSql,
String tempTableName, int panelCount, int oldPanelCount, boolean encounterFlag,
boolean instanceNumFlag, boolean panelInvertFlag, boolean firstPanelFlag, boolean invertQueryFlag, boolean firstItemFlag) {
String encounterNumClause = " ", instanceNumClause = " ";
if (instanceNumFlag) {
instanceNumClause = " and " + this.getDbSchemaName()
+ tempTableName + ".encounter_num = t.encounter_num and "
+ this.getDbSchemaName() + tempTableName
+ ".instance_num = t.instance_num and "
+ this.getDbSchemaName() + tempTableName
+ ".start_date = t.start_date and "
+ this.getDbSchemaName() + tempTableName
+ ".concept_cd = t.concept_cd and "
+ this.getDbSchemaName() + tempTableName
+ ".provider_id = t.provider_id ";
} else if (encounterFlag) {
encounterNumClause = " and " + this.getDbSchemaName()
+ tempTableName + ".encounter_num = t.encounter_num ";
}
String nonFirstPanelItemSql = " ";
if (panelInvertFlag) {
if (firstItemFlag) {
nonFirstPanelItemSql = " update " + this.getDbSchemaName()
+ tempTableName + " set panel_count = " + panelCount + " where " + this.getDbSchemaName() + tempTableName
+ ".panel_count = " + oldPanelCount + "\n<*>\n";
}
if (firstPanelFlag) {
oldPanelCount = 1;
}
String groupByClause = getGroupBy( encounterFlag, instanceNumFlag);
nonFirstPanelItemSql += " update " + this.getDbSchemaName()
+ tempTableName + " set panel_count = -1 "
+ " where " + this.getDbSchemaName() + tempTableName
+ ".panel_count = " + panelCount + " and exists ( " + totalOccuranceSql + " where "
+ this.getDbSchemaName() + tempTableName
+ ".patient_num = t.patient_num " + encounterNumClause
+ instanceNumClause + " group by " + groupByClause + " ) "; //group by patient_num
} else {
String notExists = " ";
if (invertQueryFlag && firstPanelFlag) {
oldPanelCount = 1;
panelCount = -1;
notExists = " not ";
}
nonFirstPanelItemSql = " update " + this.getDbSchemaName()
+ tempTableName + " set panel_count =" + panelCount
+ " where " + notExists + " exists ( " + totalOccuranceSql + " where "
+ this.getDbSchemaName() + tempTableName
+ ".panel_count = " + oldPanelCount + " and "
+ this.getDbSchemaName() + tempTableName
+ ".patient_num = t.patient_num " + encounterNumClause
+ instanceNumClause + " ) ";
}
return nonFirstPanelItemSql;
}
private String getGroupBy(boolean encounterFlag, boolean instanceNumFlag) {
String groupbyClausePrefix ="", groupbyClause = "";
if (instanceNumFlag) {
groupbyClause = " " + groupbyClausePrefix + "encounter_num ," + groupbyClausePrefix + "instance_num, " + groupbyClausePrefix + "concept_cd," +
groupbyClausePrefix + "start_date," + groupbyClausePrefix + "provider_id,";
} else if (encounterFlag) {
groupbyClause = " " + groupbyClausePrefix + "encounter_num ,";
}
groupbyClause += " " + groupbyClausePrefix + "patient_num ";
return groupbyClause;
}
}