Class: GraphQL::Analysis::FieldUsage

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

Overview

A query reducer for tracking both field usage and deprecated field usage.

Examples:

Logging field usage and deprecated field usage

Schema.query_analyzers << GraphQL::Analysis::FieldUsage.new { |query, used_fields, used_deprecated_fields|
  puts "Used GraphQL fields: #{used_fields.join(', ')}"
  puts "Used deprecated GraphQL fields: #{used_deprecated_fields.join(', ')}"
}
Schema.execute(query_str)
# Used GraphQL fields: Cheese.id, Cheese.fatContent, Query.cheese
# Used deprecated GraphQL fields: Cheese.fatContent

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ FieldUsage

Returns a new instance of FieldUsage


15
16
17
# File 'lib/graphql/analysis/field_usage.rb', line 15

def initialize(&block)
  @field_usage_handler = block
end

Instance Method Details

#call(memo, visit_type, irep_node) ⇒ Object


27
28
29
30
31
32
33
34
35
36
37
# File 'lib/graphql/analysis/field_usage.rb', line 27

def call(memo, visit_type, irep_node)
  if irep_node.ast_node.is_a?(GraphQL::Language::Nodes::Field) && visit_type == :leave
    field = "#{irep_node.owner_type.name}.#{irep_node.definition.name}"
    memo[:used_fields] << field
    if irep_node.definition.deprecation_reason
      memo[:used_deprecated_fields] << field
    end
  end

  memo
end

#final_value(memo) ⇒ Object


39
40
41
# File 'lib/graphql/analysis/field_usage.rb', line 39

def final_value(memo)
  @field_usage_handler.call(memo[:query], memo[:used_fields].to_a, memo[:used_deprecated_fields].to_a)
end

#initial_value(query) ⇒ Object


19
20
21
22
23
24
25
# File 'lib/graphql/analysis/field_usage.rb', line 19

def initial_value(query)
  {
    query: query,
    used_fields: Set.new,
    used_deprecated_fields: Set.new
  }
end