Skip to content

Commit d3e44f1

Browse files
authored
Merge pull request #3817 from AlchemyCMS/fix-duplicate-legacy-urls-deletion
Fix duplicate legacy URL removal for all DB engines
2 parents b2d26ed + c9a941c commit d3e44f1

File tree

2 files changed

+56
-7
lines changed

2 files changed

+56
-7
lines changed

lib/alchemy/tasks/tidy.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,12 @@ def remove_trashed_elements
6363

6464
def remove_duplicate_legacy_urls
6565
puts "\n## Removing duplicate legacy URLs"
66-
sql = <<~SQL
67-
DELETE FROM alchemy_legacy_page_urls A USING alchemy_legacy_page_urls B
68-
WHERE A.page_id = B.page_id
69-
AND A.urlname = B.urlname
70-
AND A.id < B.id
71-
SQL
72-
count = ActiveRecord::Base.connection.exec_delete(sql)
66+
keep_ids = Alchemy::LegacyPageUrl
67+
.select("MAX(id)")
68+
.group(:page_id, :urlname)
69+
count = Alchemy::LegacyPageUrl
70+
.where.not(id: keep_ids)
71+
.delete_all
7372
log "Deleted #{count} duplicate legacy URLs"
7473
end
7574

spec/libraries/tasks/tidy_spec.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# frozen_string_literal: true
2+
3+
require "rails_helper"
4+
require "alchemy/tasks/tidy"
5+
6+
RSpec.describe Alchemy::Tidy do
7+
describe ".remove_duplicate_legacy_urls" do
8+
let(:page) { create(:alchemy_page) }
9+
10+
it "removes duplicate legacy URLs keeping the latest" do
11+
duplicate = Alchemy::LegacyPageUrl.create!(page: page, urlname: "my-page")
12+
original = Alchemy::LegacyPageUrl.create!(page: page, urlname: "my-page")
13+
14+
described_class.remove_duplicate_legacy_urls
15+
16+
expect(Alchemy::LegacyPageUrl.where(id: original.id)).to exist
17+
expect(Alchemy::LegacyPageUrl.where(id: duplicate.id)).not_to exist
18+
end
19+
20+
it "does not remove unique legacy URLs" do
21+
original = Alchemy::LegacyPageUrl.create!(page: page, urlname: "my-page")
22+
other_original = Alchemy::LegacyPageUrl.create!(page: page, urlname: "my-other-page")
23+
24+
described_class.remove_duplicate_legacy_urls
25+
26+
expect(Alchemy::LegacyPageUrl.where(id: [original.id, other_original.id]).count).to eq(2)
27+
end
28+
29+
it "removes all duplicates when more than two exist" do
30+
duplicate_one = Alchemy::LegacyPageUrl.create!(page: page, urlname: "my-page")
31+
duplicate_two = Alchemy::LegacyPageUrl.create!(page: page, urlname: "my-page")
32+
original = Alchemy::LegacyPageUrl.create!(page: page, urlname: "my-page")
33+
34+
described_class.remove_duplicate_legacy_urls
35+
36+
expect(Alchemy::LegacyPageUrl.where(id: original.id)).to exist
37+
expect(Alchemy::LegacyPageUrl.where(id: [duplicate_one.id, duplicate_two.id]).count).to eq(0)
38+
end
39+
40+
it "handles duplicates across different pages" do
41+
other_page = create(:alchemy_page)
42+
original = Alchemy::LegacyPageUrl.create!(page: page, urlname: "my-page")
43+
other_original = Alchemy::LegacyPageUrl.create!(page: other_page, urlname: "my-page")
44+
45+
described_class.remove_duplicate_legacy_urls
46+
47+
expect(Alchemy::LegacyPageUrl.where(id: [original.id, other_original.id]).count).to eq(2)
48+
end
49+
end
50+
end

0 commit comments

Comments
 (0)