From 9acebfc58d252fe541eac1afc5ee083edcf140d4 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 13 Dec 2024 10:06:15 +0100 Subject: [PATCH 1/4] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index a0beb607ea..c09c242537 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 5.0.0-SNAPSHOT + 5.0.0-GH-4852-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index fc88571622..02d03b0db3 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -15,7 +15,7 @@ org.springframework.data spring-data-mongodb-parent - 5.0.0-SNAPSHOT + 5.0.0-GH-4852-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 595e5a4250..09b004fa5a 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 5.0.0-SNAPSHOT + 5.0.0-GH-4852-SNAPSHOT ../pom.xml From def31db5e93d1902d1c2f71b790a09b68f7624b9 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 13 Dec 2024 10:14:08 +0100 Subject: [PATCH 2/4] Document usage scope and effects of Meta annotation. --- .../org/springframework/data/mongodb/repository/Meta.java | 6 ++++++ .../org/springframework/data/mongodb/repository/Near.java | 4 ++-- .../ROOT/pages/mongodb/repositories/query-methods.adoc | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Meta.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Meta.java index 66c9bd786d..3b90056dc4 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Meta.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Meta.java @@ -24,6 +24,12 @@ import org.springframework.data.annotation.QueryAnnotation; /** + * Annotation to declare meta-information (execution time, cursor size, disk usage) for query methods. + *

+ * Annotating a repository method with this annotation forces the method to be implemented as query method (i.e. using + * this annotation on an overridden method from a base interface or fragment interface), similar to using + * {@link Query @Query}. + * * @author Christoph Strobl * @author Mark Paluch * @since 1.6 diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Near.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Near.java index f0da9965a3..68ba73834d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Near.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Near.java @@ -25,8 +25,8 @@ import org.springframework.data.geo.Point; /** - * Annotation to be used for disambiguing method parameters that shall be used to trigger geo near queries. By default - * those parameters are found without the need for additional annotation if they are the only parameters of the + * Annotation to be used for disambiguating method parameters that shall be used to trigger geo near queries. By + * default, those parameters are found without the need for additional annotation if they are the only parameters of the * according type (e.g. {@link Point}, {@code double[]}, {@link Distance}). * * @author Oliver Gierke diff --git a/src/main/antora/modules/ROOT/pages/mongodb/repositories/query-methods.adoc b/src/main/antora/modules/ROOT/pages/mongodb/repositories/query-methods.adoc index 8ae5065152..67ccb94e5d 100644 --- a/src/main/antora/modules/ROOT/pages/mongodb/repositories/query-methods.adoc +++ b/src/main/antora/modules/ROOT/pages/mongodb/repositories/query-methods.adoc @@ -205,6 +205,9 @@ lower / upper bounds (`$gt` / `$gte` & `$lt` / `$lte`) according to `Range` NOTE: If the property criterion compares a document, the order of the fields and exact equality in the document matters. +NOTE: In some scenarios, you might require additional options, such as a maximum run time, additional log comments, or the permission to temporarily write data to disk. +Use the `@Meta` annotation to set those options via `maxExecutionTimeMs`, `comment` or `allowDiskUse`. `@Meta` can only be used on repository query methods, not on base interface or fragment interface methods. + [[mongodb.repositories.queries.geo-spatial]] == Geo-spatial Queries @@ -443,7 +446,7 @@ public interface PersonRepository extends ReactiveMongoRepository Date: Fri, 26 Sep 2025 11:15:33 +0200 Subject: [PATCH 3/4] Allow Meta annotation usage for derived queries. We now allow applying Meta to derived queries without turning a derived query method into a annotated one. --- .../data/mongodb/repository/Meta.java | 7 ------- .../data/mongodb/repository/PersonRepository.java | 1 + .../query/PartTreeMongoQueryUnitTests.java | 13 ++++++++++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Meta.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Meta.java index 3b90056dc4..e64a6f25a0 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Meta.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Meta.java @@ -21,14 +21,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.springframework.data.annotation.QueryAnnotation; - /** * Annotation to declare meta-information (execution time, cursor size, disk usage) for query methods. - *

- * Annotating a repository method with this annotation forces the method to be implemented as query method (i.e. using - * this annotation on an overridden method from a base interface or fragment interface), similar to using - * {@link Query @Query}. * * @author Christoph Strobl * @author Mark Paluch @@ -37,7 +31,6 @@ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE }) @Documented -@QueryAnnotation public @interface Meta { /** 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 a9f694e200..dc1dbe2a92 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 @@ -63,6 +63,7 @@ public interface PersonRepository extends MongoRepository, Query * @param lastname * @return */ + @Meta List findByLastname(String lastname); List findByLastnameStartsWith(String prefix); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java index 07c10592d9..d88fc75fa1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java @@ -38,6 +38,7 @@ import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.query.TextCriteria; +import org.springframework.data.mongodb.repository.Meta; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Person; import org.springframework.data.mongodb.repository.Person.Sex; @@ -127,6 +128,12 @@ void doesNotDeriveFieldSpecForNormalDomainType() { assertThat(deriveQueryFromMethod("findPersonBy", new Object[0]).getFieldsObject()).isEmpty(); } + @Test // GH-4852 + void appliesMetaToPartTreeQuery() { + assertThat(deriveQueryFromMethod("findPersonBy", new Object[0]).getMeta() + .getMaxTimeMsec()).isEqualTo(1234L); + } + @Test // DATAMONGO-1345 void restrictsQueryToFieldsRequiredForProjection() { @@ -193,7 +200,10 @@ private org.springframework.data.mongodb.core.query.Query deriveQueryFromMethod( PartTreeMongoQuery partTreeQuery = createQueryForMethod(method, types); MongoParameterAccessor accessor = new MongoParametersParameterAccessor(partTreeQuery.getQueryMethod(), args); - return partTreeQuery.createQuery(new ConvertingParameterAccessor(mongoOperationsMock.getConverter(), accessor)); + + org.springframework.data.mongodb.core.query.Query query = partTreeQuery.createQuery(new ConvertingParameterAccessor(mongoOperationsMock.getConverter(), accessor)); + partTreeQuery.applyQueryMetaAttributesWhenPresent(query); + return query; } private PartTreeMongoQuery createQueryForMethod(String methodName, Class... paramTypes) { @@ -230,6 +240,7 @@ interface Repo extends MongoRepository { @Query(fields = "{ 'firstname }") Person findByAge(Integer age); + @Meta(maxExecutionTimeMs = 1234) Person findPersonBy(); PersonProjection findPersonProjectedBy(); From 4add66b17dad46ea56a629086c2813d23d474e36 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 26 Sep 2025 12:08:09 +0200 Subject: [PATCH 4/4] Upgrade to JDK 25. See spring-projects/spring-data-build#2667 --- Jenkinsfile | 10 +++++----- .../Dockerfile | 0 2 files changed, 5 insertions(+), 5 deletions(-) rename ci/{openjdk24-mongodb-8.0 => openjdk25-mongodb-8.0}/Dockerfile (100%) diff --git a/Jenkinsfile b/Jenkinsfile index ce2f272334..c4374cc651 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -20,10 +20,10 @@ pipeline { stages { stage("Docker images") { parallel { - stage('Publish JDK (Java 24) + MongoDB 8.0') { + stage('Publish JDK (Java 25) + MongoDB 8.0') { when { anyOf { - changeset "ci/openjdk24-mongodb-8.0/**" + changeset "ci/openjdk25-mongodb-8.0/**" changeset "ci/pipeline.properties" } } @@ -32,7 +32,7 @@ pipeline { steps { script { - def image = docker.build("springci/spring-data-with-mongodb-8.0:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.7.0.version']} ci/openjdk24-mongodb-8.0/") + def image = docker.build("springci/spring-data-with-mongodb-8.0:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg MONGODB=${p['docker.mongodb.7.0.version']} ci/openjdk25-mongodb-8.0/") docker.withRegistry(p['docker.registry'], p['docker.credentials']) { image.push() } @@ -42,7 +42,7 @@ pipeline { stage('Publish JDK (Java.next) + MongoDB 8.0') { when { anyOf { - changeset "ci/openjdk24-mongodb-8.0/**" + changeset "ci/openjdk25-mongodb-8.0/**" changeset "ci/pipeline.properties" } } @@ -51,7 +51,7 @@ pipeline { steps { script { - def image = docker.build("springci/spring-data-with-mongodb-8.0:${p['java.next.tag']}", "--build-arg BASE=${p['docker.java.next.image']} --build-arg MONGODB=${p['docker.mongodb.8.0.version']} ci/openjdk24-mongodb-8.0/") + def image = docker.build("springci/spring-data-with-mongodb-8.0:${p['java.next.tag']}", "--build-arg BASE=${p['docker.java.next.image']} --build-arg MONGODB=${p['docker.mongodb.8.0.version']} ci/openjdk25-mongodb-8.0/") docker.withRegistry(p['docker.registry'], p['docker.credentials']) { image.push() } diff --git a/ci/openjdk24-mongodb-8.0/Dockerfile b/ci/openjdk25-mongodb-8.0/Dockerfile similarity index 100% rename from ci/openjdk24-mongodb-8.0/Dockerfile rename to ci/openjdk25-mongodb-8.0/Dockerfile