Class: GraphQL::Analysis::AST::QueryComplexity
- Defined in:
- lib/graphql/analysis/ast/query_complexity.rb
Direct Known Subclasses
Defined Under Namespace
Classes: ScopedTypeComplexity
Instance Method Summary collapse
- 
  
    
      #initialize(query)  ⇒ QueryComplexity 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    State for the query complexity calculation: - complexities_on_typeholds complexity scores for each type.
- 
  
    
      #on_enter_field(node, parent, visitor)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
- 
  
    
      #on_leave_field(node, parent, visitor)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
- 
  
    
      #result  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Overide this method to use the complexity result. 
Methods inherited from Analyzer
Constructor Details
#initialize(query) ⇒ QueryComplexity
State for the query complexity calculation:
- complexities_on_type holds complexity scores for each type
| 9 10 11 12 | # File 'lib/graphql/analysis/ast/query_complexity.rb', line 9 def initialize(query) super @complexities_on_type_by_query = {} end | 
Instance Method Details
#on_enter_field(node, parent, visitor) ⇒ Object
| 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | # File 'lib/graphql/analysis/ast/query_complexity.rb', line 49 def on_enter_field(node, parent, visitor) # We don't want to visit fragment definitions, # we'll visit them when we hit the spreads instead return if visitor.visiting_fragment_definition? return if visitor.skipping? parent_type = visitor.parent_type_definition field_key = node.alias || node.name # Find or create a complexity scope stack for this query. scopes_stack = @complexities_on_type_by_query[visitor.query] ||= [ScopedTypeComplexity.new(nil, nil, query, visitor.response_path)] # Find or create the complexity costing node for this field. scope = scopes_stack.last[parent_type][field_key] ||= ScopedTypeComplexity.new(parent_type, visitor.field_definition, visitor.query, visitor.response_path) scope.nodes.push(node) scopes_stack.push(scope) end | 
#on_leave_field(node, parent, visitor) ⇒ Object
| 66 67 68 69 70 71 72 73 | # File 'lib/graphql/analysis/ast/query_complexity.rb', line 66 def on_leave_field(node, parent, visitor) # We don't want to visit fragment definitions, # we'll visit them when we hit the spreads instead return if visitor.visiting_fragment_definition? return if visitor.skipping? scopes_stack = @complexities_on_type_by_query[visitor.query] scopes_stack.pop end | 
#result ⇒ Object
Overide this method to use the complexity result
| 15 16 17 | # File 'lib/graphql/analysis/ast/query_complexity.rb', line 15 def result max_possible_complexity end |