public class AqlBinaryBooleanInspectorImpl implements IBinaryBooleanInspector {
  public static final IBinaryBooleanInspectorFactory FACTORY =
      new IBinaryBooleanInspectorFactory() {
        private static final long serialVersionUID = 1L;

        @Override
        public IBinaryBooleanInspector createBinaryBooleanInspector(IHyracksTaskContext ctx) {
          return new AqlBinaryBooleanInspectorImpl();
        }
      };

  private static final byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();

  private AqlBinaryBooleanInspectorImpl() {}

  @Override
  public boolean getBooleanValue(byte[] bytes, int offset, int length) {
    if (bytes[offset] == SER_NULL_TYPE_TAG) return false;
    /** check if the runtime type is boolean */
    ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[offset]);
    if (typeTag != ATypeTag.BOOLEAN) {
      throw new IllegalStateException(
          "Runtime error: the select condition should be of the boolean type!");
    }
    return bytes[offset + 1] == 1;
  }
}
 public void getClosedFieldValue(ARecordType recordType, int fieldId, DataOutput dOut)
     throws IOException, AsterixException {
   if (isClosedFieldNull(recordType, fieldId)) {
     dOut.writeByte(ATypeTag.NULL.serialize());
   } else {
     dOut.write(getClosedFieldTag(recordType, fieldId));
     dOut.write(
         bytes,
         getClosedFieldOffset(recordType, fieldId),
         getClosedFieldSize(recordType, fieldId));
   }
 }
public class PrintDateDescriptor extends AbstractScalarFunctionDynamicDescriptor {

  private static final long serialVersionUID = 1L;
  public static final FunctionIdentifier FID = AsterixBuiltinFunctions.PRINT_DATE;

  private static final byte SER_DATE_TYPE_TAG = ATypeTag.DATE.serialize();
  private static final byte SER_STRING_TYPE_TAG = ATypeTag.STRING.serialize();
  private static final byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();
  private static final DateTimeFormatUtils DT_UTILS = DateTimeFormatUtils.getInstance();

  public static final IFunctionDescriptorFactory FACTORY =
      new IFunctionDescriptorFactory() {

        @Override
        public IFunctionDescriptor createFunctionDescriptor() {
          return new PrintDateDescriptor();
        }
      };

  @Override
  public ICopyEvaluatorFactory createEvaluatorFactory(final ICopyEvaluatorFactory[] args)
      throws AlgebricksException {
    return new ICopyEvaluatorFactory() {

      private static final long serialVersionUID = 1L;

      @Override
      public ICopyEvaluator createEvaluator(final IDataOutputProvider output)
          throws AlgebricksException {
        return new ICopyEvaluator() {

          private DataOutput out = output.getDataOutput();
          private ArrayBackedValueStorage argOut0 = new ArrayBackedValueStorage();
          private ArrayBackedValueStorage argOut1 = new ArrayBackedValueStorage();
          private ICopyEvaluator eval0 = args[0].createEvaluator(argOut0);
          private ICopyEvaluator eval1 = args[1].createEvaluator(argOut1);

          @SuppressWarnings("unchecked")
          private ISerializerDeserializer<ANull> nullSerde =
              AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(
                  BuiltinType.ANULL);

          private StringBuilder sbder = new StringBuilder();

          @Override
          public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
            argOut0.reset();
            eval0.evaluate(tuple);
            argOut1.reset();
            eval1.evaluate(tuple);

            try {
              if (argOut0.getByteArray()[0] == SER_NULL_TYPE_TAG
                  || argOut1.getByteArray()[0] == SER_NULL_TYPE_TAG) {
                nullSerde.serialize(ANull.NULL, out);
                return;
              }

              if (argOut0.getByteArray()[0] != SER_DATE_TYPE_TAG
                  || argOut1.getByteArray()[0] != SER_STRING_TYPE_TAG) {
                throw new AlgebricksException(
                    getIdentifier().getName()
                        + ": expects (DATE, STRING) but got  ("
                        + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(
                            argOut0.getByteArray()[0])
                        + ", "
                        + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(
                            argOut1.getByteArray()[0])
                        + ")");
              }

              long chronon =
                  ADateSerializerDeserializer.getChronon(argOut0.getByteArray(), 1)
                      * GregorianCalendarSystem.CHRONON_OF_DAY;
              int formatLength =
                  (argOut1.getByteArray()[1] & 0xff << 8) + (argOut1.getByteArray()[2] & 0xff << 0);
              sbder.delete(0, sbder.length());
              DT_UTILS.printDateTime(
                  chronon,
                  0,
                  argOut1.getByteArray(),
                  3,
                  formatLength,
                  sbder,
                  DateTimeParseMode.DATE_ONLY);

              out.writeByte(ATypeTag.STRING.serialize());
              out.writeUTF(sbder.toString());

            } catch (IOException ex) {
              throw new AlgebricksException(ex);
            }
          }
        };
      }
    };
  }

  /* (non-Javadoc)
   * @see edu.uci.ics.asterix.om.functions.AbstractFunctionDescriptor#getIdentifier()
   */
  @Override
  public FunctionIdentifier getIdentifier() {
    return FID;
  }
}
public class AYearMonthDurationConstructorDescriptor
    extends AbstractScalarFunctionDynamicDescriptor {

  private static final long serialVersionUID = 1L;
  private static final byte SER_STRING_TYPE_TAG = ATypeTag.STRING.serialize();
  private static final byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();

  public static final IFunctionDescriptorFactory FACTORY =
      new IFunctionDescriptorFactory() {

        @Override
        public IFunctionDescriptor createFunctionDescriptor() {
          return new AYearMonthDurationConstructorDescriptor();
        }
      };

  @Override
  public ICopyEvaluatorFactory createEvaluatorFactory(final ICopyEvaluatorFactory[] args) {
    return new ICopyEvaluatorFactory() {
      private static final long serialVersionUID = 1L;

      @Override
      public ICopyEvaluator createEvaluator(final IDataOutputProvider output)
          throws AlgebricksException {
        return new ICopyEvaluator() {

          private DataOutput out = output.getDataOutput();

          private ArrayBackedValueStorage outInput = new ArrayBackedValueStorage();
          private ICopyEvaluator eval = args[0].createEvaluator(outInput);
          private String errorMessage = "This can not be an instance of year-month-duration";
          private AMutableYearMonthDuration aYearMonthDuration = new AMutableYearMonthDuration(0);

          @SuppressWarnings("unchecked")
          private ISerializerDeserializer<AYearMonthDuration> yearMonthDurationSerde =
              AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(
                  BuiltinType.AYEARMONTHDURATION);

          @SuppressWarnings("unchecked")
          private ISerializerDeserializer<ANull> nullSerde =
              AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(
                  BuiltinType.ANULL);

          @Override
          public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
            try {
              outInput.reset();
              eval.evaluate(tuple);
              byte[] serString = outInput.getByteArray();

              if (serString[0] == SER_STRING_TYPE_TAG) {

                int stringLength = (serString[1] & 0xff << 8) + (serString[2] & 0xff << 0);

                ADurationParserFactory.parseDuration(
                    serString,
                    3,
                    stringLength,
                    aYearMonthDuration,
                    ADurationParseOption.YEAR_MONTH);

                yearMonthDurationSerde.serialize(aYearMonthDuration, out);
              } else if (serString[0] == SER_NULL_TYPE_TAG) {
                nullSerde.serialize(ANull.NULL, out);
              } else {
                throw new AlgebricksException(errorMessage);
              }
            } catch (Exception e1) {
              throw new AlgebricksException(e1);
            }
          }
        };
      }
    };
  }

  /* (non-Javadoc)
   * @see edu.uci.ics.asterix.om.functions.AbstractFunctionDescriptor#getIdentifier()
   */
  @Override
  public FunctionIdentifier getIdentifier() {
    return AsterixBuiltinFunctions.YEAR_MONTH_DURATION_CONSTRUCTOR;
  }
}
public class StringUpperCaseDescriptor extends AbstractScalarFunctionDynamicDescriptor {
  private static final long serialVersionUID = 1L;

