blob: b6bb55ba2c8eda19c00637f861be355aee950b74 [file] [log] [blame]
package edu.uci.ics.asterix.aql.expression;
import java.util.ArrayList;
import edu.uci.ics.asterix.aql.base.Expression;
import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
import edu.uci.ics.asterix.aql.expression.visitor.IAqlVisitorWithVoidReturn;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
public class OperatorExpr implements Expression {
private ArrayList<Expression> exprList;
private ArrayList<OperatorType> opList;
private ArrayList<Integer> exprBroadcastIdx;
private boolean currentop = false;
public OperatorExpr() {
super();
exprList = new ArrayList<Expression>();
exprBroadcastIdx = new ArrayList<Integer>();
opList = new ArrayList<OperatorType>();
}
public OperatorExpr(ArrayList<Expression> exprList, ArrayList<Integer> exprBroadcastIdx,
ArrayList<OperatorType> opList) {
this.exprList = exprList;
this.exprBroadcastIdx = exprBroadcastIdx;
this.opList = opList;
}
public boolean isCurrentop() {
return currentop;
}
public void setCurrentop(boolean currentop) {
this.currentop = currentop;
}
public ArrayList<Expression> getExprList() {
return exprList;
}
public ArrayList<Integer> getExprBroadcastIdx() {
return exprBroadcastIdx;
}
public ArrayList<OperatorType> getOpList() {
return opList;
}
public void setExprList(ArrayList<Expression> exprList) {
this.exprList = exprList;
}
public void addOperand(Expression operand) {
addOperand(operand, false);
}
public void addOperand(Expression operand, boolean broadcast) {
if (broadcast) {
exprBroadcastIdx.add(exprList.size());
}
exprList.add(operand);
}
public final static boolean opIsComparison(OperatorType t) {
return t == OperatorType.EQ || t == OperatorType.NEQ || t == OperatorType.GT || t == OperatorType.GE
|| t == OperatorType.LT || t == OperatorType.LE;
}
public void addOperator(String strOp) {
if ("or".equals(strOp))
opList.add(OperatorType.OR);
else if ("and".equals(strOp))
opList.add(OperatorType.AND);
else if ("<".equals(strOp))
opList.add(OperatorType.LT);
else if (">".equals(strOp))
opList.add(OperatorType.GT);
else if ("<=".equals(strOp))
opList.add(OperatorType.LE);
else if ("<=".equals(strOp))
opList.add(OperatorType.LE);
else if (">=".equals(strOp))
opList.add(OperatorType.GE);
else if ("=".equals(strOp))
opList.add(OperatorType.EQ);
else if ("!=".equals(strOp))
opList.add(OperatorType.NEQ);
else if ("+".equals(strOp))
opList.add(OperatorType.PLUS);
else if ("-".equals(strOp))
opList.add(OperatorType.MINUS);
else if ("*".equals(strOp))
opList.add(OperatorType.MUL);
else if ("/".equals(strOp))
opList.add(OperatorType.DIV);
else if ("%".equals(strOp))
opList.add(OperatorType.MOD);
else if ("^".equals(strOp))
opList.add(OperatorType.CARET);
else if ("idiv".equals(strOp))
opList.add(OperatorType.IDIV);
else if ("~=".equals(strOp))
opList.add(OperatorType.FUZZY_EQ);
}
@Override
public Kind getKind() {
return Kind.OP_EXPRESSION;
}
public <T> void accept(IAqlVisitorWithVoidReturn<T> visitor, T arg) throws AsterixException {
visitor.visit(this, arg);
}
@Override
public <R, T> R accept(IAqlExpressionVisitor<R, T> visitor, T arg) throws AsterixException {
return visitor.visitOperatorExpr(this, arg);
}
public boolean isBroadcastOperand(int idx) {
for (Integer i : exprBroadcastIdx) {
if (i == idx) {
return true;
}
}
return false;
}
}