/**
  * allocate open part value pointable
  *
  * @param typeTag
  * @return the pointable object
  */
 public IVisitablePointable allocateFieldValue(ATypeTag typeTag, byte[] b, int offset)
     throws AsterixException {
   if (typeTag == null) return flatValueAllocator.allocate(null);
   else if (typeTag.equals(ATypeTag.RECORD))
     return recordValueAllocator.allocate(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
   else if (typeTag.equals(ATypeTag.UNORDEREDLIST)) {
     ATypeTag listItemType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(b[offset]);
     if (listItemType == ATypeTag.ANY)
       return listValueAllocator.allocate(DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE);
     else {
       if (listItemType.isDerivedType()) return allocateFieldValue(listItemType, b, offset + 1);
       else
         return listValueAllocator.allocate(
             unorederedListTypeAllocator.allocate(TypeTagUtil.getBuiltinTypeByTag(listItemType)));
     }
   } else if (typeTag.equals(ATypeTag.ORDEREDLIST)) {
     ATypeTag listItemType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(b[offset]);
     if (listItemType == ATypeTag.ANY)
       return listValueAllocator.allocate(DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE);
     else {
       if (listItemType.isDerivedType()) return allocateFieldValue(listItemType, b, offset + 1);
       else
         return listValueAllocator.allocate(
             orederedListTypeAllocator.allocate(TypeTagUtil.getBuiltinTypeByTag(listItemType)));
     }
   } else return flatValueAllocator.allocate(null);
 }
 @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;
 }
  @Override
  public void set(byte[] b, int s, int len) {
    reset();
    super.set(b, s, len);

    int numberOfitems = AInt32SerializerDeserializer.getInt(b, s + 6);
    int itemOffset;
    if (typedItemList) {
      switch (itemTag) {
        case STRING:
        case BINARY:
        case RECORD:
        case ORDEREDLIST:
        case UNORDEREDLIST:
        case ANY:
          itemOffset = s + 10 + (numberOfitems * 4);
          break;
        default:
          itemOffset = s + 10;
      }
    } else {
      itemOffset = s + 10 + (numberOfitems * 4);
    }
    int itemLength = 0;
    try {
      if (typedItemList) {
        for (int i = 0; i < numberOfitems; i++) {
          itemLength = NonTaggedFormatUtil.getFieldValueLength(b, itemOffset, itemTag, false);
          IVisitablePointable tag = allocator.allocateEmpty();
          IVisitablePointable item = allocator.allocateFieldValue(itemType);

          // set item type tag
          int start = dataBos.size();
          dataDos.writeByte(itemTag.serialize());
          int end = dataBos.size();
          tag.set(dataBos.getByteArray(), start, end - start);
          itemTags.add(tag);

          // set item value
          start = dataBos.size();
          dataDos.writeByte(itemTag.serialize());
          dataDos.write(b, itemOffset, itemLength);
          end = dataBos.size();
          item.set(dataBos.getByteArray(), start, end - start);
          itemOffset += itemLength;
          items.add(item);
        }
      } else {
        for (int i = 0; i < numberOfitems; i++) {
          itemTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(b[itemOffset]);
          itemLength = NonTaggedFormatUtil.getFieldValueLength(b, itemOffset, itemTag, true) + 1;
          IVisitablePointable tag = allocator.allocateEmpty();
          IVisitablePointable item = allocator.allocateFieldValue(itemTag, b, itemOffset + 1);

          // set item type tag
          int start = dataBos.size();
          dataDos.writeByte(itemTag.serialize());
          int end = dataBos.size();
          tag.set(dataBos.getByteArray(), start, end - start);
          itemTags.add(tag);

          // open part field already include the type tag
          item.set(b, itemOffset, itemLength);
          itemOffset += itemLength;
          items.add(item);
        }
      }
    } catch (Exception e) {
      throw new IllegalStateException(e);
    }
  }
 public int getOpenFieldValueSize(ARecordType recordType, int fieldId) throws AsterixException {
   int offset = getOpenFieldValueOffset(recordType, fieldId);
   ATypeTag tag =
       EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(getOpenFieldTag(recordType, fieldId));
   return NonTaggedFormatUtil.getFieldValueLength(bytes, offset, tag, true);
 }