All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.digitalcollections.solrocr.util.Streams Maven / Gradle / Ivy

Go to download

Solr plugin to add support for highlighting directly from various OCR formats (hOCR/ALTO/MiniOCR) without having to store the OCR documents in the index.

There is a newer version: 0.7.0
Show newest version
package de.digitalcollections.solrocr.util;

import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.BiFunction;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

/** Stream helpers.
 *
 * Only needed for `zip` and `stream(Iterator)`, since Lucene/Solr ships with an ancient version of Guava that does not
 * yet have `Streams.zip` and `Streams.stream`.
 * This is, however, going to be resolved with 8.0, so this class is only here temporarily.
 */
public class Streams {
  /** Implementation from https://stackoverflow.com/a/23529010/487903 */
  public static Stream zip(Stream a, Stream b,
                                       BiFunction zipper) {
    Objects.requireNonNull(zipper);
    Spliterator aSpliterator = Objects.requireNonNull(a).spliterator();
    Spliterator bSpliterator = Objects.requireNonNull(b).spliterator();

    // Zipping looses DISTINCT and SORTED characteristics
    int characteristics = aSpliterator.characteristics() & bSpliterator.characteristics() &
        ~(Spliterator.DISTINCT | Spliterator.SORTED);

    long zipSize = ((characteristics & Spliterator.SIZED) != 0)
        ? Math.min(aSpliterator.getExactSizeIfKnown(), bSpliterator.getExactSizeIfKnown())
        : -1;

    Iterator aIterator = Spliterators.iterator(aSpliterator);
    Iterator bIterator = Spliterators.iterator(bSpliterator);
    Iterator cIterator = new Iterator() {
      @Override
      public boolean hasNext() {
        return aIterator.hasNext() && bIterator.hasNext();
      }

      @Override
      public C next() {
        return zipper.apply(aIterator.next(), bIterator.next());
      }
    };

    Spliterator split = Spliterators.spliterator(cIterator, zipSize, characteristics);
    return (a.isParallel() || b.isParallel())
        ? StreamSupport.stream(split, true)
        : StreamSupport.stream(split, false);
  }

  public static  Stream stream(Iterator it) {
    Iterable iterable = () -> it;
    return StreamSupport.stream(iterable.spliterator(), false);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy