Skip to content

Commit a19f2cb

Browse files
authored
Fix variable value conversion for array of values (#428)
1 parent 48d1ebd commit a19f2cb

File tree

3 files changed

+36
-10
lines changed

3 files changed

+36
-10
lines changed

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

+16-9
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import graphql.language.StringValue;
5454
import graphql.language.Value;
5555
import graphql.language.VariableReference;
56+
import graphql.schema.Coercing;
5657
import graphql.schema.DataFetchingEnvironment;
5758
import graphql.schema.GraphQLArgument;
5859
import graphql.schema.GraphQLFieldDefinition;
@@ -1509,24 +1510,30 @@ protected Object convertValue(DataFetchingEnvironment environment, Argument argu
15091510
// Return provided StringValue
15101511
return ((StringValue) value).getValue();
15111512
}
1512-
} else if (value instanceof VariableReference) {
1513+
} else if (value instanceof VariableReference variableReference) {
15131514
Class javaType = getJavaType(environment, argument);
1514-
Object argumentValue = environment.getVariables().get(VariableReference.class.cast(value).getName());
1515+
Object argumentValue = environment.getVariables().get(variableReference.getName());
1516+
15151517
if (javaType.isEnum()) {
1516-
if (argumentValue instanceof Collection) {
1518+
if (argumentValue instanceof Collection argumentValues) {
15171519
List<Enum> values = new ArrayList<>();
15181520

1519-
Collection.class.cast(argumentValue)
1520-
.forEach(it -> values.add(Enum.valueOf(javaType, it.toString())));
1521+
argumentValues.forEach(it -> values.add(Enum.valueOf(javaType, it.toString())));
1522+
15211523
return values;
15221524
} else {
15231525
return Enum.valueOf(javaType, argumentValue.toString());
15241526
}
15251527
} else {
1526-
// Get resolved variable in environment arguments
1527-
return javaType.isInstance(argumentValue)
1528-
? argumentValue
1529-
: JavaScalars.of(javaType).getCoercing().parseValue(argumentValue);
1528+
Coercing<?, ?> coercing = JavaScalars.of(javaType).getCoercing();
1529+
Function<Object, Object> valueConverter = it -> javaType.isInstance(it) ? it : coercing.parseValue(it);
1530+
1531+
if (argumentValue instanceof Collection<?> argumentValues) {
1532+
return argumentValues.stream().map(valueConverter).toList();
1533+
} else {
1534+
// Get resolved variable in environment arguments
1535+
return valueConverter.apply(argumentValue);
1536+
}
15301537
}
15311538
} else if (value instanceof ArrayValue) {
15321539
Collection arrayValue = environment.getArgument(argument.getName());

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ private Predicate getTypedPredicate(From<?, ?> from, Path<?> field, PredicateFil
746746
Class<?> type = filter.getJavaType();
747747
Object value = filter.getValue();
748748
Set<Criteria> criterias = filter.getCriterias();
749-
Attribute attribute = filter.getAttribute();
749+
Attribute<?, ?> attribute = filter.getAttribute();
750750

751751
if (value == null) {
752752
return cb.disjunction();

schema/src/test/java/com/introproventures/graphql/jpa/query/support/GraphQLExecutorTestsSupport.java

+19
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,25 @@ public void queryForThingByIdViaWhereIN() {
226226
assertThat(result.toString()).isEqualTo(expected);
227227
}
228228

229+
@Test
230+
public void queryForThingByIdViaWhereINVariables() {
231+
//given:
232+
233+
String query = "query things($ids: [UUID]!){ Things(where: {id: {IN: $ids}}) { select { id }}}";
234+
String expected = "{Things={select=[{id=2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1}]}}";
235+
236+
//when:
237+
Object result = executor
238+
.execute(
239+
query,
240+
Map.of("ids", List.of("2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1", "2d1ebc5b-7d27-4197-9cf0-e84451c5bbb1"))
241+
)
242+
.getData();
243+
244+
//then:
245+
assertThat(result.toString()).isEqualTo(expected);
246+
}
247+
229248
@SuppressWarnings({ "rawtypes", "unchecked", "serial" })
230249
@Test
231250
public void queryForThingByIdViaWhereNE() {

0 commit comments

Comments
 (0)