Skip to content

Commit d6099a6

Browse files
authored
Simplify ResultStreamWrapper to use native Java stream iterator (#432)
* Refactor ResultStreamWrapper to use native Java stream iterator * Optimize wrapped result stream effective size
1 parent fd329f1 commit d6099a6

File tree

2 files changed

+6
-33
lines changed

2 files changed

+6
-33
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static graphql.introspection.Introspection.SchemaMetaFieldDef;
2727
import static graphql.introspection.Introspection.TypeMetaFieldDef;
2828
import static graphql.introspection.Introspection.TypeNameMetaFieldDef;
29+
import static java.lang.Integer.min;
2930
import static java.util.stream.Collectors.groupingBy;
3031

3132
import com.introproventures.graphql.jpa.query.annotation.GraphQLDefaultOrderBy;
@@ -248,16 +249,17 @@ public List<Object> queryKeys(
248249
public List<Object> queryResultList(DataFetchingEnvironment environment, int maxResults, List<Object> keys) {
249250
// Let's execute query and get result as stream
250251
Stream<Object> resultStream = queryResultStream(environment, maxResults, keys);
252+
var size = keys.isEmpty() ? maxResults : min(keys.size(), maxResults);
251253
// Let's wrap stream into lazy list to pass it downstream
252-
return ResultStreamWrapper.wrap(resultStream, maxResults);
254+
return ResultStreamWrapper.wrap(resultStream, size);
253255
}
254256

255257
protected Stream<Object> queryResultStream(DataFetchingEnvironment environment, int maxResults, List<Object> keys) {
256258
MergedField queryField = resolveQueryField(environment.getField());
257259

258260
// Override query environment with associated entity object type and
259261
final DataFetchingEnvironment queryEnvironment = getQueryEnvironment(environment, queryField);
260-
final int fetchSize = Integer.min(maxResults, defaultFetchSize);
262+
final int fetchSize = min(maxResults, defaultFetchSize);
261263
final boolean isDistinct = resolveDistinctArgument(queryEnvironment.getField());
262264

263265
final TypedQuery<Object> query = getQuery(
@@ -280,7 +282,7 @@ protected <T> Stream<T> getResultStream(
280282
boolean isDistinct,
281283
EntityGraph<?> entityGraph
282284
) {
283-
// Let' try reduce overhead and disable all caching
285+
// Let's try to reduce overhead and disable all caching
284286
query.setHint(ORG_HIBERNATE_READ_ONLY, true);
285287
query.setHint(ORG_HIBERNATE_FETCH_SIZE, fetchSize);
286288
query.setHint(ORG_HIBERNATE_CACHEABLE, false);

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

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.lang.reflect.Method;
2121
import java.lang.reflect.Proxy;
2222
import java.util.Collection;
23-
import java.util.Iterator;
2423
import java.util.List;
2524
import java.util.stream.Stream;
2625

@@ -55,7 +54,7 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
5554
if ("size".equals(method.getName())) {
5655
return size;
5756
} else if ("iterator".equals(method.getName())) {
58-
return new ResultIteratorWrapper(stream.iterator(), size);
57+
return stream.limit(size).iterator();
5958
} else if ("equals".equals(method.getName())) {
6059
// Only consider equal when proxies are identical.
6160
return (proxy == args[0]);
@@ -67,33 +66,5 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
6766
}
6867
throw new UnsupportedOperationException(method + " is not supported");
6968
}
70-
71-
class ResultIteratorWrapper implements Iterator<T> {
72-
73-
final Iterator<T> delegate;
74-
final int size;
75-
int current = 0;
76-
77-
ResultIteratorWrapper(Iterator<T> delegate, int size) {
78-
this.delegate = delegate;
79-
this.size = size;
80-
}
81-
82-
@Override
83-
public boolean hasNext() {
84-
return (current < size) && delegate.hasNext();
85-
}
86-
87-
@Override
88-
public T next() {
89-
T result = delegate.next();
90-
91-
try {
92-
return result;
93-
} finally {
94-
current++;
95-
}
96-
}
97-
}
9869
}
9970
}

0 commit comments

Comments
 (0)