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<String> 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<roleNames.length;i++){
|
rolesSb.append(roleNames[i]);
|
rolesSb.append(",");
|
}
|
if(roleNames.length > 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<OrderInfo> 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;
|
}
|
}
|