/*******************************************************************************
* Copyright (c) 2013 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.engine.sql.util;
import org.apache.log4j.Logger;
import com.hangum.tadpole.engine.define.DBDefine;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.sql.template.AltibaseDMLTemplate;
import com.hangum.tadpole.engine.sql.template.CubridDMLTemplate;
import com.hangum.tadpole.engine.sql.template.HIVEDMLTemplate;
import com.hangum.tadpole.engine.sql.template.MSSQLDMLTemplate;
import com.hangum.tadpole.engine.sql.template.MySQLDMLTemplate;
import com.hangum.tadpole.engine.sql.template.OracleDMLTemplate;
import com.hangum.tadpole.engine.sql.template.PostgreDMLTemplate;
import com.hangum.tadpole.engine.sql.template.RedShiftDMLTemplate;
import com.hangum.tadpole.engine.sql.template.SQLiteDMLTemplate;
import com.hangum.tadpole.engine.sql.template.TAJODMLTemplate;
import com.hangum.tadpole.engine.sql.template.TiberoDMLTemplate;
/**
* 각 DBMS에 맞는 쿼리문을 생성합니다.
*
* @author hangum
*
*/
public class PartQueryUtil {
private static final Logger logger = Logger.getLogger(PartQueryUtil.class);
/**
* 각 DBMS에 맞는 SELECT 문을 만들어줍니다.
*
* @param userDB 사용디비
* @param strQuery 사용 쿼리
* @param intStartPosition 시작 포인트
* @param intRowCnt 몇 건 데이터
*
* @return
*/
public static String makeSelect(UserDBDAO userDB, String strQuery, int intStartPos, int intRowCnt) throws Exception {
String requestQuery = strQuery;
// if(logger.isDebugEnabled()) logger.debug("make select : " + intStartPos + ", " + intRowCnt);
if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) {
requestQuery = String.format(MySQLDMLTemplate.TMP_GET_PARTDATA, strQuery, intStartPos, intRowCnt);
} else if(DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()) {
requestQuery = String.format(OracleDMLTemplate.TMP_GET_PARTDATA, strQuery, intStartPos, intStartPos+intRowCnt);
} else if(DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup()) {
requestQuery = String.format(SQLiteDMLTemplate.TMP_GET_PARTDATA, strQuery, intStartPos, intRowCnt);
} else if(DBGroupDefine.CUBRID_GROUP == userDB.getDBGroup()) {
requestQuery = String.format(CubridDMLTemplate.TMP_GET_PARTDATA, strQuery, intStartPos, intRowCnt);
} else if(DBGroupDefine.POSTGRE_GROUP == userDB.getDBGroup()) {
requestQuery = String.format(PostgreDMLTemplate.TMP_GET_PARTDATA, strQuery, intStartPos, intRowCnt);
} else if(DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup()) {
requestQuery = String.format(AltibaseDMLTemplate.TMP_GET_PARTDATA, strQuery, intStartPos, intRowCnt);
// } else if(DBDefine.MSSQL_DEFAULT == userDB.getDBDefine() | DBDefine.MSSQL_8_LE_DEFAULT == userDB.getDBDefine()) {
// requestQuery = String.format(MSSQLDMLTemplate.TMP_GET_PARTDATA, strQuery, intRowCnt, intStartPos+intRowCnt);
//
// // 정의 되지 않는 dbms는 전체로 동작하게 합니다.
// } else {
// requestQuery = originalQuery;
// } else {
// throw new Exception("Not support Database.");
}
return requestQuery;
}
/**
* 각 dbms에 맞는 explain query를 만들어 줍니다.
*
* @param userDB
* @param query
* @return
*/
public static String makeExplainQuery(UserDBDAO userDB, String query) throws Exception {
String resultQuery = "";
if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) {
resultQuery = MySQLDMLTemplate.TMP_EXPLAIN_EXTENDED + query;
} else if(DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()) {
if(DBDefine.ORACLE_DEFAULT == userDB.getDBDefine()) {
resultQuery = OracleDMLTemplate.TMP_EXPLAIN_EXTENDED + query;
} else if(DBDefine.TIBERO_DEFAULT == userDB.getDBDefine()) {
resultQuery = String.format(TiberoDMLTemplate.TMP_EXPLAIN_EXTENDED, "%" + query + "%");
}
} else if(DBGroupDefine.MSSQL_GROUP == userDB.getDBGroup()) {
resultQuery = MSSQLDMLTemplate.TMP_EXPLAIN_EXTENDED + query;
} else if(DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup()) {
resultQuery = SQLiteDMLTemplate.TMP_EXPLAIN_EXTENDED + query;
} else if(DBGroupDefine.CUBRID_GROUP == userDB.getDBGroup()) {
resultQuery = query;
} else if(DBGroupDefine.HIVE_GROUP == userDB.getDBGroup()) {
resultQuery = HIVEDMLTemplate.TMP_EXPLAIN_EXTENDED + query;
} else if(DBGroupDefine.TAJO_GROUP == userDB.getDBGroup()) {
resultQuery = TAJODMLTemplate.TMP_EXPLAIN_EXTENDED + query;
} else if(DBGroupDefine.POSTGRE_GROUP == userDB.getDBGroup()) {
if(userDB.getDBDefine() == DBDefine.AMAZON_REDSHIFT_DEFAULT) {
resultQuery = RedShiftDMLTemplate.TMP_EXPLAIN_EXTENDED + query;
} else {
resultQuery = PostgreDMLTemplate.TMP_EXPLAIN_EXTENDED + query;
}
} else {
throw new Exception("Not Support DBMS Query Plan.");
}
if(logger.isDebugEnabled()) logger.debug("[plan query]" + resultQuery);
return resultQuery;
}
}