package edu.washington.escience.myria.expression;
import edu.washington.escience.myria.Type;
import edu.washington.escience.myria.expression.evaluate.ExpressionOperatorParameter;
/**
* Return a sequence of numbers from 0 (inclusive) to operand (exclusive).
*/
public class SequenceExpression extends UnaryExpression {
/***/
private static final long serialVersionUID = 1L;
/**
* This is not really unused, it's used automagically by Jackson deserialization.
*/
@SuppressWarnings("unused")
private SequenceExpression() {
super();
}
/**
* Takes the upper bound of the sequence to be returned.
*
* @param operand an expression that evaluates to a positive integer
*/
public SequenceExpression(final ExpressionOperator operand) {
super(operand);
}
@Override
public Type getOutputType(final ExpressionOperatorParameter parameters) {
checkOperandType(Type.LONG_TYPE, parameters);
return Type.LONG_TYPE;
}
@Override
public String getJavaString(final ExpressionOperatorParameter parameters) {
return new StringBuilder()
.append("LongStream.range(0, (")
.append(getOperand().getJavaString(parameters))
.append(")).toArray()")
.toString();
}
@Override
public String getJavaExpressionWithAppend(final ExpressionOperatorParameter parameters) {
return new StringBuilder()
.append(Expression.COUNT)
.append(".appendInt((int) (")
.append(getOperand().getJavaString(parameters))
.append("));\n")
// It would be nice to replace this loop with IntStream.forEach(), but Janino doesn't support lambdas.
.append("for (long i = 0; i < (long) (")
.append(getOperand().getJavaString(parameters))
.append("); ++i) {\n")
.append(Expression.RESULT)
.append(".appendLong(i);\n}")
.toString();
}
@Override
public boolean hasArrayOutputType() {
return true;
}
}