diff options
Diffstat (limited to 'app/finders/user_recent_events_finder.rb')
-rw-r--r-- | app/finders/user_recent_events_finder.rb | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/app/finders/user_recent_events_finder.rb b/app/finders/user_recent_events_finder.rb index 596a413782e..96120d9412f 100644 --- a/app/finders/user_recent_events_finder.rb +++ b/app/finders/user_recent_events_finder.rb @@ -47,6 +47,24 @@ class UserRecentEventsFinder end # rubocop: disable CodeReuse/ActiveRecord + def execute_optimized_multi(users) + Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new( + scope: Event.reorder(id: :desc), + array_scope: User.select(:id).where(id: users), + # Event model has a default scope { reorder(nil) } + # When a relation is rordered and used as a target when merging scope, + # its order takes a precedence and _overwrites_ the original scope's order. + # Thus we have to explicitly provide `reorder` for array_mapping_scope here. + array_mapping_scope: -> (author_id_expression) { Event.where(Event.arel_table[:author_id].eq(author_id_expression)).reorder(id: :desc) }, + finder_query: -> (id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) } + ) + .execute + .limit(limit) + .offset(params[:offset] || 0) + end + # rubocop: enable CodeReuse/ActiveRecord + + # rubocop: disable CodeReuse/ActiveRecord def execute_multi users = [] @target_user.each do |user| @@ -55,7 +73,11 @@ class UserRecentEventsFinder return Event.none if users.empty? - event_filter.apply_filter(Event.where(author: users).limit_recent(limit, params[:offset] || 0)) + if event_filter.filter == EventFilter::ALL + execute_optimized_multi(users) + else + event_filter.apply_filter(Event.where(author: users).limit_recent(limit, params[:offset] || 0)) + end end # rubocop: enable CodeReuse/ActiveRecord |