package graphql.schema; import graphql.execution.ExecutionContext; import graphql.execution.FieldCollector; import graphql.execution.FieldCollectorParameters; import graphql.language.Field; import java.util.Collections; import java.util.List; import java.util.Map; public class DataFetchingFieldSelectionSetImpl implements DataFetchingFieldSelectionSet { private final static DataFetchingFieldSelectionSet NOOP = Collections::emptyMap; public static DataFetchingFieldSelectionSet newCollector(ExecutionContext executionContext, GraphQLType fieldType, List<Field> fields) { if (fieldType instanceof GraphQLObjectType) { return new DataFetchingFieldSelectionSetImpl(executionContext, (GraphQLObjectType) fieldType, fields); } else { // we can only collect fields on object types. Scalars, Interfaces, Unions etc... cant be done. // we will be called back once they are resolved however return NOOP; } } private final FieldCollector fieldCollector; private final FieldCollectorParameters parameters; private final List<Field> fields; private DataFetchingFieldSelectionSetImpl(ExecutionContext executionContext, GraphQLObjectType fieldType, List<Field> fields) { this.fields = fields; this.fieldCollector = new FieldCollector(); this.parameters = FieldCollectorParameters. newParameters(executionContext.getGraphQLSchema(), fieldType) .fragments(executionContext.getFragmentsByName()) .variables(executionContext.getVariables()) .build(); } @Override public Map<String, List<Field>> get() { // by having a .get() method we get lazy evaluation. return fieldCollector.collectFields(parameters, fields); } }