Skip to content

Commit 2c30d2b

Browse files
authored
Merge pull request #5150 from nhsuk/remove_patient_teams_sync_from_transactions
Move all perform_later calls outside transaction
2 parents ab68f82 + 63d42cb commit 2c30d2b

7 files changed

Lines changed: 65 additions & 60 deletions

File tree

app/jobs/commit_import_job.rb

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def perform(import_global_id)
2727
end
2828

2929
counts = import.class.const_get(:COUNT_COLUMNS).index_with(0)
30+
imported_school_move_ids = []
3031

3132
ActiveRecord::Base.transaction do
3233
import
@@ -37,11 +38,10 @@ def perform(import_global_id)
3738

3839
import_patients_and_parents(changesets, import)
3940

40-
import_school_moves(changesets, import)
41+
imported_school_move_ids |= import_school_moves(changesets, import)
4142

4243
import_pds_search_results(changesets, import)
4344
end
44-
4545
import.postprocess_rows!
4646

4747
reset_counts(import)
@@ -52,7 +52,7 @@ def perform(import_global_id)
5252
**counts
5353
)
5454
end
55-
55+
SyncPatientTeamJob.perform_later(SchoolMove, imported_school_move_ids)
5656
import.post_commit!
5757
end
5858

@@ -124,12 +124,11 @@ def import_school_moves(changesets, import)
124124
school_move.confirm! if school_move.patient.persisted?
125125
end
126126
school_move_import_records = importable_school_moves.to_a
127-
imported_ids =
128-
SchoolMove.import!(
129-
school_move_import_records,
130-
on_duplicate_key_update: :all
131-
).ids
132-
SyncPatientTeamJob.perform_later(SchoolMove, imported_ids)
127+
128+
SchoolMove.import!(
129+
school_move_import_records,
130+
on_duplicate_key_update: :all
131+
).ids
133132
end
134133

135134
def import_pds_search_results(changesets, import)

app/jobs/commit_patient_changesets_job.rb

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def perform(import_global_id)
2727
end
2828

2929
counts = import.class.const_get(:COUNT_COLUMNS).index_with(0)
30+
imported_school_move_ids = []
3031

3132
ActiveRecord::Base.transaction do
3233
import
@@ -37,11 +38,10 @@ def perform(import_global_id)
3738

3839
import_patients_and_parents(changesets, import)
3940

40-
import_school_moves(changesets, import)
41+
imported_school_move_ids |= import_school_moves(changesets, import)
4142

4243
import_pds_search_results(changesets, import)
4344
end
44-
4545
import.postprocess_rows!
4646

4747
reset_counts(import)
@@ -52,7 +52,7 @@ def perform(import_global_id)
5252
**counts
5353
)
5454
end
55-
55+
SyncPatientTeamJob.perform_later(SchoolMove, imported_school_move_ids)
5656
import.post_commit!
5757
end
5858

@@ -124,12 +124,11 @@ def import_school_moves(changesets, import)
124124
school_move.confirm! if school_move.patient.persisted?
125125
end
126126
school_move_import_records = importable_school_moves.to_a
127-
imported_ids =
128-
SchoolMove.import!(
129-
school_move_import_records,
130-
on_duplicate_key_update: :all
131-
).ids
132-
SyncPatientTeamJob.perform_later(SchoolMove, imported_ids)
127+
128+
SchoolMove.import!(
129+
school_move_import_records,
130+
on_duplicate_key_update: :all
131+
).ids
133132
end
134133

135134
def import_pds_search_results(changesets, import)

app/lib/location_sessions_factory.rb

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,31 @@ def initialize(location, academic_year:, sync_patient_teams_now: false)
88
end
99

1010
def call
11-
ActiveRecord::Base.transaction do
12-
if location.generic_clinic?
13-
find_or_create_session!(programmes: location.programmes)
14-
else
15-
ProgrammeGrouper
16-
.call(location.programmes)
17-
.values
18-
.reject { |programmes| catch_up_only?(programmes:) }
19-
.reject { |programmes| already_exists?(programmes:) }
20-
.map { |programmes| create_session!(programmes:) }
21-
end
11+
imported_patient_location_ids =
12+
ActiveRecord::Base.transaction do
13+
if location.generic_clinic?
14+
find_or_create_session!(programmes: location.programmes)
15+
else
16+
ProgrammeGrouper
17+
.call(location.programmes)
18+
.values
19+
.reject { |programmes| catch_up_only?(programmes:) }
20+
.reject { |programmes| already_exists?(programmes:) }
21+
.map { |programmes| create_session!(programmes:) }
22+
end
2223

23-
add_patients!
24+
add_patients!
25+
end
26+
if sync_patient_teams_now
27+
SyncPatientTeamJob.perform_now(
28+
PatientLocation,
29+
imported_patient_location_ids
30+
)
31+
else
32+
SyncPatientTeamJob.perform_later(
33+
PatientLocation,
34+
imported_patient_location_ids
35+
)
2436
end
2537
end
2638

@@ -61,17 +73,11 @@ def find_or_create_session!(programmes:)
6173
end
6274

