Skip to content

Commit 1b4ecac

Browse files
committed
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.
1 parent 1ef03bf commit 1b4ecac

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.slf4j.LoggerFactory;
2626
import org.springframework.data.domain.Sort;
2727
import org.springframework.data.geo.Distance;
28+
import org.springframework.data.geo.Metrics;
2829
import org.springframework.data.geo.Point;
2930
import org.springframework.data.geo.Shape;
3031
import org.springframework.data.mapping.context.MappingContext;
@@ -217,7 +218,7 @@ private Criteria from(Part part, MongoPersistentProperty property, Criteria crit
217218
if (distance == null) {
218219
return criteria.near(point);
219220
} else {
220-
if (distance.getMetric() != null) {
221+
if (!Metrics.NEUTRAL.equals(distance.getMetric())) {
221222
criteria.nearSphere(point);
222223
} else {
223224
criteria.near(point);

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.springframework.data.geo.Point;
4242
import org.springframework.data.mapping.context.MappingContext;
4343
import org.springframework.data.mongodb.core.Person;
44+
import org.springframework.data.mongodb.core.Venue;
4445
import org.springframework.data.mongodb.core.convert.MongoConverter;
4546
import org.springframework.data.mongodb.core.mapping.DBRef;
4647
import org.springframework.data.mongodb.core.mapping.Field;
@@ -452,6 +453,22 @@ public void shouldCreateInClauseWhenUsingContainsOnCollectionLikeProperty() {
452453
assertThat(query, is(query(where("emailAddresses").in("dave"))));
453454
}
454455

456+
/**
457+
* @see DATAMONGO-1139
458+
*/
459+
@Test
460+
public void createsNonShericalNearForDistanceWithDefaultMetric() {
461+
462+
Point point = new Point(1.0, 1.0);
463+
Distance distance = new Distance(1.0);
464+
465+
PartTree tree = new PartTree("findByLocationNear", Venue.class);
466+
MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, point, distance), context);
467+
Query query = creator.createQuery();
468+
469+
assertThat(query, is(query(where("location").near(point).maxDistance(1.0))));
470+
}
471+
455472
interface PersonRepository extends Repository<Person, Long> {
456473

457474
List<Person> findByLocationNearAndFirstname(Point location, Distance maxDistance, String firstname);

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StubParameterAccessor.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
class StubParameterAccessor implements MongoParameterAccessor {
3434

3535
private final Object[] values;
36+
private Distance distance;
3637

3738
/**
3839
* Creates a new {@link ConvertingParameterAccessor} backed by a {@link StubParameterAccessor} simply returning the
@@ -47,7 +48,14 @@ public static ConvertingParameterAccessor getAccessor(MongoWriter<Object> conver
4748
}
4849

4950
public StubParameterAccessor(Object... values) {
51+
5052
this.values = values;
53+
54+
for (Object value : values) {
55+
if (value instanceof Distance) {
56+
this.distance = (Distance) value;
57+
}
58+
}
5159
}
5260

5361
/*
@@ -87,7 +95,7 @@ public Sort getSort() {
8795
* @see org.springframework.data.mongodb.repository.MongoParameterAccessor#getMaxDistance()
8896
*/
8997
public Distance getMaxDistance() {
90-
return null;
98+
return distance;
9199
}
92100

93101
/*

0 commit comments

Comments
 (0)