diff --git a/nrich-search-api/src/main/java/net/croz/nrich/search/api/model/operator/DefaultSearchOperator.java b/nrich-search-api/src/main/java/net/croz/nrich/search/api/model/operator/DefaultSearchOperator.java index 56bc681c..4debd4e7 100644 --- a/nrich-search-api/src/main/java/net/croz/nrich/search/api/model/operator/DefaultSearchOperator.java +++ b/nrich-search-api/src/main/java/net/croz/nrich/search/api/model/operator/DefaultSearchOperator.java @@ -22,6 +22,7 @@ import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Predicate; import java.util.Collection; +import java.util.Locale; import java.util.Objects; // TODO check if other operators are required @@ -95,6 +96,17 @@ public Predicate asPredicate(CriteriaBuilder criteriaBuilder, Path path, Obje ((Collection) value).forEach(inClause::value); + return inClause; + } + }, + + LOWER_IN { + @Override + public Predicate asPredicate(CriteriaBuilder criteriaBuilder, Path path, Object value) { + CriteriaBuilder.In inClause = criteriaBuilder.in(criteriaBuilder.lower((Expression) path)); + + ((Collection) value).forEach(item -> inClause.value(((String) item).toLowerCase(Locale.ROOT))); + return inClause; } } 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 846bc12b..0b233a50 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 @@ -601,6 +601,24 @@ void shouldSupportSearchingByPropertyList() { assertThat(results).hasSize(2); } + @Test + void shouldSupportSearchingByPropertyListUsingLowerOperator() { + // given + TestEntitySearchRequest request = new TestEntitySearchRequest(null); + request.setNameSearchList(List.of("firsT1", "First2")); + + SearchConfiguration searchConfiguration = SearchConfiguration.builder() + .searchOperatorOverrideList(List.of(SearchOperatorOverride.forPath("name", DefaultSearchOperator.LOWER_IN))) + .build(); + + + // when + List results = executeQuery(request, searchConfiguration); + + // then + assertThat(results).hasSize(2); + } + @Test void shouldIgnoreEmptyCollectionWhenSearching() { // given