3
3
import static com .introproventures .graphql .jpa .query .support .GraphQLSupport .getSelectionField ;
4
4
import static com .introproventures .graphql .jpa .query .support .GraphQLSupport .searchByFieldName ;
5
5
6
+ import java .util .Collections ;
6
7
import java .util .List ;
7
8
import java .util .Optional ;
8
9
11
12
12
13
import com .introproventures .graphql .jpa .query .schema .impl .GraphQLJpaQueryFactory ;
13
14
import com .introproventures .graphql .jpa .query .schema .impl .PagedResult ;
14
-
15
15
import graphql .language .Field ;
16
16
import graphql .schema .DataFetcher ;
17
17
import graphql .schema .DataFetchingEnvironment ;
@@ -26,60 +26,64 @@ public class GraphQLJpaRelayDataFetcher implements DataFetcher<Page<Object>> {
26
26
27
27
private final int defaultMaxResults ;
28
28
private final int defaultFirstSize ;
29
+ private final boolean enableDefaultMaxResults ;
29
30
private final GraphQLJpaQueryFactory queryFactory ;
30
31
31
32
private GraphQLJpaRelayDataFetcher (Builder builder ) {
32
33
this .queryFactory = builder .queryFactory ;
33
34
this .defaultMaxResults = builder .defaultMaxResults ;
34
35
this .defaultFirstSize = builder .defaultFirstSize ;
36
+ this .enableDefaultMaxResults = builder .enableDefaultMaxResults ;
35
37
}
36
-
38
+
37
39
@ Override
38
40
public Page <Object > get (DataFetchingEnvironment environment ) throws Exception {
39
41
final Field rootNode = environment .getField ();
40
-
42
+
41
43
Optional <Field > edgesSelection = searchByFieldName (rootNode , EDGES );
42
44
Optional <Field > pageInfoSelection = getSelectionField (rootNode , PAGE_INFO );
43
-
44
- final Integer first = Optional .<Integer > ofNullable (environment .getArgument (FIRST ))
45
- . orElse ( defaultFirstSize );
46
-
47
- final String after = Optional .< String > ofNullable ( environment . getArgument ( AFTER ))
48
- .orElse (new OffsetBasedCursor (0L ).toConnectionCursor ()
45
+ Optional < Integer > firstArgument = Optional .< Integer > ofNullable ( environment . getArgument ( FIRST ));
46
+ Optional < String > afterArgument = Optional .<String > ofNullable (environment .getArgument (AFTER ));
47
+
48
+ final Integer first = firstArgument . orElse ( defaultFirstSize );
49
+
50
+ final String after = afterArgument .orElse (new OffsetBasedCursor (0L ).toConnectionCursor ()
49
51
.toString ());
50
52
51
53
final OffsetBasedCursor cursor = OffsetBasedCursor .fromCursor (after );
52
-
54
+
53
55
final int firstResult = Integer .parseInt (Long .toString (cursor .getOffset ()));
54
56
final int maxResults = Integer .min (first , defaultMaxResults );
55
-
57
+
56
58
final PagedResult .Builder <Object > pagedResult = PagedResult .builder ()
57
59
.withOffset (firstResult )
58
60
.withLimit (maxResults );
59
-
61
+
60
62
if (edgesSelection .isPresent ()) {
61
- final List <Object > keys = queryFactory .queryKeys (environment ,
62
- firstResult ,
63
- maxResults );
64
- if (!keys .isEmpty ()) {
65
- final List <Object > resultList = queryFactory .queryResultList (environment ,
66
- maxResults ,
67
- keys );
68
- pagedResult .withSelect (resultList );
63
+ List <Object > keys = Collections .emptyList ();
64
+
65
+ if (enableDefaultMaxResults || firstArgument .isPresent () || afterArgument .isPresent ()) {
66
+ keys = queryFactory .queryKeys (environment ,
67
+ firstResult ,
68
+ maxResults );
69
69
}
70
+
71
+ final List <Object > resultList = queryFactory .queryResultList (environment ,
72
+ maxResults ,
73
+ keys );
74
+ pagedResult .withSelect (resultList );
70
75
}
71
-
76
+
72
77
if (pageInfoSelection .isPresent ()) {
73
-
74
78
final Long total = queryFactory .queryTotalCount (environment );
75
79
76
80
pagedResult .withTotal (total );
77
81
}
78
-
82
+
79
83
PagedResult <Object > result = pagedResult .build ();
80
-
81
- return PageFactory .createOffsetBasedPage (result .getSelect (),
82
- result .getTotal (),
84
+
85
+ return PageFactory .createOffsetBasedPage (result .getSelect (),
86
+ result .getTotal (),
83
87
result .getOffset ());
84
88
}
85
89
@@ -114,7 +118,14 @@ public interface IDefaultMaxResultsStage {
114
118
* @param defaultMaxResults field to set
115
119
* @return builder
116
120
*/
117
- public IDefaultFirstSizeStage withDefaultMaxResults (int defaultMaxResults );
121
+ public IDefaultMaxResultsStage withDefaultMaxResults (int defaultMaxResults );
122
+
123
+ /**
124
+ * Builder method for enableDefaultMaxResults parameter.
125
+ * @param enableDefaultMaxResults field to set
126
+ * @return builder
127
+ */
128
+ public IDefaultFirstSizeStage withEnableDefaultMaxResults (boolean enableDefaultMaxResults );
118
129
}
119
130
120
131
/**
@@ -150,6 +161,7 @@ public static final class Builder implements IQueryFactoryStage, IDefaultMaxResu
150
161
private GraphQLJpaQueryFactory queryFactory ;
151
162
private int defaultMaxResults ;
152
163
private int defaultFirstSize ;
164
+ private boolean enableDefaultMaxResults ;
153
165
154
166
private Builder () {
155
167
}
@@ -161,7 +173,7 @@ public IDefaultMaxResultsStage withQueryFactory(GraphQLJpaQueryFactory queryFact
161
173
}
162
174
163
175
@ Override
164
- public IDefaultFirstSizeStage withDefaultMaxResults (int defaultMaxResults ) {
176
+ public IDefaultMaxResultsStage withDefaultMaxResults (int defaultMaxResults ) {
165
177
this .defaultMaxResults = defaultMaxResults ;
166
178
return this ;
167
179
}
@@ -176,6 +188,12 @@ public IBuildStage withDefaultFirstSize(int defaultFirstSize) {
176
188
public GraphQLJpaRelayDataFetcher build () {
177
189
return new GraphQLJpaRelayDataFetcher (this );
178
190
}
191
+
192
+ @ Override
193
+ public IDefaultFirstSizeStage withEnableDefaultMaxResults (boolean enableDefaultMaxResults ) {
194
+ this .enableDefaultMaxResults = enableDefaultMaxResults ;
195
+ return this ;
196
+ }
179
197
}
180
198
181
199
}
0 commit comments