private void gatherStatistics()

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