Make Keyset::InOperatorOptimization work with Graphql
While looking into !95685 (comment 1130870531) we discovered that Keyset::InOperatorOptimization doesn't really work with GraphQL out of the box because our GraphQL cursor doesn't recognise the order clause.
See more on https://www.youtube.com/watch?v=USTRljvvWCo
Some diff we tried on the issue
diff --git a/app/finders/releases/group_releases_finder.rb b/app/finders/releases/group_releases_finder.rb
index 08530f63ea6..5647295b707 100644
--- a/app/finders/releases/group_releases_finder.rb
+++ b/app/finders/releases/group_releases_finder.rb
@@ -14,6 +14,7 @@ def initialize(parent, current_user = nil, params = {})
@parent = parent
@current_user = current_user
@params = params
+ @cursor = params[:cursor] || {}
params[:sort] ||= 'desc'
end
@@ -40,7 +41,15 @@ def get_releases
end
def releases_scope
- Release.sort_by_attribute("released_at_#{params[:sort]}").order(id: params[:sort])
+ scope = Release.sort_by_attribute("released_at_#{params[:sort]}").order(id: params[:sort])
+ if @cursor.any?
+ scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope)
+ raise 'unsupported query' unless success
+
+ order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
+ scope = order.apply_cursor_conditions(scope, @cursor)
+ end
+ scope
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/graphql/resolvers/group_releases_resolver.rb b/app/graphql/resolvers/group_releases_resolver.rb
index de1fa8a977d..86e4af44e26 100644
--- a/app/graphql/resolvers/group_releases_resolver.rb
+++ b/app/graphql/resolvers/group_releases_resolver.rb
@@ -17,6 +17,8 @@ class GroupReleasesResolver < BaseResolver
}.freeze
def resolve(sort:)
+ byebug
+
Releases::GroupReleasesFinder.new(
group,
current_user,
diff --git a/lib/gitlab/graphql/pagination/keyset/connection.rb b/lib/gitlab/graphql/pagination/keyset/connection.rb
index b5f2c5ee6e8..c1efa37fcc2 100644
--- a/lib/gitlab/graphql/pagination/keyset/connection.rb
+++ b/lib/gitlab/graphql/pagination/keyset/connection.rb
@@ -94,7 +94,7 @@ def nodes
def items
original_items = super
- return original_items if Gitlab::Pagination::Keyset::Order.keyset_aware?(original_items)
+ return original_items if Gitlab::Pagination::Keyset::Order.keyset_aware?(original_items) # || order_values.eql?('1+1')
strong_memoize(:keyset_pagination_items) do
rebuilt_items_with_keyset_order, success =Edited by Vladimir Shushlin