Class: GraphQL::Analysis::QueryDepth

Inherits:
Analyzer
  • Object
show all
Defined in:
lib/graphql/analysis/query_depth.rb

Overview

A query reducer for measuring the depth of a given query.

See https://graphql-ruby.org/queries/ast_analysis.html for more examples.

Examples:

Logging the depth of a query

class LogQueryDepth < GraphQL::Analysis::QueryDepth
  def result
    log("GraphQL query depth: #{@max_depth}")
  end
end

# In your Schema file:

class MySchema < GraphQL::Schema
  query_analyzer LogQueryDepth
end

# When you run the query, the depth will get logged:

Schema.execute(query_str)
# GraphQL query depth: 8

Direct Known Subclasses

MaxQueryDepth

Instance Method Summary collapse

Methods inherited from Analyzer

#analyze?, #visit?

Constructor Details

#initialize(query) ⇒ QueryDepth

Returns a new instance of QueryDepth.



27
28
29
30
31
32
# File 'lib/graphql/analysis/query_depth.rb', line 27

def initialize(query)
  @max_depth = 0
  @current_depth = 0
  @count_introspection_fields = query.schema.count_introspection_fields
  super
end

Instance Method Details

#on_enter_field(node, parent, visitor) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/graphql/analysis/query_depth.rb', line 34

def on_enter_field(node, parent, visitor)
  return if visitor.skipping? ||
    visitor.visiting_fragment_definition? ||
      (@count_introspection_fields == false && visitor.field_definition.introspection?)

  @current_depth += 1
end

#on_leave_field(node, parent, visitor) ⇒ Object



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

def on_leave_field(node, parent, visitor)
  return if visitor.skipping? ||
    visitor.visiting_fragment_definition? ||
    (@count_introspection_fields == false && visitor.field_definition.introspection?)

  if @max_depth < @current_depth
    @max_depth = @current_depth
  end
  @current_depth -= 1
end

#resultObject



53
54
55
# File 'lib/graphql/analysis/query_depth.rb', line 53

def result
  @max_depth
end