Skip to content

Commit dd015c4

Browse files
thomasleesebenilovj
authored andcommitted
Revert "Find duplicates using full name"
This reverts commit 00821ad.
1 parent fe71e4b commit dd015c4

File tree

3 files changed

+40
-74
lines changed

3 files changed

+40
-74
lines changed

app/controllers/patients_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def index
1010

1111
if (@q = params[:q]).present?
1212
@q.strip!
13-
scope = scope.search_by_full_name(@q)
13+
scope = scope.search_by_name(@q)
1414
end
1515

1616
@pagy, @patients = pagy(scope.order_by_name)

app/models/patient.rb

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -114,32 +114,22 @@ class Patient < ApplicationRecord
114114

115115
scope :with_pending_changes, -> { where.not(pending_changes: {}) }
116116

117-
# Trigram matching requires at least 3 characters
118-
scope :search_by_full_name,
117+
scope :search_by_name,
119118
->(query) do
119+
# Trigram matching requires at least 3 characters
120120
if query.length < 3
121121
where(
122122
"given_name ILIKE :like_query OR family_name ILIKE :like_query",
123123
like_query: "#{query}%"
124124
)
125125
else
126-
where("given_name % :query OR family_name % :query", query:)
127-
end
128-
end
129-
scope :search_by_given_name,
130-
->(query) do
131-
if query.length < 3
132-
where("given_name ILIKE :query", query:)
133-
else
134-
where("given_name % :query", query:)
135-
end
136-
end
137-
scope :search_by_family_name,
138-
->(query) do
139-
if query.length < 3
140-
where("family_name ILIKE :query", query:)
141-
else
142-
where("family_name % :query", query:)
126+
where(
127+
"given_name % :query OR " \
128+
"family_name % :query OR " \
129+
"similarity(given_name, :query) > 0.3 OR " \
130+
"similarity(family_name, :query) > 0.3",
131+
query:
132+
)
143133
end
144134
end
145135

@@ -182,16 +172,32 @@ def self.match_existing(
182172
end
183173

184174
scope =
185-
Patient.search_by_given_name(given_name).search_by_family_name(
186-
family_name
187-
)
188-
189-
scope =
190-
if address_postcode.present?
191-
scope.where(address_postcode:).or(scope.where(date_of_birth:))
192-
else
193-
scope.where(date_of_birth:)
194-
end
175+
Patient
176+
.where(
177+
"given_name ILIKE ? AND family_name ILIKE ?",
178+
given_name,
179+
family_name
180+
)
181+
.where(date_of_birth:)
182+
.or(
183+
Patient.where(
184+
"given_name ILIKE ? AND family_name ILIKE ?",
185+
given_name,
186+
family_name
187+
).where(address_postcode:)
188+
)
189+
.or(
190+
Patient.where("given_name ILIKE ?", given_name).where(
191+
date_of_birth:,
192+
address_postcode:
193+
)
194+
)
195+
.or(
196+
Patient.where("family_name ILIKE ?", family_name).where(
197+
date_of_birth:,
198+
address_postcode:
199+
)
200+
)
195201

196202
if nhs_number.blank?
197203
scope.to_a

spec/models/patient_spec.rb

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -165,62 +165,22 @@
165165
it { should_not include(patient) }
166166
end
167167

168-
context "with first name and last name are similar and matching date of birth" do
169-
let(:nhs_number) { nil }
170-
let(:patient) do
171-
create(
172-
:patient,
173-
given_name: "Johnny",
174-
family_name: "Smith",
175-
date_of_birth:
176-
)
177-
end
178-
179-
it { should include(patient) }
180-
end
181-
182-
context "with first name and last name are similar and matching postcode" do
183-
let(:nhs_number) { nil }
184-
let(:patient) do
185-
create(
186-
:patient,
187-
given_name: "John",
188-
family_name: "Smyth",
189-
address_postcode:
190-
)
191-
end
192-
193-
it { should include(patient) }
194-
end
195-
196168
context "with matching first name, date of birth and postcode" do
197169
let(:nhs_number) { nil }
198170
let(:patient) do
199-
create(
200-
:patient,
201-
given_name:,
202-
family_name: "Seldon",
203-
date_of_birth:,
204-
address_postcode:
205-
)
171+
create(:patient, given_name:, date_of_birth:, address_postcode:)
206172
end
207173

208-
it { should_not include(patient) }
174+
it { should include(patient) }
209175
end
210176

211177
context "with matching last name, date of birth and postcode" do
212178
let(:nhs_number) { nil }
213179
let(:patient) do
214-
create(
215-
:patient,
216-
given_name: "Hari",
217-
family_name:,
218-
date_of_birth:,
219-
address_postcode:
220-
)
180+
create(:patient, family_name:, date_of_birth:, address_postcode:)
221181
end
222182

223-
it { should_not include(patient) }
183+
it { should include(patient) }
224184
end
225185

226186
context "when matching everything except the NHS number" do

0 commit comments

Comments
 (0)