## org.apache.lucene.search.grouping
Class AbstractFirstPassGroupingCollector<GROUP_VALUE_TYPE>

    java.lang.Object
      org.apache.lucene.search.Collector
          org.apache.lucene.search.grouping.AbstractFirstPassGroupingCollector<GROUP_VALUE_TYPE>

Direct Known Subclasses:
  TermFirstPassGroupingCollector

    public abstract class AbstractFirstPassGroupingCollector<GROUP_VALUE_TYPE>

extends Collector

FirstPassGroupingCollector is the first of two passes necessary to collect grouped hits. This pass gathers the top N sorted groups. Concrete subclasses define what a group is and how it is internally collected.

See `org.apache.lucene.search.grouping` for more details including a full code example.

WARNING: This API is experimental and might change in incompatible ways in the next release.

Constructor Summary
`AbstractFirstPassGroupingCollector(Sort groupSort, int topNGroups)` Create the first pass collector.

Method Summary
`boolean` `acceptsDocsOutOfOrder()` Return `true` if this collector does not require the matching docIDs to be delivered in int sort order (smallest to largest) to `Collector.collect(int)`.
`void` `collect(int doc)` Called once for every document matching a query, with the unbased document number.
`protected abstract GROUP_VALUE_TYPE` `copyDocGroupValue(GROUP_VALUE_TYPE groupValue, GROUP_VALUE_TYPE reuse)` Returns a copy of the specified group value by creating a new instance and copying the value from the specified groupValue in the new instance.
`protected abstract GROUP_VALUE_TYPE` `getDocGroupValue(int doc)` Returns the group value for the specified doc.
`Collection<SearchGroup<GROUP_VALUE_TYPE>>` `getTopGroups(int groupOffset, boolean fillFields)` Returns top groups, starting from offset.
`void` `setNextReader(IndexReader reader, int docBase)` Called before collecting from each IndexReader.
`void` `setScorer(Scorer scorer)` Called before successive calls to `Collector.collect(int)`.

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Constructor Detail

### AbstractFirstPassGroupingCollector

    public AbstractFirstPassGroupingCollector(Sort groupSort,
                                              int topNGroups)
                                       throws IOException

  Create the first pass collector.

  Parameters:
    `groupSort` - The `Sort` used to sort the groups. The top sorted document within each group according to groupSort, determines how that group sorts against other groups. This must be non-null, ie, if you want to groupSort by relevance use Sort.RELEVANCE.
    `topNGroups` - How many top groups to keep.
  Throws:
    `IOException` - If I/O related errors occur

Method Detail

### getTopGroups

    public Collection<SearchGroup<GROUP_VALUE_TYPE>> getTopGroups(int groupOffset,
                                                                  boolean fillFields)

  Returns top groups, starting from offset. This may return null, if no groups were collected, or if the number of unique groups collected is <= offset.

  Parameters:
    `groupOffset` - The offset in the collected groups
    `fillFields` - Whether to fill to `SearchGroup.sortValues`
  Returns:
    top groups, starting from offset

### setScorer

    public void setScorer(Scorer scorer)
                   throws IOException

  Description copied from class: `Collector`
  Called before successive calls to `Collector.collect(int)`. Implementations that need the score of the current document (passed-in to `Collector.collect(int)`), should save the passed-in Scorer and call scorer.score() when needed.

  Specified by:
    `setScorer` in class `Collector`
  Throws:
    `IOException`

### collect

    public void collect(int doc)
                 throws IOException

  Description copied from class: `Collector`
  Called once for every document matching a query, with the unbased document number.

  Note: This is called in an inner search loop. For good search performance, implementations of this method should not call `Searcher.doc(int)` or `IndexReader.document(int)` on every hit. Doing so can slow searches by an order of magnitude or more.

  Specified by:
    `collect` in class `Collector`
  Throws:
    `IOException`

### acceptsDocsOutOfOrder

    public boolean acceptsDocsOutOfOrder()

  Description copied from class: `Collector`
  Return `true` if this collector does not require the matching docIDs to be delivered in int sort order (smallest to largest) to `Collector.collect(int)`.

  Most Lucene Query implementations will visit matching docIDs in order. However, some queries (currently limited to certain cases of `BooleanQuery`) can achieve faster searching if the `Collector` allows them to deliver the docIDs out of order.

  Many collectors don't mind getting docIDs out of order, so it's important to return `true` here.

  Specified by:
    `acceptsDocsOutOfOrder` in class `Collector`

### setNextReader

    public void setNextReader(IndexReader reader,
                              int docBase)
                       throws IOException

  Description copied from class: `Collector`
  Called before collecting from each IndexReader. All doc ids in `Collector.collect(int)` will correspond to reader. Add docBase to the current IndexReaders internal document id to re-base ids in `Collector.collect(int)`.

  Specified by:
    `setNextReader` in class `Collector`
  Parameters:
    `reader` - next IndexReader
  Throws:
    `IOException`

### getDocGroupValue

    protected abstract GROUP_VALUE_TYPE getDocGroupValue(int doc)

  Returns the group value for the specified doc.

  Parameters:
    `doc` - The specified doc
  Returns:
    the group value for the specified doc

### copyDocGroupValue

    protected abstract GROUP_VALUE_TYPE copyDocGroupValue(GROUP_VALUE_TYPE groupValue,
                                                          GROUP_VALUE_TYPE reuse)

  Returns a copy of the specified group value by creating a new instance and copying the value from the specified groupValue in the new instance. Or optionally the reuse argument can be used to copy the group value in.

  Parameters:
    `groupValue` - The group value to copy
    `reuse` - Optionally a reuse instance to prevent a new instance creation
  Returns:
    a copy of the specified group value