diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java index 8e7708f55..c1f081c03 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java @@ -515,6 +515,12 @@ private GraphQLInputType getWhereAttributeType(Attribute attribute) { .type(getAttributeInputType(attribute)) .build() ) + .field(GraphQLInputObjectField.newInputObjectField() + .name(Criteria.LOWER.name()) + .description("Case insensitive match criteria") + .type(getAttributeInputType(attribute)) + .build() + ) .field(GraphQLInputObjectField.newInputObjectField() .name(Criteria.CASE.name()) .description("Case sensitive match criteria") diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java index f823e021a..1b79ed7bb 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java @@ -129,7 +129,7 @@ protected Predicate getStringPredicate(Path root, PredicateFilter filter if(arrayValuePredicate == null) { String compareValue = filter.getValue().toString(); Expression fieldValue = root; - + if (filter.getCriterias().contains(PredicateFilter.Criteria.IN)) { CriteriaBuilder.In in = cb.in(root); return in.value(compareValue); @@ -141,6 +141,10 @@ protected Predicate getStringPredicate(Path root, PredicateFilter filter if (filter.getCriterias().contains(PredicateFilter.Criteria.EQ)) { return cb.equal(fieldValue, compareValue); } + else if (filter.getCriterias().contains(PredicateFilter.Criteria.LOWER)) { + return cb.equal(cb.lower(fieldValue), + compareValue.toLowerCase()); + } else if (filter.getCriterias().contains(PredicateFilter.Criteria.NE)) { return cb.notEqual(fieldValue, compareValue); } diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/PredicateFilter.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/PredicateFilter.java index 8e7080ced..b4840ec39 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/PredicateFilter.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/PredicateFilter.java @@ -60,10 +60,13 @@ public enum Criteria { * case sensitive (strings) */ CASE, + /** + * case insensitive match + *
LOWER(field) = LOWER(SEARCH)
+ */ + LOWER, /** * end of the string matches - *
LOWER(field) LIKE LOWER(SEARCH)
if not set then case - * insensitive match */ ENDS, /** diff --git a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java index b909ff962..cc4a35591 100644 --- a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java +++ b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java @@ -1550,6 +1550,38 @@ public void queryWithEQMatchingCase() { assertThat(result.toString()).isEqualTo(expected); } + @Test + public void queryWithLOWERNotMatchingCase() { + //given: + String query = "query { Books ( where: { title: {LOWER: \"WAR AND PEACE\"}}) { select { id title} } }"; + + String expected = "{Books={select=[" + + "{id=2, title=War and Peace}" + + "]}}"; + + //when: + Object result = executor.execute(query).getData(); + + //then: + assertThat(result.toString()).isEqualTo(expected); + } + + @Test + public void queryWithLOWERMatchingCase() { + //given: + String query = "query { Books ( where: { title: {LOWER: \"War and Peace\"}}) { select { id title} } }"; + + String expected = "{Books={select=[" + + "{id=2, title=War and Peace}" + + "]}}"; + + //when: + Object result = executor.execute(query).getData(); + + //then: + assertThat(result.toString()).isEqualTo(expected); + } + @Test public void shouldNotReturnStaleCacheResultsFromPreviousQueryForCollectionCriteriaExpression() { //given: