package com.vci.server.query.service;
|
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.Map;
|
|
import org.hibernate.SQLQuery;
|
import org.hibernate.Session;
|
|
import com.vci.omd.constants.BusinessConstants;
|
import com.vci.omd.constants.LinkConstants;
|
import com.vci.server.base.exception.ExceptionLocalHandler;
|
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
|
import com.vci.server.base.utility.OmdHelper;
|
import com.vci.server.cache.OMCacheProvider;
|
import com.vci.server.query.parsers.Parser;
|
import com.vci.server.query.util.QTSqlUtil;
|
import com.vci.corba.omd.data.AttributeValue;
|
import com.vci.corba.omd.data.BusinessObject;
|
import com.vci.corba.omd.data.LinkObject;
|
import com.vci.corba.omd.ltm.LinkType;
|
import com.vci.corba.query.data.BOAndLO;
|
import com.vci.common.exception.VciExceptionTool;
|
import com.vci.common.qt.object.QTConstants;
|
import com.vci.common.qt.object.QueryTemplate;
|
import com.vci.common.qt.object.Version;
|
import com.vci.corba.common.VCIError;
|
|
/**
|
* 分段策略查询
|
* 当链接查询多个业务类型时, 为满足递归查询实行二次查询:第一次查询link表,第二次分段查询btm表
|
* @author zhouhui
|
*
|
*/
|
public class QueryObjectPartationStrategy{
|
|
private final int PARTIONSIZE = 500;
|
private static QueryObjectPartationStrategy queryObj = null;
|
|
private VCIError getLocalVciError(String key, Throwable e) {
|
VCIError error = new VCIError(key, new String[]{VciExceptionTool.getExceptionStr(e), VciExceptionTool.getExceptionDetail(e)});
|
VCIError rsError = ExceptionLocalHandler.getInstance().getLocalString(error, "PLMOQ");
|
return rsError;
|
}
|
|
public static QueryObjectPartationStrategy getInstance(){
|
if(queryObj == null){
|
queryObj = new QueryObjectPartationStrategy();
|
}
|
return queryObj;
|
}
|
/**
|
* 解析QueryTemplate 为sql
|
* 执行sql, 返回结果
|
* @param queryTemplate
|
* @return
|
* @throws Throwable
|
*/
|
public List<BusinessObject> findBtmObjects(QueryTemplate queryTemplate) throws Throwable{
|
List<String> clauseList = queryTemplate.getClauseList();
|
// 当clauseList中含有*时, 应当解析为BtmObject的全部属性
|
if (clauseList.contains("*") || queryTemplate.isQueryChildren()) {
|
clauseList = getAllAbNamesForBtm(queryTemplate.getBtmType());
|
}
|
queryTemplate.setClauseList(clauseList);
|
Parser parser = new Parser(queryTemplate);
|
String sql = parser.parseToSql();
|
List<BusinessObject> objList = executeSqlForBtm(clauseList, sql);
|
return objList;
|
}
|
|
/**
|
* @param clauseList
|
* @param sql
|
* @return
|
*/
|
private List<BusinessObject> executeSqlForBtm(List<String> clauseList, String sql){
|
List<BusinessObject> objList = new ArrayList<BusinessObject>();
|
Session session = HibernateSessionFactory.getSession();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
BusinessObject bo = new BusinessObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 再判断Object
|
// if((list.get(i)) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object obj_ = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(obj_ == null ? "" : obj_);
|
abArray[k] = ab;
|
}
|
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj_ = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj_ == null ? "" : obj_);
|
// abArray[0] = ab;
|
//
|
// }
|
|
bo.newAttrValList = new AttributeValue[0];
|
bo.hisAttrValList = abArray;
|
//为btm的系统属性赋值
|
int k = 0;
|
bo.oid = abArray[k++].attrVal;
|
bo.revisionid = abArray[k++].attrVal;
|
bo.nameoid = abArray[k++].attrVal;
|
bo.btName = abArray[k++].attrVal;
|
bo.isLastR = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isFirstR = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isLastV = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isFirstV = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.creator = abArray[k++].attrVal;
|
bo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
bo.modifier = abArray[k++].attrVal;
|
bo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
bo.revisionRule = abArray[k++].attrVal;
|
bo.versionRule = abArray[k++].attrVal;
|
bo.revisionSeq = Short.parseShort(abArray[k++].attrVal);
|
bo.revisionValue = abArray[k++].attrVal;
|
bo.versionSeq = Short.parseShort(abArray[k++].attrVal);
|
bo.versionValue = abArray[k++].attrVal;
|
bo.lctId = abArray[k++].attrVal;
|
bo.lcStatus = abArray[k++].attrVal;
|
bo.ts = Integer.valueOf(abArray[k++].attrVal);
|
bo.id = abArray[k++].attrVal;
|
bo.name = abArray[k++].attrVal;
|
bo.description = abArray[k++].attrVal;
|
bo.owner = abArray[k++].attrVal;
|
// bo.checkinBy = abArray[k++].attrVal;
|
// bo.checkinTime = abArray[k++].attrVal;
|
// bo.checkoutBy = abArray[k++].attrVal;
|
// bo.checkoutTime = abArray[k++].attrVal;
|
bo.fromVersion = abArray[k++].attrVal;
|
objList.add(bo);
|
}
|
return objList;
|
}
|
|
/**
|
* Map<String, BusinessObject>
|
* key:
|
* 最新版本最新版次:nameOId
|
* 当前版本最新版次:revisonOId
|
* 其他: OId
|
* @param clauseList
|
* @param sql
|
* @return
|
*/
|
public Map<String, BusinessObject> executeSqlForBtmLRLV(List<String> clauseList, String sql){
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Session session = HibernateSessionFactory.getSession();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
BusinessObject bo = new BusinessObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 再判断Object
|
// if((list.get(i)) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object obj_ = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(obj_ == null ? "" : obj_);
|
abArray[k] = ab;
|
}
|
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj_ = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj_ == null ? "" : obj_);
|
// abArray[0] = ab;
|
//
|
// }
|
|
bo.newAttrValList = new AttributeValue[0];
|
bo.hisAttrValList = abArray;
|
//为btm的系统属性赋值
|
int k = 0;
|
bo.oid = abArray[k++].attrVal;
|
bo.revisionid = abArray[k++].attrVal;
|
bo.nameoid = abArray[k++].attrVal;
|
bo.btName = abArray[k++].attrVal;
|
bo.isLastR = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isFirstR = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isLastV = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isFirstV = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.creator = abArray[k++].attrVal;
|
bo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
bo.modifier = abArray[k++].attrVal;
|
bo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
bo.revisionRule = abArray[k++].attrVal;
|
bo.versionRule = abArray[k++].attrVal;
|
bo.revisionSeq = Short.parseShort(abArray[k++].attrVal);
|
bo.revisionValue = abArray[k++].attrVal;
|
bo.versionSeq = Short.parseShort(abArray[k++].attrVal);
|
bo.versionValue = abArray[k++].attrVal;
|
bo.lctId = abArray[k++].attrVal;
|
bo.lcStatus = abArray[k++].attrVal;
|
bo.ts = Integer.valueOf(abArray[k++].attrVal);
|
bo.id = abArray[k++].attrVal;
|
bo.name = abArray[k++].attrVal;
|
bo.description = abArray[k++].attrVal;
|
bo.owner = abArray[k++].attrVal;
|
// bo.checkinBy = abArray[k++].attrVal;
|
// bo.checkinTime = abArray[k++].attrVal;
|
// bo.checkoutBy = abArray[k++].attrVal;
|
// bo.checkoutTime = abArray[k++].attrVal;
|
bo.fromVersion = abArray[k++].attrVal;
|
|
bos.put(bo.nameoid, bo);
|
|
}
|
return bos;
|
}
|
|
/**
|
* Map<String, BusinessObject>
|
* key:
|
* 最新版本最新版次:nameOId
|
* 当前版本最新版次:revisonOId
|
* 其他: OId
|
* @param clauseList
|
* @param sql
|
* @return
|
*/
|
public Map<String, BusinessObject> executeSqlForBtmCRLV(List<String> clauseList, String sql){
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Session session = HibernateSessionFactory.getSession();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
BusinessObject bo = new BusinessObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 再判断Object
|
// if((list.get(i)) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object obj_ = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(obj_ == null ? "" : obj_);
|
abArray[k] = ab;
|
}
|
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj_ = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj_ == null ? "" : obj_);
|
// abArray[0] = ab;
|
//
|
// }
|
|
bo.newAttrValList = new AttributeValue[0];
|
bo.hisAttrValList = abArray;
|
//为btm的系统属性赋值
|
int k = 0;
|
bo.oid = abArray[k++].attrVal;
|
bo.revisionid = abArray[k++].attrVal;
|
bo.nameoid = abArray[k++].attrVal;
|
bo.btName = abArray[k++].attrVal;
|
bo.isLastR = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isFirstR = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isLastV = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isFirstV = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.creator = abArray[k++].attrVal;
|
bo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
bo.modifier = abArray[k++].attrVal;
|
bo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
bo.revisionRule = abArray[k++].attrVal;
|
bo.versionRule = abArray[k++].attrVal;
|
bo.revisionSeq = Short.parseShort(abArray[k++].attrVal);
|
bo.revisionValue = abArray[k++].attrVal;
|
bo.versionSeq = Short.parseShort(abArray[k++].attrVal);
|
bo.versionValue = abArray[k++].attrVal;
|
bo.lctId = abArray[k++].attrVal;
|
bo.lcStatus = abArray[k++].attrVal;
|
bo.ts = Integer.valueOf(abArray[k++].attrVal);
|
bo.id = abArray[k++].attrVal;
|
bo.name = abArray[k++].attrVal;
|
bo.description = abArray[k++].attrVal;
|
bo.owner = abArray[k++].attrVal;
|
// bo.checkinBy = abArray[k++].attrVal;
|
// bo.checkinTime = abArray[k++].attrVal;
|
// bo.checkoutBy = abArray[k++].attrVal;
|
// bo.checkoutTime = abArray[k++].attrVal;
|
bo.fromVersion = abArray[k++].attrVal;
|
|
bos.put(bo.revisionid, bo);
|
}
|
return bos;
|
}
|
|
/**
|
* 仅仅查询OID, REVISIONOID, NAMEOID
|
* Map<String, BusinessObject>
|
* key:
|
* 最新版本最新版次:nameOId
|
* 当前版本最新版次:revisonOId
|
* 其他: OId
|
* @param clauseList
|
* @param sql
|
* @return
|
*/
|
private Map<String, BusinessObject> executeSqlForBtmOIDS(String sql, int version){
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Session session = HibernateSessionFactory.getSession();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
List<?> list = sqlquery.list();
|
if(version == Version.currentRevLastVer){
|
for(int i = 0; i < list.size(); i++){
|
Object[] o = (Object[]) list.get(i);
|
BusinessObject bo = new BusinessObject();
|
bo.oid = (String) o[0];
|
bo.revisionid = (String) o[1];
|
bo.nameoid = (String) o[2];
|
bos.put(bo.revisionid, bo);
|
}
|
}else if(version == Version.lastRevLastVer){
|
for(int i = 0; i < list.size(); i++){
|
Object[] o = (Object[]) list.get(i);
|
BusinessObject bo = new BusinessObject();
|
bo.oid = (String) o[0];
|
bo.revisionid = (String) o[1];
|
bo.nameoid = (String) o[2];
|
bos.put(bo.nameoid, bo);
|
}
|
}else{
|
for(int i = 0; i < list.size(); i++){
|
Object[] o = (Object[]) list.get(i);
|
BusinessObject bo = new BusinessObject();
|
bo.oid = (String) o[0];
|
bo.revisionid = (String) o[1];
|
bo.nameoid = (String) o[2];
|
bos.put(bo.oid, bo);
|
}
|
}
|
|
return bos;
|
}
|
|
/**
|
* Map<String, BusinessObject>
|
* key:
|
* 最新版本最新版次:nameOId
|
* 当前版本最新版次:revisonOId
|
* 其他: OId
|
* @param clauseList
|
* @param sql
|
* @return
|
*/
|
public Map<String, BusinessObject> executeSqlForBtmOtherRV(List<String> clauseList, String sql){
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Session session = HibernateSessionFactory.getSession();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
BusinessObject bo = new BusinessObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 再判断Object
|
// if((list.get(i)) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object obj_ = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(obj_ == null ? "" : obj_);
|
abArray[k] = ab;
|
}
|
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj_ = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj_ == null ? "" : obj_);
|
// abArray[0] = ab;
|
//
|
// }
|
|
bo.newAttrValList = new AttributeValue[0];
|
bo.hisAttrValList = abArray;
|
//为btm的系统属性赋值
|
int k = 0;
|
bo.oid = abArray[k++].attrVal;
|
bo.revisionid = abArray[k++].attrVal;
|
bo.nameoid = abArray[k++].attrVal;
|
bo.btName = abArray[k++].attrVal;
|
bo.isLastR = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isFirstR = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isLastV = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.isFirstV = Short.parseShort(abArray[k++].attrVal) != 0;
|
bo.creator = abArray[k++].attrVal;
|
bo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
bo.modifier = abArray[k++].attrVal;
|
bo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
bo.revisionRule = abArray[k++].attrVal;
|
bo.versionRule = abArray[k++].attrVal;
|
bo.revisionSeq = Short.parseShort(abArray[k++].attrVal);
|
bo.revisionValue = abArray[k++].attrVal;
|
bo.versionSeq = Short.parseShort(abArray[k++].attrVal);
|
bo.versionValue = abArray[k++].attrVal;
|
bo.lctId = abArray[k++].attrVal;
|
bo.lcStatus = abArray[k++].attrVal;
|
bo.ts = Integer.valueOf(abArray[k++].attrVal);
|
bo.id = abArray[k++].attrVal;
|
bo.name = abArray[k++].attrVal;
|
bo.description = abArray[k++].attrVal;
|
bo.owner = abArray[k++].attrVal;
|
// bo.checkinBy = abArray[k++].attrVal;
|
// bo.checkinTime = abArray[k++].attrVal;
|
// bo.checkoutBy = abArray[k++].attrVal;
|
// bo.checkoutTime = abArray[k++].attrVal;
|
bo.fromVersion = abArray[k++].attrVal;
|
|
bos.put(bo.oid, bo);
|
|
}
|
return bos;
|
}
|
|
/**
|
* 解析QueryTemplate 为sql
|
* 执行sql, 返回结果
|
* @param queryTemplate
|
* @return
|
* @throws VCIError
|
*/
|
public List<LinkObject> findLinkObject(QueryTemplate queryTemplate) throws Throwable{
|
List<String> clauseList = queryTemplate.getClauseList();
|
String ltName = queryTemplate.getLinkType();
|
String ltTableName = OmdHelper.getLTTableName(ltName);
|
String btmName = queryTemplate.getBtmType();
|
String btmTableName = OmdHelper.getBTTableName(btmName);
|
boolean btmFlag = false;
|
// if (clauseList.contains(ltTableName + ".*") || clauseList.contains("*")) {
|
clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName);
|
if(btmName != null && !btmName.equals("")){
|
btmFlag = true;
|
clauseList.add(btmTableName + ".OID AS OID2");
|
clauseList.add(btmTableName + ".REVISIONOID AS REVISIONOID2");
|
}
|
clauseList.add("CONNECT_BY_ISLEAF");
|
clauseList.add("LEVEL");
|
// }
|
queryTemplate.setClauseList(clauseList);
|
Parser parser = new Parser(queryTemplate);
|
String sql = parser.parseToSql();
|
List<LinkObject> objList = null;
|
if(btmFlag){
|
objList = executeSqlForLink(clauseList, sql, queryTemplate.getDirection(), ltName);
|
}else{
|
objList = executeSqlForLinkOnly(clauseList, sql, ltName);
|
}
|
return objList;
|
}
|
|
/**
|
* 查询链接类型
|
* 通过连接业务类型表, 替换btmOId, btmRevisionOId
|
* @param clauseList
|
* @param sql
|
* @param queryType
|
* @param direction
|
* @return
|
* @throws VCIError
|
*/
|
public List<LinkObject> executeSqlForLink(List<String> clauseList, String sql, String direction, String ltName) throws VCIError{
|
try{
|
Session session = HibernateSessionFactory.getSession();
|
List<LinkObject> objList = new ArrayList<LinkObject>();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
|
LinkObject lo = new LinkObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 在判断Object
|
// if(list.get(i) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object value = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
if(abName.contains(".")){
|
abName = abName.substring(abName.indexOf(".") + 1);
|
//abName: CONNECT_BY_ISLEAF --> _ISLEAF
|
}else if(abName.equals("CONNECT_BY_ISLEAF")){
|
abName = "_ISLEAF";
|
}else if(abName.equals("LEVEL")){
|
abName = "_LEVEL";
|
}
|
//只查询链接时, 没有direction
|
if(direction != null){
|
if(direction.equalsIgnoreCase(QTConstants.DIRECTION_POSITIVE)){
|
//正向查询(反向查询不用覆盖)
|
//查询出的to端的btm对象的OID和REVISIONOID,
|
//覆盖link对象中的t_OId 和 t_RevisionOId
|
if(abName.toUpperCase().equals("OID AS OID2") && k > 0){
|
abName = "t_OId";
|
}
|
if(abName.toUpperCase().equals("REVISIONOID AS REVISIONOID2") && k > 0){
|
abName = "t_RevisionOId";
|
}
|
}
|
}
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
abArray[k] = ab;
|
}
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// if(abName.contains(".")){
|
// abName = abName.substring(abName.indexOf(".") + 1);
|
// }
|
//只查询链接时, 没有direction
|
// if(direction != null){
|
// if(direction.equalsIgnoreCase(QTConstants.DIRECTION_POSITIVE)){
|
//正向查询(反向查询不用覆盖)
|
//查询出的to端的btm对象的OID和REVISIONOID,
|
//覆盖link对象中的t_OId 和 t_RevisionOId
|
// if(abName.toUpperCase().equals("OID AS OID2")){
|
// abName = "t_OId";
|
// }
|
// if(abName.toUpperCase().equals("REVISIONOID AS REVISIONOID2")){
|
// abName = "t_RevisionOId";
|
// }
|
// }
|
// }
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj == null ? "" : obj);
|
// abArray[0] = ab;
|
// }
|
//为link的系统属性赋值
|
int k = 0;
|
lo.oid = abArray[k++].attrVal;
|
lo.creator = abArray[k++].attrVal;
|
lo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.modifier = abArray[k++].attrVal;
|
lo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.fromOid = abArray[k++].attrVal;
|
lo.fromRevOid = abArray[k++].attrVal;
|
lo.fromNameOid = abArray[k++].attrVal;
|
lo.fromBTName = abArray[k++].attrVal;
|
lo.toOid = abArray[k++].attrVal;
|
lo.toRevOid = abArray[k++].attrVal;
|
lo.toNameOid = abArray[k++].attrVal;
|
lo.toBTName = abArray[k++].attrVal;
|
lo.ts = Integer.valueOf(abArray[k++].attrVal);
|
if(direction != null){
|
if(direction.equalsIgnoreCase(QTConstants.DIRECTION_OPPOSITE)){
|
//反向查询
|
//查询出的from端的btm对象的OID和REVISIONOID,
|
//覆盖link对象中的f_OId 和 f_RevisionOId
|
int flag = 0;
|
for(int m = abArray.length - 2; m > k; m--){
|
AttributeValue ab = abArray[m];
|
if(ab.attrName.equalsIgnoreCase("F_REVISIONOID")){
|
lo.fromRevOid = abArray[m].attrVal;
|
flag++;
|
}
|
if(ab.attrName.equalsIgnoreCase("F_OID")){
|
lo.fromOid = abArray[m].attrVal;
|
flag++;
|
}
|
|
if(flag == 2){
|
break;
|
}
|
}
|
|
}else if(direction.equalsIgnoreCase(QTConstants.DIRECTION_POSITIVE)){
|
//正向查询
|
//查询出的to端的btm对象的OID和REVISIONOID,
|
//覆盖link对象中的t_OId 和 t_RevisionOId
|
int flag = 0;
|
for(int m = abArray.length - 2; m > k; m--){
|
AttributeValue ab = abArray[m];
|
if(ab.attrName.equalsIgnoreCase("T_REVISIONOID")){
|
lo.toRevOid = abArray[m].attrVal;
|
flag++;
|
}
|
if(ab.attrName.equalsIgnoreCase("T_OID")){
|
lo.toOid = abArray[m].attrVal;
|
flag++;
|
}
|
|
if(flag == 2){
|
break;
|
}
|
}
|
}
|
}
|
lo.hisAttrValList = abArray;
|
lo.newAttrValList = new AttributeValue[0];
|
//目前系统属性没有ltName, 传参赋值
|
lo.ltName = ltName;
|
objList.add(lo);
|
}
|
return objList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00009", e);
|
}
|
|
}
|
|
/**
|
* 查询链接类型
|
* 只查询链接类型, 不需要替换btmOId, btmRevisionOId
|
* @param clauseList
|
* @param sql
|
* @param queryType
|
* @param direction
|
* @param ltName : 目前系统属性没有ltName
|
* @return
|
* @throws VCIError
|
*/
|
public List<LinkObject> executeSqlForLinkOnly(List<String> clauseList, String sql, String ltName) throws VCIError{
|
try{
|
Session session = HibernateSessionFactory.getSession();
|
List<LinkObject> objList = new ArrayList<LinkObject>();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
|
LinkObject lo = new LinkObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 在判断Object
|
// if(list.get(i) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object value = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
if(abName.contains(".")){
|
abName = abName.substring(abName.indexOf(".") + 1);
|
//abName: CONNECT_BY_ISLEAF --> _ISLEAF
|
}else if(abName.equals("CONNECT_BY_ISLEAF")){
|
abName = "_ISLEAF";
|
}else if(abName.equals("LEVEL")){
|
abName = "_LEVEL";
|
}
|
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
abArray[k] = ab;
|
}
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// if(abName.contains(".")){
|
// abName = abName.substring(abName.indexOf(".") + 1);
|
// }
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj == null ? "" : obj);
|
// abArray[0] = ab;
|
// }
|
//为link的系统属性赋值
|
int k = 0;
|
lo.oid = abArray[k++].attrVal;
|
lo.creator = abArray[k++].attrVal;
|
lo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.modifier = abArray[k++].attrVal;
|
lo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.fromOid = abArray[k++].attrVal;
|
lo.fromRevOid = abArray[k++].attrVal;
|
lo.fromNameOid = abArray[k++].attrVal;
|
lo.fromBTName = abArray[k++].attrVal;
|
lo.toOid = abArray[k++].attrVal;
|
lo.toRevOid = abArray[k++].attrVal;
|
lo.toNameOid = abArray[k++].attrVal;
|
lo.toBTName = abArray[k++].attrVal;
|
lo.ts = Integer.valueOf(abArray[k++].attrVal);
|
lo.hisAttrValList = abArray;
|
lo.newAttrValList = new AttributeValue[0];
|
//目前系统属性没有ltName, 传参赋值
|
lo.ltName = ltName;
|
objList.add(lo);
|
}
|
return objList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00009", e);
|
}
|
|
}
|
|
/**
|
* 查询链接类型
|
* 用Map替换btmOId, btmRevisionOId
|
* 只有正向查询的Version.currentRevLastVer, Version.lastRevLastVer情况下调到
|
* @param clauseList
|
* @param sql
|
* @param queryType
|
* @return
|
* @throws VCIError
|
*/
|
public List<LinkObject> executeSqlForLinkLRLV(List<String> clauseList, String sql, Map<String, BusinessObject> bos, String ltName) throws VCIError{
|
try{
|
Session session = HibernateSessionFactory.getSession();
|
List<LinkObject> objList = new ArrayList<LinkObject>();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
|
LinkObject lo = new LinkObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 在判断Object
|
// if(list.get(i) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object value = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
if(abName.contains(".")){
|
abName = abName.substring(abName.indexOf(".") + 1);
|
//abName: CONNECT_BY_ISLEAF --> _ISLEAF
|
}else if(abName.equals("CONNECT_BY_ISLEAF")){
|
abName = "_ISLEAF";
|
}else if(abName.equals("LEVEL")){
|
abName = "_LEVEL";
|
}
|
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
abArray[k] = ab;
|
}
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// if(abName.contains(".")){
|
// abName = abName.substring(abName.indexOf(".") + 1);
|
// }
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj == null ? "" : obj);
|
// abArray[0] = ab;
|
// }
|
//为link的系统属性赋值
|
int k = 0;
|
lo.oid = abArray[k++].attrVal;
|
lo.creator = abArray[k++].attrVal;
|
lo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.modifier = abArray[k++].attrVal;
|
lo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.fromOid = abArray[k++].attrVal;
|
lo.fromRevOid = abArray[k++].attrVal;
|
lo.fromNameOid = abArray[k++].attrVal;
|
lo.fromBTName = abArray[k++].attrVal;
|
lo.toOid = abArray[k++].attrVal;
|
lo.toRevOid = abArray[k++].attrVal;
|
lo.toNameOid = abArray[k++].attrVal;
|
lo.toBTName = abArray[k++].attrVal;
|
lo.ts = Integer.valueOf(abArray[k++].attrVal);
|
lo.hisAttrValList = abArray;
|
lo.newAttrValList = new AttributeValue[0];
|
|
//目前系统属性没有ltName, 传参赋值
|
lo.ltName = ltName;
|
|
//lastRevLastVer
|
BusinessObject bo = bos.get(lo.toNameOid);
|
if(bo != null){
|
lo.toOid = bo.oid;
|
lo.toRevOid = bo.revisionid;
|
objList.add(lo);
|
}
|
}
|
return objList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00009", e);
|
}
|
|
}
|
|
/**
|
* 查询链接类型
|
* 用Map替换btmOId, btmRevisionOId
|
* 只有正向查询的Version.currentRevLastVer, Version.lastRevLastVer情况下调到
|
* @param clauseList
|
* @param sql
|
* @param queryType
|
* @return
|
* @throws VCIError
|
*/
|
public List<LinkObject> executeSqlForLinkCRLV(List<String> clauseList, String sql, Map<String, BusinessObject> bos, String ltName) throws VCIError{
|
try{
|
Session session = HibernateSessionFactory.getSession();
|
List<LinkObject> objList = new ArrayList<LinkObject>();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
|
LinkObject lo = new LinkObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 在判断Object
|
// if(list.get(i) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object value = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
if(abName.contains(".")){
|
abName = abName.substring(abName.indexOf(".") + 1);
|
//abName: CONNECT_BY_ISLEAF --> _ISLEAF
|
}else if(abName.equals("CONNECT_BY_ISLEAF")){
|
abName = "_ISLEAF";
|
}else if(abName.equals("LEVEL")){
|
abName = "_LEVEL";
|
}
|
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
abArray[k] = ab;
|
}
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// if(abName.contains(".")){
|
// abName = abName.substring(abName.indexOf(".") + 1);
|
// }
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj == null ? "" : obj);
|
// abArray[0] = ab;
|
// }
|
//为link的系统属性赋值
|
int k = 0;
|
lo.oid = abArray[k++].attrVal;
|
lo.creator = abArray[k++].attrVal;
|
lo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.modifier = abArray[k++].attrVal;
|
lo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.fromOid = abArray[k++].attrVal;
|
lo.fromRevOid = abArray[k++].attrVal;
|
lo.fromNameOid = abArray[k++].attrVal;
|
lo.fromBTName = abArray[k++].attrVal;
|
lo.toOid = abArray[k++].attrVal;
|
lo.toRevOid = abArray[k++].attrVal;
|
lo.toNameOid = abArray[k++].attrVal;
|
lo.toBTName = abArray[k++].attrVal;
|
lo.ts = Integer.valueOf(abArray[k++].attrVal);
|
lo.hisAttrValList = abArray;
|
lo.newAttrValList = new AttributeValue[0];
|
//目前系统属性没有ltName, 传参赋值
|
lo.ltName = ltName;
|
|
//currentRevLastVer
|
BusinessObject bo = bos.get(lo.toRevOid);
|
if(bo != null){
|
lo.toOid = bo.oid;
|
objList.add(lo);
|
}
|
}
|
return objList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00009", e);
|
}
|
|
}
|
|
/**
|
* 获取业务类型全部属性, 包括系统属性和属性池属性
|
* @param btmName
|
* @return
|
* @throws Throwable
|
*/
|
private List<String> getAllAbNamesForBtm(String btmName) throws Throwable{
|
try{
|
List<String> abList = new ArrayList<String>();
|
String[] sysAbs = BusinessConstants.SELECT_CONSTANTS;
|
for(int i = 0; i < sysAbs.length; i++){
|
abList.add(sysAbs[i]);
|
}
|
//String[] abs = ServerServiceProvider.getOMDService().getBTMService().getBtmApNameArray(btmName);
|
String[] abs = OMCacheProvider.getBTAttributes(btmName);
|
for(int i = 0; i < abs.length; i++){
|
abList.add(abs[i]);
|
}
|
return abList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw e;
|
}
|
}
|
|
/**
|
* 获取链接类型全部属性, 包括系统属性和属性池属性
|
* @param ltName
|
* @return
|
* @throws Throwable
|
*/
|
private List<String> getAllAbNamesForLink(String ltName) throws Throwable{
|
try{
|
List<String> abList = new ArrayList<String>();
|
String[] sysAbs = LinkConstants.SELECT_CONSTANTS;
|
for(int i = 0; i < sysAbs.length; i++){
|
abList.add(sysAbs[i]);
|
}
|
//LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);
|
LinkType linkType = OMCacheProvider.getLinkType(ltName);
|
String[] abs = linkType.attributes;
|
for(int i = 0; i < abs.length; i++){
|
abList.add(abs[i]);
|
}
|
return abList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw e;
|
}
|
}
|
|
/**
|
* 根据查询模板获取linkObject 和 关联的businessObject
|
* @param qt
|
* @return
|
* @throws Throwable
|
*/
|
public List<BOAndLO> findBOAndLOList(QueryTemplate qt) throws Throwable {
|
try{
|
List<BOAndLO> blList = new ArrayList<BOAndLO>();
|
List<String> clauseList = qt.getClauseList();
|
String ltName = qt.getLinkType();
|
String ltTableName = OmdHelper.getLTTableName(ltName);
|
String btmName = qt.getBtmType();
|
// if (clauseList.contains(ltTableName + ".*") || clauseList.contains("*")) {
|
clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName);
|
clauseList.add("CONNECT_BY_ISLEAF");
|
clauseList.add("LEVEL");
|
clauseList.addAll(getAllBtmFiledsWithAlias(btmName));
|
// }
|
qt.setClauseList(clauseList);
|
//查询结果
|
Parser p = new Parser(qt);
|
String sql = p.parseToSql();
|
Session session = HibernateSessionFactory.getSession();
|
List<?> list = session.createSQLQuery(sql).list();
|
|
//获取link和btm的全部属性
|
List<String> ltAbNames = getAllAbNamesForLink(ltName);
|
List<String> btmAbNames = getAllAbNamesForBtm(btmName);
|
|
//封装BOANDLO对象
|
for(int i = 0; i < list.size(); i++){
|
BOAndLO bl = new BOAndLO();
|
bl.btmName = btmName;
|
bl.ltName = ltName;
|
Object o = list.get(i);
|
// if(o instanceof Object[]){
|
Object[] obj = (Object[])o;
|
//取值封装LinkObject
|
LinkObject lo = new LinkObject();
|
AttributeValue[] ltAbArray = new AttributeValue[ltAbNames.size() + 2];
|
for(int k = 0; k < ltAbNames.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
ab.attrName = ltAbNames.get(k);
|
Object value = obj[k];
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
ltAbArray[k] = ab;
|
}
|
|
//_ISLEAF属性赋值
|
AttributeValue isleafAb = new AttributeValue();
|
isleafAb.attrName = "_ISLEAF";
|
Object isleafVal = obj[ltAbNames.size()];
|
isleafAb.attrVal = String.valueOf(isleafVal == null ? "" : isleafVal);
|
ltAbArray[ltAbNames.size()] = isleafAb;
|
//_LEVEL属性赋值
|
AttributeValue levelAb = new AttributeValue();
|
levelAb.attrName = "_LEVEL";
|
Object levelVal = obj[ltAbNames.size() + 1];
|
levelAb.attrVal = String.valueOf(levelVal == null ? "" : levelVal);
|
ltAbArray[ltAbNames.size() + 1] = levelAb;
|
|
//为link的系统属性赋值
|
int k_ = 0;
|
lo.oid = ltAbArray[k_++].attrVal;
|
lo.creator = ltAbArray[k_++].attrVal;
|
lo.createTime = Integer.valueOf(ltAbArray[k_++].attrVal);
|
lo.modifier = ltAbArray[k_++].attrVal;
|
lo.modifyTime = Integer.valueOf(ltAbArray[k_++].attrVal);
|
lo.fromOid = ltAbArray[k_++].attrVal;
|
lo.fromRevOid = ltAbArray[k_++].attrVal;
|
lo.fromNameOid = ltAbArray[k_++].attrVal;
|
lo.fromBTName = ltAbArray[k_++].attrVal;
|
lo.toOid = ltAbArray[k_++].attrVal;
|
lo.toRevOid = ltAbArray[k_++].attrVal;
|
lo.toNameOid = ltAbArray[k_++].attrVal;
|
lo.toBTName = ltAbArray[k_++].attrVal;
|
lo.ts = Integer.valueOf(ltAbArray[k_++].attrVal);
|
|
lo.hisAttrValList = ltAbArray;
|
lo.newAttrValList = new AttributeValue[0];
|
|
//目前系统属性没有ltName, 传参赋值
|
lo.ltName = ltName;
|
|
bl.lo = lo;
|
//取值封装btmObject
|
BusinessObject bo = new BusinessObject();
|
AttributeValue[] btmAbArray = new AttributeValue[btmAbNames.size()];
|
int ltAblength = ltAbNames.size();
|
for(int k = 0; k < btmAbNames.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
ab.attrName = btmAbNames.get(k);
|
//+2为CONNECT_BY_ISLEAF, LEVEL
|
Object value = obj[k + ltAblength + 2];
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
btmAbArray[k] = ab;
|
}
|
//为Btm的系统属性赋值
|
bo.hisAttrValList = btmAbArray;
|
bo.newAttrValList = new AttributeValue[0];
|
int k = 0;
|
bo.oid = btmAbArray[k++].attrVal;
|
bo.revisionid = btmAbArray[k++].attrVal;
|
bo.nameoid = btmAbArray[k++].attrVal;
|
bo.btName = btmAbArray[k++].attrVal;
|
bo.modifyTime = Integer.valueOf(btmAbArray[k++].attrVal);
|
bo.isFirstR = Short.parseShort(btmAbArray[k++].attrVal) != 0;
|
bo.isLastV = Short.parseShort(btmAbArray[k++].attrVal) != 0;
|
bo.isFirstV = Short.parseShort(btmAbArray[k++].attrVal) != 0;
|
bo.creator = btmAbArray[k++].attrVal;
|
bo.createTime = Integer.valueOf(btmAbArray[k++].attrVal);
|
bo.modifier = btmAbArray[k++].attrVal;
|
bo.modifyTime = Integer.valueOf(btmAbArray[k++].attrVal);
|
bo.revisionRule = btmAbArray[k++].attrVal;
|
bo.versionRule = btmAbArray[k++].attrVal;
|
bo.revisionSeq = Short.parseShort(btmAbArray[k++].attrVal);
|
bo.revisionValue = btmAbArray[k++].attrVal;
|
bo.versionSeq = Short.parseShort(btmAbArray[k++].attrVal);
|
bo.versionValue = btmAbArray[k++].attrVal;
|
bo.lctId = btmAbArray[k++].attrVal;
|
bo.lcStatus = btmAbArray[k++].attrVal;
|
bo.ts = Integer.valueOf(btmAbArray[k++].attrVal);
|
bo.id = btmAbArray[k++].attrVal;
|
bo.name = btmAbArray[k++].attrVal;
|
bo.description = btmAbArray[k++].attrVal;
|
bo.owner = btmAbArray[k++].attrVal;
|
// bo.checkinBy = btmAbArray[k++].attrVal;
|
// bo.checkinTime = btmAbArray[k++].attrVal;
|
// bo.checkoutBy = btmAbArray[k++].attrVal;
|
// bo.checkoutTime = btmAbArray[k++].attrVal;
|
bo.fromVersion = btmAbArray[k++].attrVal;
|
bl.bo = bo;
|
// }else{
|
//因为全部查询,不是单独列的查询
|
// }
|
|
blList.add(bl);
|
}
|
return blList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw e;
|
}
|
|
}
|
|
/**
|
* 查询出链接对象, 根据版本版次条件拼接上业务对象
|
* @param clauseList
|
* @param sql
|
* @param queryType
|
* @return
|
* @throws VCIError
|
*/
|
public List<BOAndLO> findBOAndLOListLRLV(List<String> clauseList, String sql, Map<String, BusinessObject> bos) throws VCIError{
|
try{
|
Session session = HibernateSessionFactory.getSession();
|
List<BOAndLO> objList = new ArrayList<BOAndLO>();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
|
LinkObject lo = new LinkObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 在判断Object
|
// if(list.get(i) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object value = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
if(abName.contains(".")){
|
abName = abName.substring(abName.indexOf(".") + 1);
|
//abName: CONNECT_BY_ISLEAF --> _ISLEAF
|
}else if(abName.equals("CONNECT_BY_ISLEAF")){
|
abName = "_ISLEAF";
|
}else if(abName.equals("LEVEL")){
|
abName = "_LEVEL";
|
}
|
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
abArray[k] = ab;
|
}
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// if(abName.contains(".")){
|
// abName = abName.substring(abName.indexOf(".") + 1);
|
// }
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj == null ? "" : obj);
|
// abArray[0] = ab;
|
// }
|
//为link的系统属性赋值
|
int k = 0;
|
lo.oid = abArray[k++].attrVal;
|
lo.creator = abArray[k++].attrVal;
|
lo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.modifier = abArray[k++].attrVal;
|
lo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.fromOid = abArray[k++].attrVal;
|
lo.fromRevOid = abArray[k++].attrVal;
|
lo.fromNameOid = abArray[k++].attrVal;
|
lo.fromBTName = abArray[k++].attrVal;
|
lo.toOid = abArray[k++].attrVal;
|
lo.toRevOid = abArray[k++].attrVal;
|
lo.toNameOid = abArray[k++].attrVal;
|
lo.toBTName = abArray[k++].attrVal;
|
lo.ts = Integer.valueOf(abArray[k++].attrVal);
|
lo.hisAttrValList = abArray;
|
lo.newAttrValList = new AttributeValue[0];
|
|
BusinessObject bo = bos.get(lo.toNameOid);
|
if (bo != null) {
|
BOAndLO obj = new BOAndLO();
|
obj.bo = bo;
|
obj.btmName = bo.btName;
|
obj.lo = lo;
|
obj.ltName = lo.ltName;
|
objList.add(obj);
|
}
|
}
|
return objList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00009", e);
|
}
|
|
}
|
|
/**
|
* 查询出链接对象, 根据版本版次条件拼接上业务对象
|
* @param clauseList
|
* @param sql
|
* @param queryType
|
* @return
|
* @throws VCIError
|
*/
|
public List<BOAndLO> findBOAndLOListCRLV(List<String> clauseList, String sql, Map<String, BusinessObject> bos) throws VCIError{
|
try{
|
Session session = HibernateSessionFactory.getSession();
|
List<BOAndLO> objList = new ArrayList<BOAndLO>();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
|
LinkObject lo = new LinkObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 在判断Object
|
// if(list.get(i) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object value = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
if(abName.contains(".")){
|
abName = abName.substring(abName.indexOf(".") + 1);
|
//abName: CONNECT_BY_ISLEAF --> _ISLEAF
|
}else if(abName.equals("CONNECT_BY_ISLEAF")){
|
abName = "_ISLEAF";
|
}else if(abName.equals("LEVEL")){
|
abName = "_LEVEL";
|
}
|
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
abArray[k] = ab;
|
}
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// if(abName.contains(".")){
|
// abName = abName.substring(abName.indexOf(".") + 1);
|
// }
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj == null ? "" : obj);
|
// abArray[0] = ab;
|
// }
|
//为link的系统属性赋值
|
int k = 0;
|
lo.oid = abArray[k++].attrVal;
|
lo.creator = abArray[k++].attrVal;
|
lo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.modifier = abArray[k++].attrVal;
|
lo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.fromOid = abArray[k++].attrVal;
|
lo.fromRevOid = abArray[k++].attrVal;
|
lo.fromNameOid = abArray[k++].attrVal;
|
lo.fromBTName = abArray[k++].attrVal;
|
lo.toOid = abArray[k++].attrVal;
|
lo.toRevOid = abArray[k++].attrVal;
|
lo.toNameOid = abArray[k++].attrVal;
|
lo.toBTName = abArray[k++].attrVal;
|
lo.ts = Integer.valueOf(abArray[k++].attrVal);
|
lo.hisAttrValList = abArray;
|
lo.newAttrValList = new AttributeValue[0];
|
|
//currentRevLastVer
|
BusinessObject bo = bos.get(lo.toRevOid);
|
if (bo != null) {
|
BOAndLO obj = new BOAndLO();
|
obj.bo = bo;
|
obj.btmName = bo.btName;
|
obj.lo = lo;
|
obj.ltName = lo.ltName;
|
objList.add(obj);
|
}
|
}
|
return objList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00009", e);
|
}
|
|
}
|
|
/**
|
* 查询出链接对象, 根据版本版次条件拼接上业务对象
|
* @param clauseList
|
* @param sql
|
* @param queryType
|
* @return
|
* @throws VCIError
|
*/
|
public List<BOAndLO> findBOAndLOListOpposite(List<String> clauseList, String sql, Map<String, BusinessObject> bos) throws VCIError{
|
try{
|
Session session = HibernateSessionFactory.getSession();
|
List<BOAndLO> objList = new ArrayList<BOAndLO>();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
|
LinkObject lo = new LinkObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 在判断Object
|
// if(list.get(i) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object value = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
if(abName.contains(".")){
|
abName = abName.substring(abName.indexOf(".") + 1);
|
//abName: CONNECT_BY_ISLEAF --> _ISLEAF
|
}else if(abName.equals("CONNECT_BY_ISLEAF")){
|
abName = "_ISLEAF";
|
}else if(abName.equals("LEVEL")){
|
abName = "_LEVEL";
|
}
|
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
abArray[k] = ab;
|
}
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// if(abName.contains(".")){
|
// abName = abName.substring(abName.indexOf(".") + 1);
|
// }
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj == null ? "" : obj);
|
// abArray[0] = ab;
|
// }
|
//为link的系统属性赋值
|
int k = 0;
|
lo.oid = abArray[k++].attrVal;
|
lo.creator = abArray[k++].attrVal;
|
lo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.modifier = abArray[k++].attrVal;
|
lo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.fromOid = abArray[k++].attrVal;
|
lo.fromRevOid = abArray[k++].attrVal;
|
lo.fromNameOid = abArray[k++].attrVal;
|
lo.fromBTName = abArray[k++].attrVal;
|
lo.toOid = abArray[k++].attrVal;
|
lo.toRevOid = abArray[k++].attrVal;
|
lo.toNameOid = abArray[k++].attrVal;
|
lo.toBTName = abArray[k++].attrVal;
|
lo.ts = Integer.valueOf(abArray[k++].attrVal);
|
lo.hisAttrValList = abArray;
|
lo.newAttrValList = new AttributeValue[0];
|
|
BusinessObject bo = null;
|
bo = bos.get(lo.fromOid);
|
if (bo != null) {
|
BOAndLO obj = new BOAndLO();
|
obj.bo = bo;
|
obj.btmName = bo.btName;
|
obj.lo = lo;
|
obj.ltName = lo.ltName;
|
objList.add(obj);
|
}
|
}
|
return objList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00009", e);
|
}
|
|
}
|
|
/**
|
* 查询出链接对象, 根据版本版次条件拼接上业务对象
|
* @param clauseList
|
* @param sql
|
* @param queryType
|
* @return
|
* @throws VCIError
|
*/
|
public List<BOAndLO> findBOAndLOListCRCV(List<String> clauseList, String sql, Map<String, BusinessObject> bos) throws VCIError{
|
try{
|
Session session = HibernateSessionFactory.getSession();
|
List<BOAndLO> objList = new ArrayList<BOAndLO>();
|
SQLQuery sqlquery = session.createSQLQuery(sql);
|
//根据查询模板中的查询列clauseList, 设置map
|
|
List<?> list = sqlquery.list();
|
for(int i = 0; i < list.size(); i++){
|
|
LinkObject lo = new LinkObject();
|
AttributeValue[] abArray = null;
|
//当list.get(i)中有多个Object时, 类型为Object[]
|
//必须先判断Object[] 在判断Object
|
// if(list.get(i) instanceof Object[]){
|
Object[] objs = (Object[])list.get(i);
|
abArray = new AttributeValue[clauseList.size()];
|
for(int k = 0; k < clauseList.size(); k++){
|
AttributeValue ab = new AttributeValue();
|
//sessin查询出的值
|
Object value = objs[k];
|
//clauseList中对应的查询列
|
String abName = clauseList.get(k);
|
if(abName.contains(".")){
|
abName = abName.substring(abName.indexOf(".") + 1);
|
//abName: CONNECT_BY_ISLEAF --> _ISLEAF
|
}else if(abName.equals("CONNECT_BY_ISLEAF")){
|
abName = "_ISLEAF";
|
}else if(abName.equals("LEVEL")){
|
abName = "_LEVEL";
|
}
|
|
ab.attrName = abName;
|
ab.attrVal = String.valueOf(value == null ? "" : value);
|
abArray[k] = ab;
|
}
|
//当list.get(i)中只有一个Object时, 类型为Object
|
// }else{
|
//sessin查询出的值
|
// Object obj = list.get(i);
|
//clauseList中对应的查询列
|
// String abName = clauseList.get(0);
|
// if(abName.contains(".")){
|
// abName = abName.substring(abName.indexOf(".") + 1);
|
// }
|
// abArray = new AttributeValue[1];
|
// AttributeValue ab = new AttributeValue();
|
// ab.attrName = abName;
|
// ab.attrVal = String.valueOf(obj == null ? "" : obj);
|
// abArray[0] = ab;
|
// }
|
//为link的系统属性赋值
|
int k = 0;
|
lo.oid = abArray[k++].attrVal;
|
lo.creator = abArray[k++].attrVal;
|
lo.createTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.modifier = abArray[k++].attrVal;
|
lo.modifyTime = Integer.valueOf(abArray[k++].attrVal);
|
lo.fromOid = abArray[k++].attrVal;
|
lo.fromRevOid = abArray[k++].attrVal;
|
lo.fromNameOid = abArray[k++].attrVal;
|
lo.fromBTName = abArray[k++].attrVal;
|
lo.toOid = abArray[k++].attrVal;
|
lo.toRevOid = abArray[k++].attrVal;
|
lo.toNameOid = abArray[k++].attrVal;
|
lo.toBTName = abArray[k++].attrVal;
|
lo.ts = Integer.valueOf(abArray[k++].attrVal);
|
lo.hisAttrValList = abArray;
|
lo.newAttrValList = new AttributeValue[0];
|
|
BusinessObject bo = null;
|
bo = bos.get(lo.toOid);
|
if (bo != null) {
|
BOAndLO obj = new BOAndLO();
|
obj.bo = bo;
|
obj.btmName = bo.btName;
|
obj.lo = lo;
|
obj.ltName = lo.ltName;
|
objList.add(obj);
|
}
|
}
|
return objList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00009", e);
|
}
|
|
}
|
|
/**
|
* 将业务类型的全部属性加上别名返回,用作查询列。
|
* 解决Hiberbate的覆盖同名查询列的值的问题。
|
* btmTableName.abName as abName2
|
* 避免别名后标识符过长(超过30), oracle查询出错
|
* @param btmName
|
* @return
|
* @throws Throwable
|
*/
|
private List<String> getAllBtmFiledsWithAlias(String btmName) throws Throwable {
|
try{
|
List<String> list = new ArrayList<String>();
|
List<String> abList = new ArrayList<String>();
|
abList = getAllAbNamesForBtm(btmName);
|
String btmTableName = OmdHelper.getBTTableName(btmName);
|
for(int i = 0; i < abList.size(); i++){
|
String abName = abList.get(i).trim();
|
list.add(btmTableName + "." + abName + " AS " + abName + "2");
|
}
|
return list;
|
}catch(Throwable e){
|
throw e;
|
}
|
}
|
|
/**
|
* 将链接类型的全部属性加上表明返回, 用作查询列;
|
* 避免与业务类型做链接查询时, 出现列明不明确问题.
|
* tableName.ltName
|
* @param ltName
|
* @param tableName
|
* @return
|
* @throws Throwable
|
*/
|
private List<String> getAllLinkTypeFiledsWithTableName(String ltName ,String tableName) throws Throwable{
|
try{
|
List<String> abList = new ArrayList<String>();
|
String[] sysAbs = LinkConstants.SELECT_CONSTANTS;
|
for(int i = 0; i < sysAbs.length; i++){
|
abList.add(tableName + "." + sysAbs[i]);
|
}
|
//LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);
|
LinkType linkType = OMCacheProvider.getLinkType(ltName);
|
String[] abs = linkType.attributes;
|
for(int i = 0; i < abs.length; i++){
|
abList.add(tableName + "." + abs[i].trim());
|
}
|
return abList;
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw e;
|
}
|
}
|
|
//**************************************分段策略来实现递归查询**********************************************
|
|
public List<LinkObject> findLinkObjectByPartion(QueryTemplate qt) throws Throwable{
|
List<String> clauseList = qt.getClauseList();
|
String ltName = qt.getLinkType();
|
String ltTableName = OmdHelper.getLTTableName(ltName);
|
clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName);
|
clauseList.add("CONNECT_BY_ISLEAF");
|
clauseList.add("LEVEL");
|
qt.setClauseList(clauseList);
|
Parser parser = new Parser(qt);
|
String sql = parser.getLinkQuerySql();
|
|
List<LinkObject> los = null;
|
|
int version = qt.getVersion();
|
//Version.currentRevLastVer, Version.lastRevLastVer需要替换版本版次
|
los = executeSqlForLinkOnly(clauseList, sql, ltName);
|
int recReturnMode = qt.getRecReturnMode();
|
//对查询结果进行过滤
|
if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){
|
los = filterLos(los);
|
}
|
if(version == Version.currentRevLastVer){
|
Map<String, BusinessObject> boMap = getBoOIDSByPartionCRLV(qt, los);
|
return replaceLink(los, boMap, version);
|
}else if(version == Version.lastRevLastVer){
|
Map<String, BusinessObject> boMap = getBoOIDSByPartionLRLV(qt, los);
|
return replaceLink(los, boMap, version);
|
//currentRevCurrentVer 虽不需要替换版本版次, 但有bo条件时需要用bo过滤lo
|
}else{
|
//String btmConditionSql = qt.getCondition().getBtmConditionSql(qt, true);
|
String btmConditionSql = QTSqlUtil.getBtmConditionSql(qt, true);
|
if(btmConditionSql != null && !btmConditionSql.equals("")){
|
Map<String, BusinessObject> boMap = getBoOIDSByPartionOtherRV(qt, los, version);
|
return replaceLink(los, boMap, version);
|
}else{
|
return los;
|
}
|
}
|
}
|
|
/**
|
* 按不同类型的revisionOid分组查询获取Map<revisionOid, BusinessObject>
|
* 当同一个类型中的revisionOid数量大于PARTIONSIZE时, 按照PARTIONSIZE分批查询
|
* @return
|
* @throws Throwable
|
*/
|
public Map<String, BusinessObject> getBosByPartionCRLV(QueryTemplate qt, List<LinkObject> los) throws Throwable{
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Map<String, List<String>> map = new HashMap<String, List<String>>();
|
LinkObject lo = null;
|
// revisionOid按照类型分组
|
for (int i = 0; i < los.size(); i++) {
|
lo = los.get(i);
|
String key = lo.toBTName;
|
String value = lo.toRevOid;
|
List<String> list = map.get(key);
|
if (list == null) {
|
list = new ArrayList<String>();
|
map.put(key, list);
|
}
|
if (!list.contains(value)) {
|
list.add(value);
|
}
|
}
|
|
//按不同类型的revisionOid分组查询
|
for(Iterator<String> ite = map.keySet().iterator(); ite.hasNext();){
|
String btmName = ite.next();
|
List<String> revisionOidList = map.get(btmName);
|
List<String> clauseList = getAllAbNamesForBtm(btmName);
|
qt.setClauseList(clauseList);
|
qt.setBtmType(btmName);
|
Parser parser = new Parser(qt);
|
String sql_ = parser.getBtmQuerySql();
|
sql_ += " and REVISIONOID IN (";
|
int size = revisionOidList.size();
|
StringBuilder stb = null;
|
for(int k = 0; k < size/PARTIONSIZE + 1; k++){
|
stb = new StringBuilder(sql_);
|
for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){
|
stb.append("'");
|
stb.append(revisionOidList.get(m));
|
stb.append("'");
|
stb.append(",");
|
}
|
String sql = stb.substring(0, stb.lastIndexOf(",")) + ")";
|
bos.putAll(executeSqlForBtmCRLV(clauseList, sql));
|
}
|
}
|
return bos;
|
}
|
|
public Map<String, BusinessObject> getBosByPartionLRLV(QueryTemplate qt, List<LinkObject> los) throws Throwable{
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Map<String, List<String>> map = new HashMap<String, List<String>>();
|
LinkObject lo = null;
|
// NameOid按照类型分组
|
for (int i = 0; i < los.size(); i++) {
|
lo = los.get(i);
|
String key = lo.toBTName;
|
String value = lo.toNameOid;
|
List<String> list = map.get(key);
|
if (list == null) {
|
list = new ArrayList<String>();
|
map.put(key, list);
|
}
|
if (!list.contains(value)) {
|
list.add(value);
|
}
|
}
|
|
//按不同类型的NameOid分组查询
|
for(Iterator<String> ite = map.keySet().iterator(); ite.hasNext();){
|
String btmName = ite.next();
|
List<String> nameOidList = map.get(btmName);
|
List<String> clauseList = getAllAbNamesForBtm(btmName);
|
qt.setClauseList(clauseList);
|
qt.setBtmType(btmName);
|
Parser parser = new Parser(qt);
|
String sql_ = parser.getBtmQuerySql();
|
sql_ += " and NAMEOID IN (";
|
int size = nameOidList.size();
|
StringBuilder stb = null;
|
for(int k = 0; k < size/PARTIONSIZE + 1; k++){
|
stb = new StringBuilder(sql_);
|
for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){
|
stb.append("'");
|
stb.append(nameOidList.get(m));
|
stb.append("'");
|
stb.append(",");
|
}
|
String sql = stb.substring(0, stb.lastIndexOf(",")) + ")";
|
bos.putAll(executeSqlForBtmLRLV(clauseList, sql));
|
}
|
}
|
return bos;
|
}
|
|
public Map<String, BusinessObject> getBosByPartionOtherRV(QueryTemplate qt, List<LinkObject> los, int version) throws Throwable{
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Map<String, List<String>> map = new HashMap<String, List<String>>();
|
LinkObject lo = null;
|
// Oid按照类型分组
|
if(version == Version.currentRevCurrentVer){
|
for (int i = 0; i < los.size(); i++) {
|
lo = los.get(i);
|
String key = lo.toBTName;
|
String value = lo.toOid;
|
List<String> list = map.get(key);
|
if (list == null) {
|
list = new ArrayList<String>();
|
map.put(key, list);
|
}
|
if (!list.contains(value)) {
|
list.add(value);
|
}
|
}
|
}else{
|
for (int i = 0; i < los.size(); i++) {
|
lo = los.get(i);
|
String key = lo.fromBTName;
|
String value = lo.fromOid;
|
List<String> list = map.get(key);
|
if (list == null) {
|
list = new ArrayList<String>();
|
map.put(key, list);
|
}
|
if (!list.contains(value)) {
|
list.add(value);
|
}
|
}
|
}
|
|
|
//按不同类型的Oid分组查询
|
for(Iterator<String> ite = map.keySet().iterator(); ite.hasNext();){
|
String btmName = ite.next();
|
List<String> nameOidList = map.get(btmName);
|
List<String> clauseList = getAllAbNamesForBtm(btmName);
|
qt.setClauseList(clauseList);
|
qt.setBtmType(btmName);
|
Parser parser = new Parser(qt);
|
String sql_ = parser.getBtmQuerySql();
|
sql_ += " and OID IN (";
|
int size = nameOidList.size();
|
StringBuilder stb = null;
|
for(int k = 0; k < size/PARTIONSIZE + 1; k++){
|
stb = new StringBuilder(sql_);
|
for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){
|
stb.append("'");
|
stb.append(nameOidList.get(m));
|
stb.append("'");
|
stb.append(",");
|
}
|
String sql = stb.substring(0, stb.lastIndexOf(",")) + ")";
|
bos.putAll(executeSqlForBtmOtherRV(clauseList, sql));
|
}
|
}
|
return bos;
|
}
|
|
/**
|
* 按不同类型的revisionOid分组查询获取Map<revisionOid, BusinessObject>
|
* 当同一个类型中的revisionOid数量大于PARTIONSIZE时, 按照PARTIONSIZE分批查询
|
* @return
|
* @throws Throwable
|
*/
|
public Map<String, BusinessObject> getBoOIDSByPartionCRLV(QueryTemplate qt, List<LinkObject> los) throws Throwable{
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Map<String, List<String>> map = new HashMap<String, List<String>>();
|
LinkObject lo = null;
|
// revisionOid按照类型分组
|
for (int i = 0; i < los.size(); i++) {
|
lo = los.get(i);
|
String key = lo.toBTName;
|
String value = lo.toRevOid;
|
List<String> list = map.get(key);
|
if (list == null) {
|
list = new ArrayList<String>();
|
map.put(key, list);
|
}
|
if (!list.contains(value)) {
|
list.add(value);
|
}
|
}
|
|
//按不同类型的revisionOid分组查询
|
for(Iterator<String> ite = map.keySet().iterator(); ite.hasNext();){
|
String btmName = ite.next();
|
List<String> revisionOidList = map.get(btmName);
|
List<String> clauseList = new ArrayList<String>();
|
clauseList.add("OID");
|
clauseList.add("REVISIONOID");
|
clauseList.add("NAMEOID");
|
qt.setClauseList(clauseList);
|
qt.setBtmType(btmName);
|
Parser parser = new Parser(qt);
|
String sql_ = parser.getBtmQuerySql();
|
sql_ += " and REVISIONOID IN (";
|
int size = revisionOidList.size();
|
StringBuilder stb = null;
|
for(int k = 0; k < size/PARTIONSIZE + 1; k++){
|
stb = new StringBuilder(sql_);
|
for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){
|
stb.append("'");
|
stb.append(revisionOidList.get(m));
|
stb.append("'");
|
stb.append(",");
|
}
|
String sql = stb.substring(0, stb.lastIndexOf(",")) + ")";
|
bos.putAll(executeSqlForBtmOIDS(sql, Version.currentRevLastVer));
|
}
|
}
|
return bos;
|
}
|
|
public Map<String, BusinessObject> getBoOIDSByPartionLRLV(QueryTemplate qt, List<LinkObject> los) throws Throwable{
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Map<String, List<String>> map = new HashMap<String, List<String>>();
|
LinkObject lo = null;
|
// nameOid按照类型分组
|
for (int i = 0; i < los.size(); i++) {
|
lo = los.get(i);
|
String key = lo.toBTName;
|
String value = lo.toNameOid;
|
List<String> list = map.get(key);
|
if (list == null) {
|
list = new ArrayList<String>();
|
map.put(key, list);
|
}
|
if (!list.contains(value)) {
|
list.add(value);
|
}
|
}
|
|
//按不同类型的revisionOid分组查询
|
for(Iterator<String> ite = map.keySet().iterator(); ite.hasNext();){
|
String btmName = ite.next();
|
List<String> revisionOidList = map.get(btmName);
|
List<String> clauseList = new ArrayList<String>();
|
clauseList.add("OID");
|
clauseList.add("REVISIONOID");
|
clauseList.add("NAMEOID");
|
qt.setClauseList(clauseList);
|
qt.setBtmType(btmName);
|
Parser parser = new Parser(qt);
|
String sql_ = parser.getBtmQuerySql();
|
sql_ += " and NAMEOID IN (";
|
int size = revisionOidList.size();
|
StringBuilder stb = null;
|
for(int k = 0; k < size/PARTIONSIZE + 1; k++){
|
stb = new StringBuilder(sql_);
|
for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){
|
stb.append("'");
|
stb.append(revisionOidList.get(m));
|
stb.append("'");
|
stb.append(",");
|
}
|
String sql = stb.substring(0, stb.lastIndexOf(",")) + ")";
|
bos.putAll(executeSqlForBtmOIDS(sql, Version.lastRevLastVer));
|
}
|
}
|
return bos;
|
}
|
|
public Map<String, BusinessObject> getBoOIDSByPartionOtherRV(QueryTemplate qt, List<LinkObject> los, int version) throws Throwable{
|
Map<String, BusinessObject> bos = new HashMap<String, BusinessObject>();
|
Map<String, List<String>> map = new HashMap<String, List<String>>();
|
LinkObject lo = null;
|
// Oid按照类型分组
|
if(version == Version.currentRevCurrentVer){
|
for (int i = 0; i < los.size(); i++) {
|
lo = los.get(i);
|
String key = lo.toBTName;
|
String value = lo.toOid;
|
List<String> list = map.get(key);
|
if (list == null) {
|
list = new ArrayList<String>();
|
map.put(key, list);
|
}
|
if (!list.contains(value)) {
|
list.add(value);
|
}
|
}
|
}else{
|
for (int i = 0; i < los.size(); i++) {
|
lo = los.get(i);
|
String key = lo.fromBTName;
|
String value = lo.fromOid;
|
List<String> list = map.get(key);
|
if (list == null) {
|
list = new ArrayList<String>();
|
map.put(key, list);
|
}
|
if (!list.contains(value)) {
|
list.add(value);
|
}
|
}
|
}
|
|
|
//按不同类型的Oid分组查询
|
for(Iterator<String> ite = map.keySet().iterator(); ite.hasNext();){
|
String btmName = ite.next();
|
List<String> revisionOidList = map.get(btmName);
|
List<String> clauseList = new ArrayList<String>();
|
clauseList.add("OID");
|
clauseList.add("REVISIONOID");
|
clauseList.add("NAMEOID");
|
qt.setClauseList(clauseList);
|
qt.setBtmType(btmName);
|
Parser parser = new Parser(qt);
|
String sql_ = parser.getBtmQuerySql();
|
sql_ += " and OID IN (";
|
int size = revisionOidList.size();
|
StringBuilder stb = null;
|
for(int k = 0; k < size/PARTIONSIZE + 1; k++){
|
stb = new StringBuilder(sql_);
|
for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){
|
stb.append("'");
|
stb.append(revisionOidList.get(m));
|
stb.append("'");
|
stb.append(",");
|
}
|
String sql = stb.substring(0, stb.lastIndexOf(",")) + ")";
|
bos.putAll(executeSqlForBtmOIDS(sql, version));
|
}
|
}
|
return bos;
|
}
|
|
/**
|
* 根据版本版次信息, 替换link的t_oid, t_RevisionOid
|
* 过滤lo
|
* @param los
|
* @param boMap
|
* @return
|
*/
|
private List<LinkObject> replaceLink(List<LinkObject> los,
|
Map<String, BusinessObject> boMap, int version) {
|
List<LinkObject> los_ = new ArrayList<LinkObject>();
|
if(version == Version.currentRevLastVer){
|
for(int i = 0; i < los.size(); i++){
|
LinkObject lo = los.get(i);
|
BusinessObject bo = boMap.get(lo.toRevOid);
|
if(bo != null){
|
lo.toOid = bo.oid;
|
los_.add(lo);
|
}
|
}
|
}else if(version == Version.lastRevLastVer){
|
for(int i = 0; i < los.size(); i++){
|
LinkObject lo = los.get(i);
|
BusinessObject bo = boMap.get(lo.toNameOid);
|
if(bo != null){
|
lo.toOid = bo.oid;
|
lo.toRevOid = bo.revisionid;
|
los_.add(lo);
|
}
|
}
|
}else if(version == Version.currentRevCurrentVer){
|
for(int i = 0; i < los.size(); i++){
|
LinkObject lo = los.get(i);
|
BusinessObject bo = boMap.get(lo.toOid);
|
if(bo != null){
|
los_.add(lo);
|
}
|
}
|
//反向
|
}else{
|
for(int i = 0; i < los.size(); i++){
|
LinkObject lo = los.get(i);
|
BusinessObject bo = boMap.get(lo.fromOid);
|
if(bo != null){
|
los_.add(lo);
|
}
|
}
|
}
|
|
return los_;
|
}
|
|
public List<BOAndLO> findBOAndLOByPartion(QueryTemplate qt) throws Throwable{
|
List<String> clauseList = qt.getClauseList();
|
String ltName = qt.getLinkType();
|
String ltTableName = OmdHelper.getLTTableName(ltName);
|
clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName);
|
clauseList.add("CONNECT_BY_ISLEAF");
|
clauseList.add("LEVEL");
|
qt.setClauseList(clauseList);
|
Parser parser = new Parser(qt);
|
String sql = parser.getLinkQuerySql();
|
|
List<LinkObject> los = executeSqlForLinkOnly(clauseList, sql, ltName);
|
|
int recReturnMode = qt.getRecReturnMode();
|
//对查询结果进行过滤
|
if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){
|
los = filterLos(los);
|
}
|
|
int version = qt.getVersion();
|
|
//查询业务对象 ---end---
|
if(version == Version.lastRevLastVer){
|
// los = findBOAndLOListLRLV(clauseList, sql, bos);
|
Map<String, BusinessObject> boMap = getBosByPartionLRLV(qt, los);
|
return combinationBOAndLO(los, boMap, version);
|
}else if(version == Version.currentRevLastVer){
|
Map<String, BusinessObject> boMap = getBosByPartionCRLV(qt, los);
|
return combinationBOAndLO(los, boMap, version);
|
}else{
|
// los = findBOAndLOListOpposite(clauseList, sql, bos);
|
Map<String, BusinessObject> boMap = getBosByPartionOtherRV(qt, los, version);
|
return combinationBOAndLO(los, boMap, version);
|
}
|
}
|
private List<BOAndLO> combinationBOAndLO(List<LinkObject> los,
|
Map<String, BusinessObject> boMap, int version) {
|
List<BOAndLO> list = new ArrayList<BOAndLO>();
|
if(version == Version.currentRevLastVer){
|
for(int i = 0; i < los.size(); i++){
|
LinkObject lo = los.get(i);
|
BusinessObject bo = boMap.get(lo.toRevOid);
|
if(bo != null){
|
BOAndLO obj = new BOAndLO();
|
obj.bo = bo;
|
obj.btmName = bo.btName;
|
obj.lo = lo;
|
obj.ltName = lo.ltName;
|
list.add(obj);
|
}
|
}
|
}else if(version == Version.lastRevLastVer){
|
for(int i = 0; i < los.size(); i++){
|
LinkObject lo = los.get(i);
|
BusinessObject bo = boMap.get(lo.toNameOid);
|
if(bo != null){
|
BOAndLO obj = new BOAndLO();
|
obj.bo = bo;
|
obj.btmName = bo.btName;
|
obj.lo = lo;
|
obj.ltName = lo.ltName;
|
list.add(obj);
|
}
|
}
|
}else if(version == Version.currentRevCurrentVer){
|
for(int i = 0; i < los.size(); i++){
|
LinkObject lo = los.get(i);
|
BusinessObject bo = boMap.get(lo.toOid);
|
if(bo != null){
|
BOAndLO obj = new BOAndLO();
|
obj.bo = bo;
|
obj.btmName = bo.btName;
|
obj.lo = lo;
|
obj.ltName = lo.ltName;
|
list.add(obj);
|
}
|
}
|
}else{
|
for(int i = 0; i < los.size(); i++){
|
LinkObject lo = los.get(i);
|
BusinessObject bo = boMap.get(lo.fromOid);
|
if(bo != null){
|
BOAndLO obj = new BOAndLO();
|
obj.bo = bo;
|
obj.btmName = bo.btName;
|
obj.lo = lo;
|
obj.ltName = lo.ltName;
|
list.add(obj);
|
}
|
}
|
}
|
|
return list;
|
}
|
|
/**
|
* 对查询结果进行过滤
|
* @param los
|
*/
|
public List<LinkObject> filterLos(List<LinkObject> los) {
|
List<LinkObject> list = new ArrayList<LinkObject>();
|
Map<String, String> map = new HashMap<String, String>();
|
for(LinkObject lo : los){
|
if(!map.containsKey(lo.oid)){
|
list.add(lo);
|
map.put(lo.oid, lo.oid);
|
}
|
}
|
return list;
|
}
|
|
/**
|
* 对查询结果进行过滤
|
* @param list
|
* @return
|
*/
|
public List<BOAndLO> filterLoAndBOs(List<BOAndLO> loAndBos) {
|
List<BOAndLO> list = new ArrayList<BOAndLO>();
|
Map<String, String> map = new HashMap<String, String>();
|
for(BOAndLO loAndBo : loAndBos){
|
if(!map.containsKey(loAndBo.lo.oid)){
|
list.add(loAndBo);
|
map.put(loAndBo.lo.oid, loAndBo.lo.oid);
|
}
|
}
|
return list;
|
}
|
}
|