From 39584cfd80508aafb511bd9c93064a2ca4da465b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C4=B1rat=20K=C3=9C=C3=87=C3=9CK?= Date: Thu, 24 Nov 2016 20:56:27 +0100 Subject: [PATCH 1/2] Count and Delete annotations added. --- .../data/mongodb/repository/Count.java | 46 +++++++++++++++++ .../data/mongodb/repository/Delete.java | 50 +++++++++++++++++++ ...tractPersonRepositoryIntegrationTests.java | 15 ++++++ .../mongodb/repository/PersonRepository.java | 19 +++++++ 4 files changed, 130 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 0000000000..28d4f78815 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Count.java @@ -0,0 +1,46 @@ +/* + * 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. + * + */ +@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 0000000000..287ccaa5a6 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Delete.java @@ -0,0 +1,50 @@ +/* + * 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. + * + * @author Oliver Gierke + * @author Thomas Darimont + * @author Christoph Strobl + * @author Mark Paluch + */ +@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 84bad2d14c..9545abd8bf 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 @@ -1311,4 +1311,19 @@ public void findsPersonsByFirstnameNotLike() throws Exception { assertThat(result, not(hasItem(boyd))); } + @Test + public void countsPersonsByFirstname() { + + long result = repository.countByThePersonsFirstname("Dave"); + assertThat(result, is(1L)); + } + + @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 f9f2f1fbb5..a936d363ef 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 @@ -367,4 +367,23 @@ Page findByCustomQueryLastnameAndAddressStreetInList(String lastname, Li */ @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. + * + * @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. + * + * @param firstname + */ + @Delete(value = "{ 'firstname' : ?0 }") + void deleteByThePersonsFirstname(String firstname); } From 07b6e2d9da73db7ba65d68ba19b9bd773a3051a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C4=B1rat=20K=C3=9C=C3=87=C3=9CK?= Date: Thu, 24 Nov 2016 21:04:06 +0100 Subject: [PATCH 2/2] Author fix for DATAMONGO-1539 --- .../springframework/data/mongodb/repository/Count.java | 3 +++ .../springframework/data/mongodb/repository/Delete.java | 7 +++---- .../AbstractPersonRepositoryIntegrationTests.java | 9 ++++++++- .../data/mongodb/repository/PersonRepository.java | 5 +++++ 4 files changed, 19 insertions(+), 5 deletions(-) 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 index 28d4f78815..b3b7aff69c 100644 --- 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 @@ -26,6 +26,9 @@ * 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 }) 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 index 287ccaa5a6..7c3de4bbdc 100644 --- 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 @@ -26,10 +26,9 @@ * 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. * - * @author Oliver Gierke - * @author Thomas Darimont - * @author Christoph Strobl - * @author Mark Paluch + * @see DATAMONGO-1539 + * + * @author Fırat KÜÇÜK */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE }) 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 9545abd8bf..f2189a1d50 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 @@ -65,6 +65,7 @@ * @author Thomas Darimont * @author Christoph Strobl * @author Mark Paluch + * @author Fırat KÜÇÜK */ @RunWith(SpringJUnit4ClassRunner.class) public abstract class AbstractPersonRepositoryIntegrationTests { @@ -1311,6 +1312,9 @@ public void findsPersonsByFirstnameNotLike() throws Exception { assertThat(result, not(hasItem(boyd))); } + /** + * @see DATAMONGO-1539 + */ @Test public void countsPersonsByFirstname() { @@ -1318,7 +1322,10 @@ public void countsPersonsByFirstname() { assertThat(result, is(1L)); } - @Test + /** + * @see DATAMONGO-1539 + */ + @Test public void deletesPersonsByFirstname() { repository.deleteByThePersonsFirstname("Dave"); 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 a936d363ef..fe98a3f695 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 @@ * @author Oliver Gierke * @author Thomas Darimont * @author Christoph Strobl + * @author Fırat KÜÇÜK */ public interface PersonRepository extends MongoRepository, QueryDslPredicateExecutor { @@ -372,6 +373,8 @@ Page findByCustomQueryLastnameAndAddressStreetInList(String lastname, Li * 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 */ @@ -382,6 +385,8 @@ Page findByCustomQueryLastnameAndAddressStreetInList(String lastname, Li * 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 }")