19 using System.Collections.Generic;
20 using System.Diagnostics;
21 using Lucene.Net.Search;
22 using Lucene.Net.Spatial.Prefix.Tree;
23 using Lucene.Net.Spatial.Util;
24 using Lucene.Net.Util;
25 using Spatial4n.Core.Shapes;
27 namespace Lucene.Net.Spatial.Prefix
57 private readonly String fieldName;
59 private readonly Shape queryShape;
60 private readonly
int prefixGridScanLevel;
61 private readonly
int detailLevel;
66 this.fieldName = fieldName;
68 this.queryShape = queryShape;
69 this.prefixGridScanLevel = Math.Max(1, Math.Min(prefixGridScanLevel, grid.
GetMaxLevels() - 1));
70 this.detailLevel = detailLevel;
74 public override DocIdSet GetDocIdSet(Index.IndexReader reader )
78 var term = terms.Next();
85 var cells =
new LinkedList<Node>(
86 grid.GetWorldNode().GetSubCells(queryShape));
96 while (cells.Count > 0)
98 Node cell = cells.First.Value; cells.RemoveFirst();
100 var seekStat = terms.Seek(cellTerm);
112 var nextCellTerm = terms.Next();
113 Debug.Assert(nextCellTerm.Text.StartsWith(cellTerm));
114 scanCell = grid.GetNode(nextCellTerm.Text, scanCell);
123 bool scan = cell.
GetLevel() >= prefixGridScanLevel;
129 for (var i = lst.Count - 1; i >= 0; i--)
131 cells.AddFirst(lst[i]);
137 for (var t = terms.Term(); t != null && t.Text.StartsWith(cellTerm); t = terms.Next())
139 scanCell = grid.GetNode(t.Text, scanCell);
140 int termLevel = scanCell.
GetLevel();
141 if (termLevel > detailLevel)
143 if (termLevel == detailLevel || scanCell.
IsLeaf())
146 Shape cShape = termLevel == grid.GetMaxLevels() ? scanCell.
GetCenter() : scanCell.
GetShape();
147 if (queryShape.Relate(cShape) == SpatialRelation.DISJOINT)
160 public override string ToString()
162 return "GeoFilter{fieldName='" + fieldName +
'\'' +
", shape=" + queryShape +
'}';
165 public override bool Equals(
object o)
167 if (
this == o)
return true;
170 if (that == null)
return false;
172 if (!fieldName.Equals(that.fieldName))
return false;
174 if (prefixGridScanLevel != that.prefixGridScanLevel)
return false;
175 if (detailLevel != that.detailLevel)
return false;
176 if (!queryShape.Equals(that.queryShape))
return false;
181 public override int GetHashCode()
184 result = 31 * result + queryShape.GetHashCode();
185 result = 31 * result + detailLevel;