public void or()

in spark-load/spark-load-common/src/main/java/org/apache/doris/common/io/Roaring64Map.java [790:837]


    public void or(final Roaring64Map x2) {
        boolean firstBucket = true;

        for (Map.Entry<Integer, BitmapDataProvider> e2 : x2.highToBitmap.entrySet()) {
            // Keep object to prevent auto-boxing
            Integer high = e2.getKey();

            BitmapDataProvider lowBitmap1 = this.highToBitmap.get(high);

            BitmapDataProvider lowBitmap2 = e2.getValue();

            // TODO Reviewers: is it a good idea to rely on BitmapDataProvider except in methods
            // expecting an actual MutableRoaringBitmap?
            // TODO This code may lead to closing a buffer Bitmap in current Navigable even if current is
            // not on buffer
            if ((lowBitmap1 == null || lowBitmap1 instanceof RoaringBitmap)
                    && lowBitmap2 instanceof RoaringBitmap) {
                if (lowBitmap1 == null) {
                    // Clone to prevent future modification of this modifying the input Bitmap
                    RoaringBitmap lowBitmap2Clone = ((RoaringBitmap) lowBitmap2).clone();

                    pushBitmapForHigh(high, lowBitmap2Clone);
                } else {
                    ((RoaringBitmap) lowBitmap1).or((RoaringBitmap) lowBitmap2);
                }
            } else if ((lowBitmap1 == null || lowBitmap1 instanceof MutableRoaringBitmap)
                    && lowBitmap2 instanceof MutableRoaringBitmap) {
                if (lowBitmap1 == null) {
                    // Clone to prevent future modification of this modifying the input Bitmap
                    BitmapDataProvider lowBitmap2Clone = ((MutableRoaringBitmap) lowBitmap2).clone();
                    pushBitmapForHigh(high, lowBitmap2Clone);
                } else {
                    ((MutableRoaringBitmap) lowBitmap1).or((MutableRoaringBitmap) lowBitmap2);
                }
            } else {
                throw new UnsupportedOperationException(
                        ".or is not between " + this.getClass() + " and " + lowBitmap2.getClass());
            }

            if (firstBucket) {
                firstBucket = false;

                // Invalidate the lowest high as lowest not valid
                firstHighNotValid = Math.min(firstHighNotValid, high);
                allValid = false;
            }
        }
    }