Skip to content

Commit 3179f28

Browse files
committed
Add migrations for AP-427
1 parent d895ff4 commit 3179f28

File tree

4 files changed

+139
-0
lines changed

4 files changed

+139
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class AddTwoFacets < ActiveRecord::Migration[7.0]
2+
def up
3+
facet = Facet.find_by!(name: "Medium")
4+
Term.create!(facet: facet, value: "Digital")
5+
Term.create!(facet: facet, value: "Drawing")
6+
end
7+
8+
def down
9+
facet = Facet.find_by(name: "Medium")
10+
Term.where(facet: facet, value: ["Digital", "Drawing"]).delete_all
11+
end
12+
end
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class AddThreeOrderedTerms < ActiveRecord::Migration[7.0]
2+
def up
3+
facet = Facet.find_by!(name: "Decade")
4+
5+
# Add and remove terms from facet "Decade", and reorder them.
6+
# The term "After 1999" is no longer needed and will be removed
7+
# when all items_terms have been updated
8+
term = Term.find_by!(facet: facet, value: "After 1999")
9+
term.update!(ord: 15)
10+
term = Term.find_by!(facet: facet, value: "No Date")
11+
term.update!(ord: 14)
12+
13+
Term.create!(facet: facet, value: "2000-2009", ord: 11)
14+
Term.create!(facet: facet, value: "2010-2019", ord: 12)
15+
Term.create!(facet: facet, value: "After 2020",ord: 13)
16+
end
17+
18+
def down
19+
facet = Facet.find_by(name: "Decade")
20+
return unless facet
21+
22+
Term.where(facet: facet, value: ["2000-2009", "2010-2019", "After 2020"]).delete_all
23+
term = Term.find_by!(facet: facet, value: "After 1999")
24+
term.update!(ord: 11)
25+
term = Term.find_by!(facet: facet, value: "No Date")
26+
term.update!(ord: 12)
27+
end
28+
end
29+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
class UpdateTermItemRelation < ActiveRecord::Migration[7.0]
2+
def up
3+
facet = Facet.find_by!(name: 'Decade')
4+
old_term = Term.find_by!(facet: facet, value: 'After 1999')
5+
6+
new_terms = {
7+
(2000..2009) => Term.find_by!(facet: facet, value: '2000-2009'),
8+
(2010..2019) => Term.find_by!(facet: facet, value: '2010-2019'),
9+
(2020..) => Term.find_by!(facet: facet, value: 'After 2020')
10+
}
11+
12+
old_term.items.find_each do |item|
13+
year = integer_year(item.date)
14+
next unless year
15+
16+
target_term = new_terms.find { |range, _| range.cover?(year) }&.last
17+
next unless target_term
18+
19+
update_item(item, old_term, target_term)
20+
end
21+
end
22+
23+
def down
24+
facet = Facet.find_by!(name: 'Decade')
25+
target_term = Term.find_by!(facet: facet, value: 'After 1999')
26+
roll_back(facet, target_term, '2000-2009')
27+
roll_back(facet, target_term, '2010-2019')
28+
roll_back(facet, target_term, 'After 2020')
29+
end
30+
31+
private
32+
33+
def integer_year(val)
34+
Integer(val)
35+
rescue ArgumentError, TypeError
36+
nil
37+
end
38+
39+
def update_item(item, origin_term, target_term)
40+
return unless target_term & item & target_term
41+
42+
item.terms.delete(origin_term)
43+
item.terms << target_term unless item.terms.include?(target_term)
44+
end
45+
46+
def roll_back(facet, target_term, origin_term_value)
47+
origin_term = Term.find_by!(facet: facet, value: origin_term_value)
48+
origin_term.items.find_each do |item|
49+
update_item(item, origin_term, target_term)
50+
end
51+
end
52+
end
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class UpdateFixTermItemRelation < ActiveRecord::Migration[7.0]
2+
def up
3+
execute <<~SQL.squish
4+
old_id = select_value("SELECT id FROM terms WHERE value = 'After 1999'")
5+
new_id = select_value("SELECT id FROM terms WHERE value = 'After 2020'")
6+
return unless old_id && new_id
7+
8+
WITH target AS (
9+
SELECT it.term_id, it.item_id
10+
FROM items i
11+
JOIN items_terms it ON i.id = it.item_id
12+
JOIN terms t ON it.term_id = t.id
13+
WHERE t.id = #{old_id}
14+
AND i.date = '[2020]'
15+
)
16+
UPDATE items_terms it
17+
SET term_id = #{new_id}
18+
FROM target
19+
WHERE it.item_id = target.item_id
20+
AND it.term_id = target.term_id;
21+
SQL
22+
end
23+
24+
def up
25+
new_id = select_value("SELECT id FROM terms WHERE value = 'After 1999'")
26+
old_id = select_value("SELECT id FROM terms WHERE value = 'After 2020'")
27+
return unless old_id && new_id
28+
29+
execute <<~SQL.squish
30+
WITH target AS (
31+
SELECT it.term_id, it.item_id
32+
FROM items i
33+
JOIN items_terms it ON i.id = it.item_id
34+
JOIN terms t ON it.term_id = t.id
35+
WHERE t.id = #{old_id}
36+
AND i.date = '[2020]'
37+
)
38+
UPDATE items_terms it
39+
SET term_id = #{new_id}
40+
FROM target
41+
WHERE it.item_id = target.item_id
42+
AND it.term_id = target.term_id;
43+
SQL
44+
end
45+
46+
end

0 commit comments

Comments
 (0)