/** * */ package edu.washington.escience.myria.expression; import java.io.Serializable; import java.util.List; import javax.annotation.Nonnull; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; import edu.washington.escience.myria.expression.evaluate.ExpressionOperatorParameter; /** * An abstract class representing some variable in an expression tree. */ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ /* Zeroary */ @Type(name = "CONSTANT", value = ConstantExpression.class), @Type(name = "RANDOM", value = RandomExpression.class), @Type(name = "STATE", value = StateExpression.class), @Type(name = "TYPE", value = TypeExpression.class), @Type(name = "TYPEOF", value = TypeOfExpression.class), @Type(name = "VARIABLE", value = VariableExpression.class), @Type(name = "WORKERID", value = WorkerIdExpression.class), /* Unary */ @Type(name = "ABS", value = AbsExpression.class), @Type(name = "CAST", value = CastExpression.class), @Type(name = "CEIL", value = CeilExpression.class), @Type(name = "COS", value = CosExpression.class), @Type(name = "DOWNLOADBLOB", value = DownloadBlobExpression.class), @Type(name = "FLOOR", value = FloorExpression.class), @Type(name = "LEN", value = LenExpression.class), @Type(name = "LOG", value = LogExpression.class), @Type(name = "MD5", value = HashMd5Expression.class), @Type(name = "NEG", value = NegateExpression.class), @Type(name = "NGRAM", value = NgramExpression.class), @Type(name = "NOT", value = NotExpression.class), @Type(name = "SEQUENCE", value = SequenceExpression.class), @Type(name = "SIN", value = SinExpression.class), @Type(name = "SQRT", value = SqrtExpression.class), @Type(name = "TAN", value = TanExpression.class), @Type(name = "UPPER", value = ToUpperCaseExpression.class), /* Binary */ @Type(name = "AND", value = AndExpression.class), @Type(name = "DIVIDE", value = DivideExpression.class), @Type(name = "EQ", value = EqualsExpression.class), @Type(name = "GREATER", value = GreaterExpression.class), @Type(name = "GT", value = GreaterThanExpression.class), @Type(name = "GTEQ", value = GreaterThanOrEqualsExpression.class), @Type(name = "IDIVIDE", value = IntDivideExpression.class), @Type(name = "LESSER", value = LesserExpression.class), @Type(name = "LTEQ", value = LessThanOrEqualsExpression.class), @Type(name = "LT", value = LessThanExpression.class), @Type(name = "MINUS", value = MinusExpression.class), @Type(name = "MODULO", value = ModuloExpression.class), @Type(name = "NEQ", value = NotEqualsExpression.class), @Type(name = "OR", value = OrExpression.class), @Type(name = "PLUS", value = PlusExpression.class), @Type(name = "POW", value = PowExpression.class), @Type(name = "SPLIT", value = SplitExpression.class), @Type(name = "TIMES", value = TimesExpression.class), /* Nary */ @Type(name = "CONDITION", value = ConditionalExpression.class), @Type(name = "SUBSTR", value = SubstrExpression.class), @Type(name = "PYUDF", value = PyUDFExpression.class) }) public abstract class ExpressionOperator implements Serializable { /***/ private static final long serialVersionUID = 1L; /** * Get the output type of the expression which might depend on the types of the children. Also, check whether the * types of the children are correct. * * @param parameters parameters that are needed to determine the output type * @return the type of the output of this expression. */ public abstract edu.washington.escience.myria.Type getOutputType( final ExpressionOperatorParameter parameters); /** * @param parameters parameters that are needed to create the java expression * @return the entire tree represented as an expression. */ public abstract String getJavaString(final ExpressionOperatorParameter parameters); /** * @param parameters parameters that are needed to create the java expression * @return Java code to efficiently append results to an output column */ public String getJavaExpressionWithAppend(final ExpressionOperatorParameter parameters) { return null; } /** * @return if this expression returns a primitive array */ public boolean hasArrayOutputType() { return false; } /** * @return all children */ @Nonnull public abstract List<ExpressionOperator> getChildren(); }