diff options
Diffstat (limited to 'app/graphql/types/base_field.rb')
-rw-r--r-- | app/graphql/types/base_field.rb | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/app/graphql/types/base_field.rb b/app/graphql/types/base_field.rb index b4cd54b1332..6aee9a5c052 100644 --- a/app/graphql/types/base_field.rb +++ b/app/graphql/types/base_field.rb @@ -53,6 +53,30 @@ module Types field_authorized?(object, ctx) && resolver_authorized?(object, ctx) end + # This gets called from the gem's `calculate_complexity` method, allowing us + # to ensure our complexity calculation is used even for connections. + # This code is actually a copy of the default case in `calculate_complexity` + # in `lib/graphql/schema/field.rb` + # (https://github.com/rmosolgo/graphql-ruby/blob/master/lib/graphql/schema/field.rb) + def complexity_for(child_complexity:, query:, lookahead:) + defined_complexity = complexity + + case defined_complexity + when Proc + arguments = query.arguments_for(lookahead.ast_nodes.first, self) + + if arguments.respond_to?(:keyword_arguments) + defined_complexity.call(query.context, arguments.keyword_arguments, child_complexity) + else + child_complexity + end + when Numeric + defined_complexity + child_complexity + else + raise("Invalid complexity: #{defined_complexity.inspect} on #{path} (#{inspect})") + end + end + def base_complexity complexity = DEFAULT_COMPLEXITY complexity += 1 if calls_gitaly? @@ -150,10 +174,9 @@ module Types def connection_complexity_multiplier(ctx, args) # Resolvers may add extra complexity depending on number of items being loaded. - field_defn = to_graphql - return 0 unless field_defn.connection? + return 0 unless connection? - page_size = field_defn.connection_max_page_size || ctx.schema.default_max_page_size + page_size = max_page_size || ctx.schema.default_max_page_size limit_value = [args[:first], args[:last], page_size].compact.min multiplier = resolver&.try(:complexity_multiplier, args).to_f limit_value * multiplier |