public void ExtractField_WithCustomRewriters() { // arrange ISchema schema = Schema.Create( FileResource.Open("Stitching.graphql"), c => { c.RegisterType <DateTimeType>(); c.RegisterDirective <DelegateDirectiveType>(); c.RegisterDirective <ComputedDirectiveType>(); c.Use(next => context => Task.CompletedTask); }); DocumentNode query = Utf8GraphQLParser.Parse( FileResource.Open("StitchingQuery.graphql")); OperationDefinitionNode operation = query.Definitions .OfType <OperationDefinitionNode>().Single(); FieldNode selection = operation .SelectionSet.Selections .OfType <FieldNode>().First(); var rewriters = new List <IQueryDelegationRewriter> { new DummyRewriter() }; // act var rewriter = new ExtractFieldQuerySyntaxRewriter( schema, rewriters); ExtractedField extractedField = rewriter.ExtractField( "customer", query, operation, selection, schema.GetType <ObjectType>("Query")); // assert DocumentNode document = RemoteQueryBuilder.New() .SetRequestField(extractedField.Field) .AddFragmentDefinitions(extractedField.Fragments) .AddVariables(extractedField.Variables) .Build(); QuerySyntaxSerializer.Serialize(document) .MatchSnapshot(); }
private static IReadOnlyQueryRequest CreateQuery( IMiddlewareContext context, NameString schemaName, IImmutableStack <SelectionPathComponent> path) { var fieldRewriter = new ExtractFieldQuerySyntaxRewriter( context.Schema, context.Service <IEnumerable <IQueryDelegationRewriter> >()); OperationType operationType = context.Schema.IsRootType(context.ObjectType) ? context.Operation.Operation : OperationType.Query; ExtractedField extractedField = fieldRewriter.ExtractField( schemaName, context.Document, context.Operation, context.FieldSelection, context.ObjectType); IEnumerable <VariableValue> scopedVariables = ResolveScopedVariables( context, schemaName, operationType, path); IReadOnlyCollection <VariableValue> variableValues = CreateVariableValues( context, scopedVariables, extractedField); DocumentNode query = RemoteQueryBuilder.New() .SetOperation(operationType) .SetSelectionPath(path) .SetRequestField(extractedField.Field) .AddVariables(CreateVariableDefs(variableValues)) .AddFragmentDefinitions(extractedField.Fragments) .Build(); var requestBuilder = QueryRequestBuilder.New(); AddVariables(context, schemaName, requestBuilder, query, variableValues); requestBuilder.SetQuery(query); requestBuilder.AddProperty( WellKnownProperties.IsAutoGenerated, true); return(requestBuilder.Create()); }
public void ExtractField(string schemaFile, string queryFile) { // arrange ISchema schema = Schema.Create( FileResource.Open(schemaFile), c => { c.RegisterType <DateTimeType>(); c.RegisterDirective <DelegateDirectiveType>(); c.RegisterDirective <ComputedDirectiveType>(); c.Use(next => context => Task.CompletedTask); }); DocumentNode query = Parser.Default.Parse( FileResource.Open(queryFile)); OperationDefinitionNode operation = query.Definitions .OfType <OperationDefinitionNode>().Single(); FieldNode selection = operation .SelectionSet.Selections .OfType <FieldNode>().First(); // act var rewriter = new ExtractFieldQuerySyntaxRewriter(schema, Array.Empty <IQueryDelegationRewriter>()); ExtractedField extractedField = rewriter.ExtractField( "customer", query, operation, selection, schema.GetType <ObjectType>("Query")); // assert DocumentNode document = RemoteQueryBuilder.New() .SetRequestField(extractedField.Field) .AddFragmentDefinitions(extractedField.Fragments) .AddVariables(extractedField.Variables) .Build(); QuerySyntaxSerializer.Serialize(document) .MatchSnapshot(new SnapshotNameExtension( schemaFile, queryFile)); }