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

com.algolia.search.iterators.IteratorBase Maven / Gradle / Ivy

The newest version!
package com.algolia.search.iterators;

import com.algolia.search.SearchIndex;
import com.algolia.search.models.RequestOptions;
import com.algolia.search.models.indexing.SearchResult;
import java.util.Iterator;
import java.util.Objects;
import javax.annotation.Nonnull;

abstract class IteratorBase implements Iterator {

  final SearchIndex index;
  private final RequestOptions requestOptions;

  // Internal state
  private boolean isFirstRequest = true;
  private Integer currentPage = 0;
  private Iterator currentIterator = null;

  abstract SearchResult doQuery(Integer page, RequestOptions requestOptions);

  IteratorBase(@Nonnull SearchIndex index) {
    this(index, 1000, null);
  }

  IteratorBase(@Nonnull SearchIndex index, @Nonnull Integer hitsPerPage) {
    this(index, hitsPerPage, null);
  }

  IteratorBase(
      @Nonnull SearchIndex index, @Nonnull Integer hitsPerPage, RequestOptions requestOptions) {

    Objects.requireNonNull(index, "Index is required");
    Objects.requireNonNull(hitsPerPage, "hitsPerPage is required");

    this.index = index;
    this.requestOptions = requestOptions;
  }

  @Override
  public boolean hasNext() {

    if (isFirstRequest) {
      executeQueryAndSetInnerState();
      isFirstRequest = false;
    }

    if (currentPage != null && !currentIterator.hasNext()) {
      executeQueryAndSetInnerState();
    }

    return currentIterator != null && currentIterator.hasNext();
  }

  @Override
  public E next() {
    if (currentIterator == null || !currentIterator.hasNext()) {
      executeQueryAndSetInnerState();
      isFirstRequest = false;
    }
    return currentIterator.next();
  }

  private void executeQueryAndSetInnerState() {
    SearchResult result = doQuery(currentPage, requestOptions);
    currentIterator = result.getHits().iterator();

    if (result.getNbHits() > 0) {
      currentPage++;
    } else {
      currentPage = null;
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy