Package org.apache.lucene.spatial.prefix

# Class RecursivePrefixTreeStrategy

java.lang.Object
org.apache.lucene.spatial.SpatialStrategy
org.apache.lucene.spatial.prefix.PrefixTreeStrategy
org.apache.lucene.spatial.prefix.RecursivePrefixTreeStrategy

Direct Known Subclasses:
  `NumberRangePrefixTreeStrategy`

public class RecursivePrefixTreeStrategy extends PrefixTreeStrategy
A `PrefixTreeStrategy` which uses `AbstractVisitingPrefixTreeQuery`. This strategy has support for searching non-point shapes (note: not tested). Even a query shape with distErrPct=0 (fully precise to the grid) should have good performance for typical data, unless there is a lot of indexed data coincident with the shape's edge.

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

## Nested Class Summary

## Nested classes/interfaces inherited from class org.apache.lucene.spatial.prefix.PrefixTreeStrategy

`PrefixTreeStrategy.ShapeTokenStream`

## Field Summary

Fields
Modifier and Type
Field
Description
`protected boolean`
`multiOverlappingIndexedShapes`
`protected int`
`prefixGridScanLevel`
`protected boolean`
`pruneLeafyBranches`

### Fields inherited from class org.apache.lucene.spatial.prefix.PrefixTreeStrategy

`defaultFieldValuesArrayLen, distErrPct, FIELD_TYPE, grid, pointsOnly`

### Fields inherited from class org.apache.lucene.spatial.SpatialStrategy

`ctx`

## Constructor Summary

Constructors
Constructor
Description
`RecursivePrefixTreeStrategy(SpatialPrefixTree grid, String fieldName)`

## Method Summary

Modifier and Type
Method
Description
`protected Iterator<Cell>`
`createCellIteratorToIndex(org.locationtech.spatial4j.shape.Shape shape, int detailLevel, Iterator<Cell> reuse)`
`int`
`getPrefixGridScanLevel()`
`protected boolean`
`isGridAlignedShape(org.locationtech.spatial4j.shape.Shape shape)`
A quick check of the shape to see if it is perfectly aligned to a grid.
`boolean`
`isMultiOverlappingIndexedShapes()`
`boolean`
`isPruneLeafyBranches()`
`protected Query`
`makeGridShapeIntersectsQuery(org.locationtech.spatial4j.shape.Shape gridShape)`
`makeQuery(SpatialArgs)` specialized for the query being a grid square.
`Query`
`makeQuery(SpatialArgs args)`
Make a Query based principally on `SpatialOperation` and `Shape` from the supplied `args`.
`void`
`setMultiOverlappingIndexedShapes(boolean multiOverlappingIndexedShapes)`
See `ContainsPrefixTreeQuery.multiOverlappingIndexedShapes`.
`void`
`setPrefixGridScanLevel(int prefixGridScanLevel)`
Sets the grid level [1-maxLevels] at which indexed terms are scanned brute-force instead of by grid decomposition.
`void`
`setPruneLeafyBranches(boolean pruneLeafyBranches)`
An optional hint affecting non-point shapes and tree cells implementing `CellCanPrune`, otherwise ignored.
`String`
`toString()`

### Methods inherited from class org.apache.lucene.spatial.prefix.PrefixTreeStrategy

`calcFacets, createIndexableFields, createIndexableFields, createIndexableFields, getDistErrPct, getGrid, isPointShape, isPointsOnly, makeDistanceValueSource, newCellToBytesRefIterator, setDefaultFieldValuesArrayLen, setDistErrPct, setPointsOnly, tokenStream`

### Methods inherited from class org.apache.lucene.spatial.SpatialStrategy

`getFieldName, getSpatialContext, makeDistanceValueSource, makeRecipDistanceValueSource`

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

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

## Field Details

### prefixGridScanLevel

protected int prefixGridScanLevel

### pruneLeafyBranches

protected boolean pruneLeafyBranches

### multiOverlappingIndexedShapes

protected boolean multiOverlappingIndexedShapes

## Constructor Details

### RecursivePrefixTreeStrategy

public RecursivePrefixTreeStrategy(SpatialPrefixTree grid, String fieldName)

## Method Details

### getPrefixGridScanLevel

public int getPrefixGridScanLevel()

### setPrefixGridScanLevel

public void setPrefixGridScanLevel(int prefixGridScanLevel)
Sets the grid level [1-maxLevels] at which indexed terms are scanned brute-force instead of by grid decomposition. By default this is maxLevels - 4. The final level, maxLevels, is always scanned.

Parameters:
  `prefixGridScanLevel` - 1 to maxLevels

### isMultiOverlappingIndexedShapes

public boolean isMultiOverlappingIndexedShapes()

### setMultiOverlappingIndexedShapes

public void setMultiOverlappingIndexedShapes(boolean multiOverlappingIndexedShapes)
See `ContainsPrefixTreeQuery.multiOverlappingIndexedShapes`.

### isPruneLeafyBranches

public boolean isPruneLeafyBranches()

### setPruneLeafyBranches

public void setPruneLeafyBranches(boolean pruneLeafyBranches)
An optional hint affecting non-point shapes and tree cells implementing `CellCanPrune`, otherwise ignored.

It will prune away a complete set sibling leaves to their parent (recursively), resulting in ~20-50% fewer indexed cells, and consequently that much less disk and that much faster indexing. So if it's a quad tree and all 4 sub-cells are there marked as a leaf, then they will be removed (pruned) and the parent is marked as a leaf instead. This occurs recursively on up. Unfortunately, the current implementation will buffer all cells to do this, so consider disabling for high precision (low distErrPct) shapes. (default=true)

### toString

public String toString()

Overrides:
  `toString` in class `SpatialStrategy`

### createCellIteratorToIndex

protected Iterator<Cell> createCellIteratorToIndex(org.locationtech.spatial4j.shape.Shape shape, int detailLevel, Iterator<Cell> reuse)

Overrides:
  `createCellIteratorToIndex` in class `PrefixTreeStrategy`

### makeQuery

public Query makeQuery(SpatialArgs args)
Description copied from class: `SpatialStrategy`
Make a Query based principally on `SpatialOperation` and `Shape` from the supplied `args`. It should be constant scoring of 1.

Specified by:
  `makeQuery` in class `SpatialStrategy`

### isGridAlignedShape

protected boolean isGridAlignedShape(org.locationtech.spatial4j.shape.Shape shape)
A quick check of the shape to see if it is perfectly aligned to a grid. Points always are as they are indivisible. It's okay to return false if the shape actually is aligned; this is an optimization hint.

### makeGridShapeIntersectsQuery

protected Query makeGridShapeIntersectsQuery(org.locationtech.spatial4j.shape.Shape gridShape)
`makeQuery(SpatialArgs)` specialized for the query being a grid square.