Skip to content

Commit b75e740

Browse files
czybaigdianov
authored andcommitted
Fix generated CriteriaExpression not working with UUIDs (#42)
* Fix generated CriteriaExpression not working with UUIDs * Add a test for where expressions not working with UUIDs * Add a test for checking IN values for UUIDs * Also check for IN when handling UUIDs * Remove unnecessary type constraints * [tests] Add a test for testing UUIDs in a where clause with NE as comparison operator.
1 parent d431dd1 commit b75e740

File tree

2 files changed

+85
-2
lines changed

2 files changed

+85
-2
lines changed

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.util.Date;
2323
import java.util.EnumSet;
2424
import java.util.Set;
25+
import java.util.UUID;
26+
2527

2628
import javax.persistence.criteria.CriteriaBuilder;
2729
import javax.persistence.criteria.Expression;
@@ -262,6 +264,29 @@ protected Predicate getDatePredicate(Path<? extends Date> root, PredicateFilter
262264
return null;
263265
}
264266

267+
private Predicate getUuidPredicate(Path<UUID> field, PredicateFilter filter) {
268+
if (filter.getValue() == null) {
269+
return null;
270+
}
271+
final Predicate arrayPredicate = mayBeArrayValuePredicate(field, filter);
272+
if (arrayPredicate != null) {
273+
return arrayPredicate;
274+
}
275+
final UUID compareValue = (UUID) filter.getValue();
276+
277+
if (filter.getCriterias().contains(PredicateFilter.Criteria.EQ)) {
278+
return cb.equal(field, compareValue);
279+
}
280+
if (filter.getCriterias().contains(PredicateFilter.Criteria.IN)) {
281+
final CriteriaBuilder.In<Object> in = cb.in(field);
282+
return in.value(compareValue);
283+
}
284+
if (filter.getCriterias().contains(PredicateFilter.Criteria.NE)) {
285+
return cb.notEqual(field, compareValue);
286+
}
287+
return null;
288+
}
289+
265290
@SuppressWarnings("unchecked")
266291
private Predicate getTypedPredicate(From<?,?> from, Path<?> field, PredicateFilter filter) {
267292
Class<?> type = field.getJavaType();
@@ -303,6 +328,9 @@ else if (type.equals(java.util.Date.class)) {
303328
else if (type.equals(Boolean.class)) {
304329
return getBooleanPredicate(field, predicateFilter);
305330
}
331+
else if (type.equals(UUID.class)) {
332+
return getUuidPredicate((Path<UUID>) field, predicateFilter);
333+
}
306334
else if(Collection.class.isAssignableFrom(type)) {
307335
if(field.getModel() == null)
308336
return from.join(filter.getField()).in(value);
@@ -324,4 +352,4 @@ else if(Collection.class.isAssignableFrom(type)) {
324352
public Predicate getPredicate(From<?,?> from, Path<?> field, PredicateFilter filter) {
325353
return getTypedPredicate(from, field, filter);
326354
}
327-
}
355+
}

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

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static org.assertj.core.api.Assertions.assertThat;
2020

2121
import java.util.HashMap;
22+
import java.util.UUID;
2223

2324
import javax.persistence.EntityManager;
2425

@@ -136,7 +137,61 @@ public void queryWithParameterNoResult() {
136137
//then:
137138
assertThat(result.toString()).isEqualTo(expected);
138139
}
139-
140+
141+
@SuppressWarnings( { "rawtypes", "unchecked", "serial" } )
142+
@Test
143+
public void queryForThingByIdViaWhere() {
144+
//given:
145+
146+
String query = "query { Things(where: {id: {EQ: \"2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1\"}}) { select { id }}}";
147+
String expected = "{Things={select=[{id=2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1}]}}";
148+
149+
//when:
150+
Object result = executor.execute(query).getData();
151+
152+
//then:
153+
assertThat(result.toString()).isEqualTo(expected);
154+
}
155+
156+
@SuppressWarnings( { "rawtypes", "unchecked", "serial" } )
157+
@Test
158+
public void queryForThingByIdViaWhereIN() {
159+
//given:
160+
161+
String query = "query { Things(where: {id: {IN: [\"2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1\", \"2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1\" ]}}) { select { id }}}";
162+
String expected = "{Things={select=[{id=2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1}]}}";
163+
164+
//when:
165+
Object result = executor.execute(query).getData();
166+
167+
//then:
168+
assertThat(result.toString()).isEqualTo(expected);
169+
}
170+
171+
@SuppressWarnings( { "rawtypes", "unchecked", "serial" } )
172+
@Test
173+
public void queryForThingByIdViaWhereNE() {
174+
//given:
175+
176+
String query = "query { Things(where: {id: {NE: \"2d1ebc5b-7d27-4197-9cf0-e84451c5bbb2\"}}) { select { id }}}";
177+
String expected = "{Things={select=[{id=2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1}]}}";
178+
179+
//when:
180+
Object result = executor.execute(query).getData();
181+
182+
//then:
183+
assertThat(result.toString()).isEqualTo(expected);
184+
185+
query = "query { Things(where: {id: {NE: \"2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1\"}}) { select { id }}}";
186+
expected = "{Things={select=[]}}";
187+
188+
//when:
189+
result = executor.execute(query).getData();
190+
191+
//then:
192+
assertThat(result.toString()).isEqualTo(expected);
193+
}
194+
140195
@Test
141196
public void queryWithAlias() {
142197
//given:

0 commit comments

Comments
 (0)