package com.avaje.ebean;

import java.util.Iterator;

/**
 * Used to provide iteration over query results.
 * <p>
 * This can be used when you want to process a very large number of results and
 * means that you don't have to hold all the results in memory at once (unlike
 * findList(), findSet() etc where all the beans are held in the List or Set
 * etc).
 * </p>
 * <p>
 * Note that findIterate (and findEach and findEachWhile) uses a "per graph"
 * persistence context scope and adjusts jdbc fetch buffer size for large
 * queries. As such it is better to use findList for small queries.
 * </p>
 * <p>
 * Remember that with {@link QueryIterator} you must call {@link QueryIterator#close()}
 * when you have finished iterating the results (typically in a finally block).
 * </p>
 *
 * <pre>{@code
 * 
 *  Query<Customer> query = server.find(Customer.class)
 *     .where().gt("id", 0)
 *     .orderBy("id")
 *     .setMaxRows(2);
 *
 *  QueryIterator<Customer> it = query.findIterate();
 *  try {
 *    while (it.hasNext()) {
 *      Customer customer = it.next();
 *      // do something with customer ...
 *    }
 *  } finally {
 *    // close the underlying resources
 *    it.close();
 *  }
 *
 * }</pre>
 * 
 * @param <T>
 *          the type of entity bean in the iteration
 */
public interface QueryIterator<T> extends Iterator<T>, java.io.Closeable {

  /**
   * Returns <tt>true</tt> if the iteration has more elements.
   */
  boolean hasNext();

  /**
   * Returns the next element in the iteration.
   */
  T next();

  /**
   * Remove is not allowed.
   */
  void remove();

  /**
   * Close the underlying resources held by this iterator.
   */
  void close();
}
