collectFields method
Map<String?, List<SelectionContext>>
collectFields(
- DocumentContext document,
- GraphQLObjectType? objectType,
- SelectionSetContext selectionSet,
- Map<String?, dynamic> variableValues, {
- List? visitedFragments,
- GraphQLObjectType? parentType,
})
Implementation
Map<String?, List<SelectionContext>> collectFields(
DocumentContext document,
GraphQLObjectType? objectType,
SelectionSetContext selectionSet,
Map<String?, dynamic> variableValues,
{List? visitedFragments,
GraphQLObjectType? parentType}) {
var groupedFields = <String?, List<SelectionContext>>{};
visitedFragments ??= [];
for (var selection in selectionSet.selections) {
final field = selection.field;
if (field != null) {
if (getDirectiveValue('skip', 'if', field, variableValues) == true) {
continue;
}
if (getDirectiveValue('include', 'if', field, variableValues) ==
false) {
continue;
}
}
if (selection.field != null) {
var responseKey = selection.field!.fieldName.alias?.alias ??
selection.field!.fieldName.name;
var groupForResponseKey =
groupedFields.putIfAbsent(responseKey, () => []);
groupForResponseKey.add(selection);
} else if (selection.fragmentSpread != null) {
var fragmentSpreadName = selection.fragmentSpread!.name;
if (visitedFragments.contains(fragmentSpreadName)) continue;
visitedFragments.add(fragmentSpreadName);
var fragment = document.definitions
.whereType<FragmentDefinitionContext>()
.firstWhereOrNull((f) => f.name == fragmentSpreadName);
if (fragment == null) continue;
var fragmentType = fragment.typeCondition;
if (!doesFragmentTypeApply(objectType, fragmentType)) continue;
var fragmentSelectionSet = fragment.selectionSet;
var fragmentGroupFieldSet = collectFields(
document, objectType, fragmentSelectionSet, variableValues);
for (var responseKey in fragmentGroupFieldSet.keys) {
var fragmentGroup = fragmentGroupFieldSet[responseKey]!;
var groupForResponseKey =
groupedFields.putIfAbsent(responseKey, () => []);
groupForResponseKey.addAll(fragmentGroup);
}
} else if (selection.inlineFragment != null) {
var fragmentType = selection.inlineFragment!.typeCondition;
if (!doesFragmentTypeApply(objectType, fragmentType,
parentType: parentType)) continue;
var fragmentSelectionSet = selection.inlineFragment!.selectionSet;
var fragmentGroupFieldSet = collectFields(
document, objectType, fragmentSelectionSet, variableValues);
for (var responseKey in fragmentGroupFieldSet.keys) {
var fragmentGroup = fragmentGroupFieldSet[responseKey]!;
var groupForResponseKey =
groupedFields.putIfAbsent(responseKey, () => []);
groupForResponseKey.addAll(fragmentGroup);
}
}
}
return groupedFields;
}