...
2.1 编写自定义系统函数类Process1000LimitOfIn
代码块 |
---|
language | java |
---|
title | Process1000LimitOfIn.java |
---|
collapse | true |
---|
|
package smartbi.freequery.expression.function; |
...
import smartbi.freequery.metadata.SQLPart; |
...
import smartbi.freequery.util.SQLPartType; |
...
import smartbi.util.StringUtil; |
...
public class Process1000LimitOfIn extends Function { |
...
...
public boolean checkParams() { |
...
...
...
else
return false;
}
@Override
public void execute() { |
...
String fieldName = params[0].getSqlStr().trim(); |
...
fieldName = trim(fieldName,"\""); |
...
fieldName = trim(fieldName,"'"); |
...
String fieldValue = params[1].getSqlStr().trim(); |
...
...
String[] fieldValueArray = fieldValue.split(sep); |
...
...
long count = Math.round(Math.ceil(((double)fieldValueArray.length)/size)); |
...
...
result.add(new SQLPart(SQLPartType.SQLSTR, fieldName + " in (" + fieldValue +")")); |
...
...
...
StringBuilder sqlSb = new StringBuilder(); |
...
...
for(int i =0; i<count; i++){ |
...
...
jLen = (jLen>fieldValueArray.length)?fieldValueArray.length:jLen; |
...
StringBuilder sb = new StringBuilder(); |
...
for(int j = i*size; j<jLen; j++){ |
...
sb.append(fieldValueArray[j]).append(sep); |
...
}
String sbStr = sb.toString(); |
...
...
...
}
sqlSb.append(fieldName + " in (" + sbStr.substring(0, sbStr.length()-sep.length())+")"); |
...
...
result.add(new SQLPart(SQLPartType.SQLSTR, sqlSb.toString())); |
...
}
private String trim(String srcStr, String toTrimStr){ |
...
if(StringUtil.isNullOrEmpty(srcStr)){ |
...
...
}
srcStr = srcStr.trim(); |
...
while(srcStr.startsWith(toTrimStr)){ |
...
srcStr = srcStr.substring(toTrimStr.length()); |
...
...
}
while(srcStr.endsWith(toTrimStr)){ |
...
srcStr = srcStr.substring(0, srcStr.length()-toTrimStr.length()); |
...
...
}
return srcStr;
}
@Override
public String getMDXValue() { |
...
...
2.2 编写升级类
该升级类的操作是向知识库t_restree(资源树)表中插入一条数据,父节点为catalog_string(字符串),资源类型为FUNCTION(函数)
该操作用于后面在资源树中新建同名的自定义函数 该操作用于后面在资源树中新建同名的自定义函数
代码块 |
---|
language | java |
---|
title | UpgradeTask_New.java |
---|
collapse | true |
---|
|
package smartbi.ext.function.upgrade; |
...
import java.sql.Connection; |
...
import java.sql.PreparedStatement; |
...
import java.sql.ResultSet; |
...
import java.sql.SQLException; |
...
import java.sql.Statement; |
...
import java.sql.Timestamp; |
...
import org.apache.log4j.Logger; |
...
import smartbi.repository.UpgradeTask; |
...
import smartbi.util.DBType; |
...
...
...
public class UpgradeTask_New extends UpgradeTask { |
...
...
private static final Logger LOG = Logger.getLogger(UpgradeTask_New.class); |
...
...
public boolean doUpgrade(Connection conn, DBType type) { |
...
PreparedStatement prep = null; |
...
...
Statement sta = conn.createStatement(); |
...
ResultSet rs = sta.executeQuery("select c_resid from t_restree where c_resid = 'func_Process1000LimitOfIn'"); |
...
...
prep = conn.prepareStatement("insert into t_restree(c_resid, c_resname, c_resalias, c_pid, c_restype, c_order, c_perm, c_resdesc, c_created, c_lastmodified) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); |
...
prep.setString(1, "func_Process1000LimitOfIn"); |
...
prep.setString(2, "Process1000LimitOfIn"); |
...
prep.setString(3, "Process1000LimitOfIn"); |
...
prep.setString(4, "catalog_string"); |
...
prep.setString(5, "FUNCTION"); |
...
...
prep.setString(7, "<Permissions inherited=\"YES\" role=\"ADMINS\"><Permission perm=\"READ\" descend=\"FOLDER_FILE\"/></Permissions>"); |
...
prep.setString(8, "处理多选树参数或下拉框参数超过1000时报错问题,如Process1000LimitOfIn(\"A\",下拉参数)。<br/> 参数1:要过滤的字段名(如 table1.A),如果是可视化查询直接拖字段,如果是原生sql,字段最好加英文双引号,如\"table1.A\";参数2:树参数或下拉框参数 <br/>返回值:每超过1000个值生成一个or(如(A in (a,b,c。。。) or A in (d,e,f。。。)) )"); |
...
prep.setTimestamp(9, new Timestamp(new java.util.Date().getTime())); |
...
prep.setTimestamp(10, new Timestamp(new java.util.Date().getTime())); |
...
...
...
...
...
...
} catch (SQLException e) { |
...
LOG.error("Upgrade UpgradeTask_New '" + this.getClass().getPackage().getName() + "' to " + getNewVersion() + " fail.", e); |
...
...
}
}
@Override
public String getNewVersion() { |
...
...
...