[CA PoC] Rearrange the class sturcture to preapre for the CH backend
Why are we doing this work
This issue prepares the CA codebase to easily add a new data source which in our case will be ClickHouse.
Implementation plan
Currently, the Gitlab::ContributionAnalytics::DataCollector
class is responsible for providing data to the view layer (GraphQL). Essentially, we're returning a hash with counts which will be split/processed in Ruby. Let's split this class into two parts to separate the formatting and the querying parts:
-
Gitlab::ContributionAnalytics::DataCollector
=> interface, builds the DB specific data collector (based on a flag) implementation and exposes theall_counts
method (delegates to the underlying implementation).-
Gitlab::ContributionAnalytics::PostgresqlDataCollector
=> PG implementation -
Gitlab::ContributionAnalytics::ClickHouseDataCollector
=> CH implementation (not part of this issue)
-
-
Gitlab::ContributionAnalytics::DataFormatter
=> Implements the data formatting such asmerge_requests_merged_by_author_count
andtotals
methods. (implementation can be taken as is from the currentDataCollector
class)
How would this work?
Data collector implementation (pseudo code):
class DataCollector
def initialize(group:)
@group = group
end
def all_counts
data_collector.all_counts
end
private
def data_collector
@data_collector = begin
if use_postgresql?(group)
Gitlab::ContributionAnalytics::PostgresqlDataCollector.new(group: group) # contains the current implementation of all_counts
else
raise 'not supported for now'
end
end
end
end
On the data collector level, we would invoke the code like this:
data_collector = Gitlab::ContributionAnalytics::DataCollector.new(group: group)
data_collector.all_counts # based on the feature flags/settings, it delegates to `PostgresqlDataCollector#all_counts`
Combining it with the DataFormatter
:
# - We could pass the `Gitlab::ContributionAnalytics::DataCollector.new(group: group)` object
# - Or we could pass the concrete implementation (maybe for testing): `Gitlab::ContributionAnalytics::PostgresqlDataCollector.new(group: group)`
formatter = Gitlab::ContributionAnalytics::DataFormatter.new(group: group, data_collector: data_collector)
formatter.merge_requests_merged_by_author_count
Edited by Adam Hegyi