in hollow/src/main/java/com/netflix/hollow/core/write/HollowSetTypeWriteState.java [78:135]
private void gatherStatistics(boolean numShardsChanged) {
int maxElementOrdinal = 0;
int maxSetSize = 0;
ByteData data = ordinalMap.getByteData().getUnderlyingArray();
totalOfSetBuckets = new long[numShards];
if (numShardsChanged) {
revTotalOfSetBuckets = 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);
int numBuckets = HashCodes.hashTableSize(size);
if(size > maxSetSize)
maxSetSize = size;
pointer += VarInt.sizeOfVInt(size);
int elementOrdinal = 0;
for(int j=0;j<size;j++) {
int elementOrdinalDelta = VarInt.readVInt(data, pointer);
elementOrdinal += elementOrdinalDelta;
if(elementOrdinal > maxElementOrdinal)
maxElementOrdinal = elementOrdinal;
pointer += VarInt.sizeOfVInt(elementOrdinalDelta);
pointer += VarInt.nextVLongSize(data, pointer); /// discard hashed bucket
}
totalOfSetBuckets[i & (numShards-1)] += numBuckets;
if (numShardsChanged) {
revTotalOfSetBuckets[i & (revNumShards-1)] += numBuckets;
}
}
}
long maxShardTotalOfSetBuckets = 0;
for(int i=0;i<numShards;i++) {
if(totalOfSetBuckets[i] > maxShardTotalOfSetBuckets)
maxShardTotalOfSetBuckets = totalOfSetBuckets[i];
}
bitsPerElement = 64 - Long.numberOfLeadingZeros(maxElementOrdinal + 1);
bitsPerSetSizeValue = 64 - Long.numberOfLeadingZeros(maxSetSize);
bitsPerSetPointer = 64 - Long.numberOfLeadingZeros(maxShardTotalOfSetBuckets);
if (numShardsChanged) {
long revMaxShardTotalOfSetBuckets = 0;
for(int i=0;i<revNumShards;i++) {
if(revTotalOfSetBuckets[i] > revMaxShardTotalOfSetBuckets)
revMaxShardTotalOfSetBuckets = revTotalOfSetBuckets[i];
}
revBitsPerSetPointer = 64 - Long.numberOfLeadingZeros(revMaxShardTotalOfSetBuckets);
}
}