/*
* Copyright (c) 2006-2007 Massachusetts General Hospital
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the i2b2 Software License v1.0
* which accompanies this distribution.
*
* Contributors:
* Rajesh Kuttan
*/
package edu.harvard.i2b2.crc.dao.setfinder;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import edu.harvard.i2b2.common.exception.I2B2DAOException;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.common.util.db.JDBCUtil;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException;
import edu.harvard.i2b2.crc.dao.CRCDAO;
import edu.harvard.i2b2.crc.dao.setfinder.querybuilder.QueryToolUtil;
import edu.harvard.i2b2.crc.dao.setfinder.querybuilder.QueryToolUtilNew;
import edu.harvard.i2b2.crc.dao.setfinder.querybuilder.RecursiveBuild;
import edu.harvard.i2b2.crc.dao.setfinder.querybuilder.temporal.TemporalQueryBuilder;
import edu.harvard.i2b2.crc.datavo.db.DataSourceLookup;
import edu.harvard.i2b2.crc.util.ParamUtil;
import edu.harvard.i2b2.crc.util.QueryProcessorUtil;
/**
* Helper class for setfinder operation. Builds sql from query definition,
* executes the generated sql and create query results instance $Id:
* QueryRequestSpringDao.java,v 1.5 2008/07/10 20:11:21 rk903 Exp $
*
* @author rkuttan
*/
public class QueryRequestSpringDao extends CRCDAO implements IQueryRequestDao {
/** Global temp table to store intermediate setfinder results **/
private String TEMP_TABLE = "QUERY_GLOBAL_TEMP";
/** Global temp table to store intermediate patient list **/
private String TEMP_DX_TABLE = "DX";
JdbcTemplate jdbcTemplate = null;
DataSourceLookup dataSourceLookup = null;
String processTimingFlag = "NONE";
Map projectParamMap = null;
boolean allowLargeTextValueConstrainFlag = true;
boolean queryWithoutTempTableFlag = false;
public QueryRequestSpringDao(DataSource dataSource,
DataSourceLookup dataSourceLookup) {
setDataSource(dataSource);
jdbcTemplate = new JdbcTemplate(dataSource);
this.dataSourceLookup = dataSourceLookup;
}
public void setProjectParam(Map projectParamMap) {
this.projectParamMap = projectParamMap;
if (projectParamMap != null && projectParamMap.get(ParamUtil.PM_ENABLE_PROCESS_TIMING) != null) {
this.processTimingFlag = (String)projectParamMap.get(ParamUtil.PM_ENABLE_PROCESS_TIMING);
}
}
public void setAllowLargeTextValueConstrainFlag(boolean allowLargeTextValueConstrainFlag) {
this.allowLargeTextValueConstrainFlag = allowLargeTextValueConstrainFlag;
}
/**
* Function to build sql from given query definition This function uses
* QueryToolUtil class to build sql
*
* @param queryRequestXml
* @return sql string
* @throws I2B2Exception
* @throws JAXBUtilException
*/
public String[] buildSql(String queryRequestXml, boolean encounterSetFlag) throws I2B2Exception, JAXBUtilException {
String sql = null, ignoredItemMessage = null, processTimingMessage = null;
Connection conn = null;
String queryType = null;
try {
// conn = getConnection();
conn = dataSource.getConnection();
// check to switch between the old and new setfinder query
// generator.
String queryGeneratorVersion = "1.7";
try {
QueryProcessorUtil qpUtil = QueryProcessorUtil.getInstance();
queryGeneratorVersion = qpUtil
.getCRCPropertyValue("edu.harvard.i2b2.crc.setfinder.querygenerator.version");
} catch (I2B2Exception e) {
// ignore this default will be 1.6
}
if (queryGeneratorVersion.equals("1.7")) {
TemporalQueryBuilder temporalBuild = new TemporalQueryBuilder(dataSourceLookup,queryRequestXml);
temporalBuild.setProjectParamMap(this.projectParamMap);
temporalBuild.setAllowLargeTextValueConstrainFlag(allowLargeTextValueConstrainFlag);
temporalBuild.setQueryWithoutTempTableFlag(queryWithoutTempTableFlag);
temporalBuild.startSqlBuild();
sql = temporalBuild.getSql();
ignoredItemMessage = temporalBuild.getIgnoredItemMessage();
processTimingMessage = temporalBuild.getProcessTimingMessage();
queryType = (temporalBuild.isTemporalQuery()?"TEMPORAL":null);
}
else if (queryGeneratorVersion.equals("1.6")) {
RecursiveBuild recursiveBuild = new RecursiveBuild(dataSourceLookup,queryRequestXml,encounterSetFlag);
recursiveBuild.setProjectParamMap(this.projectParamMap);
recursiveBuild.setAllowLargeTextValueConstrainFlag(allowLargeTextValueConstrainFlag);
recursiveBuild.startSqlBuild();
sql = recursiveBuild.getSql();
ignoredItemMessage = recursiveBuild.getIgnoredItemMessage();
processTimingMessage = recursiveBuild.getProcessTimingMessage();
//QueryToolUtilNew queryUtil = new QueryToolUtilNew(
// dataSourceLookup, queryRequestXml, encounterSetFlag);
//sql = queryUtil.getSetfinderSqlForQueryDefinition();
//ignoredItemMessage = queryUtil.getIgnoredItemMessage();
} else {
log
.warn("*** USING THE OLD QUERY GENERATOR *** QueryToolUtil.java");
QueryToolUtil queryUtil = new QueryToolUtil(dataSourceLookup);
sql = queryUtil.generateSQL(conn, queryRequestXml,
encounterSetFlag);
ignoredItemMessage = queryUtil.getIgnoredItemMessage();
}
} catch (SQLException ex) {
log.error("Error while building sql", ex);
//throw new Exception("Error while building sql ", ex);
} catch (I2B2Exception e) {
log.error("QuieryRequestSptingDAO: Error while building sql I2b2 Error ", e);
// TODO Auto-generated catch block
throw e;
// e.printStackTrace();
} catch (JAXBUtilException e) {
throw e;
} finally {
try {
JDBCUtil.closeJdbcResource(null, null, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
return new String[] { sql, ignoredItemMessage, processTimingMessage, queryType};
}
@Override
public void setQueryWithoutTempTableFlag(boolean queryWithoutTempTableFlag) {
this.queryWithoutTempTableFlag = queryWithoutTempTableFlag;
}
}