From 588bc34bcf228d0575c995058cf93b9a562d2bd1 Mon Sep 17 00:00:00 2001 From: agrancaric Date: Fri, 20 Sep 2024 10:15:31 +0200 Subject: [PATCH] Fix issue with collection attributes not being recognized and using a join instead of exsits query by default --- .../nrich/search/parser/SearchDataParser.java | 2 +- .../support/JpaQueryBuilderTest.java | 18 ++++++++++++++++++ ...SearchRepositoryExecutorGeneratingUtil.java | 11 ++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/nrich-search/src/main/java/net/croz/nrich/search/parser/SearchDataParser.java b/nrich-search/src/main/java/net/croz/nrich/search/parser/SearchDataParser.java index c0e1370b..c2d3bcfe 100644 --- a/nrich-search/src/main/java/net/croz/nrich/search/parser/SearchDataParser.java +++ b/nrich-search/src/main/java/net/croz/nrich/search/parser/SearchDataParser.java @@ -92,7 +92,7 @@ private Set resolveRestrictionListInternal(MapSupportingDirectField } // element collections have null managed type but should be treated as plural attributes - boolean isCurrentAttributePlural = attributeHolder.isElementCollection() || isPluralAttribute; + boolean isCurrentAttributePlural = attributeHolder.isPlural() || attributeHolder.isElementCollection() || isPluralAttribute; restrictionList.add(createAttributeRestriction(attributeHolder.getAttribute().getJavaType(), originalFieldName, currentPath, value, isCurrentAttributePlural)); } diff --git a/nrich-search/src/test/java/net/croz/nrich/search/repository/support/JpaQueryBuilderTest.java b/nrich-search/src/test/java/net/croz/nrich/search/repository/support/JpaQueryBuilderTest.java index 0bf9d6a8..9e0c49b6 100644 --- a/nrich-search/src/test/java/net/croz/nrich/search/repository/support/JpaQueryBuilderTest.java +++ b/nrich-search/src/test/java/net/croz/nrich/search/repository/support/JpaQueryBuilderTest.java @@ -55,6 +55,7 @@ import java.util.List; import java.util.Map; +import static net.croz.nrich.search.repository.testutil.JpaSearchRepositoryExecutorGeneratingUtil.createTestEntityForCollectionSearch; import static net.croz.nrich.search.repository.testutil.JpaSearchRepositoryExecutorGeneratingUtil.createTestEntitySearchRequestJoin; import static net.croz.nrich.search.repository.testutil.JpaSearchRepositoryExecutorGeneratingUtil.generateListForSearch; import static net.croz.nrich.search.repository.testutil.JpaSearchRepositoryExecutorGeneratingUtil.generateTestEntityWithCustomIdList; @@ -872,6 +873,19 @@ void shouldSupportSubclassAttributeSearch() { assertThat(results).hasSize(1); } + @Test + void shouldCountCorrectlyWhenSearchingByCollection() { + // given + TestEntity entity = createTestEntityForCollectionSearch(entityManager); + Map requestMap = Map.of("name", entity.getName(), "collectionEntityList.name", "collection"); + + // when + Long result = executeCountQuery(requestMap, SearchConfiguration.emptyConfigurationWithDefaultMappingResolve()); + + // then + assertThat(result).isEqualTo(1L); + } + private List

executeQuery(R request, SearchConfiguration searchConfiguration) { return executeQuery(request, searchConfiguration, Sort.unsorted()); } @@ -879,4 +893,8 @@ private List

executeQuery(R request, SearchConfiguration List

executeQuery(R request, SearchConfiguration searchConfiguration, Sort sort) { return entityManager.createQuery(jpaQueryBuilder.buildQuery(request, searchConfiguration, sort)).getResultList(); } + + private Long executeCountQuery(R request, SearchConfiguration searchConfiguration) { + return entityManager.createQuery(jpaQueryBuilder.buildCountQuery(request, searchConfiguration)).getSingleResult(); + } } diff --git a/nrich-search/src/test/java/net/croz/nrich/search/repository/testutil/JpaSearchRepositoryExecutorGeneratingUtil.java b/nrich-search/src/test/java/net/croz/nrich/search/repository/testutil/JpaSearchRepositoryExecutorGeneratingUtil.java index 11529964..84942b53 100644 --- a/nrich-search/src/test/java/net/croz/nrich/search/repository/testutil/JpaSearchRepositoryExecutorGeneratingUtil.java +++ b/nrich-search/src/test/java/net/croz/nrich/search/repository/testutil/JpaSearchRepositoryExecutorGeneratingUtil.java @@ -35,7 +35,6 @@ import jakarta.persistence.criteria.JoinType; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -137,6 +136,16 @@ public static void generateTestSubEntityList(EntityManager entityManager) { }); } + public static TestEntity createTestEntityForCollectionSearch(EntityManager entityManager) { + TestEntity testEntity = createTestEntity(1, 3); + + testEntity.setName("CollectionSearchEntity"); + + entityManager.persist(testEntity); + + return testEntity; + } + private static TestEntity createTestEntity(Integer value, Integer numberOfCollectionEntities) { TestNestedEntity nestedEntity = createTestNestedEntity(value); List collectionEntityList = IntStream.range(0, numberOfCollectionEntities)