Index: lucene/facet/build.xml =================================================================== --- lucene/facet/build.xml (revision 1543850) +++ lucene/facet/build.xml (working copy) @@ -32,9 +32,10 @@ + - + Index: lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeAccumulator.java =================================================================== --- lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeAccumulator.java (revision 1543850) +++ lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeAccumulator.java (working copy) @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import org.apache.lucene.document.Document; @@ -31,6 +32,9 @@ import org.apache.lucene.document.FloatField; import org.apache.lucene.document.LongField; import org.apache.lucene.document.NumericDocValuesField; +import org.apache.lucene.expressions.Expression; +import org.apache.lucene.expressions.SimpleBindings; +import org.apache.lucene.expressions.js.JavascriptCompiler; import org.apache.lucene.facet.FacetTestCase; import org.apache.lucene.facet.FacetTestUtils; import org.apache.lucene.facet.index.FacetFields; @@ -38,8 +42,8 @@ import org.apache.lucene.facet.params.FacetSearchParams; import org.apache.lucene.facet.search.CountFacetRequest; import org.apache.lucene.facet.search.DrillDownQuery; +import org.apache.lucene.facet.search.DrillSideways.DrillSidewaysResult; import org.apache.lucene.facet.search.DrillSideways; -import org.apache.lucene.facet.search.DrillSideways.DrillSidewaysResult; import org.apache.lucene.facet.search.FacetRequest; import org.apache.lucene.facet.search.FacetResult; import org.apache.lucene.facet.search.FacetResultNode; @@ -57,6 +61,7 @@ import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.NumericRangeQuery; +import org.apache.lucene.search.SortField; import org.apache.lucene.store.Directory; import org.apache.lucene.util.IOUtils; import org.apache.lucene.util._TestUtil; @@ -674,4 +679,48 @@ r.close(); d.close(); } + + public void testDistanceRangeFaceting() throws Exception { + Directory dir = newDirectory(); + RandomIndexWriter writer = new RandomIndexWriter(random(), dir); + + Document doc = new Document(); + doc.add(new DoubleField("latitude", 40.759011, Field.Store.NO)); + doc.add(new DoubleField("longitude", -73.9844722, Field.Store.NO)); + writer.addDocument(doc); + + doc = new Document(); + doc.add(new DoubleField("latitude", 40.718266, Field.Store.NO)); + doc.add(new DoubleField("longitude", -74.007819, Field.Store.NO)); + writer.addDocument(doc); + + doc = new Document(); + doc.add(new DoubleField("latitude", 40.7051157, Field.Store.NO)); + doc.add(new DoubleField("longitude", -74.0088305, Field.Store.NO)); + writer.addDocument(doc); + + Expression distance = JavascriptCompiler.compile("haversin(40.7143528,-74.0059731,latitude,longitude)"); + SimpleBindings bindings = new SimpleBindings(); + bindings.add(new SortField("latitude", SortField.Type.DOUBLE)); + bindings.add(new SortField("longitude", SortField.Type.DOUBLE)); + + RangeAccumulator a = new RangeAccumulator(new RangeFacetRequest("distance", + distance.getValueSource(bindings), + new DoubleRange("< 1 km", 0.0, true, 1.0, false), + new DoubleRange("< 2 km", 0.0, true, 2.0, false), + new DoubleRange("< 5 km", 0.0, true, 5.0, false), + new DoubleRange("< 10 km", 0.0, true, 10.0, false), + new DoubleRange("< 20 km", 0.0, true, 20.0, false), + new DoubleRange("< 50 km", 0.0, true, 50.0, false))); + + FacetsCollector fc = FacetsCollector.create(a); + + IndexReader reader = writer.getReader(); + IndexSearcher searcher = new IndexSearcher(reader); + searcher.search(new MatchAllDocsQuery(), fc); + List result = fc.getFacetResults(); + assertEquals(1, result.size()); + assertEquals("distance (0)\n < 1 km (1)\n < 2 km (2)\n < 5 km (2)\n < 10 km (3)\n < 20 km (3)\n < 50 km (3)\n", FacetTestUtils.toSimpleString(result.get(0))); + IOUtils.close(reader, writer, dir); + } }