Module: GraphQL::Analysis

Defined in:
lib/graphql/analysis/field_usage.rb,
lib/graphql/analysis/query_depth.rb,
lib/graphql/analysis/analyze_query.rb,
lib/graphql/analysis/reducer_state.rb,
lib/graphql/analysis/max_query_depth.rb,
lib/graphql/analysis/query_complexity.rb,
lib/graphql/analysis/max_query_complexity.rb

Defined Under Namespace

Classes: FieldUsage, MaxQueryComplexity, MaxQueryDepth, QueryComplexity, QueryDepth, ReducerState

Class Method Summary collapse

Class Method Details

.analyze_multiplex(multiplex, analyzers) ⇒ void



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/graphql/analysis/analyze_query.rb', line 7

def analyze_multiplex(multiplex, analyzers)
  multiplex.trace("analyze_multiplex", { multiplex: multiplex }) do
    reducer_states = analyzers.map { |r| ReducerState.new(r, multiplex) }
    query_results = multiplex.queries.map do |query|
      if query.valid?
        analyze_query(query, query.analyzers, multiplex_states: reducer_states)
      else
        []
      end
    end

    multiplex_results = reducer_states.map(&:finalize_reducer)
    multiplex_errors = analysis_errors(multiplex_results)

    multiplex.queries.each_with_index do |query, idx|
      query.analysis_errors = multiplex_errors + analysis_errors(query_results[idx])
    end
  end
  nil
end

.analyze_query(query, analyzers, multiplex_states: []) ⇒ Array<Any>

Visit query's internal representation, calling analyzers along the way.

  • First, query analyzers are initialized by calling .initial_value(query), if they respond to that method.
  • Then, they receive .call(memo, visit_type, irep_node), where visit type is :enter or :leave.
  • Last, they receive .final_value(memo), if they respond to that method.

It returns an array of final memo values in the order that analyzers were passed in.



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/graphql/analysis/analyze_query.rb', line 39

def analyze_query(query, analyzers, multiplex_states: [])
  query.trace("analyze_query", { query: query }) do
    reducer_states = analyzers.map { |r| ReducerState.new(r, query) } + multiplex_states

    irep = query.internal_representation

    irep.operation_definitions.each do |name, op_node|
      reduce_node(op_node, reducer_states)
    end

    reducer_states.map(&:finalize_reducer)
  end
end