package edu.harvard.i2b2.crc.dao.setfinder.querybuilder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import edu.harvard.i2b2.crc.dao.DAOFactoryHelper; import edu.harvard.i2b2.crc.datavo.db.DataSourceLookup; import edu.harvard.i2b2.crc.datavo.pdo.query.TotOccuranceOperatorType; import edu.harvard.i2b2.crc.datavo.setfinder.query.PanelType.TotalItemOccurrences; public class BuildTotalOccuranceSql { protected final Log log = LogFactory.getLog(BuildTotalOccuranceSql.class); DataSourceLookup dataSourceLookup = null; public BuildTotalOccuranceSql(DataSourceLookup dataSourceLookup) { this.dataSourceLookup = dataSourceLookup; } public String buildTotalOccuranceSql(String dimensionJoinSql, boolean encounterFlag, boolean instanceNumFlag, String queryTiming, int panelNumber, TotalItemOccurrences totalOccurances, boolean panelInvertFlag) { String selectClause = " ", groupbyClause = " "; TotalItemOccurrenceHandler totalItemOccurrencHandler = new TotalItemOccurrenceHandler(); String totalItemOccurrenceClause = totalItemOccurrencHandler .buildTotalItemOccurrenceClause(totalOccurances); if (panelNumber != 1) { selectClause = " 1 as panel_count "; } else { if (instanceNumFlag) { selectClause = "provider_id, start_date, concept_cd, instance_num, encounter_num, "; } else if (encounterFlag) { selectClause = "encounter_num, "; } selectClause += " patient_num ," + panelNumber + " as panel_count "; } //check if the dimensionJoinSql is query in query with fact constrains String groupbyClausePrefix = ""; if (dimensionJoinSql.indexOf("j1.")>0) { groupbyClausePrefix = "j1."; } //if (instanceNumFlag) { // groupbyClause = " " + groupbyClausePrefix + "encounter_num ," + groupbyClausePrefix + "instance_num,"; //} else if (encounterFlag) { // groupbyClause = " " + groupbyClausePrefix + "encounter_num ,"; //} //groupbyClause += " " + groupbyClausePrefix + "patient_num "; QueryTimingHandler timingHandler = new QueryTimingHandler(); if (timingHandler.isSameInstanceNum(queryTiming)) { groupbyClause = " " + groupbyClausePrefix + "encounter_num ," + groupbyClausePrefix + "instance_num, " + groupbyClausePrefix + "concept_cd," + groupbyClausePrefix + "start_date," + groupbyClausePrefix + "provider_id,"; } else if (timingHandler.isSameVisit(queryTiming)) { groupbyClause = " " + groupbyClausePrefix + "encounter_num ,"; } groupbyClause += " " + groupbyClausePrefix + "patient_num "; String totalOccuranceSql = "select " + selectClause + " from (" + dimensionJoinSql ; //if (panelInvertFlag == false) { totalOccuranceSql += " group by " + groupbyClause ; //} if (totalOccurances != null) { // TotOccuranceOperatorType if ((totalOccurances.getOperator() != null && totalOccurances.getOperator().value() != null && totalOccurances.getOperator().value().equalsIgnoreCase(TotOccuranceOperatorType.GE.value())) && totalOccurances.getValue()==1) { } else { log.debug("Setfinder query total occurrences operator value [" + totalOccurances.getOperator().value() + "]"); String countDistinct = "*"; if (this.dataSourceLookup.getServerType().equalsIgnoreCase(DAOFactoryHelper.SQLSERVER)) { countDistinct = " distinct cast(patient_num as varchar) + '|' + cast(encounter_num as varchar) + '|' + " + " provider_id + '|' + cast(start_date as varchar) + '|' + cast(instance_num as varchar) + '|' +concept_cd"; } else if (this.dataSourceLookup.getServerType().equalsIgnoreCase(DAOFactoryHelper.ORACLE) || this.dataSourceLookup.getServerType().equalsIgnoreCase(DAOFactoryHelper.POSTGRESQL) ) { countDistinct = " distinct patient_num || '|' || encounter_num || '|' || provider_id || '|' || instance_num || '|' ||concept_cd || '|' ||cast(start_date as varchar(50) ) "; } totalOccuranceSql += " having count("+countDistinct+") " + totalItemOccurrenceClause;// + " group by " + selectClause; /*if (panelInvertFlag == true && totalItemOccurrenceClause.trim() != "") { if (instanceNumFlag) selectClause = " group by provider_id, start_date, concept_cd, instance_num, encounter_num "; else if (encounterFlag) selectClause = " group by encounter_num "; else totalOccuranceSql += " group by patient_num "; }*/ } } totalOccuranceSql +=" ) t"; return totalOccuranceSql; } }