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`