From 5650e35eb6c948c84ee5cd31e227a8efee952052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C4=B1rat=20KU=CC=88C=CC=A7U=CC=88K?= Date: Thu, 24 Nov 2016 20:56:27 +0100 Subject: [PATCH] DATAMONGO-1539 - Introduce @CountQuery and @DeleteQuery. Introducing dedicated annotations for manually defined count and delete queries to avoid misconfiguration and generally simplifying the declaration. Original pull request: 416. --- .../data/mongodb/repository/Count.java | 49 +++++++++++++++++++ .../data/mongodb/repository/Delete.java | 49 +++++++++++++++++++ ...tractPersonRepositoryIntegrationTests.java | 22 +++++++++ .../mongodb/repository/PersonRepository.java | 24 +++++++++ 4 files changed, 144 insertions(+) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Count.java create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Delete.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Count.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Count.java new file mode 100644 index 000000000..b3b7aff69 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Count.java @@ -0,0 +1,49 @@ +/* + * Copyright 2011-2016 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.repository; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.core.annotation.AliasFor; + +/** + * Annotation to declare finder count queries directly on repository methods. Both attributes allow using a placeholder + * notation of {@code ?0}, {@code ?1} and so on. + * + * @see DATAMONGO-1539 + * + * @author Fırat KÜÇÜK + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE }) +@Documented +@Query(count = true) +public @interface Count { + + /** + * Takes a MongoDB JSON string to define the actual query to be executed. This one will take precedence over the + * method name then. + * + * Alias for {@link Query#value}. + * + * @return + */ + @AliasFor(annotation = Query.class) + String value() default ""; +} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Delete.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Delete.java new file mode 100644 index 000000000..7c3de4bbd --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Delete.java @@ -0,0 +1,49 @@ +/* + * Copyright 2011-2016 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.repository; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.core.annotation.AliasFor; + +/** + * Annotation to declare finder delete queries directly on repository methods. Both attributes allow using a placeholder + * notation of {@code ?0}, {@code ?1} and so on. + * + * @see DATAMONGO-1539 + * + * @author Fırat KÜÇÜK + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE }) +@Documented +@Query(delete = true) +public @interface Delete { + + /** + * Takes a MongoDB JSON string to define the actual query to be executed. This one will take precedence over the + * method name then. + * + * Alias for {@link Query#value}. + * + * @return + */ + @AliasFor(annotation = Query.class) + String value() default ""; +} 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 506a5a76f..470a99054 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 @@ -64,6 +64,7 @@ import org.springframework.test.util.ReflectionTestUtils; * @author Thomas Darimont * @author Christoph Strobl * @author Mark Paluch + * @author Fırat KÜÇÜK */ @RunWith(SpringJUnit4ClassRunner.class) public abstract class AbstractPersonRepositoryIntegrationTests { @@ -1307,4 +1308,25 @@ public abstract class AbstractPersonRepositoryIntegrationTests { assertThat(result, not(hasItem(boyd))); } + /** + * @see DATAMONGO-1539 + */ + @Test + public void countsPersonsByFirstname() { + + long result = repository.countByThePersonsFirstname("Dave"); + assertThat(result, is(1L)); + } + + /** + * @see DATAMONGO-1539 + */ + @Test + public void deletesPersonsByFirstname() { + + repository.deleteByThePersonsFirstname("Dave"); + + long result = repository.countByThePersonsFirstname("Dave"); + assertThat(result, is(0L)); + } } 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 f9f2f1fbb..fe98a3f69 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 @@ -42,6 +42,7 @@ import org.springframework.data.repository.query.Param; * @author Oliver Gierke * @author Thomas Darimont * @author Christoph Strobl + * @author Fırat KÜÇÜK */ public interface PersonRepository extends MongoRepository, QueryDslPredicateExecutor { @@ -367,4 +368,27 @@ public interface PersonRepository extends MongoRepository, Query */ @Query("{ firstname : :#{#firstname}}") List findWithSpelByFirstnameForSpELExpressionWithParameterVariableOnly(@Param("firstname") String firstname); + + /** + * Returns the count of {@link Person} with the given firstname. Uses {@link Count} annotation to define the query + * to be executed. + * + * @see DATAMONGO-1539 + * + * @param firstname + * @return + */ + @Count(value = "{ 'firstname' : ?0 }") + long countByThePersonsFirstname(String firstname); + + /** + * Deletes {@link Person} entities with the given firstname. Uses {@link Delete} annotation to define the query + * to be executed. + * + * @see DATAMONGO-1539 + * + * @param firstname + */ + @Delete(value = "{ 'firstname' : ?0 }") + void deleteByThePersonsFirstname(String firstname); }