/**
* @version $Id: ClaimWorkDataDaoConnector.java 1031 2013-07-01 07:16:37Z wataru-higa $
*
* 2011/10/28 11:43:11
* @author imai-yoshikazu
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.io.dam.hibernate.connector.impl;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.bean.ProductBean;
import com.tida_okinawa.corona.io.bean.WorkdatasBean;
import com.tida_okinawa.corona.io.dam.hibernate.ClaimData;
import com.tida_okinawa.corona.io.dam.hibernate.ClaimWorkData;
import com.tida_okinawa.corona.io.dam.hibernate.IoService;
import com.tida_okinawa.corona.io.dam.hibernate.hql.CommonCreateQuery;
import com.tida_okinawa.corona.io.model.ClaimWorkDataType;
import com.tida_okinawa.corona.io.util.CoronaIoUtils;
/**
* 中間データのDB読み書き
*
* @author imai
*
*/
public class ClaimWorkDataDaoConnector extends AbstractDaoConnector<Integer, String> {
protected ClaimWorkData claimWorkData;
/**
* @return 問い合わせデータ
*/
public ClaimWorkData getClaimWorkData() {
return claimWorkData;
}
/**
* @param claimWorkData
* 問い合わせデータ
*/
public void setClaimWorkData(ClaimWorkData claimWorkData) {
this.claimWorkData = claimWorkData;
}
/**
* @param claimWorkData
* 問い合わせデータ
*/
public ClaimWorkDataDaoConnector(ClaimWorkData claimWorkData) {
this.claimWorkData = claimWorkData;
}
/**
* @param claimWorkData
* 問い合わせデータ
* @param historyId
* 履歴ID
*/
public ClaimWorkDataDaoConnector(ClaimWorkData claimWorkData, int historyId) {
this.claimWorkData = claimWorkData;
}
@Deprecated
@Override
public void clear() {
throw new UnsupportedOperationException();
}
@Override
Session getConnection() throws HibernateException {
Session conn = ((IoService) IoService.getInstance()).getSession();
return conn;
}
@Override
protected String createStatementForGetKeys() {
/* createStatementFotGetKeysで履歴IDを渡すようにしたため、引数なしのやつは使わない */
return null;
}
/**
* 抽出対象のレコードIDを取得するSQLを作成する(履歴IDも条件に含める)
*
* @param historyId
* 履歴ID
* @return SQL文
*/
protected String createStatementForGetKeys(int historyId) {
ClaimData claimData = (ClaimData) IoActivator.getService().getClaimData(claimWorkData.getClaimId());
String productDBField = claimData.getFieldInformation(claimData.getProductField()).getName();
int productId = claimWorkData.getProductId();
ProductBean product = (ProductBean) CommonCreateQuery.getProductQuery(productId).uniqueResult();
String productName = product.getProductName();
String strSQL;
ClaimWorkDataType type = claimWorkData.getClaimWorkDataType();
if (ClaimWorkDataType.FREQUENTLY_APPERING.equals(type)) {
/* 頻出用語抽出の場合 */
strSQL = "select rec_id from " + claimWorkData.getDbName() + " t where work_id =" + claimWorkData.getWorkdataId(); //$NON-NLS-1$ //$NON-NLS-2$
} else {
/* それ以外の場合 */
strSQL = "SELECT REC_ID FROM " + claimData.getTableName() + " c, " + claimWorkData.getDbName() + " t, WORKDATAS w WHERE c.ID = t.REC_ID "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (productName != null) {
strSQL += "AND c." + productDBField + " ='" + productName + "' "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
strSQL += "AND w.ID = t.WORK_ID AND t.FLD_ID = " + claimWorkData.getFieldId() + " AND w.TYPE = " + type.getIntValue(); //$NON-NLS-1$ //$NON-NLS-2$
}
strSQL += " AND t.HISTORY_ID = " + historyId; //$NON-NLS-1$
return strSQL;
}
@Override
protected Integer getKey(Object[] rs) throws HibernateException {
int recordId = rs[0] == null ? 0 : Integer.parseInt(rs[0].toString()); //rs.getInt("REC_ID");
return recordId;
}
@Override
protected String prepareStatementForGet() throws HibernateException {
StringBuilder strSQL = new StringBuilder(128);
strSQL.append("SELECT DATA FROM ").append(claimWorkData.getDbName()).append(" "); //$NON-NLS-1$ //$NON-NLS-2$
// TODO 20131206 Hibernate版H2DataBaseでは、このままではNGの為、カットしておく。
// strSQL.append("USE INDEX (").append(claimWorkData.getDbName()).append("_INDEX) "); //$NON-NLS-1$ //$NON-NLS-2$
strSQL.append("WHERE WORK_ID=").append(claimWorkData.getWorkdataId()).append(" "); //$NON-NLS-1$ //$NON-NLS-2$
strSQL.append("AND FLD_ID=").append(claimWorkData.getFieldId()); //$NON-NLS-1$
strSQL.append(" AND HISTORY_ID = !!1"); //$NON-NLS-1$
strSQL.append(" AND REC_ID = !!2"); //$NON-NLS-1$
return strSQL.toString();
}
@Override
protected String setParamForGet(String stmt, Integer key) throws HibernateException {
// TODO 20131105 このメソッドはjdbc版では呼び出し階層での確認では未使用となっている。
//stmt.setInt(1, key);
return stmt.replaceFirst("!!1", String.valueOf(key)); //$NON-NLS-1$
}
/**
* prepareStatementForGetで作成したSQL文のパラメータにレコードIDと履歴IDを設定する
*
* @param stmt
* SQLステートメント
* @param key
* レコードID
* @param historyId
* 履歴ID
* @throws HibernateException
*/
protected String setParamForGet(String stmt, int key, int historyId) throws HibernateException {
stmt = stmt.replaceFirst("!!1", String.valueOf(historyId)); //$NON-NLS-1$
stmt = stmt.replaceFirst("!!2", String.valueOf(key)); //$NON-NLS-1$
return stmt;
}
@Override
protected String getResultDirect(List<Object[]> list) throws HibernateException {
//String data = rs.getString("DATA");
String data = null;
/*
* TODO 20131203 listの内容は Object[]の場合とObjectとなる場合があるので、この判定が必要
* (selectでの1行あたりの取得個数は1個の場合Objectとなってしまう。)
*/
if (list.get(0) instanceof Object[]) {
Object[] rs = list.get(0);
//data = (String) rs[0];
data = CoronaIoUtils.convertToString(rs[0]);
} else {
Object rs = list.get(0);
//data = (String) rs;
data = CoronaIoUtils.convertToString(rs);
}
return data;
}
@Override
protected String prepareStatementForCommit() {
String dbName = claimWorkData.getDbName();
int fieldId = claimWorkData.getFieldId();
int workDataId = claimWorkData.getWorkdataId();
if (workDataId <= 0) {
/* ClaimWorkDataDao.getClaimWorkDataId を置換する。 */
workDataId = 0;
Session session = getConnection();
try {
String hql = "FROM WorkdatasBean WHERE projectId =:ProjectId AND productId =:ProductId AND inputTableId =:ClaimId AND type= :Type"; //$NON-NLS-1$
@SuppressWarnings("unchecked")
List<WorkdatasBean> list = session.createQuery(hql).setInteger("ProjectId", claimWorkData.getProjectId()) //$NON-NLS-1$
.setInteger("ProductId", claimWorkData.getProductId()) //$NON-NLS-1$
.setInteger("ClaimId", claimWorkData.getClaimId()) //$NON-NLS-1$
.setInteger("Type", claimWorkData.getClaimWorkDataType().getIntValue()) //$NON-NLS-1$
.list();
for (WorkdatasBean rs : list) {
workDataId = rs.getId();
break;
}
} catch (HibernateException e) {
workDataId = -1;
}
}
/* 登録用の履歴IDを取得 */
int historyId = claimWorkData.getHistoryId();
StringBuilder sql = new StringBuilder(256);
sql.append("MERGE INTO ").append(dbName); //$NON-NLS-1$
sql.append(" (FLD_ID, WORK_ID, REC_ID, HISTORY_ID, DATA) "); //$NON-NLS-1$
sql.append("KEY (FLD_ID, WORK_ID, REC_ID, HISTORY_ID) "); //$NON-NLS-1$
sql.append("VALUES (").append(fieldId).append(",").append(workDataId).append(", !!1, ").append(historyId).append(", '!!2')"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
// sql.append("INSERT INTO ").append(dbName); //$NON-NLS-1$
// sql.append(" (FLD_ID, WORK_ID, REC_ID, HISTORY_ID, DATA) VALUES "); //$NON-NLS-1$
// sql.append("(").append(fieldId).append(",").append(workDataId).append(", !!1, ").append(historyId).append(", '!!2')"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
// sql.append(" ON DUPLICATE KEY UPDATE DATA =VALUES(DATA);"); //$NON-NLS-1$
return sql.toString();
}
@Override
protected String setParamForCommit(String stmt, Integer key, String value) throws HibernateException {
stmt = stmt.replaceFirst("!!1", String.valueOf(key)); //$NON-NLS-1$
stmt = stmt.replaceFirst("!!2", value); //$NON-NLS-1$
return stmt;
}
@Override
protected String prepareStatementForCommit(int size) {
String dbName = claimWorkData.getDbName();
int fieldId = claimWorkData.getFieldId();
int workDataId = claimWorkData.getWorkdataId();
if (workDataId <= 0) {
/* ClaimWorkDataDao.getClaimWorkDataId を置換する。 */
workDataId = 0;
Session session = getConnection();
try {
String hql = "FROM WorkdatasBean WHERE projectId =:ProjectId AND productId =:ProductId AND inputTableId =:ClaimId AND type= :Type"; //$NON-NLS-1$
@SuppressWarnings("unchecked")
List<WorkdatasBean> list = session.createQuery(hql).setInteger("ProjectId", claimWorkData.getProjectId()) //$NON-NLS-1$
.setInteger("ProductId", claimWorkData.getProductId()) //$NON-NLS-1$
.setInteger("ClaimId", claimWorkData.getClaimId()) //$NON-NLS-1$
.setInteger("Type", claimWorkData.getClaimWorkDataType().getIntValue()) //$NON-NLS-1$
.list();
for (WorkdatasBean rs : list) {
workDataId = rs.getId();
break;
}
} catch (HibernateException e) {
workDataId = -1;
}
}
/* 登録用の履歴IDを取得 */
int historyId = claimWorkData.getHistoryId();
/* 16はfor内の文字列の予想最大数(fieldId=3, workDataId=5) */
StringBuilder sql = new StringBuilder(128 + size * 16);
sql.append("MERGE INTO ").append(dbName); //$NON-NLS-1$
sql.append(" (FLD_ID, WORK_ID, REC_ID, HISTORY_ID, DATA) "); //$NON-NLS-1$
sql.append(" KEY (FLD_ID, WORK_ID, REC_ID, HISTORY_ID) VALUES "); //$NON-NLS-1$
for (int i = 0, j = 1; i < size; i++, j++) {
sql.append("(").append(fieldId).append(",").append(workDataId).append(", !!").append(String.valueOf(j)).append(", "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
j++;
sql.append(historyId).append(", '!!").append(String.valueOf(j)).append("' ),"); //$NON-NLS-1$ //$NON-NLS-2$
}
sql.deleteCharAt(sql.length() - 1);
// sql.append("INSERT INTO ").append(dbName); //$NON-NLS-1$
// sql.append(" (FLD_ID, WORK_ID, REC_ID, HISTORY_ID, DATA) VALUES "); //$NON-NLS-1$
// for (int i = 0, j = 1; i < size; i++, j++) {
// sql.append("(").append(fieldId).append(",").append(workDataId).append(", !!").append(String.valueOf(j)).append(", "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
// j++;
// sql.append(historyId).append(", '!!").append(String.valueOf(j)).append("' ),"); //$NON-NLS-1$ //$NON-NLS-2$
// }
// sql.deleteCharAt(sql.length() - 1);
// sql.append(" ON DUPLICATE KEY UPDATE DATA =VALUES(DATA);"); //$NON-NLS-1$
return sql.toString();
}
@Override
protected String setParamForCommit(String stmt, List<Data> datas) throws HibernateException {
int i = 1;
for (Data data : datas) {
stmt = stmt.replaceFirst("!!" + String.valueOf(i), String.valueOf(data.key)); //$NON-NLS-1$
stmt = stmt.replaceFirst("!!" + String.valueOf(i + 1), data.value); //$NON-NLS-1$
i = i + 2;
}
return stmt;
}
/**
* レコードIDと履歴IDを元に表示対象のデータ(DATA)を取得する
*
* @param key
* レコードID
* @param historyId
* 履歴ID
* @return 条件に一致するデータ
*/
public String get(Integer key, int historyId) {
try {
Session session = getConnection();
if (stmtForGet == null) {
String strSQL = prepareStatementForGet();
stmtForGet = strSQL;
}
String sqlExe = setParamForGet(stmtForGet, key, historyId);
@SuppressWarnings("unchecked")
List<Object[]> list = session.createSQLQuery(sqlExe).list();
if (list != null) {
if (list.size() > 0) {
String value = getResultDirect(list);
return value;
}
}
} catch (HibernateException e) {
System.err.println(e + ":" + key); //$NON-NLS-1$
}
return null;
}
/**
* キー一覧取得
*
* @param historyId
* 履歴ID
* @return 取得できなかった場合は、サイズ0のSet<Integer>が返る
*
*/
public Set<Integer> getKeys(int historyId) {
try {
/* コミット終了まで待つ */
while (committer != null) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
String strSQL = createStatementForGetKeys(historyId);
Session session = getConnection();
@SuppressWarnings("unchecked")
List<Object> list = session.createSQLQuery(strSQL).list();
if (list != null) {
keys = new HashSet<Integer>(10000);
for (Object rs : list) {
Object[] idArr = new Object[2];
idArr[0] = rs;
Integer key = getKey(idArr);
if (key != null) {
keys.add(key);
}
}
}
} catch (ClassCastException ex) {
ex.printStackTrace();
} catch (HibernateException e) {
e.printStackTrace();
keys = new HashSet<Integer>(0);
}
return keys;
}
}