Ejemplo n.º 1
0
    public Fragment(
        int fragmentId,
        IObjectType typeCondition,
        InlineFragmentNode inlineFragment,
        ISelectionSet selectionSet,
        bool internalFragment,
        SelectionIncludeCondition?includeCondition)
    {
        TypeCondition     = typeCondition;
        SyntaxNode        = inlineFragment;
        SelectionSet      = selectionSet;
        Directives        = inlineFragment.Directives;
        IsInternal        = internalFragment;
        IsConditional     = includeCondition is not null;
        _fragmentId       = fragmentId;
        _includeCondition = includeCondition;

        InclusionKind = internalFragment
            ? SelectionInclusionKind.Internal
            : SelectionInclusionKind.Always;

        if (IsConditional)
        {
            InclusionKind = internalFragment
                ? SelectionInclusionKind.InternalConditional
                : SelectionInclusionKind.Conditional;
        }
    }
 public VisitorAction Enter(
     InlineFragmentNode node,
     ISyntaxNode parent,
     IReadOnlyList <object> path,
     IReadOnlyList <ISyntaxNode> ancestors)
 {
     if (node.TypeCondition is { } &&
 protected override void VisitInlineFragment(
     InlineFragmentNode node,
     object context)
 {
     VisitedInlineFragment = true;
     base.VisitInlineFragment(node, context);
 }
Ejemplo n.º 4
0
        private void ResolveInlineFragment(
            CompilerContext context,
            InlineFragmentNode inlineFragment,
            SelectionIncludeCondition?includeCondition)
        {
            if (inlineFragment.SelectionSet.Selections.Count == 0)
            {
                throw OperationCompiler_FragmentNoSelections(inlineFragment);
            }

            if (_fragments.GetFragment(context.Type, inlineFragment) is { } fragmentInfo&&
                DoesTypeApply(fragmentInfo.TypeCondition, context.Type))
            {
                if (inlineFragment.IsDeferrable() &&
                    AllowFragmentDeferral(context, inlineFragment))
                {
                    CompilerContext deferContext = context.Branch(fragmentInfo);
                    CompileSelectionSet(deferContext);

                    context.RegisterFragment(new Fragment(
                                                 context.Type,
                                                 inlineFragment,
                                                 deferContext.GetSelectionSet(),
                                                 context.IsInternalSelection,
                                                 includeCondition));
                }
                else
                {
                    CollectFields(
                        context,
                        fragmentInfo.SelectionSet,
                        includeCondition);
                }
            }
        }
Ejemplo n.º 5
0
        private bool AllowFragmentDeferral(
            CompilerContext context,
            InlineFragmentNode fragment)
        {
            if (context.Optimizers.Count == 0)
            {
                return(true);
            }

            var optimizerContext = new SelectionOptimizerContext
                                   (
                _schema,
                context.Path,
                context.Type,
                context.SelectionSet,
                context.Fields,
                CreateFieldMiddleware
                                   );

            if (context.Optimizers.Count == 1)
            {
                return(context.Optimizers[0].AllowFragmentDeferral(optimizerContext, fragment));
            }

            for (var i = 0; i < context.Optimizers.Count; i++)
            {
                if (!context.Optimizers[i].AllowFragmentDeferral(optimizerContext, fragment))
                {
                    return(false);
                }
            }

            return(true);
        }
Ejemplo n.º 6
0
 protected override ISyntaxVisitorAction Enter(
     InlineFragmentNode node,
     IDocumentValidatorContext context)
 {
     ValidateDirectiveAreUniquePerLocation(node, context);
     return(Continue);
 }
Ejemplo n.º 7
0
        private bool AllowFragmentDeferral(
            CompilerContext context,
            InlineFragmentNode fragment)
        {
            if (context.Optimizers.Count == 0)
            {
                return(true);
            }

            var optimizerContext = new SelectionOptimizerContext(this, context);

            if (context.Optimizers.Count == 1)
            {
                return(context.Optimizers[0].AllowFragmentDeferral(optimizerContext, fragment));
            }

            for (var i = 0; i < context.Optimizers.Count; i++)
            {
                if (!context.Optimizers[i].AllowFragmentDeferral(optimizerContext, fragment))
                {
                    return(false);
                }
            }

            return(true);
        }
Ejemplo n.º 8
0
        public Fragment GetFragment(
            ObjectType parentType,
            InlineFragmentNode inlineFragment)
        {
            if (parentType == null)
            {
                throw new ArgumentNullException(nameof(parentType));
            }

            if (inlineFragment == null)
            {
                throw new ArgumentNullException(nameof(inlineFragment));
            }

            string fragmentName = CreateInlineFragmentName(inlineFragment);

            if (!_fragments.TryGetValue(fragmentName,
                                        out List <Fragment> fragments))
            {
                fragments = new List <Fragment>();
                fragments.Add(CreateFragment(parentType, inlineFragment));
                _fragments[fragmentName] = fragments;
            }

            return(fragments.First());
        }
Ejemplo n.º 9
0
        protected override InlineFragmentNode RewriteInlineFragment(
            InlineFragmentNode node,
            Context context)
        {
            Context            currentContext = context;
            InlineFragmentNode current        = node;

            if (_schema.TryGetType(
                    current.TypeCondition.Name.Value,
                    out IComplexOutputType type))
            {
                currentContext             = currentContext.Clone();
                currentContext.TypeContext = type;

                if (type.TryGetSourceDirective(context.Schema,
                                               out SourceDirective sourceDirective))
                {
                    current = current.WithTypeCondition(
                        current.TypeCondition.WithName(
                            new NameNode(sourceDirective.Name)));
                }
            }

            return(base.RewriteInlineFragment(current, currentContext));
        }
Ejemplo n.º 10
0
    protected override ISyntaxVisitorAction Enter(
        InlineFragmentNode node,
        IDocumentValidatorContext context)
    {
        if (node.TypeCondition is null)
        {
            return(Continue);
        }

        if (context.Schema.TryGetType(
                node.TypeCondition.Name.Value,
                out INamedOutputType type))
        {
            if (type.IsCompositeType())
            {
                ValidateFragmentSpreadIsPossible(
                    node, context,
                    context.Types.Peek().NamedType(),
                    type);
                context.Types.Push(type);
                return(Continue);
            }

            context.Errors.Add(context.FragmentOnlyCompositeType(node, type.NamedType()));
            return(Skip);
        }

        context.Errors.Add(context.FragmentTypeConditionUnknown(node, node.TypeCondition));
        return(Skip);
    }
Ejemplo n.º 11
0
        private Fragment CreateFragment(ObjectType parentType, InlineFragmentNode inlineFragment)
        {
            INamedType type = inlineFragment.TypeCondition == null
                ? parentType
                : _schema.GetType <INamedType>(inlineFragment.TypeCondition.Name.Value);

            return(new Fragment(type, inlineFragment.SelectionSet, inlineFragment.Directives));
        }
Ejemplo n.º 12
0
        private Fragment CreateFragment(InlineFragmentNode inlineFragment)
        {
            // TODO : maybe introduce a tryget to the schema
            INamedType type = _schema.GetType <INamedType>(
                inlineFragment.TypeCondition.Name.Value);

            return(new Fragment(type, inlineFragment.SelectionSet));
        }
Ejemplo n.º 13
0
 protected override ISyntaxVisitorAction Enter(
     InlineFragmentNode node,
     IDocumentValidatorContext context)
 {
     ValidateTypeCondition(node, node.TypeCondition, context);
     ValidateFragmentSpreadIsPossible(node, context);
     return(Continue);
 }
Ejemplo n.º 14
0
 protected override void ResolveChildren(
     InlineFragmentNode node,
     IList <SyntaxNodeInfo> children)
 {
     ResolveChildren(
         nameof(node.SelectionSet),
         node.SelectionSet,
         children);
 }
Ejemplo n.º 15
0
        public Fragment?GetFragment(ObjectType parentType, InlineFragmentNode inlineFragment)
        {
            if (!_fragments.TryGetValue(inlineFragment, out Fragment? fragment))
            {
                fragment = CreateFragment(parentType, inlineFragment);
                _fragments[inlineFragment] = fragment;
            }

            return(fragment);
        }
Ejemplo n.º 16
0
 public VisitorAction Leave(
     InlineFragmentNode node,
     ISyntaxNode parent,
     IReadOnlyList <object> path,
     IReadOnlyList <ISyntaxNode> ancestors)
 {
     if (_action.Pop() == VisitorAction.Continue)
     {
         _type.Pop();
     }
     return(VisitorAction.Continue);
 }
Ejemplo n.º 17
0
 protected override InlineFragmentNode RewriteInlineFragment(
     InlineFragmentNode node,
     Context context)
 {
     context.Nodes.Push(node);
     context.Types.Push(node.TypeCondition is null
         ? context.Types.Peek()
         : context.Schema.GetType <INamedType>(node.TypeCondition.Name.Value));
     node = base.RewriteInlineFragment(node, context);
     context.Types.Pop();
     context.Nodes.Pop();
     return(node);
 }
Ejemplo n.º 18
0
        private void ResolveInlineFragment(
            ObjectType type,
            InlineFragmentNode inlineFragment,
            Action <QueryError> reportError,
            Dictionary <string, FieldSelection> fields)
        {
            Fragment fragment = _fragments.GetFragment(type, inlineFragment);

            if (DoesTypeApply(fragment.TypeCondition, type))
            {
                CollectFields(type, fragment.SelectionSet, reportError, fields);
            }
        }
Ejemplo n.º 19
0
        protected override void VisitInlineFragment(
            InlineFragmentNode node,
            MaxComplexityVisitorContext context)
        {
            MaxComplexityVisitorContext newContext = context;

            if (newContext.Schema.TryGetType(
                    node.TypeCondition.Name.Value,
                    out IComplexOutputType type))
            {
                newContext = newContext.SetTypeContext(type);
            }

            base.VisitInlineFragment(node, newContext);
        }
Ejemplo n.º 20
0
        protected override void VisitInlineFragment(
            InlineFragmentNode inlineFragment,
            IType parentType,
            IType typeCondition,
            ImmutableStack <ISyntaxNode> path)
        {
            ValidateTypeCondition(
                inlineFragment,
                typeCondition);

            base.VisitInlineFragment(
                inlineFragment,
                parentType,
                typeCondition,
                path);
        }
Ejemplo n.º 21
0
    public VisitorAction Enter(
        InlineFragmentNode node,
        ISyntaxNode parent,
        IReadOnlyList <object> path,
        IReadOnlyList <ISyntaxNode> ancestors)
    {
        if (node.TypeCondition is not null &&
            _schema.TryGetType <INamedType>(node.TypeCondition.Name.Value, out INamedType? type))
        {
            _type.Push(type);
            _action.Push(VisitorAction.Continue);
            return(VisitorAction.Continue);
        }

        _action.Push(VisitorAction.Skip);
        return(VisitorAction.Skip);
    }
Ejemplo n.º 22
0
        private void ResolveInlineFragment(
            CompilerContext context,
            InlineFragmentNode inlineFragment,
            SelectionIncludeCondition?includeCondition)
        {
            if (inlineFragment.SelectionSet.Selections.Count == 0)
            {
                throw OperationCompiler_FragmentNoSelections(inlineFragment);
            }

            if (_fragments.GetFragment(context.Type, inlineFragment) is { } fragmentInfo&&
                DoesTypeApply(fragmentInfo.TypeCondition, context.Type))
            {
                var reference = new SpreadReference(context.SelectionPath, inlineFragment);

                if (!context.Spreads.TryGetValue(reference, out var selectionSet))
                {
                    selectionSet = inlineFragment.SelectionSet.WithSelections(
                        inlineFragment.SelectionSet.Selections);
                    context.Spreads.Add(reference, selectionSet);
                }

                if (inlineFragment.IsDeferrable() &&
                    AllowFragmentDeferral(context, inlineFragment))
                {
                    CompilerContext deferContext = context.Branch(selectionSet);
                    CompileSelectionSet(deferContext);

                    context.RegisterFragment(new Fragment(
                                                 _nextFragmentId++,
                                                 context.Type,
                                                 inlineFragment,
                                                 deferContext.GetSelectionSet(),
                                                 context.IsInternalSelection,
                                                 includeCondition));
                }
                else
                {
                    CollectFields(
                        context,
                        selectionSet,
                        includeCondition);
                }
            }
        }
Ejemplo n.º 23
0
 protected sealed override ISyntaxVisitorAction Enter(
     ISyntaxNode node,
     ISyntaxVisitorContext context)
 {
     return(node switch
     {
         DocumentNode n => Enter(n, context),
         OperationDefinitionNode n => Enter(n, context),
         VariableDefinitionNode n => Enter(n, context),
         VariableNode n => Enter(n, context),
         SelectionSetNode n => Enter(n, context),
         FieldNode n => Enter(n, context),
         ArgumentNode n => Enter(n, context),
         FragmentSpreadNode n => Enter(n, context),
         InlineFragmentNode n => Enter(n, context),
         FragmentDefinitionNode n => Enter(n, context),
         DirectiveNode n => Enter(n, context),
         NamedTypeNode n => Enter(n, context),
         ListTypeNode n => Enter(n, context),
         NonNullTypeNode n => Enter(n, context),
         ListValueNode n => Enter(n, context),
         ObjectValueNode n => Enter(n, context),
         ObjectFieldNode n => Enter(n, context),
         IValueNode n => Enter(n, context),
         SchemaDefinitionNode n => Enter(n, context),
         OperationTypeDefinitionNode n => Enter(n, context),
         ScalarTypeDefinitionNode n => Enter(n, context),
         ObjectTypeDefinitionNode n => Enter(n, context),
         FieldDefinitionNode n => Enter(n, context),
         InputValueDefinitionNode n => Enter(n, context),
         InterfaceTypeDefinitionNode n => Enter(n, context),
         UnionTypeDefinitionNode n => Enter(n, context),
         EnumTypeDefinitionNode n => Enter(n, context),
         EnumValueDefinitionNode n => Enter(n, context),
         InputObjectTypeDefinitionNode n => Enter(n, context),
         DirectiveDefinitionNode n => Enter(n, context),
         SchemaExtensionNode n => Enter(n, context),
         ScalarTypeExtensionNode n => Enter(n, context),
         ObjectTypeExtensionNode n => Enter(n, context),
         InterfaceTypeExtensionNode n => Enter(n, context),
         UnionTypeExtensionNode n => Enter(n, context),
         EnumTypeExtensionNode n => Enter(n, context),
         InputObjectTypeExtensionNode n => Enter(n, context),
         _ => throw new NotSupportedException()
     });
Ejemplo n.º 24
0
        private Fragment CreateFragment(
            INamedOutputType parentType,
            InlineFragmentNode inlineFragment)
        {
            INamedType type;

            if (inlineFragment.TypeCondition == null)
            {
                type = parentType;
            }
            else
            {
                type = _schema.GetType <INamedType>(
                    inlineFragment.TypeCondition.Name.Value);
            }

            return(new Fragment(type.Name, FragmentKind.Inline, type, inlineFragment.SelectionSet));
        }
Ejemplo n.º 25
0
        private void ResolveInlineFragment(
            ObjectType type,
            InlineFragmentNode inlineFragment,
            Path path,
            FieldVisibility fieldVisibility,
            IDictionary <string, FieldInfo> fields)
        {
            Fragment fragment = _fragments.GetFragment(type, inlineFragment);

            if (DoesTypeApply(fragment.TypeCondition, type))
            {
                CollectFields(
                    type,
                    fragment.SelectionSet,
                    path,
                    fieldVisibility,
                    fields);
            }
        }
Ejemplo n.º 26
0
        protected override void VisitInlineFragment(
            InlineFragmentNode node,
            TContext context)
        {
            if (node.TypeCondition != null)
            {
                VisitNamedType(node.TypeCondition, context);
            }

            VisitMany(
                node.Directives,
                context,
                VisitDirective);

            if (node.SelectionSet != null)
            {
                VisitSelectionSet(node.SelectionSet, context);
            }
        }
Ejemplo n.º 27
0
 private void VisitInlineFragmentInternal(
     InlineFragmentNode inlineFragment,
     IType type,
     ImmutableStack <ISyntaxNode> path)
 {
     if (inlineFragment.TypeCondition?.Name?.Value == null)
     {
         VisitInlineFragment(inlineFragment, type, type, path);
     }
     else if (Schema.TryGetType(
                  inlineFragment.TypeCondition.Name.Value,
                  out INamedOutputType typeCondition))
     {
         VisitInlineFragment(inlineFragment, type, typeCondition, path);
     }
     else
     {
         VisitInlineFragment(inlineFragment, type, null, path);
     }
 }
Ejemplo n.º 28
0
        protected virtual void VisitInlineFragment(
            InlineFragmentNode inlineFragment,
            IType type,
            ImmutableStack <ISyntaxNode> path)
        {
            if (inlineFragment.TypeCondition?.Name?.Value != null &&
                Schema.TryGetType <INamedOutputType>(
                    inlineFragment.TypeCondition.Name.Value,
                    out INamedOutputType typeCondition))
            {
                VisitSelectionSet(
                    inlineFragment.SelectionSet,
                    typeCondition,
                    path.Push(inlineFragment));

                VisitDirectives(
                    inlineFragment.Directives,
                    path.Push(inlineFragment));
            }
        }
Ejemplo n.º 29
0
        protected virtual void VisitInlineFragment(
            InlineFragmentNode inlineFragment,
            IType parentType,
            IType typeCondition,
            ImmutableStack <ISyntaxNode> path)
        {
            if (typeCondition != null)
            {
                ImmutableStack <ISyntaxNode> newpath = path.Push(inlineFragment);

                VisitSelectionSet(
                    inlineFragment.SelectionSet,
                    typeCondition,
                    newpath);

                VisitDirectives(
                    inlineFragment.Directives,
                    newpath);
            }
        }
        protected override void VisitInlineFragment(
            InlineFragmentNode inlineFragment,
            IType parentType,
            IType typeCondition,
            ImmutableStack <ISyntaxNode> path)
        {
            if (typeCondition == null)
            {
                Errors.Add(new ValidationError(
                               "The specified inline fragment " +
                               "does not exist in the current schema.",
                               inlineFragment));
            }

            base.VisitInlineFragment(
                inlineFragment,
                parentType,
                typeCondition,
                path);
        }