Skip to content

Commit 82e24d1

Browse files
committed
feat: add UPPER and LOWER query predicate criteria options
1 parent be4e7b2 commit 82e24d1

File tree

5 files changed

+154
-499
lines changed

5 files changed

+154
-499
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,18 @@ private GraphQLInputType getWhereAttributeType(Attribute<?,?> attribute) {
521521
.type(getAttributeInputType(attribute))
522522
.build()
523523
)
524+
.field(GraphQLInputObjectField.newInputObjectField()
525+
.name(Criteria.UPPER.name())
526+
.description("Uppercase sensitive match criteria")
527+
.type(getAttributeInputType(attribute))
528+
.build()
529+
)
530+
.field(GraphQLInputObjectField.newInputObjectField()
531+
.name(Criteria.LOWER.name())
532+
.description("Lowercase sensitive match criteria")
533+
.type(getAttributeInputType(attribute))
534+
.build()
535+
)
524536
.field(GraphQLInputObjectField.newInputObjectField()
525537
.name(Criteria.STARTS.name())
526538
.description("Starts with criteria")

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

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
import java.util.ArrayList;
2929
import java.util.Collection;
3030
import java.util.Date;
31-
import java.util.EnumSet;
31+
import java.util.HashMap;
32+
import java.util.Map;
3233
import java.util.Set;
3334
import java.util.UUID;
3435

@@ -73,24 +74,42 @@
7374
*
7475
*/
7576
class JpaPredicateBuilder {
77+
78+
public static final Map<Class<?>, Class<?>> WRAPPERS_TO_PRIMITIVES = new HashMap<Class<?>, Class<?>>();
79+
public static final Map<Class<?>, Class<?>> PRIMITIVES_TO_WRAPPERS = new HashMap<Class<?>, Class<?>>();
80+
81+
static {
82+
PRIMITIVES_TO_WRAPPERS.put(boolean.class, Boolean.class);
83+
PRIMITIVES_TO_WRAPPERS.put(byte.class, Byte.class);
84+
PRIMITIVES_TO_WRAPPERS.put(char.class, Character.class);
85+
PRIMITIVES_TO_WRAPPERS.put(double.class, Double.class);
86+
PRIMITIVES_TO_WRAPPERS.put(float.class, Float.class);
87+
PRIMITIVES_TO_WRAPPERS.put(int.class, Integer.class);
88+
PRIMITIVES_TO_WRAPPERS.put(long.class, Long.class);
89+
PRIMITIVES_TO_WRAPPERS.put(short.class, Short.class);
90+
PRIMITIVES_TO_WRAPPERS.put(void.class, Void.class);
91+
92+
WRAPPERS_TO_PRIMITIVES.put(Boolean.class, boolean.class);
93+
WRAPPERS_TO_PRIMITIVES.put(Byte.class, byte.class);
94+
WRAPPERS_TO_PRIMITIVES.put(Character.class, char.class);
95+
WRAPPERS_TO_PRIMITIVES.put(Double.class, double.class);
96+
WRAPPERS_TO_PRIMITIVES.put(Float.class, float.class);
97+
WRAPPERS_TO_PRIMITIVES.put(Integer.class, int.class);
98+
WRAPPERS_TO_PRIMITIVES.put(Long.class, long.class);
99+
WRAPPERS_TO_PRIMITIVES.put(Short.class, short.class);
100+
WRAPPERS_TO_PRIMITIVES.put(Void.class, void.class);
101+
}
102+
76103

77104
private final CriteriaBuilder cb;
78105

79-
private final EnumSet<Logical> globalOptions;
80-
81106
/**
82-
* Field name can be prepended with (comma separated list of local options)
83-
* if field is prepended with (), even without options, any global options
84-
* avoided and defaults are used.Defaults: for numbers and booleas -
85-
* equality; for strings case insensitive beginning matches; for dates
86-
* greater or equal;
87-
*
88-
* @param cb
89-
* @param globalOptions
107+
* Create JpaPredicateBuilder instance with CriteriaBuilder
108+
*
109+
* @param cb criteria builder instance
90110
*/
91-
public JpaPredicateBuilder(CriteriaBuilder cb, EnumSet<Logical> globalOptions) {
111+
public JpaPredicateBuilder(CriteriaBuilder cb) {
92112
this.cb = cb;
93-
this.globalOptions = globalOptions;
94113
}
95114

96115
protected Predicate addOrNull(Path<?> root, Predicate p) {
@@ -109,48 +128,43 @@ protected Predicate getStringPredicate(Path<String> root, PredicateFilter filter
109128
Predicate arrayValuePredicate = mayBeArrayValuePredicate(root, filter);
110129

111130
if(arrayValuePredicate == null) {
131+
// CASE sensitive by default
112132
String compareValue = filter.getValue().toString();
113133
Expression<String> fieldValue = root;
114134

115-
if (filter.getCriterias().contains(PredicateFilter.Criteria.IN)) {
116-
CriteriaBuilder.In<Object> in = cb.in(root);
117-
return in.value(compareValue);
118-
}
119-
if (filter.getCriterias().contains(PredicateFilter.Criteria.NIN)) {
120-
return cb.not(root.in(compareValue));
121-
}
122-
123-
if (filter.getCriterias().contains(PredicateFilter.Criteria.CASE)) {
124-
fieldValue = root;
125-
}
126-
else if (filter.getCriterias().contains(PredicateFilter.Criteria.LOWER)) {
135+
if (filter.getCriterias().contains(PredicateFilter.Criteria.LOWER)) {
127136
fieldValue = cb.lower(root);
128-
compareValue = compareValue.toLowerCase();
129137
}
130138
else if (filter.getCriterias().contains(PredicateFilter.Criteria.UPPER)) {
131139
fieldValue = cb.upper(root);
132-
compareValue = compareValue.toUpperCase();
133140
}
134-
135-
if (filter.getCriterias().contains(PredicateFilter.Criteria.EQ)) {
141+
142+
if (filter.getCriterias().contains(PredicateFilter.Criteria.IN)) {
143+
return cb.in(fieldValue).value(compareValue);
144+
}
145+
else if (filter.getCriterias().contains(PredicateFilter.Criteria.NIN)) {
146+
return cb.not(fieldValue.in(compareValue));
147+
}
148+
else if (filter.getCriterias().contains(PredicateFilter.Criteria.EQ)) {
136149
return cb.equal(fieldValue, compareValue);
137150
}
138151
else if (filter.getCriterias().contains(PredicateFilter.Criteria.NE)) {
139152
return cb.notEqual(fieldValue, compareValue);
140153
}
141-
else if (filter.getCriterias().contains(PredicateFilter.Criteria.LIKE)) {
154+
155+
if (filter.getCriterias().contains(PredicateFilter.Criteria.LIKE)) {
142156
compareValue = "%" + compareValue + "%";
143157
}
144158
else if (filter.getCriterias().contains(PredicateFilter.Criteria.ENDS)) {
145159
compareValue = "%" + compareValue;
146160
}
147-
else if (filter.getCriterias().contains(PredicateFilter.Criteria.EXACT)) {
148-
// do nothing
161+
else if (filter.getCriterias().contains(PredicateFilter.Criteria.STARTS)){
162+
compareValue = compareValue + "%";
149163
}
150-
// STARTS or empty (default)
151164
else {
152-
compareValue = compareValue + "%";
165+
// do nothing
153166
}
167+
154168
return cb.like(fieldValue, compareValue);
155169
}
156170

@@ -668,7 +682,7 @@ private Predicate getTypedPredicate(From<?,?> from, Path<?> field, PredicateFilt
668682
PredicateFilter predicateFilter = new PredicateFilter(filter.getField(), value, criterias);
669683

670684
if (type.isPrimitive())
671-
type = JpaQueryBuilder.PRIMITIVES_TO_WRAPPERS.get(type);
685+
type = PRIMITIVES_TO_WRAPPERS.get(type);
672686
if (type.equals(String.class)) {
673687
return getStringPredicate((Path<String>)field, filter);
674688
}

0 commit comments

Comments
 (0)