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.
This commit is contained in:
Oliver Gierke
2015-01-12 19:10:10 +01:00
parent f4c27407ac
commit 90842844d4
3 changed files with 28 additions and 2 deletions

View File

@@ -25,6 +25,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.geo.Distance; import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.Point; import org.springframework.data.geo.Point;
import org.springframework.data.geo.Shape; import org.springframework.data.geo.Shape;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
@@ -209,7 +210,7 @@ class MongoQueryCreator extends AbstractQueryCreator<Query, Criteria> {
if (distance == null) { if (distance == null) {
return criteria.near(point); return criteria.near(point);
} else { } else {
if (distance.getMetric() != null) { if (!Metrics.NEUTRAL.equals(distance.getMetric())) {
criteria.nearSphere(point); criteria.nearSphere(point);
} else { } else {
criteria.near(point); criteria.near(point);

View File

@@ -41,6 +41,7 @@ import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.Point; import org.springframework.data.geo.Point;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mongodb.core.Person; 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.convert.MongoConverter;
import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.mapping.Field;
@@ -439,6 +440,22 @@ public class MongoQueryCreatorUnitTests {
assertThat(query, is(query(where("emailAddresses").in("dave")))); assertThat(query, is(query(where("emailAddresses").in("dave"))));
} }
/**
* @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<Person, Long> { interface PersonRepository extends Repository<Person, Long> {
List<Person> findByLocationNearAndFirstname(Point location, Distance maxDistance, String firstname); List<Person> findByLocationNearAndFirstname(Point location, Distance maxDistance, String firstname);

View File

@@ -34,6 +34,7 @@ import org.springframework.data.repository.query.ParameterAccessor;
class StubParameterAccessor implements MongoParameterAccessor { class StubParameterAccessor implements MongoParameterAccessor {
private final Object[] values; private final Object[] values;
private Distance distance;
/** /**
* Creates a new {@link ConvertingParameterAccessor} backed by a {@link StubParameterAccessor} simply returning the * 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) { public StubParameterAccessor(Object... values) {
this.values = 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() * @see org.springframework.data.mongodb.repository.MongoParameterAccessor#getMaxDistance()
*/ */
public Distance getMaxDistance() { public Distance getMaxDistance() {
return null; return distance;
} }
/* /*