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;
}