@Override public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { BigDecimal finalResult = BigDecimal.ZERO; for (int i = 0; i < children.size(); i++) { if (!children.get(i).evaluate(tuple, ptr)) { return false; } if (ptr.getLength() == 0) { return true; } BigDecimal value; PDataType type = children.get(i).getDataType(); SortOrder sortOrder = children.get(i).getSortOrder(); if (type == PTimestamp.INSTANCE || type == PUnsignedTimestamp.INSTANCE) { value = (BigDecimal) (PDecimal.INSTANCE.toObject(ptr, type, sortOrder)); } else if (type.isCoercibleTo(PDecimal.INSTANCE)) { value = (((BigDecimal) PDecimal.INSTANCE.toObject(ptr, sortOrder)) .multiply(QueryConstants.BD_MILLIS_IN_DAY)) .setScale(6, RoundingMode.HALF_UP); } else if (type.isCoercibleTo(PDouble.INSTANCE)) { value = ((BigDecimal.valueOf(type.getCodec().decodeDouble(ptr, sortOrder))) .multiply(QueryConstants.BD_MILLIS_IN_DAY)) .setScale(6, RoundingMode.HALF_UP); } else { value = BigDecimal.valueOf(type.getCodec().decodeLong(ptr, sortOrder)); } finalResult = finalResult.add(value); } Timestamp ts = DateUtil.getTimestamp(finalResult); byte[] resultPtr = new byte[getDataType().getByteSize()]; PTimestamp.INSTANCE.toBytes(ts, resultPtr, 0); ptr.set(resultPtr); return true; }