/* * Copyright 1999-2012 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * (created at 2011-1-19) */ package com.alibaba.cobar.parser.ast.expression.comparison; import com.alibaba.cobar.parser.ast.expression.BinaryOperatorExpression; import com.alibaba.cobar.parser.ast.expression.Expression; import com.alibaba.cobar.parser.ast.expression.ReplacableExpression; import com.alibaba.cobar.parser.ast.expression.misc.InExpressionList; import com.alibaba.cobar.parser.ast.expression.misc.QueryExpression; import com.alibaba.cobar.parser.visitor.SQLASTVisitor; /** * <code>higherPreExpr (NOT)? IN ( '(' expr (',' expr)* ')' | subquery )</code> * * @author <a href="mailto:shuo.qius@alibaba-inc.com">QIU Shuo</a> */ public class InExpression extends BinaryOperatorExpression implements ReplacableExpression { private final boolean not; /** * @param rightOprand {@link QueryExpression} or {@link InExpressionList} */ public InExpression(boolean not, Expression leftOprand, Expression rightOprand) { super(leftOprand, rightOprand, PRECEDENCE_COMPARISION); this.not = not; } public boolean isNot() { return not; } public InExpressionList getInExpressionList() { if (rightOprand instanceof InExpressionList) { return (InExpressionList) rightOprand; } return null; } public QueryExpression getQueryExpression() { if (rightOprand instanceof QueryExpression) { return (QueryExpression) rightOprand; } return null; } @Override public String getOperator() { return not ? "NOT IN" : "IN"; } private Expression replaceExpr; @Override public void setReplaceExpr(Expression replaceExpr) { this.replaceExpr = replaceExpr; } @Override public void clearReplaceExpr() { this.replaceExpr = null; } @Override public void accept(SQLASTVisitor visitor) { if (replaceExpr == null) visitor.visit(this); else replaceExpr.accept(visitor); } }