package edu.harvard.i2b2.crc.dao.setfinder.querybuilder;
import java.util.List;
import javax.xml.datatype.XMLGregorianCalendar;
import edu.harvard.i2b2.crc.datavo.db.DataSourceLookup;
import edu.harvard.i2b2.crc.datavo.setfinder.query.ConstrainDateType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.InclusiveType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.ItemType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.PanelType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.ItemType.ConstrainByDate;
public class DateConstrainUtil {
DateConstrainHandler dateConstrainHandler = null;
public DateConstrainUtil(DataSourceLookup dataSourceLookup) {
dateConstrainHandler = new DateConstrainHandler(dataSourceLookup);
}
public String buildPanelDateSql(PanelType panelType){
return buildPanelDateSql(panelType, "");
}
public String buildPanelDateSql(PanelType panelType, String tableAlias) {
String panelDateConstrain = " ";
if (panelType.getPanelDateFrom() != null
|| panelType.getPanelDateTo() != null) {
panelDateConstrain = generatePanelDateConstrain(
dateConstrainHandler, panelType.getPanelDateFrom(),
panelType.getPanelDateTo(), tableAlias);
}
return panelDateConstrain;
}
public String buildItemDateSql(ItemType item){
return buildItemDateSql(item, "");
}
public String buildItemDateSql(ItemType item, String tableAlias) {
if (tableAlias==null)
tableAlias = "";
if (tableAlias.trim().length()>0&&!tableAlias.endsWith("."))
tableAlias = tableAlias + ".";
String dateConstrainSql = null;
String fullItemDateSql = "";
List<ConstrainByDate> constrainByDateList = item.getConstrainByDate();
boolean firstFlag = true;
for (ConstrainByDate constrainByDate : constrainByDateList) {
ConstrainDateType dateFrom = constrainByDate.getDateFrom();
ConstrainDateType dateTo = constrainByDate.getDateTo();
String dateFromColumn = null, dateToColumn = null;
InclusiveType dateFromInclusive = null, dateToInclusive = null;
XMLGregorianCalendar dateFromValue = null, dateToValue = null;
if (dateFrom != null || dateTo != null) {
if (dateFrom != null) {
dateFromInclusive = dateFrom.getInclusive();
dateFromValue = dateFrom.getValue();
if (dateFrom.getTime() != null
&& dateFrom.getTime().name() != null
&& dateFrom.getTime().name().equalsIgnoreCase(
dateFrom.getTime().END_DATE.name())) {
dateFromColumn = tableAlias + "end_date";
} else {
dateFromColumn = tableAlias + "start_date";
}
}
if (dateTo != null) {
dateToInclusive = dateTo.getInclusive();
dateToValue = dateTo.getValue();
if (dateTo.getTime() != null
&& dateTo.getTime().name() != null
&& dateTo.getTime().name().equalsIgnoreCase(
dateTo.getTime().END_DATE.name())) {
dateToColumn = tableAlias + "end_date";
} else {
dateToColumn = tableAlias + "start_date";
}
}
dateConstrainSql = dateConstrainHandler
.constructDateConstrainClause(dateFromColumn,
dateToColumn, dateFromInclusive,
dateToInclusive, dateFromValue, dateToValue);
if (dateConstrainSql != null) {
if (!firstFlag) {
fullItemDateSql += " AND ";
} else {
firstFlag = false;
}
fullItemDateSql += " " + dateConstrainSql + "\n";
}
}
}
return fullItemDateSql;
}
private String generatePanelDateConstrain(
DateConstrainHandler dateConstrainHandler,
ConstrainDateType dateFrom, ConstrainDateType dateTo,
String tableAlias) {
if (tableAlias==null)
tableAlias = "";
if (tableAlias.trim().length()>0&&!tableAlias.endsWith("."))
tableAlias = tableAlias + ".";
String dateFromColumn = null, dateToColumn = null;
InclusiveType dateFromInclusive = null, dateToInclusive = null;
XMLGregorianCalendar dateFromValue = null, dateToValue = null;
String dateConstrainSql = null;
if (dateFrom != null || dateTo != null) {
if (dateFrom != null) {
dateFromInclusive = dateFrom.getInclusive();
dateFromValue = dateFrom.getValue();
if (dateFrom.getTime() != null
&& dateFrom.getTime().name() != null
&& dateFrom.getTime().name().equalsIgnoreCase(
dateFrom.getTime().END_DATE.name())) {
dateFromColumn = tableAlias + "end_date";
} else {
dateFromColumn = tableAlias + "start_date";
}
}
if (dateTo != null) {
dateToInclusive = dateTo.getInclusive();
dateToValue = dateTo.getValue();
if (dateTo.getTime() != null
&& dateTo.getTime().name() != null
&& dateTo.getTime().name().equalsIgnoreCase(
dateTo.getTime().END_DATE.name())) {
dateToColumn = tableAlias + "end_date";
} else {
dateToColumn = tableAlias + "start_date";
}
}
dateConstrainSql = dateConstrainHandler
.constructDateConstrainClause(dateFromColumn, dateToColumn,
dateFromInclusive, dateToInclusive, dateFromValue,
dateToValue);
}
return dateConstrainSql;
}
}