38 lines
1.1 KiB
Ruby
38 lines
1.1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class FixClassificationData < ActiveRecord::Migration[7.2]
|
||
|
def up
|
||
|
classifications = DB.query(<<~SQL)
|
||
|
SELECT id, classification
|
||
|
FROM classification_results
|
||
|
WHERE classification_type = 'sentiment'
|
||
|
AND SUBSTRING(LTRIM(classification::text), 1, 1) = '['
|
||
|
SQL
|
||
|
|
||
|
transformed =
|
||
|
classifications.reduce([]) do |memo, c|
|
||
|
hash_result = {}
|
||
|
c.classification.each { |r| hash_result[r["label"]] = r["score"] }
|
||
|
|
||
|
memo << { id: c.id, fixed_classification: hash_result }
|
||
|
end
|
||
|
|
||
|
transformed_json = transformed.to_json
|
||
|
|
||
|
DB.exec(<<~SQL, values: transformed_json)
|
||
|
UPDATE classification_results
|
||
|
SET classification = N.fixed_classification
|
||
|
FROM (
|
||
|
SELECT (value::jsonb->'id')::integer AS id, (value::jsonb->'fixed_classification')::jsonb AS fixed_classification
|
||
|
FROM jsonb_array_elements(:values::jsonb)
|
||
|
) N
|
||
|
WHERE classification_results.id = N.id
|
||
|
AND classification_type = 'sentiment'
|
||
|
SQL
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
raise ActiveRecord::IrreversibleMigration
|
||
|
end
|
||
|
end
|