package jef.database.query.function;
import java.util.LinkedList;
import java.util.List;
import jef.database.jsqlparser.expression.Function;
import jef.database.jsqlparser.expression.NullValue;
import jef.database.jsqlparser.expression.operators.relational.EqualsTo;
import jef.database.jsqlparser.visitor.Expression;
/**
* 用 if(expr1, expr2, expr3)的样式来模拟Oracle的decode函数。
* 该函数只在MySQL中支持
* @author jiyi
*
*/
public final class EmuDecodeWithIf extends BaseArgumentSqlFunction{
public String getName() {
return "decode";
}
public Expression renderExpression(List<Expression> arguments) {
LinkedList<Expression> copy=new LinkedList<Expression>(arguments);
Expression root=copy.removeFirst();
Expression ifFunc=wrapWithIf(root,copy);
return ifFunc;
}
private Expression wrapWithIf(Expression root, LinkedList<Expression> copy) {
if(copy.size()==1){
return copy.removeFirst();
}else if(copy.isEmpty()){
return NullValue.getInstance();
}
return new Function("if",toEqual(root,copy.removeFirst()),copy.removeFirst(),wrapWithIf(root,copy));
}
private Expression toEqual(Expression left, Expression right) {
return new EqualsTo(left,right);
}
}