package ameba.db.ebean.filter; import ameba.db.dsl.ExprArgTransformer; import ameba.db.dsl.QueryExprMeta; import ameba.db.dsl.QueryExprMeta.Val; import ameba.db.dsl.QuerySyntaxException; import ameba.db.dsl.Transformed; import ameba.db.ebean.filter.CommonExprTransformer.MapExpression; import ameba.i18n.Messages; import io.ebean.Expression; import org.apache.commons.lang3.ArrayUtils; /** * <p>CommonExprArgTransformer class.</p> * * @author icode * */ public class CommonExprArgTransformer implements ExprArgTransformer<Expression, EbeanExprInvoker> { private static final String[] OPT_STR_ARG = ArrayUtils.toArray( "phrase", "phrasePre", "opAnd", "opOr"); /** * {@inheritDoc} */ @Override public Transformed<Val<Expression>> transform(String field, String operator, Val<Expression> arg, int index, int count, EbeanExprInvoker invoker, QueryExprMeta parent) { switch (operator) { case "eq": case "ne": case "ieq": case "gt": case "ge": case "lt": case "le": case "startsWith": case "istartsWith": case "endsWith": case "iendsWith": case "contains": case "icontains": case "id": case "in": case "notIn": case "exists": case "notExists": if (count != 1) { throw new QuerySyntaxException(Messages.get("dsl.arguments.error0", operator)); } break; case "between": if (count != 2) { throw new QuerySyntaxException(Messages.get("dsl.arguments.error1", operator)); } break; case "filter": case "not": case "select": if (count < 1) { throw new QuerySyntaxException(Messages.get("dsl.arguments.error2", operator, ">", "1")); } break; case "option": String argStr = arg.string(); if (ArrayUtils.contains(OPT_STR_ARG, argStr)) { arg = Val.of(MapExpression.of(argStr, null)); } break; } return Transformed.succ(this, arg); } }