Skip to content

Commit 6401f12

Browse files
committed
PR feedback - added getImmediate fields
1 parent 1dc1d7a commit 6401f12

3 files changed

Lines changed: 67 additions & 4 deletions

File tree

src/main/java/graphql/schema/DataFetchingFieldSelectionSet.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,16 @@ public interface DataFetchingFieldSelectionSet {
146146
*/
147147
List<SelectedField> getFields();
148148

149+
/**
150+
* This will return all selected fields that are immediate child fields
151+
* of the field being fetched.
152+
* <p>
153+
* The fields are guaranteed to be in pre-order as they appear in the query.
154+
*
155+
* @return a list of all selected immediate child fields or empty list if none match
156+
*/
157+
List<SelectedField> getImmediateFields();
158+
149159
/**
150160
* This will return a list of selected fields that match a specified "glob" pattern matching ie
151161
* the glob pattern matching supported by {@link java.nio.file.FileSystem#getPathMatcher}.

src/main/java/graphql/schema/DataFetchingFieldSelectionSetImpl.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ public List<SelectedField> getFields() {
5151
return emptyList();
5252
}
5353

54+
@Override
55+
public List<SelectedField> getImmediateFields() {
56+
return emptyList();
57+
}
58+
5459
@Override
5560
public List<SelectedField> getFields(String fieldGlobPattern, String... fieldGlobPatterns) {
5661
return Collections.emptyList();
@@ -79,6 +84,7 @@ public static DataFetchingFieldSelectionSet newCollector(GraphQLOutputType field
7984
private final Supplier<NormalizedField> normalizedFieldSupplier;
8085

8186
private boolean computedValues;
87+
private List<SelectedField> immediateFields;
8288
private Map<String, List<SelectedField>> normalisedSelectionSetFields;
8389
private Set<String> flattenedFieldsForGlobSearching;
8490

@@ -159,6 +165,12 @@ public List<SelectedField> getFields() {
159165
.collect(toList());
160166
}
161167

168+
@Override
169+
public List<SelectedField> getImmediateFields() {
170+
computeValuesLazily();
171+
return immediateFields;
172+
}
173+
162174
@Override
163175
public Map<String, List<SelectedField>> getFieldsGroupedByResultKey() {
164176
return getFields().stream().collect(Collectors.groupingBy(SelectedField::getResultKey));
@@ -179,13 +191,14 @@ private void computeValuesLazily() {
179191
}
180192
flattenedFieldsForGlobSearching = new LinkedHashSet<>();
181193
normalisedSelectionSetFields = new LinkedHashMap<>();
182-
traverseSubSelectedFields(normalizedFieldSupplier.get(), "", "");
194+
immediateFields = new ArrayList<>();
195+
traverseSubSelectedFields(normalizedFieldSupplier.get(), "", "", true);
183196
computedValues = true;
184197
}
185198
}
186199

187200

188-
private void traverseSubSelectedFields(NormalizedField currentNormalisedField, String qualifiedFieldPrefix, String simpleFieldPrefix) {
201+
private void traverseSubSelectedFields(NormalizedField currentNormalisedField, String qualifiedFieldPrefix, String simpleFieldPrefix, boolean firstLevel) {
189202
List<NormalizedField> children = currentNormalisedField.getChildren();
190203
for (NormalizedField normalizedSubSelectedField : children) {
191204

@@ -200,13 +213,16 @@ private void traverseSubSelectedFields(NormalizedField currentNormalisedField, S
200213
flattenedFieldsForGlobSearching.add(globSimpleName);
201214

202215
SelectedFieldImpl selectedField = new SelectedFieldImpl(globSimpleName, globQualifiedName, normalizedSubSelectedField);
216+
if (firstLevel) {
217+
immediateFields.add(selectedField);
218+
}
203219
normalisedSelectionSetFields.computeIfAbsent(globQualifiedName, newList()).add(selectedField);
204220
normalisedSelectionSetFields.computeIfAbsent(globSimpleName, newList()).add(selectedField);
205221

206222
GraphQLFieldDefinition fieldDefinition = normalizedSubSelectedField.getFieldDefinition();
207223
GraphQLType unwrappedType = GraphQLTypeUtil.unwrapAll(fieldDefinition.getType());
208224
if (!GraphQLTypeUtil.isLeaf(unwrappedType)) {
209-
traverseSubSelectedFields(normalizedSubSelectedField, globQualifiedName, globSimpleName);
225+
traverseSubSelectedFields(normalizedSubSelectedField, globQualifiedName, globSimpleName, false);
210226
}
211227
}
212228
}

src/test/groovy/graphql/schema/DataFetchingFieldSelectionSetImplTest.groovy

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,10 +740,47 @@ class DataFetchingFieldSelectionSetImplTest extends Specification {
740740

741741
then:
742742
selectedFields.size() == 3
743-
assertTheyAreExpected(selectedFields,["Bird.name", "Cat.name", "Dog.name"])
743+
assertTheyAreExpected(selectedFields, ["Bird.name", "Cat.name", "Dog.name"])
744744

745745
}
746746

747+
def "immediate fields can be found at all levels"() {
748+
when:
749+
def query = '''
750+
{
751+
pet {
752+
name
753+
... on Dog {
754+
woof
755+
}
756+
... on Cat {
757+
meow
758+
}
759+
lead {
760+
material
761+
}
762+
}
763+
}
764+
'''
765+
def ei = ExecutionInput.newExecutionInput(query).build()
766+
def er = petSchema.execute(ei)
767+
then:
768+
er.errors.isEmpty()
769+
when:
770+
def selectedFields = petSelectionSet.getImmediateFields()
771+
then:
772+
assertTheyAreExpected(selectedFields, [
773+
"Bird.lead", "Bird.name",
774+
"Cat.lead", "Cat.meow", "Cat.name",
775+
"Dog.lead", "Dog.name", "Dog.woof"])
776+
777+
when:
778+
selectedFields = petSelectionSet.getFields("lead")
779+
selectedFields = selectedFields[0].getSelectionSet().getImmediateFields()
780+
then:
781+
assertTheyAreExpected(selectedFields, ["Lead.material"])
782+
}
783+
747784
def "simple fields do not have selection sets"() {
748785
when:
749786
def query = '''

0 commit comments

Comments
 (0)