in hollow/src/main/java/com/netflix/hollow/core/write/HollowMapTypeWriteState.java [79:149]
private void gatherStatistics(boolean numShardsChanged) {
int maxKeyOrdinal = 0;
int maxValueOrdinal = 0;
int maxMapSize = 0;
ByteData data = ordinalMap.getByteData().getUnderlyingArray();
totalOfMapBuckets = new long[numShards];
if (numShardsChanged) {
revTotalOfMapBuckets = 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 > maxMapSize)
maxMapSize = size;
pointer += VarInt.sizeOfVInt(size);
int keyOrdinal = 0;
for(int j=0;j<size;j++) {
int keyOrdinalDelta = VarInt.readVInt(data, pointer);
pointer += VarInt.sizeOfVInt(keyOrdinalDelta);
int valueOrdinal = VarInt.readVInt(data, pointer);
pointer += VarInt.sizeOfVInt(valueOrdinal);
keyOrdinal += keyOrdinalDelta;
if(keyOrdinal > maxKeyOrdinal)
maxKeyOrdinal = keyOrdinal;
if(valueOrdinal > maxValueOrdinal)
maxValueOrdinal = valueOrdinal;
pointer += VarInt.nextVLongSize(data, pointer); /// discard hashed bucket
}
totalOfMapBuckets[i & (numShards-1)] += numBuckets;
if (numShardsChanged) {
revTotalOfMapBuckets[i & (revNumShards-1)] += numBuckets;
}
}
}
long maxShardTotalOfMapBuckets = 0;
for(int i=0;i<numShards;i++) {
if(totalOfMapBuckets[i] > maxShardTotalOfMapBuckets)
maxShardTotalOfMapBuckets = totalOfMapBuckets[i];
}
bitsPerKeyElement = 64 - Long.numberOfLeadingZeros(maxKeyOrdinal + 1);
bitsPerValueElement = maxValueOrdinal == 0 ? 1 : 64 - Long.numberOfLeadingZeros(maxValueOrdinal);
bitsPerMapSizeValue = 64 - Long.numberOfLeadingZeros(maxMapSize);
bitsPerMapPointer = 64 - Long.numberOfLeadingZeros(maxShardTotalOfMapBuckets);
if (numShardsChanged) {
long revMaxShardTotalOfMapBuckets = 0;
for(int i=0;i<revNumShards;i++) {
if(revTotalOfMapBuckets[i] > revMaxShardTotalOfMapBuckets)
revMaxShardTotalOfMapBuckets = revTotalOfMapBuckets[i];
}
revBitsPerMapPointer = 64 - Long.numberOfLeadingZeros(revMaxShardTotalOfMapBuckets);
}
}