Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/types/base_field.rb')
-rw-r--r--app/graphql/types/base_field.rb29
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