package jef.database.query; import java.util.IdentityHashMap; import java.util.Map; import jef.database.DbUtils; import jef.database.dialect.DatabaseDialect; import jef.database.jsqlparser.ColumnAliasApplier; import jef.database.jsqlparser.SqlFunctionlocalization; import jef.database.jsqlparser.parser.ParseException; import jef.database.jsqlparser.visitor.Expression; /** * 支持方言改写的表达式,需要解析 * @author jiyi * */ final class SelectExpression2 extends SelectExpression { private Map<DatabaseDialect,Expression> localExpressions=new IdentityHashMap<DatabaseDialect,Expression>(); private Expression defaultEx; public SelectExpression2(Expression defaultEx) { super(defaultEx.toString()); this.defaultEx = defaultEx; } public String getSelectItem(DatabaseDialect profile, String tableAlias,SqlContext context) { Expression localex=localExpressions.get(profile); if(localex==null){ localex=createLocalEx(profile); ColumnAliasApplier al=new ColumnAliasApplier(tableAlias,profile,context); localex.accept(al); } return localex.toString(); } private Expression createLocalEx(DatabaseDialect profile) { Expression result; if(defaultEx!=null){ result=defaultEx; defaultEx=null; }else{ try { result=DbUtils.parseExpression(super.text); } catch (ParseException e) { throw new IllegalArgumentException("Can not parser expression"+text); } } result.accept(new SqlFunctionlocalization(profile,null)); //TODO,无法检查存储过程 localExpressions.put(profile, result); return result; } }