private static IEnumerable <Delegation.VariableValue> ResolveUsedRequestVariables( ISchema schema, NameString schemaName, ExtractedField extractedField, IReadOnlyDictionary <string, IValueNode> requestVariables, ExtractFieldQuerySyntaxRewriter rewriter) { foreach (VariableDefinitionNode variable in extractedField.Variables) { string name = variable.Variable.Name.Value; INamedInputType namedType = schema.GetType <INamedInputType>( variable.Type.NamedType().Name.Value); if (!requestVariables.TryGetValue(name, out IValueNode value)) { value = NullValueNode.Default; } value = rewriter.RewriteValueNode( schemaName, (IInputType)variable.Type.ToType(namedType), value); yield return(new Delegation.VariableValue ( name, variable.Type, value, variable.DefaultValue )); } }
private static IReadOnlyCollection <Delegation.VariableValue> CreateVariableValues( IMiddlewareContext context, NameString schemaName, IEnumerable <Delegation.VariableValue> scopedVariables, ExtractedField extractedField, ExtractFieldQuerySyntaxRewriter rewriter) { var values = new Dictionary <string, Delegation.VariableValue>(); foreach (Delegation.VariableValue value in scopedVariables) { values[value.Name] = value; } IReadOnlyDictionary <string, IValueNode> requestVariables = context.GetVariables(); foreach (Delegation.VariableValue value in ResolveUsedRequestVariables( context.Schema, schemaName, extractedField, requestVariables, rewriter)) { values[value.Name] = value; } return(values.Values); }
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_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 IEnumerable <VariableValue> ResolveUsedRequestVariables( ExtractedField extractedField, IReadOnlyDictionary <string, object> requestVariables) { foreach (VariableDefinitionNode variable in extractedField.Variables) { string name = variable.Variable.Name.Value; requestVariables.TryGetValue(name, out object value); yield return(new VariableValue ( name, variable.Type, value, variable.DefaultValue )); } }
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)); }
private static IReadOnlyCollection <VariableValue> CreateVariableValues( IMiddlewareContext context, IEnumerable <VariableValue> scopedVaribles, ExtractedField extractedField) { var values = new Dictionary <string, VariableValue>(); foreach (VariableValue value in scopedVaribles) { values[value.Name] = value; } IReadOnlyDictionary <string, object> requestVariables = context.GetVariables(); foreach (VariableValue value in ResolveUsedRequestVariables( extractedField, requestVariables)) { values[value.Name] = value; } return(values.Values); }