package com.vci.server.query.service;
|
|
import java.math.BigDecimal;
|
import java.text.DateFormat;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
import org.hibernate.SQLQuery;
|
import org.hibernate.Session;
|
|
import com.vci.corba.omd.btm.BtmItem;
|
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.ObjectQueryService;
|
import com.vci.corba.query.data.BOAndLO;
|
import com.vci.corba.query.data.KV;
|
import com.vci.server.base.exception.ExceptionLocalHandler;
|
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
|
import com.vci.server.base.utility.OQueryHelper;
|
import com.vci.server.base.utility.ServerServiceProvider;
|
import com.vci.server.cache.OMCacheProvider;
|
import com.vci.server.query.parsers.Parser;
|
import com.vci.server.query.util.QTSqlUtil;
|
import com.zeroc.Ice.Current;
|
import com.vci.common.exception.VciExceptionTool;
|
import com.vci.common.qt.object.Condition;
|
import com.vci.common.qt.object.QTConstants;
|
import com.vci.common.qt.object.QueryTemplate;
|
import com.vci.corba.common.VCIError;
|
|
/**
|
* 分段策略查询
|
* 当链接查询多个业务类型时, 为满足递归查询实行二次查询:第一次查询link表,第二次分段查询btm表
|
* @author zhouhui
|
*
|
*/
|
public abstract class QTServiceImplPartationStrategy implements ObjectQueryService{
|
private DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd");
|
private Date date = Calendar.getInstance().getTime();
|
|
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;
|
}
|
|
/**
|
* 根据查询模板名, 查询模板内容查询业务对象
|
*/
|
@Override
|
public BusinessObject[] findBTMObjects(String qtName, String qtText, Current current)
|
throws VCIError {
|
try {
|
List<BusinessObject> boList = new ArrayList<BusinessObject>();
|
// Document doc = null;
|
// doc = DocumentHelper.parseText(qtText);
|
// if(doc == null){
|
// return boList.toArray(new BusinessObject[0]);
|
// }
|
QueryTemplate qt = OQueryHelper.getQTByQTText(qtName, qtText);
|
if(qt == null){
|
return boList.toArray(new BusinessObject[0]);
|
}
|
boList = QueryObjectService.getInstance().findBtmObjects(qt);
|
if(qt.isQueryChildren()){
|
//查询子类型
|
BtmItem[] btms = ServerServiceProvider.getOMDService().getBTMService().getChildrenBtms(qt.getBtmType());
|
for(int i = 0; i < btms.length; i++){
|
qt.setBtmType(btms[i].name);
|
boList.addAll(QueryObjectService.getInstance().findBtmObjects(qt));
|
}
|
}
|
return boList.toArray(new BusinessObject[0]);
|
} catch (Throwable e) {
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00001", e);
|
}
|
}
|
|
/**
|
* 根据查询模板名, 查询模板内容查询链接对象
|
*/
|
@Override
|
public LinkObject[] findLTObjects(String qtName, String qtText, Current current)
|
throws VCIError {
|
try {
|
List<LinkObject> loList = new ArrayList<LinkObject>();
|
// Document doc = null;
|
// doc = DocumentHelper.parseText(qtText);
|
// if(doc == null){
|
// return loList.toArray(new LinkObject[0]);
|
// }
|
QueryTemplate qt = OQueryHelper.getQTByQTText(qtName, qtText);
|
if(qt == null){
|
return loList.toArray(new LinkObject[0]);
|
}
|
String btmType = qt.getBtmType();
|
if(btmType != null && btmType.equals("*")){
|
String ltName = qt.getLinkType();
|
//LinkType lt = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);
|
LinkType lt = OMCacheProvider.getLinkType(ltName);
|
//当linkType的from或者to端的业务类型只有一个时,按现有方式处理
|
if(lt.btmItemsFrom.length < 2 || lt.btmItemsTo.length < 2){
|
String[] btmNames = null;
|
if(qt.getDirection().equals(QTConstants.DIRECTION_OPPOSITE)){
|
btmNames = lt.btmItemsFrom;
|
}else{
|
btmNames = lt.btmItemsTo;
|
}
|
List<LinkObject> list = new ArrayList<LinkObject>();
|
for(int i = 0; i < btmNames.length; i++){
|
qt.setBtmType(btmNames[i]);
|
list.addAll(QueryObjectService.getInstance().findLinkObject(qt));
|
}
|
int recReturnMode = qt.getRecReturnMode();
|
//对查询结果进行过滤
|
if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){
|
list = QueryObjectService.getInstance().filterLos(list);
|
}
|
return list.toArray(new LinkObject[0]);
|
//否则, 采用二次查询来处理
|
}else{
|
// List<LinkObject> list = QueryObject.getInstance().findLinkObjectByTwiceQuery(qt);
|
//在方法内查询完 lo查询bo之前进行过滤处理
|
List<LinkObject> list = QueryObjectPartationStrategy.getInstance().findLinkObjectByPartion(qt);
|
return list.toArray(new LinkObject[0]);
|
}
|
}else{
|
loList = QueryObjectService.getInstance().findLinkObject(qt);
|
int recReturnMode = qt.getRecReturnMode();
|
//对查询结果进行过滤
|
if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){
|
loList = QueryObjectService.getInstance().filterLos(loList);
|
}
|
}
|
return loList.toArray(new LinkObject[0]);
|
} catch (Throwable e) {
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00002", e);
|
}
|
}
|
|
|
/**
|
* 根据查询模板获取linkObject 和 关联的businessObject
|
*/
|
@Override
|
public BOAndLO[] getBOAndLOS(String qtName, String qtText, String btmOId, Current current) throws VCIError {
|
try{
|
// Document doc = DocumentHelper.parseText(qtText);
|
// if(doc == null){
|
// return new BOAndLO[0];
|
// }
|
QueryTemplate qt = OQueryHelper.getQTByQTText(qtName, qtText);
|
if(qt == null){
|
return new BOAndLO[0];
|
}
|
if(qt.getBtmType().equals("*")){
|
String ltName = qt.getLinkType();
|
//LinkType lt = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);
|
LinkType lt = OMCacheProvider.getLinkType(ltName);
|
//当linkType的form或者to端的业务类型只有一个时,按现有方式处理
|
if(lt.btmItemsFrom.length < 2 || lt.btmItemsTo.length < 2){
|
String[] btmNames = null;
|
if(qt.getDirection().equals(QTConstants.DIRECTION_OPPOSITE)){
|
btmNames = lt.btmItemsFrom;
|
}else{
|
btmNames = lt.btmItemsTo;
|
}
|
List<BOAndLO> list = new ArrayList<BOAndLO>();
|
for(int i = 0; i < btmNames.length; i++){
|
qt.setBtmType(btmNames[i]);
|
list.addAll(QueryObjectPartationStrategy.getInstance().findBOAndLOList(qt));
|
}
|
|
int recReturnMode = qt.getRecReturnMode();
|
//对查询结果进行过滤
|
if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){
|
list = QueryObjectService.getInstance().filterLoAndBOs(list);
|
}
|
return list.toArray(new BOAndLO[0]);
|
//否则, 二次查询处理
|
}else{
|
// List<BOAndLO> list = QueryObject.getInstance().findBOAndLOByTwiceQuery(qt);
|
//查询完los在查询bos之前进行过滤
|
List<BOAndLO> list = QueryObjectPartationStrategy.getInstance().findBOAndLOByPartion(qt);
|
return list.toArray(new BOAndLO[0]);
|
}
|
}else{
|
List<BOAndLO> list = QueryObjectPartationStrategy.getInstance().findBOAndLOList(qt);
|
|
int recReturnMode = qt.getRecReturnMode();
|
//对查询结果进行过滤
|
if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){
|
list = QueryObjectService.getInstance().filterLoAndBOs(list);
|
}
|
return list.toArray(new BOAndLO[0]);
|
}
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00007", e);
|
}
|
}
|
|
/**
|
* 根据业务类型名, 版本条件查询业务对象
|
* version: 0:所有版次; 1:当前版本当前版次; 2:当前版本最新版次; 3:最新版本最新版次.
|
*/
|
@Override
|
public BusinessObject[] findBTMObjectsByTypeNameAndVersion(String typeName,
|
short version, Current current) throws VCIError {
|
try{
|
List<BusinessObject> boList = new ArrayList<BusinessObject>();
|
QueryTemplate qt = new QueryTemplate();
|
qt.setType(QTConstants.TYPE_BTM);
|
qt.setBtmType(typeName);
|
List<String> clauseList = new ArrayList<String>();
|
clauseList.add("*");
|
qt.setClauseList(clauseList);
|
qt.setVersion(version);
|
boList = QueryObjectService.getInstance().findBtmObjects(qt);
|
|
|
return boList.toArray(new BusinessObject[0]);
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00010", e);
|
}
|
}
|
|
/**
|
* 根据查询模板名, 查询模板内容返回查询总数
|
*/
|
@Override
|
public long findTotalCount(String qtName, String qtText, Current current) throws VCIError {
|
try {
|
int totalCount = 0;
|
//Document doc = DocumentHelper.parseText(qtText);
|
QueryTemplate qt = OQueryHelper.getQTByQTText(qtName, qtText);
|
if(qt.getType().equals(QTConstants.TYPE_LINK) && qt.getBtmType().equals("*")){
|
String ltName = qt.getLinkType();
|
//LinkType lt = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);
|
LinkType lt = OMCacheProvider.getLinkType(ltName);
|
String[] btmNames = null;
|
if(qt.getDirection().equals(QTConstants.DIRECTION_OPPOSITE)){
|
btmNames = lt.btmItemsFrom;
|
}else{
|
btmNames = lt.btmItemsTo;
|
}
|
for(int i = 0; i < btmNames.length; i++){
|
qt.setBtmType(btmNames[i]);
|
StringBuilder sql = new StringBuilder();
|
sql.append("select count(*) from ");
|
|
Parser parser = new Parser(qt);
|
String queryType = parser.getQueryType();
|
sql.append(queryType);
|
sql.append(" where 1 = 1 ");
|
Condition condition = qt.getCondition();
|
if(condition != null){
|
sql.append("and ");
|
//sql.append(condition.getSql(qt, true));
|
sql.append(QTSqlUtil.getSql(qt, true));
|
}
|
sql.append(parser.getRevConstraint());
|
sql.append(parser.getVerConstraint());
|
if(parser.isRightSwitch() && qt.getType().equals(QTConstants.TYPE_BTM)){
|
if(qt.isRightFlag()){
|
sql.append(parser.getGrandRightSQL());
|
}
|
}
|
sql.append(parser.getSecretCheckSql());
|
|
Session session = HibernateSessionFactory.getSession();
|
SQLQuery sqlQuery = session.createSQLQuery(sql.toString());
|
List list = sqlQuery.list();
|
totalCount += ((BigDecimal)list.get(0)).intValue();
|
}
|
return totalCount;
|
}else{
|
StringBuilder sql = new StringBuilder();
|
sql.append("select count(*) from ");
|
|
Parser parser = new Parser(qt);
|
String queryType = parser.getQueryType();
|
sql.append(queryType);
|
sql.append(" where 1 = 1 ");
|
Condition condition = qt.getCondition();
|
if(condition != null){
|
sql.append("and ");
|
//sql.append(condition.getSql(qt, true));
|
sql.append(QTSqlUtil.getSql(qt, true));
|
}
|
sql.append(parser.getRevConstraint());
|
sql.append(parser.getVerConstraint());
|
if(parser.isRightSwitch() && qt.getType().equals(QTConstants.TYPE_BTM)){
|
if(qt.isRightFlag()){
|
sql.append(parser.getGrandRightSQL());
|
}
|
}
|
sql.append(parser.getSecretCheckSql());
|
|
Session session = HibernateSessionFactory.getSession();
|
SQLQuery sqlQuery = session.createSQLQuery(sql.toString());
|
List list = sqlQuery.list();
|
totalCount = ((BigDecimal)list.get(0)).intValue();
|
return totalCount;
|
}
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw getLocalVciError("P0010QT-00012", e);
|
}
|
|
}
|
|
@Override
|
public KV[][] queryBySql(String sql, Current current) throws VCIError {
|
// TODO Auto-generated method stub
|
return null;
|
}
|
|
}
|