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/models/event_collection.rb')
-rw-r--r--app/models/event_collection.rb47
1 files changed, 31 insertions, 16 deletions
diff --git a/app/models/event_collection.rb b/app/models/event_collection.rb
index fc093894847..4258027aa56 100644
--- a/app/models/event_collection.rb
+++ b/app/models/event_collection.rb
@@ -8,6 +8,8 @@
class EventCollection
include Gitlab::Utils::StrongMemoize
+ attr_reader :filter
+
# To prevent users from putting too much pressure on the database by cycling
# through thousands of events we put a limit on the number of pages.
MAX_PAGE = 10
@@ -19,7 +21,7 @@ class EventCollection
@projects = projects
@limit = limit
@offset = offset
- @filter = filter
+ @filter = filter || EventFilter.new(EventFilter::ALL)
@groups = groups
end
@@ -44,35 +46,46 @@ class EventCollection
private
def project_events
- in_operator_optimized_relation('project_id', projects)
+ in_operator_optimized_relation('project_id', projects, Project)
end
def group_events
- in_operator_optimized_relation('group_id', groups)
+ in_operator_optimized_relation('group_id', groups, Namespace)
end
def project_and_group_events
- Event.from_union([project_events, group_events]).recent
+ if EventFilter::PROJECT_ONLY_EVENT_TYPES.include?(filter.filter)
+ project_events
+ else
+ Event.from_union([project_events, group_events]).recent
+ end
end
- def in_operator_optimized_relation(parent_column, parents)
- scope = filtered_events
- array_scope = parents.select(:id)
- array_mapping_scope = -> (parent_id_expression) { Event.where(Event.arel_table[parent_column].eq(parent_id_expression)).reorder(id: :desc) }
- finder_query = -> (id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) }
+ def in_operator_optimized_relation(parent_column, parents, parent_model)
+ query_builder_params = if Feature.enabled?(:optimized_project_and_group_activity_queries)
+ array_data = {
+ scope_ids: parents.pluck(:id),
+ scope_model: parent_model,
+ mapping_column: parent_column
+ }
+ filter.in_operator_query_builder_params(array_data)
+ else
+ {
+ scope: filtered_events,
+ array_scope: parents.select(:id),
+ array_mapping_scope: -> (parent_id_expression) { Event.where(Event.arel_table[parent_column].eq(parent_id_expression)).reorder(id: :desc) },
+ finder_query: -> (id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) }
+ }
+ end
Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
- .new(
- scope: scope,
- array_scope: array_scope,
- array_mapping_scope: array_mapping_scope,
- finder_query: finder_query
- )
+ .new(**query_builder_params)
.execute
+ .limit(@limit + @offset)
end
def filtered_events
- @filter ? @filter.apply_filter(base_relation) : base_relation
+ filter.apply_filter(base_relation)
end
def paginate_events(events)
@@ -99,3 +112,5 @@ class EventCollection
end
end
end
+
+EventCollection.prepend_mod