package uk.ac.imperial.lsds.streamsql.expressions; import java.util.ArrayList; 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.IntegerConversion; import uk.ac.imperial.lsds.streamsql.conversion.TypeConversion; import uk.ac.imperial.lsds.streamsql.visitors.ValueExpressionVisitor; public class DateDiff implements IValueExpression<Integer> { private static final long serialVersionUID = 1L; private final TypeConversion<Date> _dc = new DateConversion(); private final TypeConversion<Integer> _ic = new IntegerConversion(); private final IValueExpression<Date> _ve1, _ve2; public DateDiff(IValueExpression<Date> ve1, IValueExpression<Date> ve2) { _ve1 = ve1; _ve2 = ve2; } @Override public void accept(ValueExpressionVisitor vev) { vev.visit(this); } @Override public void changeValues(int i, IValueExpression<Integer> newExpr) { // nothing } @Override public Integer eval(DataTuple tuple) { Date dateObj1 = _ve1.eval(tuple); Date dateObj2 = _ve2.eval(tuple); long diff = dateObj2.getTime() - dateObj1.getTime(); int diffDays = (int) (diff / (24* 1000 * 60 * 60)); return diffDays; } @Override public String evalString(DataTuple tuple) { return _ic.toString(eval(tuple)); } @Override public List<IValueExpression> getInnerExpressions() { final List<IValueExpression> result = new ArrayList<IValueExpression>(); result.add(_ve1); result.add(_ve2); return result; } @Override public TypeConversion getType() { return _ic; } @Override public void inverseNumber() { // nothing } @Override public boolean isNegative() { // nothing return false; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("DateDiff "); sb.append("First Exp: ").append(_ve1.toString()).append("\n"); sb.append("Second Exp: ").append(_ve2.toString()).append("\n"); return sb.toString(); } }