Skip to content

Commit 3f313bd

Browse files
authored
Enable variable mapping to page arguments (#67)
* fix: make consistent ordering by name for failing tests * fix: Pagination start/limit from variables
1 parent 518ad1d commit 3f313bd

File tree

3 files changed

+54
-35
lines changed

3 files changed

+54
-35
lines changed

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

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
import graphql.language.Argument;
3636
import graphql.language.BooleanValue;
3737
import graphql.language.Field;
38-
import graphql.language.IntValue;
39-
import graphql.language.ObjectValue;
4038
import graphql.schema.DataFetchingEnvironment;
4139
import graphql.schema.DataFetchingEnvironmentImpl;
4240
import graphql.schema.GraphQLObjectType;
@@ -191,21 +189,28 @@ private Page extractPageArgument(DataFetchingEnvironment environment, Field fiel
191189
field.getArguments()
192190
.remove(paginationRequest.get());
193191

194-
ObjectValue paginationValues = (ObjectValue) paginationRequest.get().getValue();
192+
Map<String, Integer> pagex = environment.getArgument(GraphQLJpaSchemaBuilder.PAGE_PARAM_NAME);
195193

196-
IntValue page = (IntValue) paginationValues.getObjectFields().stream()
197-
.filter(it -> GraphQLJpaSchemaBuilder.PAGE_START_PARAM_NAME.equals(it.getName()))
198-
.findFirst()
199-
.get()
200-
.getValue();
201-
202-
IntValue size = (IntValue) paginationValues.getObjectFields().stream()
203-
.filter(it -> GraphQLJpaSchemaBuilder.PAGE_LIMIT_PARAM_NAME.equals(it.getName()))
204-
.findFirst()
205-
.get()
206-
.getValue();
194+
Integer start = pagex.get(GraphQLJpaSchemaBuilder.PAGE_START_PARAM_NAME);
195+
Integer limit = pagex.get(GraphQLJpaSchemaBuilder.PAGE_LIMIT_PARAM_NAME);
207196

208-
return new Page(page.getValue().intValue(), size.getValue().intValue());
197+
return new Page(start, limit);
198+
199+
// ObjectValue paginationValues = (ObjectValue) paginationRequest.get().getValue();
200+
//
201+
// IntValue page = (IntValue) paginationValues.getObjectFields().stream()
202+
// .filter(it -> GraphQLJpaSchemaBuilder.PAGE_START_PARAM_NAME.equals(it.getName()))
203+
// .findFirst()
204+
// .get()
205+
// .getValue();
206+
//
207+
// IntValue size = (IntValue) paginationValues.getObjectFields().stream()
208+
// .filter(it -> GraphQLJpaSchemaBuilder.PAGE_LIMIT_PARAM_NAME.equals(it.getName()))
209+
// .findFirst()
210+
// .get()
211+
// .getValue();
212+
//
213+
// return new Page(page.getValue().intValue(), size.getValue().intValue());
209214
}
210215

211216
return new Page(1, Integer.MAX_VALUE);

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

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,9 @@ public void queryOneToManyJoinByID() {
150150
//given:
151151
String query = "query { Humans(where:{id:{EQ: \"1000\"}}) { select {name, homePlanet, friends { name } } }}";
152152

153-
154153
String expected = "{Humans={select=["
155-
+ "{name=Luke Skywalker, homePlanet=Tatooine, friends=[{name=R2-D2}, {name=C-3PO}, {name=Han Solo}, {name=Leia Organa}]}"
156-
+ "]}}";
157-
158-
154+
+ "{name=Luke Skywalker, homePlanet=Tatooine, friends=[{name=C-3PO}, {name=Han Solo}, {name=Leia Organa}, {name=R2-D2}]}"
155+
+ "]}}";
159156

160157
//when:
161158
Object result = executor.execute(query).getData();
@@ -233,10 +230,10 @@ public void queryDeepNesting() {
233230
String query = "query { Droid(id: \"2001\") { name, friends { name, appearsIn, friends { name } } } }";
234231

235232
String expected = "{Droid={name=R2-D2, friends=["
236-
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2}, {name=Leia Organa}, {name=Luke Skywalker}]}, "
237-
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2}, {name=C-3PO}, {name=Han Solo}, {name=Leia Organa}]}, "
238-
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2}, {name=C-3PO}, {name=Han Solo}, {name=Luke Skywalker}]}"
239-
+ "]}}";
233+
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=Leia Organa}, {name=Luke Skywalker}, {name=R2-D2}]}, "
234+
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO}, {name=Han Solo}, {name=Luke Skywalker}, {name=R2-D2}]}, "
235+
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO}, {name=Han Solo}, {name=Leia Organa}, {name=R2-D2}]}"
236+
+ "]}}";
240237

