Skip to content

Commit 3921a3e

Browse files
committed
Minor optimization in QuerydslDataFetcher
Use single MultiValueMap in method that flattens arguments vs creating a new one at each level of recursion. See gh-1085
1 parent 2cafc7c commit 3921a3e

File tree

3 files changed

+12
-16
lines changed

3 files changed

+12
-16
lines changed

spring-graphql/src/main/java/org/springframework/graphql/data/query/QuerydslDataFetcher.java

+9-13
Original file line numberDiff line numberDiff line change
@@ -143,33 +143,29 @@ public String getDescription() {
143143
* @return the resulting predicate
144144
*/
145145
protected Predicate buildPredicate(DataFetchingEnvironment environment) {
146-
MultiValueMap<String, Object> parameters = new LinkedMultiValueMap<>();
147146
QuerydslBindings bindings = new QuerydslBindings();
148-
149147
EntityPath<?> path = SimpleEntityPathResolver.INSTANCE.createPath(this.domainType.getType());
150148
this.customizer.customize(bindings, path);
151149

152-
parameters.putAll(flatten(null, getArgumentValues(environment)));
150+
MultiValueMap<String, Object> parameters = new LinkedMultiValueMap<>();
151+
addParameters(null, getArgumentValues(environment), parameters);
153152

154153
return BUILDER.getPredicate(this.domainType, parameters, bindings);
155154
}
156155

157156
@SuppressWarnings("unchecked")
158-
private MultiValueMap<String, Object> flatten(@Nullable String prefix, Map<String, Object> inputParameters) {
159-
MultiValueMap<String, Object> parameters = new LinkedMultiValueMap<>();
157+
private void addParameters(
158+
@Nullable String prefix, Map<String, Object> arguments, MultiValueMap<String, Object> parameters) {
160159

161-
for (Map.Entry<String, Object> entry : inputParameters.entrySet()) {
160+
for (Map.Entry<String, Object> entry : arguments.entrySet()) {
162161
Object value = entry.getValue();
163162
if (value instanceof Map<?, ?> nested) {
164-
parameters.addAll(flatten(entry.getKey(), (Map<String, Object>) nested));
165-
}
166-
else {
167-
List<Object> values = (value instanceof List) ? (List<Object>) value : Collections.singletonList(value);
168-
parameters.put(((prefix != null) ? prefix + "." : "") + entry.getKey(), values);
163+
addParameters(entry.getKey(), (Map<String, Object>) nested, parameters);
164+
continue;
169165
}
166+
List<Object> values = (value instanceof List) ? (List<Object>) value : Collections.singletonList(value);
167+
parameters.put(((prefix != null) ? prefix + "." : "") + entry.getKey(), values);
170168
}
171-
172-
return parameters;
173169
}
174170

175171
/**

spring-graphql/src/test/java/org/springframework/graphql/data/query/QuerydslDataFetcherTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -346,13 +346,13 @@ void shouldNestForSingleArgumentInputType() {
346346
assertThat(books.get(0).getName()).isEqualTo(book1.getName());
347347
}
348348

349-
@Test
349+
@Test // gh-1081
350350
void shouldConsiderNestedArguments() {
351351
Book book1 = new Book(42L, "Hitchhiker's Guide to the Galaxy", new Author(0L, "Douglas", "Adams"));
352352
Book book2 = new Book(53L, "Breaking Bad", new Author(0L, "", "Heisenberg"));
353353
mockRepository.saveAll(Arrays.asList(book1, book2));
354354

355-
String queryName = "booksByNestableCriteria";
355+
String queryName = "booksByNestedCriteria";
356356

357357
Mono<ExecutionGraphQlResponse> responseMono =
358358
graphQlSetup(queryName, QuerydslDataFetcher.builder(mockRepository).many())

spring-graphql/src/test/resources/books/schema.graphqls

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ type Query {
22
bookById(id: ID): Book
33
booksById(id: [ID]): [Book]
44
books(id: ID, name: String, author: String): [Book!]!
5-
booksByNestableCriteria(id: ID, name: String, author: AuthorCriteria): [Book!]!
5+
booksByNestedCriteria(id: ID, name: String, author: AuthorCriteria): [Book!]!
66
booksByCriteria(criteria:BookCriteria): [Book]
77
booksByProjectedArguments(name: String, author: String): [Book]
88
booksByProjectedCriteria(criteria:BookCriteria): [Book]

0 commit comments

Comments
 (0)