public Expr visitPrecedenceEqualExpression()

in tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/HiveQLAnalyzer.java [682:757]


  public Expr visitPrecedenceEqualExpression(HiveQLParser.PrecedenceEqualExpressionContext ctx) {
    Expr current = null, left = null, right = null, min = null, max = null;
    OpType type = null;
    boolean isNot = false, isIn = false;
    for (int i = 0; i < ctx.getChildCount(); i++) {
      if (ctx.getChild(i) instanceof HiveQLParser.PrecedenceBitwiseOrExpressionContext) {
        if (i == 0) {
          left = visitPrecedenceBitwiseOrExpression((HiveQLParser.PrecedenceBitwiseOrExpressionContext) ctx.getChild(i));
        } else {
          right = visitPrecedenceBitwiseOrExpression((HiveQLParser.PrecedenceBitwiseOrExpressionContext) ctx.getChild(i));
        }
      } else if (ctx.getChild(i) instanceof HiveQLParser.ExpressionsContext) {
        right = visitExpressions((HiveQLParser.ExpressionsContext) ctx.getChild(i));
      } else if (ctx.getChild(i) instanceof TerminalNodeImpl) {
        int symbolType = ((TerminalNodeImpl) ctx.getChild(i)).getSymbol().getType();
        switch (symbolType) {
          case HiveQLLexer.KW_NOT:
            isNot = true;
            break;
          case HiveQLLexer.KW_IN:
            isIn = true;
            break;
          default:
            break;
        }
      } else if (ctx.getChild(i) instanceof HiveQLParser.PrecedenceEqualOperatorContext
          || ctx.getChild(i) instanceof HiveQLParser.PrecedenceEqualNegatableOperatorContext) {
        String keyword = ctx.getChild(i).getText().toUpperCase();

        if (keyword.equals(">")) {
          type = OpType.GreaterThan;
        } else if (keyword.equals("<=>")) {
          throw new RuntimeException("Unexpected operator : <=>");
        } else if (keyword.equals("=")) {
          type = OpType.Equals;
        } else if (keyword.equals("<=")) {
          type = OpType.LessThanOrEquals;
        } else if (keyword.equals("<")) {
          type = OpType.LessThan;
        } else if (keyword.equals(">=")) {
          type = OpType.GreaterThanOrEquals;
        } else if (keyword.equals("<>")) {
          type = OpType.NotEquals;
        } else if (keyword.equals("!=")) {
          type = OpType.NotEquals;
        } else if (keyword.equals("REGEXP")) {
          type = OpType.Regexp;
        } else if (keyword.equals("RLIKE")) {
          type = OpType.Regexp;
        } else if (keyword.equals("LIKE")) {
          type = OpType.LikePredicate;
        }
      }
    }

    if (type != null && right != null) {
      if (type.equals(OpType.LikePredicate)) {
        PatternMatchPredicate like = new PatternMatchPredicate(OpType.LikePredicate,
            isNot, left, right);
        current = like;
      } else if (type.equals(OpType.Regexp)) {
        PatternMatchPredicate regex = new PatternMatchPredicate(OpType.Regexp, isNot, left, right);
        current = regex;
      } else {
        BinaryOperator binaryOperator = new BinaryOperator(type, left, right);
        current = binaryOperator;
      }
    } else if (isIn) {
      InPredicate inPredicate = new InPredicate(left, right, isNot);
      current = inPredicate;
    } else {
      current = left;
    }

    return current;
  }