diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-20 12:26:25 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-20 12:26:25 +0000 |
commit | a09983ae35713f5a2bbb100981116d31ce99826e (patch) | |
tree | 2ee2af7bd104d57086db360a7e6d8c9d5d43667a /lib/gitlab/graphql | |
parent | 18c5ab32b738c0b6ecb4d0df3994000482f34bd8 (diff) | |
download | gitlab-ce-a09983ae35713f5a2bbb100981116d31ce99826e.tar.gz |
Add latest changes from gitlab-org/gitlab@13-2-stable-ee
Diffstat (limited to 'lib/gitlab/graphql')
-rw-r--r-- | lib/gitlab/graphql/authorize/authorize_resource.rb | 3 | ||||
-rw-r--r-- | lib/gitlab/graphql/lazy.rb | 19 | ||||
-rw-r--r-- | lib/gitlab/graphql/loaders/issuable_loader.rb | 82 | ||||
-rw-r--r-- | lib/gitlab/graphql/mount_mutation.rb | 8 | ||||
-rw-r--r-- | lib/gitlab/graphql/query_analyzers/logger_analyzer.rb | 3 |
5 files changed, 111 insertions, 4 deletions
diff --git a/lib/gitlab/graphql/authorize/authorize_resource.rb b/lib/gitlab/graphql/authorize/authorize_resource.rb index 94871498cf8..27673e5c27a 100644 --- a/lib/gitlab/graphql/authorize/authorize_resource.rb +++ b/lib/gitlab/graphql/authorize/authorize_resource.rb @@ -30,8 +30,7 @@ module Gitlab end def authorized_find!(*args) - object = find_object(*args) - object = object.sync if object.respond_to?(:sync) + object = Graphql::Lazy.force(find_object(*args)) authorize!(object) diff --git a/lib/gitlab/graphql/lazy.rb b/lib/gitlab/graphql/lazy.rb new file mode 100644 index 00000000000..a7f7610a041 --- /dev/null +++ b/lib/gitlab/graphql/lazy.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Gitlab + module Graphql + class Lazy + # Force evaluation of a (possibly) lazy value + def self.force(value) + case value + when ::BatchLoader::GraphQL + value.sync + when ::Concurrent::Promise + value.execute.value + else + value + end + end + end + end +end diff --git a/lib/gitlab/graphql/loaders/issuable_loader.rb b/lib/gitlab/graphql/loaders/issuable_loader.rb new file mode 100644 index 00000000000..1cc0fbe215f --- /dev/null +++ b/lib/gitlab/graphql/loaders/issuable_loader.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +module Gitlab + module Graphql + module Loaders + class IssuableLoader + attr_reader :parent, :issuable_finder + + BatchKey = Struct.new(:parent, :finder_class, :current_user) + + def initialize(parent, issuable_finder) + @parent = parent + @issuable_finder = issuable_finder + end + + def batching_find_all(&with_query) + if issuable_finder.params.keys == ['iids'] + batch_load_issuables(issuable_finder.params[:iids], with_query) + else + post_process(find_all, with_query) + end + end + + def find_all + issuable_finder.params[parent_param] = parent if parent + + issuable_finder.execute + end + + private + + def parent_param + case parent + when Project + :project_id + when Group + :group_id + else + raise "Unexpected parent: #{parent.class}" + end + end + + def post_process(query, with_query) + if with_query + with_query.call(query) + else + query + end + end + + def batch_load_issuables(iids, with_query) + Array.wrap(iids).map { |iid| batch_load(iid, with_query) } + end + + def batch_load(iid, with_query) + return if parent.nil? + + BatchLoader::GraphQL + .for([parent_param, iid.to_s]) + .batch(key: batch_key) do |params, loader, args| + batch_key = args[:key] + user = batch_key.current_user + + params.group_by(&:first).each do |key, group| + iids = group.map(&:second).uniq + args = { key => batch_key.parent, iids: iids } + query = batch_key.finder_class.new(user, args).execute + + post_process(query, with_query).each do |item| + loader.call([key, item.iid.to_s], item) + end + end + end + end + + def batch_key + BatchKey.new(parent, issuable_finder.class, issuable_finder.current_user) + end + end + end + end +end diff --git a/lib/gitlab/graphql/mount_mutation.rb b/lib/gitlab/graphql/mount_mutation.rb index b10e963170a..8e507ba4531 100644 --- a/lib/gitlab/graphql/mount_mutation.rb +++ b/lib/gitlab/graphql/mount_mutation.rb @@ -13,6 +13,14 @@ module Gitlab mutation: mutation_class, **custom_kwargs end + + def mount_aliased_mutation(alias_name, mutation_class, **custom_kwargs) + aliased_mutation_class = Class.new(mutation_class) do + graphql_name alias_name + end + + mount_mutation(aliased_mutation_class, **custom_kwargs) + end end end end diff --git a/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb b/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb index 6f705239fa3..6b6bb72eb31 100644 --- a/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb +++ b/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb @@ -52,8 +52,7 @@ module Gitlab end def duration(time_started) - nanoseconds = Gitlab::Metrics::System.monotonic_time - time_started - nanoseconds * 1000000 + Gitlab::Metrics::System.monotonic_time - time_started end def default_initial_values(query) |