Skip to content

Commit 53c84dc

Browse files
authored
feat(GH-208): added EQ_, NE_, STARTS_, LIKE_, ENDS_ case insensitive string match criteria #210
1 parent 08ab48e commit 53c84dc

File tree

4 files changed

+316
-25
lines changed

4 files changed

+316
-25
lines changed

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

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -511,16 +511,34 @@ private GraphQLInputType getWhereAttributeType(Attribute<?,?> attribute) {
511511
if(attribute.getJavaType().equals(String.class)) {
512512
builder.field(GraphQLInputObjectField.newInputObjectField()
513513
.name(Criteria.LIKE.name())
514-
.description("Like criteria")
514+
.description("Like criteria, case sensitive")
515515
.type(getAttributeInputType(attribute))
516516
.build()
517517
)
518+
.field(GraphQLInputObjectField.newInputObjectField()
519+
.name(Criteria.LIKE_.name())
520+
.description("Like criteria, case insensitive")
521+
.type(getAttributeInputType(attribute))
522+
.build()
523+
)
518524
.field(GraphQLInputObjectField.newInputObjectField()
519525
.name(Criteria.LOWER.name())
520526
.description("Case insensitive match criteria")
521527
.type(getAttributeInputType(attribute))
522528
.build()
523529
)
530+
.field(GraphQLInputObjectField.newInputObjectField()
531+
.name(Criteria.EQ_.name())
532+
.description("Case equals case insensitive match criteria")
533+
.type(getAttributeInputType(attribute))
534+
.build()
535+
)
536+
.field(GraphQLInputObjectField.newInputObjectField()
537+
.name(Criteria.NE_.name())
538+
.description("Not equals case insensitive match criteria")
539+
.type(getAttributeInputType(attribute))
540+
.build()
541+
)
524542
.field(GraphQLInputObjectField.newInputObjectField()
525543
.name(Criteria.CASE.name())
526544
.description("Case sensitive match criteria")
@@ -529,15 +547,27 @@ private GraphQLInputType getWhereAttributeType(Attribute<?,?> attribute) {
529547
)
530548
.field(GraphQLInputObjectField.newInputObjectField()
531549
.name(Criteria.STARTS.name())
532-
.description("Starts with criteria")
550+
.description("Starts with criteria, case sensitive")
533551
.type(getAttributeInputType(attribute))
534552
.build()
535553
)
554+
.field(GraphQLInputObjectField.newInputObjectField()
555+
.name(Criteria.STARTS_.name())
556+
.description("Starts with criteria, case insensitive")
557+
.type(getAttributeInputType(attribute))
558+
.build()
559+
)
536560
.field(GraphQLInputObjectField.newInputObjectField()
537561
.name(Criteria.ENDS.name())
538-
.description("Ends with criteria")
562+
.description("Ends with criteria, case sensitive")
539563
.type(getAttributeInputType(attribute))
540564
.build()
565+
)
566+
.field(GraphQLInputObjectField.newInputObjectField()
567+
.name(Criteria.ENDS_.name())
568+
.description("Ends with criteria, case insensitive")
569+
.type(getAttributeInputType(attribute))
570+
.build()
541571
);
542572
}
543573
else if (attribute.getJavaMember().getClass().isAssignableFrom(Field.class)

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

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.introproventures.graphql.jpa.query.schema.impl;
1818

19+
1920
import java.lang.reflect.Constructor;
2021
import java.math.BigDecimal;
2122
import java.math.BigInteger;
@@ -130,43 +131,47 @@ protected Predicate getStringPredicate(Path<String> root, PredicateFilter filter
130131
String compareValue = filter.getValue().toString();
131132
Expression<String> fieldValue = root;
132133

133-
if (filter.getCriterias().contains(PredicateFilter.Criteria.IN)) {
134-
CriteriaBuilder.In<Object> in = cb.in(root);
134+
if (filter.anyMatch(Criteria.EQ_, Criteria.NE_, Criteria.LIKE_, Criteria.STARTS_, Criteria.ENDS_, Criteria.LOWER)) {
135+
compareValue = compareValue.toLowerCase();
136+
fieldValue = cb.lower(fieldValue);
137+
};
138+
139+
if (filter.getCriterias().contains(Criteria.IN)) {
140+
CriteriaBuilder.In<Object> in = cb.in(fieldValue);
135141
return in.value(compareValue);
136142
}
137-
if (filter.getCriterias().contains(PredicateFilter.Criteria.NIN)) {
138-
return cb.not(root.in(compareValue));
143+
if (filter.getCriterias().contains(Criteria.NIN)) {
144+
return cb.not(fieldValue.in(compareValue));
139145
}
140146

141-
if (filter.getCriterias().contains(PredicateFilter.Criteria.EQ)) {
147+
if (filter.anyMatch(Criteria.EQ, Criteria.LOWER, Criteria.EQ_)) {
142148
return cb.equal(fieldValue, compareValue);
143149
}
144-
else if (filter.getCriterias().contains(PredicateFilter.Criteria.LOWER)) {
145-
return cb.equal(cb.lower(fieldValue),
146-
compareValue.toLowerCase());
147-
}
148-
else if (filter.getCriterias().contains(PredicateFilter.Criteria.NE)) {
150+
else if (filter.anyMatch(Criteria.NE, Criteria.NE_)) {
149151
return cb.notEqual(fieldValue, compareValue);
150152
}
151-
else if (filter.getCriterias().contains(PredicateFilter.Criteria.LIKE)) {
153+
else if (filter.anyMatch(Criteria.LIKE, Criteria.LIKE_)) {
152154
compareValue = "%" + compareValue + "%";
153155
}
154-
else if (filter.getCriterias().contains(PredicateFilter.Criteria.ENDS)) {
156+
else if (filter.anyMatch(Criteria.STARTS, Criteria.STARTS_)) {
157+
compareValue = compareValue + "%";
158+
}
159+
else if (filter.anyMatch(Criteria.ENDS, Criteria.ENDS_)) {
155160
compareValue = "%" + compareValue;
156161
}
157-
else if (filter.getCriterias().contains(PredicateFilter.Criteria.EXACT)) {
162+
else if (filter.anyMatch(Criteria.EXACT, Criteria.CASE)) {
158163
// do nothing
159-
}
160-
// STARTS or empty (default)
164+
} // default empty
161165
else {
162-
compareValue = compareValue + "%";
166+
compareValue = "%";
163167
}
168+
164169
return cb.like(fieldValue, compareValue);
165170
}
166171

167172
return arrayValuePredicate;
168173
}
169-
174+
170175
protected Predicate getBooleanPredicate(Path<?> root, PredicateFilter filter) {
171176
Boolean bool = (Boolean) filter.getValue();
172177
if (filter.getCriterias().contains(PredicateFilter.Criteria.NE)) {

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

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.EnumSet;
2121
import java.util.Set;
2222
import java.util.stream.Collectors;
23+
import java.util.stream.Stream;
2324

2425
class PredicateFilter implements Comparable<PredicateFilter>, Serializable {
2526

@@ -53,9 +54,13 @@ public enum Criteria {
5354
*/
5455
EQ,
5556
/**
56-
* not equal (numbers, dates, booleans)
57+
* not equal (numbers, dates, booleans, strings)
5758
*/
5859
NE,
60+
/**
61+
* not equal strings, case insensitive
62+
*/
63+
NE_,
5964
/**
6065
* case sensitive (strings)
6166
*/
@@ -64,21 +69,35 @@ public enum Criteria {
6469
* case insensitive match
6570
* <pre>LOWER(field) = LOWER(SEARCH)</pre>
6671
*/
67-
LOWER,
72+
LOWER, EQ_,
6873
/**
69-
* end of the string matches
74+
* end of the string matches, case sensitive
7075
*/
7176
ENDS,
7277
/**
73-
* beginning of string matches
78+
* end of the string matches, case insensitive
79+
*/
80+
ENDS_,
81+
/**
82+
* beginning of string matches, case sensitive
7483
* <pre>LIKE SEARCH%</pre>
7584
*/
7685
STARTS,
7786
/**
78-
* any part of the string matches
87+
* beginning of string matches, case insensitive
88+
* <pre>LIKE SEARCH%</pre>
89+
*/
90+
STARTS_,
91+
/**
92+
* any part of the string matches, case sensitive
7993
* <pre>LIKE %SEARCH%</pre>
8094
*/
8195
LIKE,
96+
/**
97+
* any part of the string matches, case insensitive
98+
* <pre>LIKE %SEARCH%</pre>
99+
*/
100+
LIKE_,
82101
/**
83102
* full string match =
84103
*/
@@ -151,4 +170,10 @@ public Set<Criteria> getCriterias() {
151170
public int compareTo(PredicateFilter o) {
152171
return this.getField().compareTo(o.getField());
153172
}
173+
174+
public boolean anyMatch(Criteria...criterias) {
175+
return Stream.of(criterias)
176+
.anyMatch(criteria -> this.getCriterias()
177+
.contains(criteria));
178+
}
154179
}

0 commit comments

Comments
 (0)