private long addRecordField()

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;
    }