package jef.database.meta;
import java.util.Collections;
import java.util.List;
import jef.database.DbFunction;
import jef.database.jsqlparser.expression.Function;
import jef.database.jsqlparser.visitor.Expression;
import jef.database.query.function.NoArgSQLFunction;
import jef.database.query.function.SQLFunction;
import jef.tools.ArrayUtils;
/**
* 描述一个数据库的函数与标准函数的匹配程度
* @author jiyi
*
*/
public class FunctionMapping {
private DbFunction stardard;
private SQLFunction function;
private int match;
/**
* 如果是内部定义的通用函数返回true
* @return return true if it is a standard function.
*/
public boolean isStandard(){
return stardard!=null;
}
/**
* 返回参数个数。目前实际上此数据还未就绪,只能当无参数时返回0.
* @return return 0 if the function has no args.
*/
public int getArgCount(){
if(function instanceof NoArgSQLFunction){
return 0;
}
return 1;
}
public FunctionMapping(SQLFunction function, DbFunction stardard, int match) {
this.function = function;
this.stardard = stardard;
this.match = match;
}
public SQLFunction getFunction() {
return function;
}
public DbFunction getStardard() {
return stardard;
}
/**
* 1、数据库的函数已经实现了所需要的标准函数。无需任何更改
* 2、数据库的函数和标准函数参数含义(基本)一样,仅需变化一下名称,如 nvl -> ifnull
* 3、数据库的函数和标准函数差别较大,通过多个其他函数模拟实现。(参数一致)
* @see #MATCH_FULL
* @see #MATCH_NAME_CHANGE
* @see #MATCH_EMULATION
* @return
*/
public int getMatch() {
return match;
}
// public static final int MATCH_NONE=-1;
/**
* 完全匹配,SQL不用做任何修改
*/
public static final int MATCH_FULL=0;
/**
* 基本匹配,SQL的名称和 escape属性要修改
*/
public static final int MATCH_NAME_CHANGE=1; //
/**
* 兼容实现,整个function要替换为新的对象
*/
public static final int MATCH_EMULATION=2; //
public Expression rewrite(String name,Expression... args) {
if(getMatch()==FunctionMapping.MATCH_NAME_CHANGE){
Function function=new Function(name,args);
function.setName(getFunction().getName());//替换name
function.setEscaped(getFunction().needEscape()); //替换名称后一般不需要转义
return function;
}else if(getMatch()==FunctionMapping.MATCH_EMULATION){ //整体替换
SQLFunction sf=getFunction();
return sf.renderExpression(ArrayUtils.asList(args));
}else{
Function function=new Function(name,args);
function.setEscaped(getFunction().needEscape());
return function;
}
}
@SuppressWarnings("unchecked")
public void rewrite(Function function) {
if(getMatch()==FunctionMapping.MATCH_NAME_CHANGE){
function.setName(getFunction().getName());//替换name
function.setEscaped(getFunction().needEscape()); //替换名称后一般不需要转义
}else if(getMatch()==FunctionMapping.MATCH_EMULATION){ //整体替换
List<Expression> exps;
if(function.getParameters()!=null){
exps=function.getParameters().getExpressions();
}else{
exps=Collections.EMPTY_LIST;
}
SQLFunction sf=getFunction();
Expression s = sf.renderExpression(exps);
function.rewrite=s;
}else{
function.setEscaped(getFunction().needEscape());
}
}
public String[] requiresUserFunction() {
return function.requiresUserFunction();
}
}