private void gatherStatistics()

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