Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions lib/graphql/schema/field.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true
require "graphql/schema/field/connection_extension"
require "graphql/schema/field/scope_extension"
require "graphql/schema/field/default_resolver_tracker"

module GraphQL
class Schema
Expand Down Expand Up @@ -737,7 +738,10 @@ def resolve(object, args, query_ctx)

inner_object = obj.object

tracker = query_ctx[:default_resolver_tracker]

if !NOT_CONFIGURED.equal?(@hash_key)
tracker&.track(self, :hash_key)
hash_value = if inner_object.is_a?(Hash)
inner_object.key?(@hash_key) ? inner_object[@hash_key] : inner_object[@hash_key_str]
elsif inner_object.respond_to?(:[])
Expand All @@ -751,6 +755,7 @@ def resolve(object, args, query_ctx)
hash_value || (@fallback_value != NOT_CONFIGURED ? @fallback_value : nil)
end
elsif obj.respond_to?(resolver_method)
tracker&.track(self, :resolver_method)
method_to_call = resolver_method
method_receiver = obj
# Call the method with kwargs, if there are any
Expand All @@ -761,17 +766,22 @@ def resolve(object, args, query_ctx)
end
elsif inner_object.is_a?(Hash)
if @dig_keys
tracker&.track(self, :hash_dig_keys)
inner_object.dig(*@dig_keys)
elsif inner_object.key?(@method_sym)
tracker&.track(self, :hash_method_sym)
inner_object[@method_sym]
elsif inner_object.key?(@method_str) || !inner_object.default_proc.nil?
tracker&.track(self, :hash_method_str)
inner_object[@method_str]
elsif @fallback_value != NOT_CONFIGURED
tracker&.track(self, :hash_fallback)
@fallback_value
else
nil
end
elsif inner_object.respond_to?(@method_sym)
tracker&.track(self, :send_method_sym)
method_to_call = @method_sym
method_receiver = obj.object
if !ruby_kwargs.empty?
Expand All @@ -780,6 +790,7 @@ def resolve(object, args, query_ctx)
inner_object.public_send(@method_sym)
end
elsif @fallback_value != NOT_CONFIGURED
tracker&.track(self, :fallback)
@fallback_value
else
raise <<-ERR
Expand Down
28 changes: 28 additions & 0 deletions lib/graphql/schema/field/default_resolver_tracker.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

module GraphQL
class Schema
class Field
class DefaultResolverTracker
attr_reader :counts_by_field
attr_reader :strategy_by_field

def initialize
@counts_by_field = Hash.new do |h, k|
h[k] = Hash.new do |h2, k2|
h2[k2] = 0
end
end
@strategy_by_field = Hash.new do |h, k|
h[k] = Set.new
end
end

def track(field, strategy)
@counts_by_field[field.path][strategy] += 1
@strategy_by_field[strategy] << field.path
end
end
end
end
end
Loading