src/main/java/com/googlecode/javaewah/FastAggregation.java
public static void orToContainer(final BitmapStorage container,
                                     final EWAHCompressedBitmap... bitmaps) {
        if (bitmaps.length < 2)
            throw new IllegalArgumentException(
                    "We need at least two bitmaps");
        PriorityQueue<EWAHCompressedBitmap> pq = new PriorityQueue<EWAHCompressedBitmap>(
                bitmaps.length, new Comparator<EWAHCompressedBitmap>() {
            @Override
            public int compare(EWAHCompressedBitmap a,
                               EWAHCompressedBitmap b) {
                return a.sizeInBytes()
                        - b.sizeInBytes();
            }
        }
        );
        Collections.addAll(pq, bitmaps);
        while (pq.size() > 2) {
            EWAHCompressedBitmap x1 = pq.poll();
            EWAHCompressedBitmap x2 = pq.poll();
            pq.add(x1.or(x2));
        }
        pq.poll().orToContainer(pq.poll(), container);
    }
public static void orToContainer(final BitmapStorage container,
                                     final EWAHCompressedBitmap... bitmaps) {
        if (bitmaps.length < 2)
            throw new IllegalArgumentException(
                    "We need at least two bitmaps");
        PriorityQueue<EWAHCompressedBitmap> pq = new PriorityQueue<EWAHCompressedBitmap>(
                bitmaps.length, new Comparator<EWAHCompressedBitmap>() {
            @Override
            public int compare(EWAHCompressedBitmap a,
                               EWAHCompressedBitmap b) {
                return a.sizeInBytes()
                        - b.sizeInBytes();
            }
        }
        );
        Collections.addAll(pq, bitmaps);
        while (pq.size() > 2) {
            EWAHCompressedBitmap x1 = pq.poll();
            EWAHCompressedBitmap x2 = pq.poll();
            pq.add(x1.or(x2));
        }
        pq.poll().orToContainer(pq.poll(), container);
    }
public static void orToContainer ( final BitmapStorage container , final EWAHCompressedBitmap ... bitmaps ) { if ( bitmaps . length < 2 ) throw new IllegalArgumentException ( "We need at least two bitmaps" ) ; PriorityQueue < EWAHCompressedBitmap > pq = new PriorityQueue < EWAHCompressedBitmap > ( bitmaps . length , new Comparator < EWAHCompressedBitmap > ( ) { @ Override public int compare ( EWAHCompressedBitmap a , EWAHCompressedBitmap b ) { return a . sizeInBytes ( ) - b . sizeInBytes ( ) ; } } ) ; Collections . addAll ( pq , bitmaps ) ; while ( pq . size ( ) > 2 ) { EWAHCompressedBitmap x1 = pq . poll ( ) ; EWAHCompressedBitmap x2 = pq . poll ( ) ; pq . add ( x1 . or ( x2 ) ) ; } pq . poll ( ) . orToContainer ( pq . poll ( ) , container ) ; }
Uses a priority queue to compute the or aggregate.

The content of the container is overwritten.

This algorithm runs in linearithmic time (O(n log n)) with respect to the number of bitmaps.

@param container where we write the result
@param bitmaps   to be aggregated
Uses a priority queue to compute the or aggregate .