Skip to content

Commit 6ff6992

Browse files
authored
feat(GH-204): added LOWER predicate for case insensitive match (#206)
1 parent 8f1e36c commit 6ff6992

File tree

4 files changed

+48
-3
lines changed

4 files changed

+48
-3
lines changed

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,12 @@ private GraphQLInputType getWhereAttributeType(Attribute<?,?> attribute) {
515515
.type(getAttributeInputType(attribute))
516516
.build()
517517
)
518+
.field(GraphQLInputObjectField.newInputObjectField()
519+
.name(Criteria.LOWER.name())
520+
.description("Case insensitive match criteria")
521+
.type(getAttributeInputType(attribute))
522+
.build()
523+
)
518524
.field(GraphQLInputObjectField.newInputObjectField()
519525
.name(Criteria.CASE.name())
520526
.description("Case sensitive match criteria")

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ protected Predicate getStringPredicate(Path<String> root, PredicateFilter filter
129129
if(arrayValuePredicate == null) {
130130
String compareValue = filter.getValue().toString();
131131
Expression<String> fieldValue = root;
132-
132+
133133
if (filter.getCriterias().contains(PredicateFilter.Criteria.IN)) {
134134
CriteriaBuilder.In<Object> in = cb.in(root);
135135
return in.value(compareValue);
@@ -141,6 +141,10 @@ protected Predicate getStringPredicate(Path<String> root, PredicateFilter filter
141141
if (filter.getCriterias().contains(PredicateFilter.Criteria.EQ)) {
142142
return cb.equal(fieldValue, compareValue);
143143
}
144+
else if (filter.getCriterias().contains(PredicateFilter.Criteria.LOWER)) {
145+
return cb.equal(cb.lower(fieldValue),
146+
compareValue.toLowerCase());
147+
}
144148
else if (filter.getCriterias().contains(PredicateFilter.Criteria.NE)) {
145149
return cb.notEqual(fieldValue, compareValue);
146150
}

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/PredicateFilter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,13 @@ public enum Criteria {
6060
* case sensitive (strings)
6161
*/
6262
CASE,
63+
/**
64+
* case insensitive match
65+
* <pre>LOWER(field) = LOWER(SEARCH)</pre>
66+
*/
67+
LOWER,
6368
/**
6469
* end of the string matches
65-
* <pre>LOWER(field) LIKE LOWER(SEARCH)</pre> if not set then case
66-
* insensitive match
6770
*/
6871
ENDS,
6972
/**

graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,38 @@ public void queryWithEQMatchingCase() {
15501550
assertThat(result.toString()).isEqualTo(expected);
15511551
}
15521552

1553+
@Test
1554+
public void queryWithLOWERNotMatchingCase() {
1555+
//given:
1556+
String query = "query { Books ( where: { title: {LOWER: \"WAR AND PEACE\"}}) { select { id title} } }";
1557+
1558+
String expected = "{Books={select=[" +
1559+
"{id=2, title=War and Peace}" +
1560+
"]}}";
1561+
1562+
//when:
1563+
Object result = executor.execute(query).getData();
1564+
1565+
//then:
1566+
assertThat(result.toString()).isEqualTo(expected);
1567+
}
1568+
1569+
@Test
1570+
public void queryWithLOWERMatchingCase() {
1571+
//given:
1572+
String query = "query { Books ( where: { title: {LOWER: \"War and Peace\"}}) { select { id title} } }";
1573+
1574+
String expected = "{Books={select=[" +
1575+
"{id=2, title=War and Peace}" +
1576+
"]}}";
1577+
1578+
//when:
1579+
Object result = executor.execute(query).getData();
1580+
1581+
//then:
1582+
assertThat(result.toString()).isEqualTo(expected);
1583+
}
1584+
15531585
@Test
15541586
public void shouldNotReturnStaleCacheResultsFromPreviousQueryForCollectionCriteriaExpression() {
15551587
//given:

0 commit comments

Comments
 (0)