diff --git a/lib/graphql/schema/field.rb b/lib/graphql/schema/field.rb index 98cf087d06..d29d62edfb 100644 --- a/lib/graphql/schema/field.rb +++ b/lib/graphql/schema/field.rb @@ -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 @@ -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?(:[]) @@ -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 @@ -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? @@ -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 diff --git a/lib/graphql/schema/field/default_resolver_tracker.rb b/lib/graphql/schema/field/default_resolver_tracker.rb new file mode 100644 index 0000000000..21ac1ae450 --- /dev/null +++ b/lib/graphql/schema/field/default_resolver_tracker.rb @@ -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