diff --git a/pom.xml b/pom.xml
index 15b2d67f47..99f208b69d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.3.0.BUILD-SNAPSHOT
+ 2.3.0.DATAMONGO-2394-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index c4766040c1..f6eb71a703 100644
--- a/spring-data-mongodb-benchmarks/pom.xml
+++ b/spring-data-mongodb-benchmarks/pom.xml
@@ -7,7 +7,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.3.0.BUILD-SNAPSHOT
+ 2.3.0.DATAMONGO-2394-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index ed39c63e76..25985fb21f 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.3.0.BUILD-SNAPSHOT
+ 2.3.0.DATAMONGO-2394-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 25cf02b5d5..02ab1295ad 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -11,7 +11,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.3.0.BUILD-SNAPSHOT
+ 2.3.0.DATAMONGO-2394-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/MetricConversion.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/MetricConversion.java
index 72e76b9977..f78bb850d6 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/MetricConversion.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/MetricConversion.java
@@ -29,7 +29,7 @@
* @author Mark Paluch
* @since 2.2
*/
-class MetricConversion {
+public class MetricConversion {
private static final BigDecimal METERS_MULTIPLIER = new BigDecimal(Metrics.KILOMETERS.getMultiplier())
.multiply(new BigDecimal(1000));
@@ -43,7 +43,7 @@ class MetricConversion {
* @param metric
* @return
*/
- protected static double getMetersToMetricMultiplier(Metric metric) {
+ public static double getMetersToMetricMultiplier(Metric metric) {
ConversionMultiplier conversionMultiplier = ConversionMultiplier.builder().from(METERS_MULTIPLIER).to(metric)
.build();
@@ -56,7 +56,7 @@ protected static double getMetersToMetricMultiplier(Metric metric) {
* @param distance
* @return
*/
- protected static double getDistanceInMeters(Distance distance) {
+ public static double getDistanceInMeters(Distance distance) {
return new BigDecimal(distance.getValue()).multiply(getMetricToMetersMultiplier(distance.getMetric()))
.doubleValue();
}
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 ae44999193..d9595ffd3e 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
@@ -36,11 +36,13 @@
import org.springframework.data.mapping.PersistentPropertyPath;
import org.springframework.data.mapping.PropertyPath;
import org.springframework.data.mapping.context.MappingContext;
+import org.springframework.data.mongodb.core.geo.GeoJson;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.CriteriaDefinition;
+import org.springframework.data.mongodb.core.query.MetricConversion;
import org.springframework.data.mongodb.core.query.MongoRegexCreator;
import org.springframework.data.mongodb.core.query.MongoRegexCreator.MatchMode;
import org.springframework.data.mongodb.core.query.Query;
@@ -235,8 +237,14 @@ private Criteria from(Part part, MongoPersistentProperty property, Criteria crit
criteria.near(pointToUse);
}
- criteria.maxDistance(it.getNormalizedValue());
- minDistance.ifPresent(min -> criteria.minDistance(min.getNormalizedValue()));
+ if(pointToUse instanceof GeoJson) { // using GeoJson distance is in meters.
+
+ criteria.maxDistance(MetricConversion.getDistanceInMeters(it));
+ minDistance.map(MetricConversion::getDistanceInMeters).ifPresent(min -> criteria.minDistance(min));
+ } else {
+ criteria.maxDistance(it.getNormalizedValue());
+ minDistance.ifPresent(min -> criteria.minDistance(min.getNormalizedValue()));
+ }
return criteria;
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateCollationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateCollationTests.java
index 70bf70777c..8950571c0c 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateCollationTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateCollationTests.java
@@ -60,6 +60,11 @@ public MongoClient mongoClient() {
protected String getDatabaseName() {
return "collation-tests";
}
+
+ @Override
+ protected boolean autoIndexCreation() {
+ return false;
+ }
}
@Autowired MongoTemplate template;
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java
index 92654379a4..da8ab558ee 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java
@@ -85,6 +85,11 @@ protected String getDatabaseName() {
return DB_NAME;
}
+ @Override
+ protected boolean autoIndexCreation() {
+ return false;
+ }
+
@Bean
MongoTransactionManager txManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateValidationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateValidationTests.java
index d0b68acf2e..1983634d06 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateValidationTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateValidationTests.java
@@ -74,6 +74,11 @@ public MongoClient mongoClient() {
protected String getDatabaseName() {
return "validation-tests";
}
+
+ @Override
+ protected boolean autoIndexCreation() {
+ return false;
+ }
}
@Autowired MongoTemplate template;
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/NoExplicitIdTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/NoExplicitIdTests.java
index 19a373068e..5e74309c05 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/NoExplicitIdTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/NoExplicitIdTests.java
@@ -59,6 +59,11 @@ protected String getDatabaseName() {
public MongoClient mongoClient() {
return MongoTestUtils.client();
}
+
+ @Override
+ protected boolean autoIndexCreation() {
+ return false;
+ }
}
@Autowired MongoOperations mongoOps;
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java
index d1fd286223..3f2ed4f531 100755
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java
@@ -30,11 +30,11 @@
import org.bson.types.Code;
import org.bson.types.ObjectId;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
@@ -69,7 +69,7 @@
* @author Christoph Strobl
* @author Mark Paluch
*/
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
public class QueryMapperUnitTests {
QueryMapper mapper;
@@ -78,8 +78,8 @@ public class QueryMapperUnitTests {
@Mock MongoDbFactory factory;
- @Before
- public void setUp() {
+ @BeforeEach
+ public void beforeEach() {
this.context = new MongoMappingContext();
@@ -890,6 +890,17 @@ public void findByIdUsesMappedIdFieldNameWithUnderscoreCorrectly() {
assertThat(target).isEqualTo(new org.bson.Document("_id", "id-1"));
}
+ @Test // DATAMONGO-2394
+ public void leavesDistanceUntouchedWhenUsingGeoJson() {
+
+ Query query = query(where("geoJsonPoint").near(new GeoJsonPoint(27.987901, 86.9165379)).maxDistance(1000));
+
+ org.bson.Document document = mapper.getMappedObject(query.getQueryObject(),
+ context.getPersistentEntity(ClassWithGeoTypes.class));
+ assertThat(document).containsEntry("geoJsonPoint.$near.$geometry.type", "Point");
+ assertThat(document).containsEntry("geoJsonPoint.$near.$maxDistance", 1000.0D);
+ }
+
@Document
public class Foo {
@Id private ObjectId id;
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 327da33a10..986aa46f38 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
@@ -27,9 +27,8 @@
import org.bson.Document;
import org.bson.types.ObjectId;
-import org.junit.Before;
-import org.junit.Test;
-
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.springframework.data.domain.Range;
import org.springframework.data.domain.Range.Bound;
import org.springframework.data.geo.Distance;
@@ -73,8 +72,8 @@ public class MongoQueryCreatorUnitTests {
MappingContext extends MongoPersistentEntity>, MongoPersistentProperty> context;
MongoConverter converter;
- @Before
- public void setUp() {
+ @BeforeEach
+ public void beforeEach() {
context = new MongoMappingContext();
@@ -652,6 +651,17 @@ public void betweenShouldAllowSingleRageParameter() {
assertThat(creator.createQuery()).isEqualTo(query(where("age").gt(10).lt(11)));
}
+ @Test // DATAMONGO-2394
+ public void nearShouldUseMetricDistanceForGeoJsonTypes() {
+
+ GeoJsonPoint point = new GeoJsonPoint(27.987901, 86.9165379);
+ PartTree tree = new PartTree("findByLocationNear", User.class);
+ MongoQueryCreator creator = new MongoQueryCreator(tree,
+ getAccessor(converter, point, new Distance(1, Metrics.KILOMETERS)), context);
+
+ assertThat(creator.createQuery()).isEqualTo(query(where("location").nearSphere(point).maxDistance(1000.0D)));
+ }
+
interface PersonRepository extends Repository {
List findByLocationNearAndFirstname(Point location, Distance maxDistance, String firstname);