Skip to content

Commit 5dd999a

Browse files
authored
feat: support enum variable bindings in queries (#109)
Fixes #81
1 parent 8e9d409 commit 5dd999a

File tree

2 files changed

+228
-5
lines changed

2 files changed

+228
-5
lines changed

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

+20-5
Original file line numberDiff line numberDiff line change
@@ -540,12 +540,27 @@ protected Object convertValue(DataFetchingEnvironment environment, Argument argu
540540
return ((StringValue) value).getValue();
541541
}
542542
}
543-
else if (value instanceof VariableReference)
544-
// Get resolved variable in environment arguments
545-
return environment.getArguments().get(argument.getName());
546-
else if (value instanceof ArrayValue) {
543+
else if (value instanceof VariableReference) {
544+
Class javaType = getJavaType(environment, argument);
545+
Object argumentValue = environment.getArguments().get(argument.getName());
546+
if(javaType.isEnum()) {
547+
if(argumentValue instanceof Collection) {
548+
List<Enum> values = new ArrayList<>();
549+
550+
Collection.class.cast(argumentValue)
551+
.forEach(it -> values.add(Enum.valueOf(javaType, it.toString())));
552+
return values;
553+
} else {
554+
return Enum.valueOf(javaType, argumentValue.toString());
555+
}
556+
}
557+
else {
558+
// Get resolved variable in environment arguments
559+
return argumentValue;
560+
}
561+
} else if (value instanceof ArrayValue) {
547562
Object convertedValue = environment.getArgument(argument.getName());
548-
if (convertedValue != null) {
563+
if (convertedValue != null && !getJavaType(environment, argument).isEnum()) {
549564
// unwrap [[EnumValue{name='value'}]]
550565
if(convertedValue instanceof Collection
551566
&& ((Collection) convertedValue).stream().allMatch(it->it instanceof Collection)) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
/*
2+
* Copyright 2017 IntroPro Ventures Inc. and/or its affiliates.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.introproventures.graphql.jpa.query.schema;
18+
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
21+
import java.util.Arrays;
22+
import java.util.HashMap;
23+
import java.util.Map;
24+
25+
import javax.persistence.EntityManager;
26+
27+
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaExecutor;
28+
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder;
29+
import org.junit.Test;
30+
import org.junit.runner.RunWith;
31+
import org.springframework.beans.factory.annotation.Autowired;
32+
import org.springframework.boot.autoconfigure.SpringBootApplication;
33+
import org.springframework.boot.test.context.SpringBootTest;
34+
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
35+
import org.springframework.context.annotation.Bean;
36+
import org.springframework.test.context.TestPropertySource;
37+
import org.springframework.test.context.junit4.SpringRunner;
38+
39+
40+
@RunWith(SpringRunner.class)
41+
@SpringBootTest(webEnvironment=WebEnvironment.NONE)
42+
@TestPropertySource({"classpath:hibernate.properties"})
43+
public class GraphQLEnumVariableBindingsTests {
44+
45+
@SpringBootApplication
46+
static class Application {
47+
@Bean
48+
public GraphQLExecutor graphQLExecutor(final GraphQLSchemaBuilder graphQLSchemaBuilder) {
49+
return new GraphQLJpaExecutor(graphQLSchemaBuilder.build());
50+
}
51+
52+
@Bean
53+
public GraphQLSchemaBuilder graphQLSchemaBuilder(final EntityManager entityManager) {
54+
55+
return new GraphQLJpaSchemaBuilder(entityManager)
56+
.name("GraphQLBooks")
57+
.description("Books JPA test schema");
58+
}
59+
60+
}
61+
62+
@Autowired
63+
private GraphQLExecutor executor;
64+
65+
66+
@Test
67+
public void queryEnumSimpleVariableBinding() {
68+
//given
69+
String query = "query($genre: Genre) {" +
70+
" Books(where: {" +
71+
" genre: {EQ: $genre}" +
72+
" }) {" +
73+
" select {" +
74+
" id" +
75+
" title" +
76+
" genre" +
77+
" }" +
78+
" }" +
79+
"}";
80+
81+
Map<String, Object> variables = new HashMap<String, Object>() {{
82+
put("genre", "NOVEL");
83+
}};
84+
85+
86+
String expected = "{Books={select=["
87+
+ "{id=2, title=War and Peace, genre=NOVEL}, "
88+
+ "{id=3, title=Anna Karenina, genre=NOVEL}"
89+
+ "]}}";
90+
91+
//when
92+
Object result = executor.execute(query, variables).getData();
93+
94+
// then
95+
assertThat(result.toString()).isEqualTo(expected);
96+
}
97+
98+
@Test
99+
public void queryEnumSimpleArrayVariableBinding() {
100+
//given
101+
String query = "query($genre: Genre) {" +
102+
" Books(where: {" +
103+
" genre: {IN: [$genre]}" +
104+
" }) {" +
105+
" select {" +
106+
" id" +
107+
" title" +
108+
" genre" +
109+
" }" +
110+
" }" +
111+
"}";
112+
113+
Map<String, Object> variables = new HashMap<String, Object>() {{
114+
put("genre", "NOVEL");
115+
}};
116+
117+
118+
String expected = "{Books={select=["
119+
+ "{id=2, title=War and Peace, genre=NOVEL}, "
120+
+ "{id=3, title=Anna Karenina, genre=NOVEL}"
121+
+ "]}}";
122+
123+
//when
124+
Object result = executor.execute(query, variables).getData();
125+
126+
// then
127+
assertThat(result.toString()).isEqualTo(expected);
128+
}
129+
130+
@Test
131+
public void queryEnumArrayVariableBindingInNestedRelation() {
132+
//given
133+
String query = "query($genres: [Genre!]) {" +
134+
" Authors(where: {" +
135+
" books: {" +
136+
" genre: {IN: $genres}" +
137+
" }" +
138+
" }) {" +
139+
" select {" +
140+
" id" +
141+
" name" +
142+
" books {" +
143+
" id" +
144+
" title" +
145+
" genre" +
146+
" }" +
147+
" }" +
148+
" }" +
149+
"}";
150+
151+
Map<String, Object> variables = new HashMap<String, Object>() {{
152+
put("genres", Arrays.asList("NOVEL"));
153+
}};
154+
155+
156+
String expected = "{Authors={select=[{"
157+
+ "id=1, name=Leo Tolstoy, books=["
158+
+ "{id=2, title=War and Peace, genre=NOVEL}, "
159+
+ "{id=3, title=Anna Karenina, genre=NOVEL}"
160+
+ "]}"
161+
+ "]}}";
162+
163+
//when
164+
Object result = executor.execute(query, variables).getData();
165+
166+
// then
167+
assertThat(result.toString()).isEqualTo(expected);
168+
}
169+
170+
@Test
171+
public void queryEnumArrayVariableBindingInEmbeddedRelation() {
172+
//given
173+
String query = "query($genres: [Genre!]) {" +
174+
" Authors {" +
175+
" select {" +
176+
" id" +
177+
" name" +
178+
" books(where: {" +
179+
" genre: {IN: $genres}" +
180+
" }) {" +
181+
" id" +
182+
" title" +
183+
" genre" +
184+
" }" +
185+
" }" +
186+
" } " +
187+
"}";
188+
189+
Map<String, Object> variables = new HashMap<String, Object>() {{
190+
put("genres", Arrays.asList("NOVEL"));
191+
}};
192+
193+
194+
String expected = "{Authors={select=["
195+
+ "{id=1, name=Leo Tolstoy, books=["
196+
+ "{id=2, title=War and Peace, genre=NOVEL}, "
197+
+ "{id=3, title=Anna Karenina, genre=NOVEL}"
198+
+ "]}, "
199+
+ "{id=4, name=Anton Chekhov, books=[]}"
200+
+ "]}}";
201+
202+
//when
203+
Object result = executor.execute(query, variables).getData();
204+
205+
// then
206+
assertThat(result.toString()).isEqualTo(expected);
207+
}
208+
}

0 commit comments

Comments
 (0)