From 5ed7e8efc2e83b54b28b63a7879ecb7810e7207f Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 12 Jan 2015 19:10:10 +0100 Subject: [PATCH] DATAMONGO-1139 - MongoQueryCreator now only uses $nearSpherical if non-neutral Metric is used. Fixed the evaluation of the Distance for a near clause handed into a query method. Previously we evaluated against null, which will never result in true as Distance returns Metrics.NEUTRAL by default. --- .../repository/query/MongoQueryCreator.java | 3 ++- .../query/MongoQueryCreatorUnitTests.java | 17 +++++++++++++++++ .../repository/query/StubParameterAccessor.java | 10 +++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java index 3085f5dc8..83dd74324 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Distance; +import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; import org.springframework.data.geo.Shape; import org.springframework.data.mapping.context.MappingContext; @@ -211,7 +212,7 @@ class MongoQueryCreator extends AbstractQueryCreator { if (distance == null) { return criteria.near(point); } else { - if (distance.getMetric() != null) { + if (!Metrics.NEUTRAL.equals(distance.getMetric())) { criteria.nearSphere(point); } else { criteria.near(point); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java index b7181341e..abc7d3baf 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java @@ -41,6 +41,7 @@ import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.Person; +import org.springframework.data.mongodb.core.Venue; import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Field; @@ -466,6 +467,22 @@ public class MongoQueryCreatorUnitTests { assertThat(query, is(query(where("username").regex(".*thew.*").not()))); } + /** + * @see DATAMONGO-1139 + */ + @Test + public void createsNonShericalNearForDistanceWithDefaultMetric() { + + Point point = new Point(1.0, 1.0); + Distance distance = new Distance(1.0); + + PartTree tree = new PartTree("findByLocationNear", Venue.class); + MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, point, distance), context); + Query query = creator.createQuery(); + + assertThat(query, is(query(where("location").near(point).maxDistance(1.0)))); + } + interface PersonRepository extends Repository { List findByLocationNearAndFirstname(Point location, Distance maxDistance, String firstname); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StubParameterAccessor.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StubParameterAccessor.java index ab11cde67..72986a0f3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StubParameterAccessor.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StubParameterAccessor.java @@ -34,6 +34,7 @@ import org.springframework.data.repository.query.ParameterAccessor; class StubParameterAccessor implements MongoParameterAccessor { private final Object[] values; + private Distance distance; /** * Creates a new {@link ConvertingParameterAccessor} backed by a {@link StubParameterAccessor} simply returning the @@ -48,7 +49,14 @@ class StubParameterAccessor implements MongoParameterAccessor { } public StubParameterAccessor(Object... values) { + this.values = values; + + for (Object value : values) { + if (value instanceof Distance) { + this.distance = (Distance) value; + } + } } /* @@ -88,7 +96,7 @@ class StubParameterAccessor implements MongoParameterAccessor { * @see org.springframework.data.mongodb.repository.MongoParameterAccessor#getMaxDistance() */ public Distance getMaxDistance() { - return null; + return distance; } /*