From e78519c0e64a1a17d7f177db700b8f05fb20d439 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 18 Oct 2019 09:30:40 +0200 Subject: [PATCH 1/4] DATAMONGO-2394 - Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 From afdcad9e8bd75c334c007be3de60444c53a779a3 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 16 Oct 2019 11:14:46 +0200 Subject: [PATCH 2/4] DATAMONGO-2394 - Fix test issues related to JUnit5 upgrade. Execution time and test order changed by using JUnit5. This commit fixes some of the issues related to index creation where actually not needed. --- .../data/mongodb/core/MongoTemplateCollationTests.java | 5 +++++ .../data/mongodb/core/MongoTemplateTransactionTests.java | 5 +++++ .../data/mongodb/core/MongoTemplateValidationTests.java | 5 +++++ .../springframework/data/mongodb/core/NoExplicitIdTests.java | 5 +++++ 4 files changed, 20 insertions(+) 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; From e38296906e962d77627d717bd930c079e55b9549 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 18 Oct 2019 10:53:34 +0200 Subject: [PATCH 3/4] DATAMONGO-2394 - Fix distance conversion for derived finder using near along with GeoJSON. GeoJson requries the distance to be in meters instead of radians, so we now make sure to convert it correctly --- .../data/mongodb/core/query/MetricConversion.java | 6 +++--- .../mongodb/repository/query/MongoQueryCreator.java | 12 ++++++++++-- .../mongodb/core/convert/QueryMapperUnitTests.java | 11 +++++++++++ .../repository/query/MongoQueryCreatorUnitTests.java | 11 +++++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) 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/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java index d1fd286223..db14d6bc12 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 @@ -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..3b83348b28 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 @@ -652,6 +652,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); From 7f39377fe767b2975f9a4318e0bfa32b0c8e0ea7 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 18 Oct 2019 12:44:04 +0200 Subject: [PATCH 4/4] DATAMONGO-2394 - Polishing. Move tests to JUnit Jupiter. --- .../mongodb/core/convert/QueryMapperUnitTests.java | 14 +++++++------- .../query/MongoQueryCreatorUnitTests.java | 9 ++++----- 2 files changed, 11 insertions(+), 12 deletions(-) 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 db14d6bc12..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(); 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 3b83348b28..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, MongoPersistentProperty> context; MongoConverter converter; - @Before - public void setUp() { + @BeforeEach + public void beforeEach() { context = new MongoMappingContext();