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 boList = new ArrayList(); // 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 loList = new ArrayList(); // 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 list = new ArrayList(); 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 list = QueryObject.getInstance().findLinkObjectByTwiceQuery(qt); //在方法内查询完 lo查询bo之前进行过滤处理 List 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 list = new ArrayList(); 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 list = QueryObject.getInstance().findBOAndLOByTwiceQuery(qt); //查询完los在查询bos之前进行过滤 List list = QueryObjectPartationStrategy.getInstance().findBOAndLOByPartion(qt); return list.toArray(new BOAndLO[0]); } }else{ List 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 boList = new ArrayList(); QueryTemplate qt = new QueryTemplate(); qt.setType(QTConstants.TYPE_BTM); qt.setBtmType(typeName); List clauseList = new ArrayList(); 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; } }