package uk.ac.imperial.lsds.streamsql.expressions; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import uk.ac.imperial.lsds.seep.comm.serialization.DataTuple; import uk.ac.imperial.lsds.streamsql.conversion.DateConversion; import uk.ac.imperial.lsds.streamsql.conversion.TypeConversion; import uk.ac.imperial.lsds.streamsql.visitors.ValueExpressionVisitor; public class DateSum implements IValueExpression<Date> { private static final long serialVersionUID = 1L; private final TypeConversion<Date> _dc = new DateConversion(); private final IValueExpression<Date> _ve; private final int _interval, _unit; public DateSum(IValueExpression<Date> ve, int unit, int interval) { _ve = ve; _unit = unit; _interval = interval; } @Override public void accept(ValueExpressionVisitor vev) { vev.visit(this); } @Override public void changeValues(int i, IValueExpression<Date> newExpr) { // nothing } @Override public Date eval(DataTuple tuple) { final Date base = _ve.eval(tuple); final Calendar c = Calendar.getInstance(); c.setTime(base); c.add(_unit, _interval); return c.getTime(); } @Override public String evalString(DataTuple tuple) { return _dc.toString(eval(tuple)); } @Override public List<IValueExpression> getInnerExpressions() { final List<IValueExpression> result = new ArrayList<IValueExpression>(); result.add(_ve); return result; } @Override public TypeConversion getType() { return _dc; } @Override public void inverseNumber() { // nothing } @Override public boolean isNegative() { // nothing return false; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("DateSum ").append(_ve.toString()); sb.append(" interval ").append(_interval); sb.append(" unit ").append(_unit); return sb.toString(); } }