diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java index 69c78b584..b5fb1b234 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java @@ -20,6 +20,7 @@ import java.util.List; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Range; import org.springframework.data.domain.Slice; import org.springframework.data.domain.SliceImpl; import org.springframework.data.geo.Distance; @@ -361,12 +362,15 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { nearQuery.query(query); } - Distance maxDistance = accessor.getMaxDistance(); + Range distances = accessor.getDistanceRange(); + Distance maxDistance = distances.getUpperBound(); + if (maxDistance != null) { nearQuery.maxDistance(maxDistance).in(maxDistance.getMetric()); } - Distance minDistance = accessor.getMinDistance(); + Distance minDistance = distances.getLowerBound(); + if (minDistance != null) { nearQuery.minDistance(minDistance).in(minDistance.getMetric()); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java index b52f97f4e..bbed7e3ed 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java @@ -22,6 +22,7 @@ import java.util.Iterator; import java.util.List; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Range; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Point; @@ -96,21 +97,13 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor { return getConvertedValue(delegate.getBindableValue(index), null); } - /* + /* * (non-Javadoc) - * @see org.springframework.data.mongodb.repository.MongoParameterAccessor#getMaxDistance() - */ - public Distance getMaxDistance() { - return delegate.getMaxDistance(); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.mongodb.repository.query.MongoParameterAccessor#getMinDistance() + * @see org.springframework.data.mongodb.repository.query.MongoParameterAccessor#getDistanceRange() */ @Override - public Distance getMinDistance() { - return delegate.getMinDistance(); + public Range getDistanceRange() { + return delegate.getDistanceRange(); } /* diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameterAccessor.java index 9b107857e..9b39b16d7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameterAccessor.java @@ -15,6 +15,7 @@ */ package org.springframework.data.mongodb.repository.query; +import org.springframework.data.domain.Range; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.query.TextCriteria; @@ -34,7 +35,7 @@ public interface MongoParameterAccessor extends ParameterAccessor { * @return the maximum distance to apply to the geo query or {@literal null} if there's no {@link Distance} parameter * at all or the given value for it was {@literal null}. */ - Distance getMaxDistance(); + Range getDistanceRange(); /** * Returns the {@link Point} to use for a geo-near query. @@ -50,12 +51,4 @@ public interface MongoParameterAccessor extends ParameterAccessor { * @since 1.6 */ TextCriteria getFullText(); - - /** - * Returns a {@link Distance} to be applied to {@literal $minDistance} for MongoDB geo queries. - * - * @return - * @since 1.7 - */ - Distance getMinDistance(); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameters.java index bbd52d278..1e36047b9 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameters.java @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.List; import org.springframework.core.MethodParameter; +import org.springframework.data.domain.Range; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.query.TextCriteria; @@ -27,6 +28,8 @@ import org.springframework.data.mongodb.repository.Near; import org.springframework.data.mongodb.repository.query.MongoParameters.MongoParameter; import org.springframework.data.repository.query.Parameter; import org.springframework.data.repository.query.Parameters; +import org.springframework.data.util.ClassTypeInformation; +import org.springframework.data.util.TypeInformation; /** * Custom extension of {@link Parameters} discovering additional @@ -36,8 +39,8 @@ import org.springframework.data.repository.query.Parameters; */ public class MongoParameters extends Parameters { - private final Integer minDistanceIndex; - private final Integer maxDistanceIndex; + private final int rangeIndex; + private final int maxDistanceIndex; private final Integer fullTextIndex; private Integer nearIndex; @@ -55,9 +58,11 @@ public class MongoParameters extends Parameters this.fullTextIndex = parameterTypes.indexOf(TextCriteria.class); - int[] distances = distances(parameterTypes); - this.minDistanceIndex = distances[0]; - this.maxDistanceIndex = distances[1]; + ClassTypeInformation declaringClassInfo = ClassTypeInformation.from(method.getDeclaringClass()); + List> parameterTypeInfo = declaringClassInfo.getParameterTypes(method); + + this.rangeIndex = getTypeIndex(parameterTypeInfo, Range.class, Distance.class); + this.maxDistanceIndex = this.rangeIndex == -1 ? getTypeIndex(parameterTypeInfo, Distance.class, null) : -1; if (this.nearIndex == null && isGeoNearMethod) { this.nearIndex = getNearIndex(parameterTypes); @@ -66,15 +71,15 @@ public class MongoParameters extends Parameters } } - private MongoParameters(List parameters, Integer distanceIndex, Integer nearIndex, - Integer fullTextIndex, Integer minDistanceIndex) { + private MongoParameters(List parameters, int maxDistanceIndex, Integer nearIndex, + Integer fullTextIndex, int rangeIndex) { super(parameters); - this.maxDistanceIndex = distanceIndex; this.nearIndex = nearIndex; this.fullTextIndex = fullTextIndex; - this.minDistanceIndex = minDistanceIndex; + this.maxDistanceIndex = maxDistanceIndex; + this.rangeIndex = rangeIndex; } private final int getNearIndex(List> parameterTypes) { @@ -117,15 +122,19 @@ public class MongoParameters extends Parameters return mongoParameter; } + public int getDistanceRangeIndex() { + return -1; + } + /** * Returns the index of a {@link Distance} parameter to be used for geo queries. * * @return - * @deprecated since 1.7. Please use {@link #getMaxDistanceParameterIndex()} instead. + * @deprecated since 1.7. Please use {@link #getMaxDistanceIndex()} instead. */ @Deprecated public int getDistanceIndex() { - return getMaxDistanceParameterIndex(); + return getMaxDistanceIndex(); } /** @@ -134,7 +143,7 @@ public class MongoParameters extends Parameters * @return * @since 1.7 */ - public int getMaxDistanceParameterIndex() { + public int getMaxDistanceIndex() { return maxDistanceIndex; } @@ -169,16 +178,8 @@ public class MongoParameters extends Parameters * @return * @since 1.7 */ - public boolean hasMinDistanceParameter() { - return minDistanceIndex != null && minDistanceIndex.intValue() >= 0; - } - - /** - * @return - * @since 1.7 - */ - public int getMinDistanceParameterIndex() { - return minDistanceIndex != null ? minDistanceIndex.intValue() : -1; + public int getRangeIndex() { + return rangeIndex; } /* @@ -187,23 +188,26 @@ public class MongoParameters extends Parameters */ @Override protected MongoParameters createFrom(List parameters) { - return new MongoParameters(parameters, this.maxDistanceIndex, this.nearIndex, this.fullTextIndex, - this.minDistanceIndex); + return new MongoParameters(parameters, this.maxDistanceIndex, this.nearIndex, this.fullTextIndex, this.rangeIndex); } - private int[] distances(List> paramTypes) { + private int getTypeIndex(List> parameterTypes, Class type, Class componentType) { - int maxDistance = paramTypes.lastIndexOf(Distance.class); - if (maxDistance == -1) { - return new int[] { -1, -1 }; + for (int i = 0; i < parameterTypes.size(); i++) { + + TypeInformation candidate = parameterTypes.get(i); + + if (candidate.getType().equals(type)) { + + if (componentType == null) { + return i; + } else if (componentType.equals(candidate.getComponentType().getType())) { + return i; + } + } } - int minDistance = paramTypes.indexOf(Distance.class); - if (minDistance == maxDistance) { - return new int[] { -1, maxDistance }; - } - - return new int[] { minDistance, maxDistance }; + return -1; } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessor.java index a38664ec3..aea9f371e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessor.java @@ -15,6 +15,7 @@ */ package org.springframework.data.mongodb.repository.query; +import org.springframework.data.domain.Range; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.query.Term; @@ -44,23 +45,20 @@ public class MongoParametersParameterAccessor extends ParametersParameterAccesso this.method = method; } - /* - * (non-Javadoc) - * @see org.springframework.data.mongodb.repository.MongoParameterAccessor#getMaxDistance() - */ - public Distance getMaxDistance() { - int index = method.getParameters().getDistanceIndex(); - return index == -1 ? null : (Distance) getValue(index); - } + public Range getDistanceRange() { - /* - * (non-Javadoc) - * @see org.springframework.data.mongodb.repository.query.MongoParameterAccessor#getMinDistance() - */ - @Override - public Distance getMinDistance() { - int index = method.getParameters().getMinDistanceParameterIndex(); - return index == -1 ? null : (Distance) getValue(index); + MongoParameters mongoParameters = method.getParameters(); + + int rangeIndex = mongoParameters.getRangeIndex(); + + if (rangeIndex != -1) { + return getValue(rangeIndex); + } + + int maxDistanceIndex = mongoParameters.getMaxDistanceIndex(); + Distance maxDistance = maxDistanceIndex == -1 ? null : (Distance) getValue(maxDistanceIndex); + + return new Range(null, maxDistance); } /* 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 aa4fb9375..c2d2ff75a 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 @@ -23,6 +23,7 @@ import java.util.Iterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Range; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metrics; @@ -207,8 +208,10 @@ class MongoQueryCreator extends AbstractQueryCreator { return criteria.is(false); case NEAR: - Distance distance = accessor.getMaxDistance(); - Distance minDistance = accessor.getMinDistance(); + Range range = accessor.getDistanceRange(); + Distance distance = range.getUpperBound(); + Distance minDistance = range.getLowerBound(); + Point point = accessor.getGeoNearLocation(); point = point == null ? nextAs(parameters, Point.class) : point; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoSpatial2DTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoSpatial2DTests.java index f72ab83cc..e9248f63b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoSpatial2DTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoSpatial2DTests.java @@ -70,16 +70,6 @@ public class GeoSpatial2DTests extends AbstractGeoSpatialTests { assertThat(fields, hasItem(IndexField.geo("location"))); } - /** - * @see DATAMONGO-1110 - */ - @Test - public void nearPointWithMinDistance() { - Point point = new Point(-73.99171, 40.738868); - List venues = template.find(query(where("location").near(point).minDistance(0.01)), Venue.class); - assertThat(venues.size(), is(5)); - } - @Override protected void createIndex() { template.indexOps(Venue.class).ensureIndex(new GeospatialIndex("location").typed(GeoSpatialIndexType.GEO_2D)); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index 576f8eee3..c73ded4e7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -18,6 +18,7 @@ package org.springframework.data.mongodb.repository; import static java.util.Arrays.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import static org.springframework.data.geo.Metrics.*; import java.util.ArrayList; import java.util.Arrays; @@ -35,6 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Range; import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; @@ -1176,8 +1178,9 @@ public abstract class AbstractPersonRepositoryIntegrationTests { dave.setLocation(point); repository.save(dave); - GeoResults results = repository.findPersonByLocationNear(new Point(-73.99, 40.73), new Distance(0.01, - Metrics.KILOMETERS), new Distance(2000, Metrics.KILOMETERS)); + Range range = Distance.between(new Distance(0.01, KILOMETERS), new Distance(2000, KILOMETERS)); + + GeoResults results = repository.findPersonByLocationNear(new Point(-73.99, 40.73), range); assertThat(results.getContent().isEmpty(), is(false)); } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java index 8004ca949..a45e55c72 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java @@ -22,6 +22,7 @@ import java.util.stream.Stream; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Range; import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Box; @@ -169,8 +170,10 @@ public interface PersonRepository extends MongoRepository, Query GeoResults findByLocationNear(Point point, Distance maxDistance); - /** @see DATAMONGO-1110 */ - GeoResults findPersonByLocationNear(Point point, Distance maxDistance, Distance minDistance); + /** + * @see DATAMONGO-1110 + */ + GeoResults findPersonByLocationNear(Point point, Range distance); GeoPage findByLocationNear(Point point, Distance maxDistance, Pageable pageable); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessorUnitTests.java index 1a9aca5b0..f6ccea459 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessorUnitTests.java @@ -23,6 +23,7 @@ import java.util.List; import org.hamcrest.core.IsNull; import org.junit.Test; +import org.springframework.data.domain.Range; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; @@ -53,7 +54,7 @@ public class MongoParametersParameterAccessorUnitTests { MongoParameterAccessor accessor = new MongoParametersParameterAccessor(queryMethod, new Object[] { new Point(10, 20) }); - assertThat(accessor.getMaxDistance(), is(nullValue())); + assertThat(accessor.getDistanceRange().getUpperBound(), is(nullValue())); } @Test @@ -64,7 +65,7 @@ public class MongoParametersParameterAccessorUnitTests { MongoParameterAccessor accessor = new MongoParametersParameterAccessor(queryMethod, new Object[] { new Point(10, 20), DISTANCE }); - assertThat(accessor.getMaxDistance(), is(DISTANCE)); + assertThat(accessor.getDistanceRange().getUpperBound(), is(DISTANCE)); } /** @@ -102,17 +103,19 @@ public class MongoParametersParameterAccessorUnitTests { @Test public void shouldDetectMinAndMaxDistance() throws NoSuchMethodException, SecurityException { - Method method = PersonRepository.class.getMethod("findByLocationNear", Point.class, Distance.class, Distance.class); + Method method = PersonRepository.class.getMethod("findByLocationNear", Point.class, Range.class); MongoQueryMethod queryMethod = new MongoQueryMethod(method, metadata, context); Distance min = new Distance(10, Metrics.KILOMETERS); Distance max = new Distance(20, Metrics.KILOMETERS); MongoParameterAccessor accessor = new MongoParametersParameterAccessor(queryMethod, new Object[] { - new Point(10, 20), min, max }); + new Point(10, 20), Distance.between(min, max) }); - assertThat(accessor.getMinDistance(), is(min)); - assertThat(accessor.getMaxDistance(), is(max)); + Range range = accessor.getDistanceRange(); + + assertThat(range.getLowerBound(), is(min)); + assertThat(range.getUpperBound(), is(max)); } interface PersonRepository extends Repository { @@ -121,7 +124,7 @@ public class MongoParametersParameterAccessorUnitTests { List findByLocationNear(Point point, Distance distance); - List findByLocationNear(Point point, Distance minDistance, Distance maxDistance); + List findByLocationNear(Point point, Range distances); List findByFirstname(String firstname, TextCriteria fullText); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersUnitTests.java index 6b9fb6eca..e7468d4a1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersUnitTests.java @@ -25,6 +25,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.data.domain.Range; import org.springframework.data.geo.Distance; import org.springframework.data.geo.GeoResults; import org.springframework.data.geo.Point; @@ -50,7 +51,7 @@ public class MongoParametersUnitTests { MongoParameters parameters = new MongoParameters(method, false); assertThat(parameters.getNumberOfParameters(), is(2)); - assertThat(parameters.getMaxDistanceParameterIndex(), is(1)); + assertThat(parameters.getMaxDistanceIndex(), is(1)); assertThat(parameters.getBindableParameters().getNumberOfParameters(), is(1)); Parameter parameter = parameters.getParameter(1); @@ -127,11 +128,11 @@ public class MongoParametersUnitTests { @Test public void shouldFindMinAndMaxDistanceParameters() throws NoSuchMethodException, SecurityException { - Method method = PersonRepository.class.getMethod("findByLocationNear", Point.class, Distance.class, Distance.class); + Method method = PersonRepository.class.getMethod("findByLocationNear", Point.class, Range.class); MongoParameters parameters = new MongoParameters(method, false); - assertThat(parameters.getMinDistanceParameterIndex(), is(1)); - assertThat(parameters.getMaxDistanceParameterIndex(), is(2)); + assertThat(parameters.getRangeIndex(), is(1)); + assertThat(parameters.getMaxDistanceIndex(), is(-1)); } /** @@ -144,8 +145,8 @@ public class MongoParametersUnitTests { Method method = PersonRepository.class.getMethod("findByLocationNear", Point.class, Distance.class); MongoParameters parameters = new MongoParameters(method, false); - assertThat(parameters.getMinDistanceParameterIndex(), is(-1)); - assertThat(parameters.getMaxDistanceParameterIndex(), is(1)); + assertThat(parameters.getRangeIndex(), is(-1)); + assertThat(parameters.getMaxDistanceIndex(), is(1)); } interface PersonRepository { @@ -164,6 +165,6 @@ public class MongoParametersUnitTests { List findByNameAndText(String name, TextCriteria text); - List findByLocationNear(Point point, Distance min, Distance max); + List findByLocationNear(Point point, Range range); } } 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 6b8d6a3f1..06873b78c 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 @@ -36,6 +36,7 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; +import org.springframework.data.domain.Range; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; @@ -543,11 +544,10 @@ public class MongoQueryCreatorUnitTests { public void shouldCreateNearQueryForMinMaxDistance() { Point point = new Point(10, 20); - Distance min = new Distance(10); - Distance max = new Distance(20); + Range range = Distance.between(new Distance(10), new Distance(20)); PartTree tree = new PartTree("findByAddress_GeoNear", User.class); - MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, point, min, max), context); + MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, point, range), context); Query query = creator.createQuery(); assertThat(query, is(query(where("address.geo").near(point).minDistance(10D).maxDistance(20D)))); 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 a5909af80..654c9eef8 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 @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.Iterator; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Range; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Point; @@ -35,8 +36,7 @@ import org.springframework.data.repository.query.ParameterAccessor; class StubParameterAccessor implements MongoParameterAccessor { private final Object[] values; - private Distance distance; - private Distance minDistance; + private Range range = new Range(null, null); /** * Creates a new {@link ConvertingParameterAccessor} backed by a {@link StubParameterAccessor} simply returning the @@ -50,18 +50,16 @@ class StubParameterAccessor implements MongoParameterAccessor { return new ConvertingParameterAccessor(converter, new StubParameterAccessor(parameters)); } + @SuppressWarnings("unchecked") public StubParameterAccessor(Object... values) { this.values = values; for (Object value : values) { - if (value instanceof Distance) { - if (this.distance == null) { - this.distance = (Distance) value; - } else { - this.minDistance = this.distance; - this.distance = (Distance) value; - } + if (value instanceof Range) { + this.range = (Range) value; + } else if (value instanceof Distance) { + this.range = new Range(null, (Distance) value); } } } @@ -98,17 +96,13 @@ class StubParameterAccessor implements MongoParameterAccessor { return null; } - /* + /* * (non-Javadoc) - * @see org.springframework.data.mongodb.repository.MongoParameterAccessor#getMaxDistance() + * @see org.springframework.data.mongodb.repository.query.MongoParameterAccessor#getDistanceRange() */ - public Distance getMaxDistance() { - return distance; - } - @Override - public Distance getMinDistance() { - return minDistance; + public Range getDistanceRange() { + return range; } /*