Package org.apache.lucene.sandbox.facet.recorders

# Class CountFacetRecorder

java.lang.Object
org.apache.lucene.sandbox.facet.recorders.CountFacetRecorder

All Implemented Interfaces:
  `FacetRecorder`

public final class CountFacetRecorder extends Object implements FacetRecorder
`FacetRecorder` to count facets.

TODO: add an option to keep counts in an array, to improve performance for facets with small number of ordinals e.g. range facets. Options: - `LeafFacetCutter` can inform `LeafFacetRecorder` about expected number of facet ordinals (`FacetFieldCollector` can orchestrate that). If expeted facet ord number is below some threshold - use array instead of a map? - first 100/1k counts in array, the rest - in a map; the limit can also be provided in a constructor? It is similar to what LongValuesFacetCounts does today.

TODO: We can also consider collecting 2 (3, 4, ..., can be parametrizes) slices to a single sync map which can reduce thread contention compared to single sync map for all slices; at the same time there will be less work for reduce method. So far reduce wasn't a bottleneck for us, but it is definitely not free.

TODO: If we come back to some for of synchronized count maps, we should be more careful what we acquire locks for - we used to lock addTo method itself, but it could be faster if we only synchronized after computing the key's hash; or we can lock the entire map only if we need to insert key, and lock single key otherwise?

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

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `CountFacetRecorder()`
  Create.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `boolean`
  `contains(int ordinal)`
  Check if any data was recorded for provided facet ordinal.
  `int`
  `getCount(int ord)`
  Get count for provided ordinal.
  `LeafFacetRecorder`
  `getLeafRecorder(LeafReaderContext context)`
  Get leaf recorder.
  `boolean`
  `isEmpty()`
  True if there are no records
  `OrdinalIterator`
  `recordedOrds()`
  Return next collected ordinal, or `OrdinalIterator.NO_MORE_ORDS`
  `void`
  `reduce(FacetCutter facetCutter)`
  Reduce leaf recorder results into this recorder.

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Constructor Details

  - ### CountFacetRecorder

    public CountFacetRecorder()
    Create.

- ## Method Details

  - ### getCount

    public int getCount(int ord)
    Get count for provided ordinal.

  - ### getLeafRecorder

    public LeafFacetRecorder getLeafRecorder(LeafReaderContext context)
    Description copied from interface: `FacetRecorder`
    Get leaf recorder.
    Specified by:
      `getLeafRecorder` in interface `FacetRecorder`

  - ### recordedOrds

    public OrdinalIterator recordedOrds()
    Description copied from interface: `FacetRecorder`
    Return next collected ordinal, or `OrdinalIterator.NO_MORE_ORDS`
    Specified by:
      `recordedOrds` in interface `FacetRecorder`

  - ### isEmpty

    public boolean isEmpty()
    Description copied from interface: `FacetRecorder`
    True if there are no records
    Specified by:
      `isEmpty` in interface `FacetRecorder`

  - ### reduce

    public void reduce(FacetCutter facetCutter) throws IOException
    Description copied from interface: `FacetRecorder`
    Reduce leaf recorder results into this recorder. If `FacetCutter.getOrdinalsToRollup()` result is not null, it also rolls up values.

    After this method is called, it's illegal to add values to recorder, i.e. calling `FacetRecorder.getLeafRecorder(org.apache.lucene.index.LeafReaderContext)` or `LeafFacetRecorder.record(int, int)` on its leaf recorders.

    Specified by:
      `reduce` in interface `FacetRecorder`
    Throws:
      `IOException`

  - ### contains

    public boolean contains(int ordinal)
    Description copied from interface: `FacetRecorder`
    Check if any data was recorded for provided facet ordinal.
    Specified by:
      `contains` in interface `FacetRecorder`