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:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user