/** * 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 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); } }