package com.vci.server.query.parsers; import java.util.Collections; import java.util.List; import com.vci.common.qt.object.ComparatorOrderInfo; import com.vci.common.qt.object.Condition; import com.vci.common.qt.object.Connector; import com.vci.common.qt.object.Operator; import com.vci.common.qt.object.OrderInfo; import com.vci.common.qt.object.PageInfo; import com.vci.common.qt.object.QTConstants; import com.vci.common.qt.object.QueryTemplate; import com.vci.common.qt.object.Symbol; import com.vci.common.qt.object.Version; import com.vci.common.resource.CommonProperties; import com.vci.corba.framework.data.CheckValue; import com.vci.corba.common.VCIError; import com.vci.server.base.persistence.dao.HibernateSessionFactory; import com.vci.server.base.utility.OmdHelper; import com.vci.server.cache.ConfigCacheProvider; import com.vci.server.query.util.QTSqlUtil; import com.vci.server.query.util.SecretUtil; /** * * 将QueryTemplate定义的OQL解析为SQL并返回 * * @author Administrator * */ public class ParserPartationStrategy { private boolean addGrandRightFlag = true; /** * 是否增加授权SQL * @return */ public boolean isAddGrandRight() { return addGrandRightFlag; } /** * 是否增加授权SQL * @param addGrandRightFlag */ public void setAddGrandRightFlag(boolean addGrandRightFlag) { this.addGrandRightFlag = addGrandRightFlag; } private QueryTemplate queryTemplate = null; public ParserPartationStrategy(QueryTemplate queryTemplate){ this.queryTemplate = queryTemplate; } /** * 解析OQL为不同数据库对应的SQL * 数据库: Oracle, SQLServer * @return * @throws Throwable */ public String parseToSql(){ if(this.queryTemplate.getType().equals(QTConstants.TYPE_LINK)){ return parseToSqlForLink(); } StringBuilder sqlBu = new StringBuilder(""); sqlBu.append(Symbol.SELECT); sqlBu.append(Symbol.SPACE); sqlBu.append(getClauses()); sqlBu.append(Symbol.SPACE); sqlBu.append(Symbol.FROM); sqlBu.append(Symbol.SPACE); sqlBu.append(getQueryType()); sqlBu.append(Symbol.SPACE); sqlBu.append(Symbol.WHERE); sqlBu.append(Symbol.SPACE); sqlBu.append("1 = 1"); String conditionSql = null; Condition condi = queryTemplate.getCondition(); if(condi != null && condi.getCIMap().size() > 0){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); //conditionSql = queryTemplate.getCondition().getSql(queryTemplate, addGrandRightFlag); conditionSql = QTSqlUtil.getSql(queryTemplate, addGrandRightFlag); sqlBu.append(conditionSql); } //加上版本条件 sqlBu.append(getRevConstraint()); //加上版次条件 sqlBu.append(getVerConstraint()); String rightSwitch = CommonProperties.getStringProperty("right.switch"); if((rightSwitch != null && rightSwitch.equalsIgnoreCase("on")) && this.queryTemplate.getType().equals(QTConstants.TYPE_BTM)){ if(queryTemplate.isRightFlag()){ String additionalSQL = ""; if(addGrandRightFlag){ additionalSQL = getGrandRightSQL(); } sqlBu.append(additionalSQL); } } sqlBu.append(getSecretCheckSql()); sqlBu.append(getOrderSQL(queryTemplate.getOrderInfoList())); PageInfo pageInfo = queryTemplate.getPageInfo(); if(pageInfo != null){ String sql = page(sqlBu.toString(), queryTemplate.getPageInfo()); return sql; }else { return sqlBu.toString(); } } /** 用户密级校验和IP密级校验 */ public String getSecretCheckSql(){ StringBuffer sqlBu = new StringBuffer(); boolean isUserCheckOpen = ConfigCacheProvider.isUserSecurity();//isCheckOpen("userSecuritySwith"); if(isUserCheckOpen){ String userFilterSQL = getUserFilterSQL(); sqlBu.append(userFilterSQL); //用户密级校验开启才进行IP密集校验 boolean isIPCheckOpen = ConfigCacheProvider.isIpSecurity();//isCheckOpen("ipSecuritySwitch"); if(isIPCheckOpen){ String ipFilterSQL = getIPFilterSQL(); sqlBu.append(ipFilterSQL); } } return sqlBu.toString(); } // private boolean isCheckOpen(String keyName){ // UserEntityInfo userObj = new UserEntityInfo(); // // AppConfigDetailInfo userConfigDetail; // try { // userConfigDetail = ServerServiceProvider.getFrameService().getAppConfigDetailByKey(keyName, userObj); // if(userConfigDetail != null && "on".equals(userConfigDetail.value)){ // return true; // } // } catch (VCIError e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // return false; // } public String getUserFilterSQL() { String where = ""; CheckValue value = getCheckValue(); try { //where = ServerServiceProvider.getAuth2Service().checkUserSecret(value); where = new SecretUtil().checkUserSecret(value); } catch (VCIError e) { e.printStackTrace(); } return where; } public String getIPFilterSQL() { String where = ""; CheckValue value = getCheckValue(); try { //where = ServerServiceProvider.getAuth2Service().checkIPSecret(value); where = new SecretUtil().checkIPSecret(value); } catch (VCIError e) { e.printStackTrace(); } return where; } /** * 增加链接查询的解析sql方法 * 加入递归查询处理: * 根节点条件, 对子节点无效,即:start with [普通条件] + [版本版次条件] * 连接条件(子节点条件),对根节点无效, 即:connect by [普通条件 - f_oid/t_oid条件] + [版本版次条件] + (level <= level + 1) * 层次条件: where level <= n,当n = -1时不加层次限制 * 注:当只查询link类型时, 版本版次条件应为当前版本当前版次, 此时getRevConstraint(), getVerConstraint() 都为""; * @return */ private String parseToSqlForLink(){ StringBuilder sqlBu = new StringBuilder(""); sqlBu.append(Symbol.SELECT); sqlBu.append(Symbol.SPACE); sqlBu.append(getClauses()); sqlBu.append(Symbol.SPACE); sqlBu.append(Symbol.FROM); sqlBu.append(Symbol.SPACE); sqlBu.append(getQueryType()); sqlBu.append(Symbol.SPACE); String levelConstraint = getLevelConstraint(); if(!levelConstraint.equals("")){ sqlBu.append(Symbol.WHERE); sqlBu.append(Symbol.SPACE); sqlBu.append(levelConstraint); sqlBu.append(Symbol.SPACE); } sqlBu.append(Symbol.START); sqlBu.append(Symbol.SPACE); sqlBu.append(Symbol.WITH); sqlBu.append(Symbol.SPACE); sqlBu.append("1 = 1"); //start with [普通条件] + [版本版次条件] String conditionSql = null; Condition condi = queryTemplate.getCondition(); if(condi != null && condi.getCIMap().size() > 0){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); //conditionSql = queryTemplate.getCondition().getSql(queryTemplate, addGrandRightFlag); conditionSql = QTSqlUtil.getSql(queryTemplate, addGrandRightFlag); sqlBu.append(conditionSql); } //加上版本条件 sqlBu.append(getRevConstraint()); //加上版次条件 sqlBu.append(getVerConstraint()); //获取 connect by prior sqlBu.append(getConnectBy()); if(conditionSql != null && !conditionSql.equals("")){ //[普通条件 - f_oid/t_oid条件] conditionSql = conditionSql.replaceAll(".F_OID", ".f_oid"); conditionSql = conditionSql.replaceAll(".T_OID", ".t_oid"); if(this.queryTemplate.getDirection().equals(QTConstants.DIRECTION_POSITIVE)){ if(conditionSql.matches(".+.f_oid = '[a-zA-Z0-9-]+' and.+")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql.replaceAll("[a-zA-Z_]+.f_oid = '[a-zA-Z0-9-]+' and", "")); }else if(conditionSql.matches(".+and .+.f_oid = '[a-zA-Z0-9-]+'.+")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql.replaceAll("and [a-zA-Z_]+.f_oid = '[a-zA-Z0-9-]+'", "")); }else if(!conditionSql.contains(".f_oid")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql); } }else{ if(conditionSql.matches(".+.t_oid = '[a-zA-Z0-9-]+' and.+")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql.replaceAll("[a-zA-Z_]+.t_oid = '[a-zA-Z0-9-]+' and", "")); }else if(conditionSql.matches(".+and .+.t_oid = '[a-zA-Z0-9-]+'.+")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql.replaceAll("and [a-zA-Z_]+.t_oid = '[a-zA-Z0-9-]+'", "")); }else if(!conditionSql.contains(".t_oid")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql); } } } //[版本版次条件] //加上版本条件 sqlBu.append(getRevConstraint()); //加上版次条件 sqlBu.append(getVerConstraint()); //加上level <= level + 1 String connLevel = getConnectByLevelConstraint(); if(!connLevel.equals("")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(connLevel); } sqlBu.append(getOrderSQL(queryTemplate.getOrderInfoList())); PageInfo pageInfo = queryTemplate.getPageInfo(); if(pageInfo != null){ String sql = page(sqlBu.toString(), queryTemplate.getPageInfo()); return sql; }else { return sqlBu.toString(); } } /** * 获取链接查询模板的只查询链接对象的sql * @return */ public String getLinkQuerySql(){ StringBuilder sqlBu = new StringBuilder(""); sqlBu.append(Symbol.SELECT); sqlBu.append(Symbol.SPACE); sqlBu.append(getClauses()); sqlBu.append(Symbol.SPACE); sqlBu.append(Symbol.FROM); sqlBu.append(Symbol.SPACE); sqlBu.append(OmdHelper.getLTTableName(this.queryTemplate.getLinkType())); sqlBu.append(Symbol.SPACE); String levelConstraint = getLevelConstraint(); if(!levelConstraint.equals("")){ sqlBu.append(Symbol.WHERE); sqlBu.append(Symbol.SPACE); sqlBu.append(levelConstraint); sqlBu.append(Symbol.SPACE); } sqlBu.append(Symbol.START); sqlBu.append(Symbol.SPACE); sqlBu.append(Symbol.WITH); sqlBu.append(Symbol.SPACE); sqlBu.append("1 = 1"); //start with [普通条件] + [版本版次条件] String conditionSql = null; Condition condi = queryTemplate.getCondition(); if(condi != null && condi.getCIMap().size() > 0){ //conditionSql = queryTemplate.getCondition().getLinkConditionSql(queryTemplate, addGrandRightFlag); conditionSql = QTSqlUtil.getLinkConditionSql(queryTemplate, addGrandRightFlag); if(conditionSql != null && !conditionSql.equals("")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql); } } //获取 connect by prior sqlBu.append(getConnectBy()); if(conditionSql != null && !conditionSql.equals("")){ //[普通条件 - f_oid/t_oid条件] conditionSql = conditionSql.replaceAll(".F_OID", ".f_oid"); conditionSql = conditionSql.replaceAll(".T_OID", ".t_oid"); if(this.queryTemplate.getDirection().equals(QTConstants.DIRECTION_POSITIVE)){ if(conditionSql.matches(".+.f_oid = '[a-zA-Z0-9-]+' and.+")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql.replaceAll("[a-zA-Z_]+.f_oid = '[a-zA-Z0-9-]+' and", "")); }else if(conditionSql.matches(".+and .+.f_oid = '[a-zA-Z0-9-]+'.+")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql.replaceAll("and [a-zA-Z_]+.f_oid = '[a-zA-Z0-9-]+'", "")); //conditionSql 中只有f_oid/t_oid时不加入 }else if(!conditionSql.contains(".f_oid")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql); } }else{ if(conditionSql.matches(".+.t_oid = '[a-zA-Z0-9-]+' and.+")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql.replaceAll("[a-zA-Z_]+.t_oid = '[a-zA-Z0-9-]+' and", "")); }else if(conditionSql.matches(".+and .+.t_oid = '[a-zA-Z0-9-]+'.+")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql.replaceAll("and [a-zA-Z_]+.t_oid = '[a-zA-Z0-9-]+'", "")); //conditionSql 中只有f_oid/t_oid时不加入 }else if(!conditionSql.contains(".t_oid")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql); } } } //加上level <= level + 1 String connLevel = getConnectByLevelConstraint(); if(!connLevel.equals("")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(connLevel); } sqlBu.append(getOrderSQL(queryTemplate.getOrderInfoList())); PageInfo pageInfo = queryTemplate.getPageInfo(); if(pageInfo != null){ String sql = page(sqlBu.toString(), queryTemplate.getPageInfo()); return sql; }else { return sqlBu.toString(); } } /** * 获取链接查询模板的只查询业务对象的sql * @return */ public String getBtmQuerySql(){ StringBuilder sqlBu = new StringBuilder(""); sqlBu.append(Symbol.SELECT); sqlBu.append(Symbol.SPACE); sqlBu.append(getClauses()); sqlBu.append(Symbol.SPACE); sqlBu.append(Symbol.FROM); sqlBu.append(Symbol.SPACE); sqlBu.append(OmdHelper.getBTTableName(this.queryTemplate.getBtmType())); sqlBu.append(Symbol.SPACE); sqlBu.append(Symbol.WHERE); sqlBu.append(Symbol.SPACE); sqlBu.append("1 = 1"); String conditionSql = null; Condition condi = queryTemplate.getCondition(); if(condi != null && condi.getCIMap().size() > 0){ //conditionSql = queryTemplate.getCondition().getBtmConditionSql(queryTemplate, addGrandRightFlag); conditionSql = QTSqlUtil.getBtmConditionSql(queryTemplate, addGrandRightFlag); if(conditionSql != null && !conditionSql.equals("")){ sqlBu.append(Symbol.SPACE); sqlBu.append(Connector.AND); sqlBu.append(Symbol.SPACE); sqlBu.append(conditionSql); } } //加上版本条件 sqlBu.append(getRevConstraint()); //加上版次条件 sqlBu.append(getVerConstraint()); return sqlBu.toString(); } /** * 获取查询列 * 到查询列中包含*时, 覆盖其他查询列 * @return */ private String getClauses(){ StringBuilder clausesBu = new StringBuilder(""); List clauseList = queryTemplate.getClauseList(); for (int i = 0; i < clauseList.size(); i++) { clausesBu.append(clauseList.get(i)); if (i < clauseList.size() - 1) { clausesBu.append(","); } } return clausesBu.toString(); } /** * 获取版本约束 * @return */ public String getRevConstraint(){ int version = queryTemplate.getVersion(); StringBuilder strb = new StringBuilder(""); switch(version){ case Version.allVer: case Version.currentRevCurrentVer: case Version.currentRevLastVer: case Version.currentVer: case Version.currentRev: case Version.currentName: break; case Version.lastRevLastVer: strb.append(Symbol.SPACE); strb.append(Connector.AND); strb.append(Symbol.SPACE); strb.append("ISLastR"); strb.append(Symbol.SPACE); strb.append(Operator.EQUAL); strb.append(Symbol.SPACE); strb.append("'1'"); break; default: break; } return strb.toString(); } /** * 获取版次约束 * @return */ public String getVerConstraint(){ int version = queryTemplate.getVersion(); StringBuilder strb = new StringBuilder(""); switch(version){ case Version.allVer: case Version.currentRevCurrentVer: case Version.currentVer: case Version.currentRev: case Version.currentName: break; case Version.currentRevLastVer: case Version.lastRevLastVer: strb.append(Symbol.SPACE); strb.append(Connector.AND); strb.append(Symbol.SPACE); strb.append("ISLastV"); strb.append(Symbol.SPACE); strb.append(Operator.EQUAL); strb.append(Symbol.SPACE); strb.append("'1'"); break; default: break; } return strb.toString(); } /** * 获取递归层次约束 * @return */ private String getLevelConstraint(){ int level = this.queryTemplate.getLevel(); if(level < 0){ return ""; } StringBuilder stb = new StringBuilder(); stb.append(Symbol.LEVEL); stb.append(Symbol.SPACE); stb.append(Operator.LTE); stb.append(Symbol.SPACE); stb.append(level); return stb.toString(); } /** * 加强连接过滤条件, 提高效率 * connect by 递归层次约束 * level <= level + 1 * +1: 保证在表中是否是叶子节点的正确性 * @return */ private String getConnectByLevelConstraint(){ int level = this.queryTemplate.getLevel(); if(level < 0){ return ""; } StringBuilder stb = new StringBuilder(); stb.append(Symbol.LEVEL); stb.append(Symbol.SPACE); stb.append(Operator.LTE); stb.append(Symbol.SPACE); stb.append(level + 1); return stb.toString(); } /** * 根据版本版次信息, 选择oid, revisionOId, nameOId做连接,具体为: * 正向查询时, 最新版本最新版次:connect by prior t_nameOId = f_nameOId; * 当前版本最新版次:connect by prior t_revisionOId = f_revisionOId; * 当前版本当前版次:connect by prior t_OId = f_OId; * 反向查询时, 当前版次,当前版本,当前命名对象:connect by prior f_OId = t_OId; * @return */ private String getConnectBy(){ String direction = this.queryTemplate.getDirection(); StringBuilder stb = new StringBuilder(); stb.append(Symbol.SPACE); stb.append(Symbol.CONNECT); stb.append(Symbol.SPACE); stb.append(Symbol.BY); stb.append(Symbol.SPACE); stb.append(Symbol.NOCYCLE); stb.append(Symbol.SPACE); stb.append(Symbol.PRIOR); stb.append(Symbol.SPACE); int version = this.queryTemplate.getVersion(); if(direction.equals(QTConstants.DIRECTION_POSITIVE)){ if(version == Version.currentRevCurrentVer){ stb.append("T_OID = F_OID"); }else if(version == Version.currentRevLastVer){ stb.append("T_REVISIONOID = F_REVISIONOID"); //Version.lastRevLastVer }else{ stb.append("T_NAMEOID = F_NAMEOID"); } }else{ stb.append("F_OID = T_OID"); } return stb.toString(); } /** * 处理查询类型 * @return */ public String getQueryType(){ String type = queryTemplate.getType(); int version = queryTemplate.getVersion(); String linkType = queryTemplate.getLinkType(); String btmType = queryTemplate.getBtmType(); StringBuilder strb = new StringBuilder(""); //业务类型查询 if(type.equals(QTConstants.TYPE_BTM)){ String btmTable = OmdHelper.getBTTableName(btmType); strb.append(btmTable); //链接查询, 只查链接对象 }else if(type.equals(QTConstants.TYPE_LINK) && (btmType == null || btmType.equals(""))){ String ltTable = OmdHelper.getLTTableName(linkType); strb.append(ltTable); //链接查询, 既查链接对象又查链接的业务对象, 根据版本版次信息链接这两个表 }else{ String btmTable = OmdHelper.getBTTableName(btmType); String ltTable = OmdHelper.getLTTableName(linkType); switch(version){ case Version.currentRevCurrentVer: strb.append(ltTable); strb.append(Symbol.SPACE); strb.append(Symbol.JOIN); strb.append(Symbol.SPACE); strb.append(btmTable); strb.append(Symbol.SPACE); strb.append(Symbol.ON); strb.append(Symbol.SPACE); strb.append(ltTable + ".t_oid"); strb.append(Symbol.SPACE); strb.append(Operator.EQUAL); strb.append(Symbol.SPACE); strb.append(btmTable + ".oid"); break; case Version.currentRevLastVer: strb.append(ltTable); strb.append(Symbol.SPACE); strb.append(Symbol.JOIN); strb.append(Symbol.SPACE); strb.append(btmTable); strb.append(Symbol.SPACE); strb.append(Symbol.ON); strb.append(Symbol.SPACE); strb.append(ltTable + ".t_revisionoid"); strb.append(Symbol.SPACE); strb.append(Operator.EQUAL); strb.append(Symbol.SPACE); strb.append(btmTable + ".revisionoid"); break; case Version.allVer: case Version.lastRevLastVer: strb.append(ltTable); strb.append(Symbol.SPACE); strb.append(Symbol.JOIN); strb.append(Symbol.SPACE); strb.append(btmTable); strb.append(Symbol.SPACE); strb.append(Symbol.ON); strb.append(Symbol.SPACE); strb.append(ltTable + ".t_nameoid"); strb.append(Symbol.SPACE); strb.append(Operator.EQUAL); strb.append(Symbol.SPACE); strb.append(btmTable + ".nameoid"); break; case Version.currentVer: strb.append(ltTable); strb.append(Symbol.SPACE); strb.append(Symbol.JOIN); strb.append(Symbol.SPACE); strb.append(btmTable); strb.append(Symbol.SPACE); strb.append(Symbol.ON); strb.append(Symbol.SPACE); strb.append(ltTable + ".f_oid"); strb.append(Symbol.SPACE); strb.append(Operator.EQUAL); strb.append(Symbol.SPACE); strb.append(btmTable + ".oid"); break; case Version.currentRev: strb.append(ltTable); strb.append(Symbol.SPACE); strb.append(Symbol.JOIN); strb.append(Symbol.SPACE); strb.append(btmTable); strb.append(Symbol.SPACE); strb.append(Symbol.ON); strb.append(Symbol.SPACE); strb.append(ltTable + ".f_oid"); strb.append(Symbol.SPACE); strb.append(Operator.EQUAL); strb.append(Symbol.SPACE); strb.append(btmTable + ".oid"); break; case Version.currentName: strb.append(ltTable); strb.append(Symbol.SPACE); strb.append(Symbol.JOIN); strb.append(Symbol.SPACE); strb.append(btmTable); strb.append(Symbol.SPACE); strb.append(Symbol.ON); strb.append(Symbol.SPACE); strb.append(ltTable + ".f_oid"); strb.append(Symbol.SPACE); strb.append(Operator.EQUAL); strb.append(Symbol.SPACE); strb.append(btmTable + ".oid"); break; default: break; } } return strb.toString(); } /** * 将SQL包装成分页SQL * select * from (select A.*, rownum RN from ( sql ) A where rownum < endRow ) where RN >= startRow * @param sql * @param pageInfo * @return */ private String page(String sql, PageInfo pageInfo){ int startRow = (pageInfo.getPageNO() - 1) * pageInfo.getRowCount() + 1; int endRow = startRow + pageInfo.getRowCount(); StringBuilder strb = new StringBuilder(); strb.append("select * from (select A.* , rownum RN from ("); strb.append(sql); strb.append(") A where rownum < "); strb.append(endRow); strb.append(") where RN >= "); strb.append(startRow); return strb.toString(); } /** * 获取授权SQL * : 权限 * @param btmType * @return * @throws Throwable */ public String getGrandRightSQL(){ String where = ""; CheckValue value = getCheckValue(); try { //where = ServerServiceProvider.getAuth2Service().checkRight(value); where = new SecretUtil().checkRight(value); } catch (VCIError e) { e.printStackTrace(); } return where; } private CheckValue getCheckValue(){ CheckValue value = new CheckValue(); value.businesstype = queryTemplate.getBtmType(); value.opname = "query"; //TODO value.users = HibernateSessionFactory.getVciSessionInfo().userName; String[] roleNames = HibernateSessionFactory.getVciSessionInfo().roleNames; StringBuilder rolesSb = new StringBuilder(); for(int i=0;i 0){ value.roles = rolesSb.toString().substring(0, rolesSb.toString().lastIndexOf(",")); } String[] groupNames = HibernateSessionFactory.getVciSessionInfo().groupNames; if(groupNames.length > 0){ value.userGroups=groupNames[0]; } String[] params = HibernateSessionFactory.getVciSessionInfo().extAttribs; StringBuilder strb = new StringBuilder(); for(int i = 0; i < params.length; i++){ strb.append(params[i]); strb.append(","); } if(params.length > 0){ value.paramValues = strb.substring(0, strb.length() - 1); }else{ value.paramValues = ""; } return value; } /** * 获取排序条件 * @param orderInfoList * @return */ private Object getOrderSQL(List orderInfoList) { StringBuilder strb = new StringBuilder(); if(orderInfoList == null || orderInfoList.size() < 1){ return strb.toString(); } //根据orderInfo.level降排序 Collections.sort(orderInfoList, new ComparatorOrderInfo()); for(int i = 0; i < orderInfoList.size(); i++){ OrderInfo orderInfo = orderInfoList.get(i); if(orderInfo == null){ continue; } strb.append(" "); String field = orderInfo.getOrderField(); if(queryTemplate.getType().equals(QTConstants.TYPE_LINK)){ String btmType = queryTemplate.getBtmType(); if(field.startsWith("T_OID.") || field.startsWith("F_OID.")){ field = field.substring(6); String tableName = OmdHelper.getBTTableName(btmType); field = tableName + "." + field; } } strb.append(field); strb.append(" "); strb.append(orderInfo.getOrderMode()); strb.append(","); } //当strb不等于"" 时, 为其加上前缀ORDER BY String str = strb.toString(); if(!str.equals("")){ str = str.substring(0, str.length() - 1); return " order by" + str; } return str; } public QueryTemplate getQueryTemplate() { return queryTemplate; } public void setQueryTemplate(QueryTemplate queryTemplate) { this.queryTemplate = queryTemplate; } }