@Override
protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args)
throws AlgebricksException {
final DynamicContext dCtx = (DynamicContext) ctx.getJobletContext().getGlobalJobData();
final XSTimePointable timep = (XSTimePointable) XSTimePointable.FACTORY.createPointable();
final XSDateTimePointable datetimep = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
final XSDateTimePointable ctxDatetimep = (XSDateTimePointable) XSDateTimePointable.FACTORY.createPointable();
final LongPointable longp = (LongPointable) LongPointable.FACTORY.createPointable();
final ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
final DataOutput dOutInner = abvsInner.getDataOutput();
final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
final DataOutput dOut = abvs.getDataOutput();
return new AbstractTaggedValueArgumentScalarEvaluator(args) {
@Override
protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
dCtx.getCurrentDateTime(ctxDatetimep);
TaggedValuePointable tvp1 = args[0];
if (tvp1.getTag() != ValueTag.XS_TIME_TAG) {
throw new SystemException(ErrorCode.FORG0006);
}
tvp1.getValue(timep);
// Second argument is optional and will used the dynamic context if not supplied.
long tz;
if (args.length == 2) {
TaggedValuePointable tvp2 = args[1];
if (tvp2.getTag() == ValueTag.XS_DAY_TIME_DURATION_TAG) {
tvp2.getValue(longp);
if (Math.abs(longp.getLong()) > DateTime.CHRONON_OF_HOUR * 14) {
throw new SystemException(ErrorCode.FODT0003);
}
tz = longp.getLong() / DateTime.CHRONON_OF_MINUTE;
} else {
throw new SystemException(ErrorCode.FORG0006);
}
} else {
tz = ctxDatetimep.getTimezoneHour() * 60 + ctxDatetimep.getTimezoneMinute();
}
try {
abvs.reset();
abvsInner.reset();