Module: GraphQL::Analysis

Defined in:
lib/graphql/analysis.rb,
lib/graphql/analysis/visitor.rb,
lib/graphql/analysis/analyzer.rb,
lib/graphql/analysis/field_usage.rb,
lib/graphql/analysis/query_depth.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: Analyzer, FieldUsage, MaxQueryComplexity, MaxQueryDepth, QueryComplexity, QueryDepth, TimeoutError, Visitor

Constant Summary collapse

AST =
self

Class Method Summary collapse

Class Method Details

.analysis_errors(results) ⇒ Object



92
93
94
# File 'lib/graphql/analysis.rb', line 92

def analysis_errors(results)
  results.flatten.tap { _1.select! { |r| r.is_a?(GraphQL::AnalysisError) } }
end

.analyze_multiplex(multiplex, analyzers) ⇒ Array<Any>

Analyze a multiplex, and all queries within. Multiplex analyzers are ran for all queries, keeping state. Query analyzers are ran per query, without carrying state between queries.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/graphql/analysis.rb', line 27

def analyze_multiplex(multiplex, analyzers)
  multiplex_analyzers = analyzers.map { |analyzer| analyzer.new(multiplex) }

  multiplex.current_trace.analyze_multiplex(multiplex: multiplex) do
    query_results = multiplex.queries.map do |query|
      if query.valid?
        analyze_query(
          query,
          query.analyzers,
          multiplex_analyzers: multiplex_analyzers
        )
      else
        []
      end
    end

    multiplex_results = multiplex_analyzers.map(&:result)
    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
    multiplex_results
  end
end

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



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/graphql/analysis.rb', line 56

def analyze_query(query, analyzers, multiplex_analyzers: [])
  query.current_trace.analyze_query(query: query) do
    query_analyzers = analyzers
      .map { |analyzer| analyzer.new(query) }
      .tap { _1.select!(&:analyze?) }

    analyzers_to_run = query_analyzers + multiplex_analyzers
    if !analyzers_to_run.empty?

      analyzers_to_run.select!(&:visit?)
      if !analyzers_to_run.empty?
        visitor = GraphQL::Analysis::Visitor.new(
          query: query,
          analyzers: analyzers_to_run,
          timeout: query.validate_timeout_remaining,
        )

        visitor.visit

        if !visitor.rescued_errors.empty?
          return visitor.rescued_errors
        end
      end

      query_analyzers.map(&:result)
    else
      []
    end
  end
rescue TimeoutError => err
  [err]
rescue GraphQL::UnauthorizedError, GraphQL::ExecutionError
  # This error was raised during analysis and will be returned the client before execution
  []
end