private static IAdmNode getOpenField(ARecordPointable recPointable, ARecordType type, int i) throws IOException {
byte tagByte = recPointable.getOpenFieldTag(type, i);
ATypeTag tag = ATypeTag.VALUE_TYPE_MAPPING[tagByte];
switch (tag) {
case ARRAY:
return getOpenFieldAsArray(recPointable, type, i);
case BIGINT:
return new AdmBigIntNode(LongPointable.getLong(recPointable.getByteArray(),
recPointable.getOpenFieldValueOffset(type, i) + 1));
case BOOLEAN:
return AdmBooleanNode.get(BooleanPointable.getBoolean(recPointable.getByteArray(),
recPointable.getOpenFieldValueOffset(type, i) + 1));
case DOUBLE:
return new AdmDoubleNode(DoublePointable.getDouble(recPointable.getByteArray(),
recPointable.getOpenFieldValueOffset(type, i) + 1));
case NULL:
return AdmNullNode.INSTANCE;
case OBJECT:
return getOpenFieldAsObject(recPointable, type, i);
case STRING:
UTF8StringPointable str = UTF8StringPointable.FACTORY.createPointable();
str.set(recPointable.getByteArray(), recPointable.getOpenFieldValueOffset(type, i) + 1,
recPointable.getOpenFieldValueSize(type, i) - 1);
return new AdmStringNode(str.toString());
default:
throw new UnsupportedOperationException("Unsupported item type: " + tag);
}
}