public static VectorColumnAssign[] buildAssigners(VectorizedRowBatch outputBatch)
      throws HiveException {
    VectorColumnAssign[] vca = new VectorColumnAssign[outputBatch.cols.length];
    for (int i = 0; i < vca.length; ++i) {
      ColumnVector cv = outputBatch.cols[i];
      if (cv == null) {
        continue;
      } else if (cv instanceof LongColumnVector) {
        vca[i] =
            new VectorLongColumnAssign() {
              @Override
              protected void copyValue(LongColumnVector in, int srcIndex, int destIndex) {
                assignLong(in.vector[srcIndex], destIndex);
              }
            }.init(outputBatch, (LongColumnVector) cv);
      } else if (cv instanceof DoubleColumnVector) {
        vca[i] =
            new VectorDoubleColumnAssign() {

              @Override
              protected void copyValue(DoubleColumnVector in, int srcIndex, int destIndex) {
                assignDouble(in.vector[srcIndex], destIndex);
              }
            }.init(outputBatch, (DoubleColumnVector) cv);
      } else if (cv instanceof BytesColumnVector) {
        vca[i] =
            new VectorBytesColumnAssign() {
              @Override
              protected void copyValue(BytesColumnVector src, int srcIndex, int destIndex) {
                assignBytes(
                    src.vector[srcIndex], src.start[srcIndex], src.length[srcIndex], destIndex);
              }
            }.init(outputBatch, (BytesColumnVector) cv);
      } else if (cv instanceof DecimalColumnVector) {
        vca[i] =
            new VectorDecimalColumnAssign() {
              @Override
              protected void copyValue(DecimalColumnVector src, int srcIndex, int destIndex) {
                assignDecimal(src.vector[srcIndex], destIndex);
              }
            };
      } else {
        throw new HiveException("Unimplemented vector column type: " + cv.getClass().getName());
      }
    }
    return vca;
  }
 public static VectorColumnAssign buildObjectAssign(
     VectorizedRowBatch outputBatch, int outColIndex, ObjectInspector objInspector)
     throws HiveException {
   PrimitiveObjectInspector poi = (PrimitiveObjectInspector) objInspector;
   VectorColumnAssign outVCA = null;
   ColumnVector destCol = outputBatch.cols[outColIndex];
   if (destCol instanceof LongColumnVector) {
     switch (poi.getPrimitiveCategory()) {
       case BOOLEAN:
         outVCA =
             new VectorLongColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   BooleanWritable bw = (BooleanWritable) val;
                   assignLong(bw.get() ? 1 : 0, destIndex);
                 }
               }
             }.init(outputBatch, (LongColumnVector) destCol);
         break;
       case BYTE:
         outVCA =
             new VectorLongColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   ByteWritable bw = (ByteWritable) val;
                   assignLong(bw.get(), destIndex);
                 }
               }
             }.init(outputBatch, (LongColumnVector) destCol);
         break;
       case SHORT:
         outVCA =
             new VectorLongColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   ShortWritable bw = (ShortWritable) val;
                   assignLong(bw.get(), destIndex);
                 }
               }
             }.init(outputBatch, (LongColumnVector) destCol);
         break;
       case INT:
         outVCA =
             new VectorLongColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   IntWritable bw = (IntWritable) val;
                   assignLong(bw.get(), destIndex);
                 }
               }
             }.init(outputBatch, (LongColumnVector) destCol);
         break;
       case LONG:
         outVCA =
             new VectorLongColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   LongWritable bw = (LongWritable) val;
                   assignLong(bw.get(), destIndex);
                 }
               }
             }.init(outputBatch, (LongColumnVector) destCol);
         break;
       case TIMESTAMP:
         outVCA =
             new VectorLongColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   TimestampWritable bw = (TimestampWritable) val;
                   Timestamp t = bw.getTimestamp();
                   assignLong(TimestampUtils.getTimeNanoSec(t), destIndex);
                 }
               }
             }.init(outputBatch, (LongColumnVector) destCol);
         break;
       case DATE:
         outVCA =
             new VectorLongColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   DateWritable bw = (DateWritable) val;
                   assignLong(bw.getDays(), destIndex);
                 }
               }
             }.init(outputBatch, (LongColumnVector) destCol);
         break;
       default:
         throw new HiveException(
             "Incompatible Long vector column and primitive category "
                 + poi.getPrimitiveCategory());
     }
   } else if (destCol instanceof DoubleColumnVector) {
     switch (poi.getPrimitiveCategory()) {
       case DOUBLE:
         outVCA =
             new VectorDoubleColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   DoubleWritable bw = (DoubleWritable) val;
                   assignDouble(bw.get(), destIndex);
                 }
               }
             }.init(outputBatch, (DoubleColumnVector) destCol);
         break;
       case FLOAT:
         outVCA =
             new VectorDoubleColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   FloatWritable bw = (FloatWritable) val;
                   assignDouble(bw.get(), destIndex);
                 }
               }
             }.init(outputBatch, (DoubleColumnVector) destCol);
         break;
       default:
         throw new HiveException(
             "Incompatible Double vector column and primitive category "
                 + poi.getPrimitiveCategory());
     }
   } else if (destCol instanceof BytesColumnVector) {
     switch (poi.getPrimitiveCategory()) {
       case STRING:
         outVCA =
             new VectorBytesColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   Text bw = (Text) val;
                   byte[] bytes = bw.getBytes();
                   assignBytes(bytes, 0, bytes.length, destIndex);
                 }
               }
             }.init(outputBatch, (BytesColumnVector) destCol);
         break;
       default:
         throw new HiveException(
             "Incompatible Bytes vector column and primitive category "
                 + poi.getPrimitiveCategory());
     }
   } else if (destCol instanceof DecimalColumnVector) {
     switch (poi.getPrimitiveCategory()) {
       case DECIMAL:
         outVCA =
             new VectorDecimalColumnAssign() {
               @Override
               public void assignObjectValue(Object val, int destIndex) throws HiveException {
                 if (val == null) {
                   assignNull(destIndex);
                 } else {
                   HiveDecimalWritable hdw = (HiveDecimalWritable) val;
                   assignDecimal(hdw, destIndex);
                 }
               }
             }.init(outputBatch, (DecimalColumnVector) destCol);
         break;
       default:
         throw new HiveException(
             "Incompatible Decimal vector column and primitive category "
                 + poi.getPrimitiveCategory());
     }
   } else {
     throw new HiveException("Unknown vector column type " + destCol.getClass().getName());
   }
   return outVCA;
 }