6375
def add_patients!
64-
imported_ids =
65-
PatientLocation.import!(
66-
%i[patient_id location_id academic_year],
67-
patient_ids.map { [it, location.id, academic_year] },
68-
on_duplicate_key_ignore: true
69-
).ids
70-
if sync_patient_teams_now
71-
SyncPatientTeamJob.perform_now(PatientLocation, imported_ids)
72-
else
73-
SyncPatientTeamJob.perform_later(PatientLocation, imported_ids)
74-
end
76+
PatientLocation.import!(
77+
%i[patient_id location_id academic_year],
78+
patient_ids.map { [it, location.id, academic_year] },
79+
on_duplicate_key_ignore: true
80+
).ids
7581
end
7682

7783
def patient_ids

app/models/class_import.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ class ClassImport < PatientImport
5050

5151
def postprocess_rows!
5252
# Remove patients already in the sessions but not in the class list.
53-
5453
birth_academic_years =
5554
year_groups.map { it.to_birth_academic_year(academic_year:) }
5655

@@ -77,14 +76,15 @@ def postprocess_rows!
7776
)
7877
end
7978

80-
imported_ids =
79+
@imported_school_move_ids ||= []
80+
@imported_school_move_ids |=
8181
SchoolMove.import!(school_moves, on_duplicate_key_ignore: true).ids
82-
SyncPatientTeamJob.perform_later(SchoolMove, imported_ids)
8382

8483
PatientsAgedOutOfSchoolJob.perform_async(location_id)
8584
end
8685

8786
def post_commit!
87+
SyncPatientTeamJob.perform_later(SchoolMove, @imported_school_move_ids)
8888
end
8989

9090
private

app/models/concerns/contributes_to_patient_teams.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def sync_patient_teams_table_on_patient_ids(pk_ids)
229229
sterile_key = connection.quote(PatientTeam.sources.fetch(key.to_s))
230230
patient_relationships_to_remove =
231231
select("#{patient_id_source} as patient_id")
232-
.where("#{table_name}.id = ANY(ARRAY[?])", pk_ids)
232+
.where("#{table_name}.id = ANY(ARRAY[?]::bigint[])", pk_ids)
233233
.distinct
234234
.to_sql
235235
connection.execute <<-SQL
@@ -241,7 +241,7 @@ def sync_patient_teams_table_on_patient_ids(pk_ids)
241241
end
242242

243243
where(
244-
"#{table_name}.id = ANY(ARRAY[?])",
244+
"#{table_name}.id = ANY(ARRAY[?]::bigint[])",
245245
pk_ids
246246
).distinct.add_patient_team_relationships
247247

app/models/patient.rb

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -661,12 +661,13 @@ def update_from_pds!(pds_patient)
661661
raise NHSNumberMismatch
662662
end
663663

664+
archived_ids = []
664665
ActiveRecord::Base.transaction do
665666
self.date_of_death = pds_patient.date_of_death
666667

667668
if date_of_death_changed?
668669
if date_of_death.present?
669-
archive_due_to_deceased!
670+
archived_ids = archive_due_to_deceased!
670671
clear_pending_sessions!
671672
end
672673

@@ -697,6 +698,8 @@ def update_from_pds!(pds_patient)
697698

698699
save!
699700
end
701+
702+
SyncPatientTeamJob.perform_later(ArchiveReason, archived_ids)
700703
end
701704

702705
def invalidate!
@@ -810,15 +813,13 @@ def archive_due_to_deceased!
810813
ArchiveReason.new(team:, patient: self, type: :deceased)
811814
end
812815

813-
imported_ids =
814-
ArchiveReason.import!(
815-
archive_reasons,
816-
on_duplicate_key_update: {
817-
conflict_target: %i[team_id patient_id],
818-
columns: %i[type]
819-
}
820-
).ids
821-
SyncPatientTeamJob.perform_later(ArchiveReason, imported_ids)
816+
ArchiveReason.import!(
817+
archive_reasons,
818+
on_duplicate_key_update: {
819+
conflict_target: %i[team_id patient_id],
820+
columns: %i[type]
821+
}
822+
).ids
822823
end
823824

824825
def fhir_mapper = @fhir_mapper ||= FHIRMapper::Patient.new(self)

app/models/school_move.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,15 @@ def assign_from(school:, home_educated:, team:)
6363
end
6464

6565
def confirm!(user: nil)
66+
imported_archive_reason_ids = []
6667
ActiveRecord::Base.transaction do
6768
update_patient!
68-
update_archive_reasons!(user:)
69+
imported_archive_reason_ids = update_archive_reasons!(user:)
6970
update_sessions!
7071
create_log_entry!(user:)
7172
destroy! if persisted?
7273
end
74+
SyncPatientTeamJob.perform_later(ArchiveReason, imported_archive_reason_ids)
7375
end
7476

7577
def ignore!
@@ -99,9 +101,7 @@ def update_archive_reasons!(user:)
99101
)
100102
end
101103

102-
imported_ids =
103-
ArchiveReason.import!(archive_reasons, on_duplicate_key_ignore: true).ids
104-
SyncPatientTeamJob.perform_later(ArchiveReason, imported_ids)
104+
ArchiveReason.import!(archive_reasons, on_duplicate_key_ignore: true).ids
105105
end
106106

107107
def update_sessions!

0 commit comments

Comments
 (0)