in hollow/src/main/java/com/netflix/hollow/core/write/HollowListTypeWriteState.java [70:117]
private void gatherStatistics(boolean numShardsChanged) {
int maxElementOrdinal = 0;
ByteData data = ordinalMap.getByteData().getUnderlyingArray();
totalOfListSizes = new long[numShards];
if (numShardsChanged) {
revTotalOfListSizes = new long[revNumShards];
}
for(int i=0;i<=maxOrdinal;i++) {
if(currentCyclePopulated.get(i) || previousCyclePopulated.get(i)) {
long pointer = ordinalMap.getPointerForData(i);
int size = VarInt.readVInt(data, pointer);
pointer += VarInt.sizeOfVInt(size);
for(int j=0;j<size;j++) {
int elementOrdinal = VarInt.readVInt(data, pointer);
if(elementOrdinal > maxElementOrdinal)
maxElementOrdinal = elementOrdinal;
pointer += VarInt.sizeOfVInt(elementOrdinal);
}
totalOfListSizes[i & (numShards-1)] += size;
if (numShardsChanged) {
revTotalOfListSizes[i & (revNumShards-1)] += size;
}
}
}
long maxShardTotalOfListSizes = 0;
for(int i=0;i<numShards;i++) {
if(totalOfListSizes[i] > maxShardTotalOfListSizes)
maxShardTotalOfListSizes = totalOfListSizes[i];
}
bitsPerElement = maxElementOrdinal == 0 ? 1 : 64 - Long.numberOfLeadingZeros(maxElementOrdinal);
bitsPerListPointer = maxShardTotalOfListSizes == 0 ? 1 : 64 - Long.numberOfLeadingZeros(maxShardTotalOfListSizes);
if (numShardsChanged) {
long revMaxShardTotalOfListSizes = 0;
for(int i=0;i<revNumShards;i++) {
if(revTotalOfListSizes[i] > revMaxShardTotalOfListSizes)
revMaxShardTotalOfListSizes = revTotalOfListSizes[i];
}
revBitsPerListPointer = revMaxShardTotalOfListSizes == 0 ? 1 : 64 - Long.numberOfLeadingZeros(revMaxShardTotalOfListSizes);
}
}