From f48178b8de0d9e91a9e37d56cb04e3fab92c9c44 Mon Sep 17 00:00:00 2001 From: agrancaric Date: Fri, 24 Nov 2023 08:47:54 +0100 Subject: [PATCH] Add support for resolving domain class from repository method to make AOP on repositories easier to work with --- .../nrich/search/api/repository/SearchExecutor.java | 6 ++++++ .../search/api/repository/StringSearchExecutor.java | 6 ++++++ .../nrich/search/repository/JpaSearchExecutor.java | 10 +++++++++- .../search/repository/JpaStringSearchExecutor.java | 12 ++++++++++-- .../search/repository/JpaSearchExecutorTest.java | 9 +++++++++ .../repository/JpaStringSearchExecutorTest.java | 9 +++++++++ 6 files changed, 49 insertions(+), 3 deletions(-) diff --git a/nrich-search-repository-api/src/main/java/net/croz/nrich/search/api/repository/SearchExecutor.java b/nrich-search-repository-api/src/main/java/net/croz/nrich/search/api/repository/SearchExecutor.java index 9e25db8af..6f340d9a5 100644 --- a/nrich-search-repository-api/src/main/java/net/croz/nrich/search/api/repository/SearchExecutor.java +++ b/nrich-search-repository-api/src/main/java/net/croz/nrich/search/api/repository/SearchExecutor.java @@ -101,4 +101,10 @@ public interface SearchExecutor { */ boolean exists(R request, SearchConfiguration searchConfiguration); + /** + * Returns repository domain class. + * + * @return repository domain class + */ + Class getDomainClass(); } diff --git a/nrich-search-repository-api/src/main/java/net/croz/nrich/search/api/repository/StringSearchExecutor.java b/nrich-search-repository-api/src/main/java/net/croz/nrich/search/api/repository/StringSearchExecutor.java index 64451e600..cf5291132 100644 --- a/nrich-search-repository-api/src/main/java/net/croz/nrich/search/api/repository/StringSearchExecutor.java +++ b/nrich-search-repository-api/src/main/java/net/croz/nrich/search/api/repository/StringSearchExecutor.java @@ -97,4 +97,10 @@ public interface StringSearchExecutor { */

boolean exists(String searchTerm, List propertyToSearchList, SearchConfiguration> searchConfiguration); + /** + * Returns repository domain class. + * + * @return repository domain class + */ + Class getDomainClass(); } diff --git a/nrich-search/src/main/java/net/croz/nrich/search/repository/JpaSearchExecutor.java b/nrich-search/src/main/java/net/croz/nrich/search/repository/JpaSearchExecutor.java index 0421b7587..d2214ddb9 100644 --- a/nrich-search/src/main/java/net/croz/nrich/search/repository/JpaSearchExecutor.java +++ b/nrich-search/src/main/java/net/croz/nrich/search/repository/JpaSearchExecutor.java @@ -42,11 +42,14 @@ public class JpaSearchExecutor implements SearchExecutor { private final EntityManager entityManager; + private final Class domainClass; + private final JpaQueryBuilder queryBuilder; public JpaSearchExecutor(EntityManager entityManager, JpaEntityInformation entityInformation) { this.entityManager = entityManager; - this.queryBuilder = new JpaQueryBuilder<>(entityManager, entityInformation.getJavaType()); + domainClass = entityInformation.getJavaType(); + queryBuilder = new JpaQueryBuilder<>(entityManager, entityInformation.getJavaType()); } @Override @@ -101,6 +104,11 @@ public boolean exists(R request, SearchConfiguration searchConfi return entityManager.createQuery(query).setMaxResults(1).getResultList().size() == 1; } + @Override + public Class getDomainClass() { + return domainClass; + } + private long executeCountQuery(R request, SearchConfiguration searchConfiguration) { CriteriaQuery countQuery = queryBuilder.buildCountQuery(request, searchConfiguration); diff --git a/nrich-search/src/main/java/net/croz/nrich/search/repository/JpaStringSearchExecutor.java b/nrich-search/src/main/java/net/croz/nrich/search/repository/JpaStringSearchExecutor.java index 0f1d2c4c3..d43fc98ea 100644 --- a/nrich-search/src/main/java/net/croz/nrich/search/repository/JpaStringSearchExecutor.java +++ b/nrich-search/src/main/java/net/croz/nrich/search/repository/JpaStringSearchExecutor.java @@ -46,6 +46,8 @@ public class JpaStringSearchExecutor implements StringSearchExecutor { private final EntityManager entityManager; + private final Class domainClass; + private final JpaQueryBuilder queryBuilder; private final ManagedType managedType; @@ -53,8 +55,9 @@ public class JpaStringSearchExecutor implements StringSearchExecutor { public JpaStringSearchExecutor(StringToEntityPropertyMapConverter stringToEntityPropertyMapConverter, EntityManager entityManager, JpaEntityInformation jpaEntityInformation) { this.stringToEntityPropertyMapConverter = stringToEntityPropertyMapConverter; this.entityManager = entityManager; - this.queryBuilder = new JpaQueryBuilder<>(entityManager, jpaEntityInformation.getJavaType()); - this.managedType = jpaEntityInformation.getRequiredIdAttribute().getDeclaringType(); + domainClass = jpaEntityInformation.getJavaType(); + queryBuilder = new JpaQueryBuilder<>(entityManager, jpaEntityInformation.getJavaType()); + managedType = jpaEntityInformation.getRequiredIdAttribute().getDeclaringType(); } @Override @@ -121,6 +124,11 @@ public

boolean exists(String searchTerm, List propertyToSearchList, return entityManager.createQuery(query).setMaxResults(1).getResultList().size() == 1; } + @Override + public Class getDomainClass() { + return domainClass; + } + private Map convertToMap(String searchTerm, List propertyToSearchList, SearchConfiguration> searchConfiguration) { return stringToEntityPropertyMapConverter.convert(searchTerm, propertyToSearchList, managedType, searchConfiguration.getSearchPropertyConfiguration()); } diff --git a/nrich-search/src/test/java/net/croz/nrich/search/repository/JpaSearchExecutorTest.java b/nrich-search/src/test/java/net/croz/nrich/search/repository/JpaSearchExecutorTest.java index da00dc6c5..70a0807b7 100644 --- a/nrich-search/src/test/java/net/croz/nrich/search/repository/JpaSearchExecutorTest.java +++ b/nrich-search/src/test/java/net/croz/nrich/search/repository/JpaSearchExecutorTest.java @@ -262,4 +262,13 @@ void shouldReturnFalseWhenEntityDoesntExist() { // then assertThat(result).isFalse(); } + + @Test + void shouldReturnDomainClass() { + // when + Class result = testEntitySearchRepository.getDomainClass(); + + // then + assertThat(result).isEqualTo(TestEntity.class); + } } diff --git a/nrich-search/src/test/java/net/croz/nrich/search/repository/JpaStringSearchExecutorTest.java b/nrich-search/src/test/java/net/croz/nrich/search/repository/JpaStringSearchExecutorTest.java index cfa08e1fa..fcf4facce 100644 --- a/nrich-search/src/test/java/net/croz/nrich/search/repository/JpaStringSearchExecutorTest.java +++ b/nrich-search/src/test/java/net/croz/nrich/search/repository/JpaStringSearchExecutorTest.java @@ -172,4 +172,13 @@ void shouldFindByRangeQuery() { // then assertThat(result).isEqualTo(3); } + + @Test + void shouldReturnDomainClass() { + // when + Class result = testEntityStringSearchRepository.getDomainClass(); + + // then + assertThat(result).isEqualTo(TestStringSearchEntity.class); + } }