in hollow/src/main/java/com/netflix/hollow/core/write/HollowObjectTypeWriteState.java [367:426]
private long addRecordField(long readPointer, long recordBitOffset, int fieldIndex, FixedLengthElementArray fixedLengthLongArray, ByteDataArray varLengthByteArrays[]) {
FieldType fieldType = getSchema().getFieldType(fieldIndex);
long fieldBitOffset = recordBitOffset + fieldStats.getFieldBitOffset(fieldIndex);
int bitsPerElement = fieldStats.getMaxBitsForField(fieldIndex);
ByteData data = ordinalMap.getByteData().getUnderlyingArray();
switch(fieldType) {
case BOOLEAN:
if(VarInt.readVNull(data, readPointer)) {
fixedLengthLongArray.setElementValue(fieldBitOffset, 2, 3);
} else {
fixedLengthLongArray.setElementValue(fieldBitOffset, 2, data.get(readPointer));
}
readPointer += 1;
break;
case FLOAT:
long intValue = data.readIntBits(readPointer) & 0xFFFFFFFFL;
fixedLengthLongArray.setElementValue(fieldBitOffset, 32, intValue);
readPointer += 4;
break;
case DOUBLE:
long longValue = data.readLongBits(readPointer);
fixedLengthLongArray.setElementValue(fieldBitOffset, 64, longValue);
readPointer += 8;
break;
case LONG:
case INT:
case REFERENCE:
if(VarInt.readVNull(data, readPointer)) {
fixedLengthLongArray.setElementValue(fieldBitOffset, bitsPerElement, fieldStats.getNullValueForField(fieldIndex));
readPointer += 1;
} else {
long vLong = VarInt.readVLong(data, readPointer);
fixedLengthLongArray.setElementValue(fieldBitOffset, bitsPerElement, vLong);
readPointer += VarInt.sizeOfVLong(vLong);
}
break;
case BYTES:
case STRING:
ByteDataArray varLengthBuf = getByteArray(varLengthByteArrays, fieldIndex);
if(VarInt.readVNull(data, readPointer)) {
long offset = varLengthBuf.length();
fixedLengthLongArray.setElementValue(fieldBitOffset, bitsPerElement, offset | (1L << (bitsPerElement - 1))); // write offset with set null bit
readPointer += 1;
} else {
int length = VarInt.readVInt(data, readPointer);
readPointer += VarInt.sizeOfVInt(length);
varLengthBuf.copyFrom(data, readPointer, length);
long offset = varLengthBuf.length();
fixedLengthLongArray.setElementValue(fieldBitOffset, bitsPerElement, offset);
readPointer += length;
}
break;
}
return readPointer;
}