You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2012/03/14 05:05:51 UTC

svn commit: r1300457 - in /lucene/dev/trunk/solr/core/src: java/org/apache/solr/schema/ java/org/apache/solr/search/ java/org/apache/solr/search/function/distance/ test/org/apache/solr/search/

Author: yonik
Date: Wed Mar 14 04:05:51 2012
New Revision: 1300457

URL: http://svn.apache.org/viewvc?rev=1300457&view=rev
Log:
LUCENE-3795: re-optimize degrees-radians conversions

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SpatialFilterTest.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java?rev=1300457&r1=1300456&r2=1300457&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java Wed Mar 14 04:05:51 2012
@@ -36,6 +36,7 @@ import org.apache.lucene.util.Bits;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.response.TextResponseWriter;
 import org.apache.solr.search.*;
+import org.apache.solr.search.function.distance.HaversineConstFunction;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -49,7 +50,7 @@ import java.util.Set;
  */
 public class LatLonType extends AbstractSubTypeFieldType implements SpatialQueryable {
   protected static final int LAT = 0;
-  protected static final int LONG = 1;
+  protected static final int LON = 1;
 
   @Override
   protected void init(IndexSchema schema, Map<String, String> args) {
@@ -75,7 +76,7 @@ public class LatLonType extends Abstract
       f[i] = subField(field, i).createField(String.valueOf(latLon[LAT]), boost);
       i++;
       //longitude
-      f[i] = subField(field, i).createField(String.valueOf(latLon[LONG]), boost);
+      f[i] = subField(field, i).createField(String.valueOf(latLon[LON]), boost);
 
     }
 
@@ -142,7 +143,7 @@ public class LatLonType extends Abstract
 
     // lat & lon in degrees
     double latCenter = point[LAT];
-    double lonCenter = point[LONG];
+    double lonCenter = point[LON];
     
     DistanceCalculator distCalc = new GeodesicSphereDistCalc.Haversine(options.units.earthRadius());
     SpatialContext ctx = new SimpleSpatialContext(options.units,distCalc,null);
@@ -164,7 +165,7 @@ public class LatLonType extends Abstract
     
     // Now that we've figured out the ranges, build them!
     SchemaField latField = subField(options.field, LAT);
-    SchemaField lonField = subField(options.field, LONG);
+    SchemaField lonField = subField(options.field, LON);
 
     SpatialDistanceQuery spatial = new SpatialDistanceQuery();
 
@@ -398,8 +399,8 @@ class SpatialDistanceQuery extends Exten
       this.lon2 = SpatialDistanceQuery.this.lon2;
       this.calcDist = SpatialDistanceQuery.this.calcDist;
 
-      this.latCenterRad = Math.toRadians(SpatialDistanceQuery.this.latCenter);
-      this.lonCenterRad = Math.toRadians(SpatialDistanceQuery.this.lonCenter);
+      this.latCenterRad = SpatialDistanceQuery.this.latCenter * HaversineConstFunction.DEGREES_TO_RADIANS;
+      this.lonCenterRad = SpatialDistanceQuery.this.lonCenter * HaversineConstFunction.DEGREES_TO_RADIANS;
       this.latCenterRad_cos = this.calcDist ? Math.cos(latCenterRad) : 0;
       this.dist = SpatialDistanceQuery.this.dist;
       this.planetRadius = SpatialDistanceQuery.this.planetRadius;
@@ -428,8 +429,8 @@ class SpatialDistanceQuery extends Exten
     }
 
     double dist(double lat, double lon) {
-      double latRad = Math.toRadians(lat);
-      double lonRad = Math.toRadians(lon);
+      double latRad = lat * HaversineConstFunction.DEGREES_TO_RADIANS;
+      double lonRad = lon * HaversineConstFunction.DEGREES_TO_RADIANS;
       
       // haversine, specialized to avoid a cos() call on latCenterRad
       double diffX = latCenterRad - latRad;

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java?rev=1300457&r1=1300456&r2=1300457&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java Wed Mar 14 04:05:51 2012
@@ -362,13 +362,13 @@ public abstract class ValueSourceParser 
     addParser(new DoubleParser("rad") {
       @Override
       public double func(int doc, FunctionValues vals) {
-        return Math.toRadians(vals.doubleVal(doc));
+        return vals.doubleVal(doc) * HaversineConstFunction.DEGREES_TO_RADIANS;
       }
     });
     addParser(new DoubleParser("deg") {
       @Override
       public double func(int doc, FunctionValues vals) {
-        return Math.toDegrees(vals.doubleVal(doc));
+        return vals.doubleVal(doc) * HaversineConstFunction.RADIANS_TO_DEGREES;
       }
     });
     addParser(new DoubleParser("sqrt") {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java?rev=1300457&r1=1300456&r2=1300457&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java Wed Mar 14 04:05:51 2012
@@ -44,6 +44,9 @@ import java.util.Map;
  * Haversine function with one point constant
  */
 public class HaversineConstFunction extends ValueSource {
+  // TODO: these could go in spatial4j somewhere
+  public static final double DEGREES_TO_RADIANS = Math.PI / 180.0;
+  public static final double RADIANS_TO_DEGREES =  180.0 / Math.PI;
 
   public static ValueSourceParser parser = new ValueSourceParser() {
     @Override
@@ -190,7 +193,7 @@ public class HaversineConstFunction exte
     this.p2 = vs;
     this.latSource = p2.getSources().get(0);
     this.lonSource = p2.getSources().get(1);
-    this.latCenterRad_cos = Math.cos(Math.toRadians(latCenter));
+    this.latCenterRad_cos = Math.cos(latCenter * DEGREES_TO_RADIANS);
   }
 
   protected String name() {
@@ -201,15 +204,15 @@ public class HaversineConstFunction exte
   public FunctionValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
     final FunctionValues latVals = latSource.getValues(context, readerContext);
     final FunctionValues lonVals = lonSource.getValues(context, readerContext);
-    final double latCenterRad = Math.toRadians(this.latCenter);
-    final double lonCenterRad = Math.toRadians(this.lonCenter);
+    final double latCenterRad = this.latCenter * DEGREES_TO_RADIANS;
+    final double lonCenterRad = this.lonCenter * DEGREES_TO_RADIANS;
     final double latCenterRad_cos = this.latCenterRad_cos;
 
     return new DoubleDocValues(this) {
       @Override
       public double doubleVal(int doc) {
-        double latRad = Math.toRadians(latVals.doubleVal(doc));
-        double lonRad = Math.toRadians(lonVals.doubleVal(doc));
+        double latRad = latVals.doubleVal(doc) * DEGREES_TO_RADIANS;
+        double lonRad = lonVals.doubleVal(doc) * DEGREES_TO_RADIANS;
         double diffX = latCenterRad - latRad;
         double diffY = lonCenterRad - lonRad;
         double hsinX = Math.sin(diffX * 0.5);

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java?rev=1300457&r1=1300456&r2=1300457&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java Wed Mar 14 04:05:51 2012
@@ -81,10 +81,10 @@ public class HaversineFunction extends V
     double y2;
     double x2;
     if (convertToRadians) {
-      y1 = Math.toRadians(p1D[0]);
-      x1 = Math.toRadians(p1D[1]);
-      y2 = Math.toRadians(p2D[0]);
-      x2 = Math.toRadians(p2D[1]);
+      y1 = p1D[0] * HaversineConstFunction.DEGREES_TO_RADIANS;
+      x1 = p1D[1] * HaversineConstFunction.DEGREES_TO_RADIANS;
+      y2 = p2D[0] * HaversineConstFunction.DEGREES_TO_RADIANS;
+      x2 = p2D[1] * HaversineConstFunction.DEGREES_TO_RADIANS;
     } else {
       y1 = p1D[0];
       x1 = p1D[1];

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SpatialFilterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SpatialFilterTest.java?rev=1300457&r1=1300456&r2=1300457&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SpatialFilterTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SpatialFilterTest.java Wed Mar 14 04:05:51 2012
@@ -169,7 +169,7 @@ public class SpatialFilterTest extends S
     assertQ(req("fl", "id", "q","*:* OR foo_i:" + random.nextInt(100)+100, "rows", "1000", "fq", "{!"+method+" sfield=" +fieldName + " cache=false cost=150" + "}",
         "pt", pt, "d", String.valueOf(distance)),
         tests);
-    assertEquals(postFilterCount + 1, DelegatingCollector.setLastDelegateCount);      // post filtering shouldn't be used
+    assertEquals(postFilterCount + 1, DelegatingCollector.setLastDelegateCount);      // post filtering *should* have been used
 
     }
   }