collectFields method

Map<String?, List<SelectionContext>> collectFields(
  1. DocumentContext document,
  2. GraphQLObjectType? objectType,
  3. SelectionSetContext selectionSet,
  4. Map<String?, dynamic> variableValues, {
  5. List? visitedFragments,
  6. 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;
}