Skip to content
Snippets Groups Projects

Backfill identifier_names to vulnerability_reads

Merged Bala Kumar requested to merge 460080-new-backfill-migration into master
All threads resolved!
1 file
+ 20
18
Compare changes
  • Side-by-side
  • Inline
@@ -9,23 +9,7 @@ class BackfillIdentifierNamesOfVulnerabilityReads < BatchedMigrationJob
UPDATE_SQL = <<~SQL
UPDATE vulnerability_reads AS vr
SET identifier_names = selected_ids.names
FROM (
SELECT
vr.id,
ARRAY_AGG(LOWER(vi.name) ORDER BY LOWER(vi.name)) AS names
FROM
vulnerability_reads vr
JOIN
vulnerability_occurrences vo ON vr.vulnerability_id = vo.vulnerability_id
JOIN
vulnerability_occurrence_identifiers voi ON vo.id = voi.occurrence_id
JOIN
vulnerability_identifiers vi ON voi.identifier_id = vi.id
WHERE
vr.id IN (?)
GROUP BY
vr.id
) AS selected_ids
FROM (?) AS selected_ids
WHERE vr.id = selected_ids.id
SQL
@@ -35,7 +19,25 @@ class VulnerabilitiesRead < ::ApplicationRecord
def perform
each_sub_batch do |sub_batch|
update_query = VulnerabilitiesRead.sanitize_sql([UPDATE_SQL, sub_batch.select(:id)])
cte = Gitlab::SQL::CTE.new(:batched_relation, sub_batch.limit(100))
filtered_results = cte
.apply_to(VulnerabilitiesRead.all)
.joins(
'INNER JOIN vulnerability_occurrences vo ' \
'ON vulnerability_reads.vulnerability_id = vo.vulnerability_id'
)
.joins('INNER JOIN vulnerability_occurrence_identifiers voi ON vo.id = voi.occurrence_id')
.joins('INNER JOIN vulnerability_identifiers vi ON voi.identifier_id = vi.id')
.where(vulnerability_reads: { id: sub_batch.select(:id) })
.group("vulnerability_reads.id")
.select(
'vulnerability_reads.id AS id',
'ARRAY_AGG(LOWER(vi.name) ORDER BY LOWER(vi.name)) AS names'
)
update_query = VulnerabilitiesRead.sanitize_sql([UPDATE_SQL, filtered_results])
connection.execute(update_query)
end
end
Loading