241238
//when:
242239
Object result = executor.execute(query).getData();
@@ -252,11 +249,11 @@ public void queryDeepNestingPlural() {
252249
String query = "query { Droids(where: {id: {EQ: \"2001\"}}) { select { name, friends { name, appearsIn, friends { name } } } }}";
253250

254251
String expected = "{Droids={select=[{name=R2-D2, friends=["
255-
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2}, {name=Leia Organa}, {name=Luke Skywalker}]}, "
256-
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2}, {name=C-3PO}, {name=Han Solo}, {name=Leia Organa}]}, "
257-
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2}, {name=C-3PO}, {name=Han Solo}, {name=Luke Skywalker}]}"
258-
+ "]}"
259-
+ "]}}";
252+
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=Leia Organa}, {name=Luke Skywalker}, {name=R2-D2}]}, "
253+
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO}, {name=Han Solo}, {name=Luke Skywalker}, {name=R2-D2}]}, "
254+
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO}, {name=Han Solo}, {name=Leia Organa}, {name=R2-D2}]}"
255+
+ "]"
256+
+ "}]}}";
260257

261258
//when:
262259
Object result = executor.execute(query).getData();
@@ -298,6 +295,25 @@ public void queryWhereRoot() {
298295
//then:
299296
assertThat(result.toString()).isEqualTo(expected);
300297
}
298+
299+
@Test
300+
public void queryWhereRootPagedWithVariables() {
301+
//given:
302+
String query = "query($start: Int, $limit: Int) { Humans( page: { start: $start, limit: $limit }) { pages, total, select { name } } }";
303+
Map<String, Object> variables = new HashMap<String, Object>() {{
304+
put("start", 1);
305+
put("limit", 2);
306+
}};
307+
308+
309+
String expected = "{Humans={pages=3, total=5, select=[{name=Luke Skywalker}, {name=Darth Vader}]}}";
310+
311+
//when:
312+
Object result = executor.execute(query,variables).getData();
313+
314+
//then:
315+
assertThat(result.toString()).isEqualTo(expected);
316+
}
301317

302318
@Test
303319
public void queryPaginationWithoutRecords() {
@@ -513,12 +529,10 @@ public void queryWithTypenameDeepNesting() {
513529
String query = "query { Droid(id: \"2001\") { name, friends { name, appearsIn, friends { name __typename } __typename } __typename } }";
514530

515531
String expected = "{Droid={name=R2-D2, friends=["
516-
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2, __typename=Character}, "
517-
+ "{name=Leia Organa, __typename=Character}, {name=Luke Skywalker, __typename=Character}], __typename=Character}, "
518-
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2, __typename=Character}, {name=C-3PO, __typename=Character}, {name=Han Solo, __typename=Character}, {name=Leia Organa, __typename=Character}], __typename=Character}, {name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2, __typename=Character}, {name=C-3PO, __typename=Character}, {name=Han Solo, __typename=Character}, {name=Luke Skywalker, __typename=Character}], __typename=Character}], "
519-
+ "__typename=Droid}}";
532+
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=Leia Organa, __typename=Character}, {name=Luke Skywalker, __typename=Character}, {name=R2-D2, __typename=Character}], __typename=Character}, "
533+
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO, __typename=Character}, {name=Han Solo, __typename=Character}, {name=Luke Skywalker, __typename=Character}, {name=R2-D2, __typename=Character}], __typename=Character}, "
534+
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO, __typename=Character}, {name=Han Solo, __typename=Character}, {name=Leia Organa, __typename=Character}, {name=R2-D2, __typename=Character}], __typename=Character}], __typename=Droid}}";
520535

521-
522536
//when:
523537
Object result = executor.execute(query).getData();
524538

graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/model/starwars/Character.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import javax.persistence.OrderBy;
3131

3232
import com.introproventures.graphql.jpa.query.annotation.GraphQLDescription;
33-
3433
import lombok.EqualsAndHashCode;
3534
import lombok.Getter;
3635
import lombok.Setter;
@@ -56,6 +55,7 @@ public abstract class Character {
5655
@JoinTable(name="character_friends",
5756
joinColumns=@JoinColumn(name="source_id", referencedColumnName="id"),
5857
inverseJoinColumns=@JoinColumn(name="friend_id", referencedColumnName="id"))
58+
@OrderBy("name ASC")
5959
Set<Character> friends;
6060

6161
@GraphQLDescription("What Star Wars episodes does this character appear in")

0 commit comments

Comments
 (0)