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
- .analysis_errors(parent_errors, results) ⇒ Object
-
.analyze_multiplex(multiplex, analyzers) ⇒ Array<Any>
Analyze a multiplex, and all queries within.
-
.analyze_query(query, analyzers, multiplex_analyzers: []) ⇒ Array<Any>
Results from those analyzers.
Class Method Details
.analysis_errors(parent_errors, results) ⇒ Object
90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/graphql/analysis.rb', line 90 def analysis_errors(parent_errors, results) if !results.empty? results = results.flatten results.select! { |r| r.is_a?(GraphQL::AnalysisError) } end if parent_errors.empty? results else parent_errors + results end 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_analyzers.map!(&:result) multiplex_errors = analysis_errors(EmptyObjects::EMPTY_ARRAY, multiplex_analyzers) multiplex.queries.each_with_index do |query, idx| query.analysis_errors = analysis_errors(multiplex_errors, query_results[idx]) end multiplex_analyzers end end |
.analyze_query(query, analyzers, multiplex_analyzers: []) ⇒ Array<Any>
Returns Results from those analyzers.
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 |
# 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) } query_analyzers.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 EmptyObjects::EMPTY_ARRAY 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 EmptyObjects::EMPTY_ARRAY end |