Skip to content

Commit 9a50dfe

Browse files
authored
Merge pull request #4659 from nhsuk/fix-patients-query
Fix performance degradation in patients query
2 parents c696c06 + e2dd33a commit 9a50dfe

File tree

2 files changed

+27
-16
lines changed

2 files changed

+27
-16
lines changed

app/controllers/sessions_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def index
1919
@patient_count_by_session_id =
2020
PatientLocation
2121
.joins(:patient)
22+
.joins_sessions
2223
.appear_in_programmes(@programmes)
2324
.where("sessions.id IN (?)", sessions.pluck(:id))
2425
.distinct

app/models/patient_location.rb

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,24 +66,34 @@ class PatientLocation < ApplicationRecord
6666
AND sessions.academic_year = patient_locations.academic_year
6767
SQL
6868

69-
scope :joins_session_programmes, -> { joins(<<-SQL) }
70-
INNER JOIN session_programmes
71-
ON session_programmes.session_id = sessions.id
72-
SQL
73-
74-
scope :joins_location_programme_year_groups, -> { joins(<<-SQL) }
75-
INNER JOIN location_programme_year_groups
76-
ON location_programme_year_groups.location_id = patient_locations.location_id
77-
AND location_programme_year_groups.programme_id = session_programmes.programme_id
78-
AND location_programme_year_groups.year_group = patient_locations.academic_year - patients.birth_academic_year - #{Integer::AGE_CHILDREN_START_SCHOOL}
79-
SQL
80-
8169
scope :appear_in_programmes,
8270
->(programmes) do
83-
joins_sessions
84-
.joins_session_programmes
85-
.joins_location_programme_year_groups
86-
.where(session_programmes: { programme_id: programmes.map(&:id) })
71+
session_programme_exists =
72+
SessionProgramme
73+
.where(programme: programmes)
74+
.joins(:session)
75+
.where("sessions.location_id = patient_locations.location_id")
76+
.where("sessions.academic_year = patient_locations.academic_year")
77+
.arel
78+
.exists
79+
80+
location_programme_year_group_exists =
81+
LocationProgrammeYearGroup
82+
.where(
83+
"location_programme_year_groups.location_id = patient_locations.location_id"
84+
)
85+
.where(
86+
"location_programme_year_groups.year_group = " \
87+
"patient_locations.academic_year - patients.birth_academic_year - ?",
88+
Integer::AGE_CHILDREN_START_SCHOOL
89+
)
90+
.where(programme: programmes)
91+
.arel
92+
.exists
93+
94+
where(session_programme_exists).where(
95+
location_programme_year_group_exists
96+
)
8797
end
8898

8999
scope :destroy_all_if_safe,

0 commit comments

Comments
 (0)