Class: GitlabQuality::TestTooling::CodeCoverage::ClickHouse::TestFileMappingsTable

Inherits:
Table
  • Object
show all
Defined in:
lib/gitlab_quality/test_tooling/code_coverage/click_house/test_file_mappings_table.rb

Constant Summary collapse

TABLE_NAME =
"test_file_mappings"

Constants inherited from Table

GitlabQuality::TestTooling::CodeCoverage::ClickHouse::Table::LOG_PREFIX

Instance Method Summary collapse

Methods inherited from Table

#initialize

Constructor Details

This class inherits a constructor from GitlabQuality::TestTooling::CodeCoverage::ClickHouse::Table

Instance Method Details

#push(data) ⇒ nil

Override push to filter out duplicate mappings before inserting This prevents accumulating 36M duplicate rows per day in ReplacingMergeTree

Parameters:

  • data (Array<Hash>)

    Code coverage related data to be pushed to ClickHouse

Returns:

  • (nil)


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/gitlab_quality/test_tooling/code_coverage/click_house/test_file_mappings_table.rb', line 17

def push(data) # rubocop:disable Metrics/AbcSize
  return logger.warn("#{LOG_PREFIX} No data found, skipping ClickHouse export!") if data.empty?

  logger.debug("#{LOG_PREFIX} Starting data export to ClickHouse")
  sanitized_data = sanitize(data)

  return logger.warn("#{LOG_PREFIX} No valid data found after sanitization, skipping ClickHouse export!") if sanitized_data.empty?

  # Filter out records that already exist with identical values
  new_or_changed_records = filter_duplicates(sanitized_data)

  if new_or_changed_records.empty?
    logger.info("#{LOG_PREFIX} All #{sanitized_data.size} mappings already exist with same values, skipping insert to #{full_table_name}")
    return
  end

  client.insert_json_data(table_name, new_or_changed_records)
  skipped_count = sanitized_data.size - new_or_changed_records.size
  logger.info("#{LOG_PREFIX} Successfully pushed #{new_or_changed_records.size} new/changed records " \
    "to #{full_table_name} (skipped #{skipped_count} duplicates)")
rescue StandardError => e
  logger.error("#{LOG_PREFIX} Error occurred while pushing data to #{full_table_name}: #{e.message}")
  raise
end