From cb071ce05feb91ff3741776142afd764bddf8574 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 27 Feb 2014 14:47:18 +0100 Subject: [PATCH] DATAMONGO-829 - NearQuery should not default 'num' to zero. NearQuery now ignores query.getLimit() equal to zero, when adding Query to NearQuery. This has to be done as limit is defaulted to zero within Query which then results in unintended propagation of the parameter. In case 'num' should be explicitly set to zero one might use 'NearQuery.num(0)' as an alternative to the query approach. Introduced 'null' check for 'NearQuery.query(Query)' and 'NearQuery.with(Pageable)' along the way. Original Pull Request: #133 --- .../data/mongodb/core/query/NearQuery.java | 14 ++++++-- .../data/mongodb/core/DBObjectUtils.java | 2 +- .../core/query/NearQueryUnitTests.java | 36 ++++++++++++++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/NearQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/NearQuery.java index c000d4e32..ace202e65 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/NearQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/NearQuery.java @@ -31,6 +31,7 @@ import com.mongodb.DBObject; * * @author Oliver Gierke * @author Thomas Darimont + * @author Christoph Strobl */ public class NearQuery { @@ -143,10 +144,12 @@ public class NearQuery { /** * Configures the {@link Pageable} to use. * - * @param pageable + * @param pageable must not be {@literal null} * @return */ public NearQuery with(Pageable pageable) { + + Assert.notNull(pageable, "Pageable must not be 'null'."); this.num = pageable.getOffset() + pageable.getPageSize(); this.skip = pageable.getOffset(); return this; @@ -311,13 +314,18 @@ public class NearQuery { /** * Adds an actual query to the {@link NearQuery} to restrict the objects considered for the actual near operation. * - * @param query + * @param query must not be {@literal null}. * @return */ public NearQuery query(Query query) { + + Assert.notNull(query, "Cannot apply 'null' query on NearQuery."); this.query = query; this.skip = query.getSkip(); - this.num = query.getLimit(); + + if (query.getLimit() != 0) { + this.num = query.getLimit(); + } return this; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DBObjectUtils.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DBObjectUtils.java index a9be3ba3a..52bad476f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DBObjectUtils.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DBObjectUtils.java @@ -70,7 +70,7 @@ public abstract class DBObjectUtils { } @SuppressWarnings("unchecked") - private static T getTypedValue(DBObject source, String key, Class type) { + public static T getTypedValue(DBObject source, String key, Class type) { Object value = source.get(key); assertThat(value, is(notNullValue())); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/NearQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/NearQueryUnitTests.java index b97bf90d7..57f31dc93 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/NearQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/NearQueryUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2013 the original author or authors. + * Copyright 2011-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import static org.junit.Assert.*; import org.junit.Test; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.core.DBObjectUtils; import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.Metric; import org.springframework.data.mongodb.core.geo.Metrics; @@ -31,6 +32,7 @@ import org.springframework.data.mongodb.core.geo.Point; * * @author Oliver Gierke * @author Thomas Darimont + * @author Christoph Strobl */ public class NearQueryUnitTests { @@ -123,4 +125,36 @@ public class NearQueryUnitTests { assertThat(query.getSkip(), is(pageable.getPageNumber() * pageable.getPageSize())); assertThat((Integer) query.toDBObject().get("num"), is((pageable.getPageNumber() + 1) * pageable.getPageSize())); } + + /** + * @see DATAMONGO-829 + */ + @Test + public void nearQueryShouldInoreZeroLimitFromQuery() { + + NearQuery query = NearQuery.near(new Point(1, 2)).query(Query.query(Criteria.where("foo").is("bar"))); + assertThat(query.toDBObject().get("num"), nullValue()); + } + + /** + * @see DATAMONOGO-829 + */ + @Test(expected = IllegalArgumentException.class) + public void nearQueryShouldThrowExceptionWhenGivenANullQuery() { + NearQuery.near(new Point(1, 2)).query(null); + } + + /** + * @see DATAMONGO-829 + */ + @Test + public void numShouldNotBeAlteredByQueryWithoutPageable() { + + int num = 100; + NearQuery query = NearQuery.near(new Point(1, 2)); + query.num(num); + query.query(Query.query(Criteria.where("foo").is("bar"))); + + assertThat(DBObjectUtils.getTypedValue(query.toDBObject(), "num", Integer.class), is(num)); + } }