  public static final IFunctionDescriptorFactory FACTORY =
      new IFunctionDescriptorFactory() {
        public IFunctionDescriptor createFunctionDescriptor() {
          return new StringUpperCaseDescriptor();
        }
      };
  private static final byte SER_STRING_TYPE_TAG = ATypeTag.STRING.serialize();
  private static final byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();

  @Override
  public ICopyEvaluatorFactory createEvaluatorFactory(final ICopyEvaluatorFactory[] args) {
    return new ICopyEvaluatorFactory() {
      private static final long serialVersionUID = 1L;

      @Override
      public ICopyEvaluator createEvaluator(final IDataOutputProvider output)
          throws AlgebricksException {
        return new ICopyEvaluator() {

          private DataOutput out = output.getDataOutput();
          private ArrayBackedValueStorage outInput = new ArrayBackedValueStorage();
          private ICopyEvaluator eval = args[0].createEvaluator(outInput);

          private final byte stt = ATypeTag.STRING.serialize();

          @SuppressWarnings("unchecked")
          private ISerializerDeserializer<ANull> nullSerde =
              AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(
                  BuiltinType.ANULL);

          @Override
          public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {

            try {
              outInput.reset();
              eval.evaluate(tuple);
              byte[] serString = outInput.getByteArray();

              if (serString[0] == SER_STRING_TYPE_TAG) {
                byte[] bytes = outInput.getByteArray();
                int len = UTF8StringPointable.getUTFLength(bytes, 1);

                out.writeByte(stt);
                StringUtils.writeUTF8Len(len, out);

                int pos = 3;
                while (pos < len + 3) {
                  char c1 = UTF8StringPointable.charAt(bytes, pos);
                  c1 = Character.toUpperCase(c1);
                  pos += UTF8StringPointable.charSize(bytes, pos);
                  StringUtils.writeCharAsModifiedUTF8(c1, out);
                }
              } else if (serString[0] == SER_NULL_TYPE_TAG) nullSerde.serialize(ANull.NULL, out);
              else
                throw new AlgebricksException(
                    AsterixBuiltinFunctions.STRING_UPPERCASE.getName()
                        + ": expects input type STRING/NULL but got "
                        + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(serString[0]));
            } catch (IOException e1) {
              throw new AlgebricksException(e1);
            }
          }
        };
      }
    };
  }

  @Override
  public FunctionIdentifier getIdentifier() {
    return AsterixBuiltinFunctions.STRING_UPPERCASE;
  }
}