Skip to content

Commit 1e71d49

Browse files
authored
fix(Dr. Rai Report): Titration Query Updater (#5699)
**Story card:** [sc-16748](https://app.shortcut.com/simpledotorg/story/16748/fix-titrationdata-populator) ## Because The original implementation assumed a more recent version of PostgreSQL. What we use in Simple is still behind ## This addresses Changing the SQL syntax to match the version of PostgreSQL used in Simple ## Test instructions run the rake task
1 parent 439ed1c commit 1e71d49

File tree

3 files changed

+32
-38
lines changed

3 files changed

+32
-38
lines changed

app/queries/dr_rai/titration_query_factory.rb

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,28 @@
11
module DrRai
22
class TitrationQueryFactory < QueryFactory
3-
def inserter
4-
base_query do
5-
"insert into public.dr_rai_data_titrations (month_date, facility_name, follow_up_count, titrated_count, titration_rate)"
6-
end
7-
end
3+
INSERTER_SQL = "insert into public.dr_rai_data_titrations (month_date, facility_name, follow_up_count, titrated_count, titration_rate)".freeze
84

9-
def updater
10-
<<-SQL
11-
merge into public.dr_rai_data_titrations as existing
12-
using (#{base_query { "" }}) as incoming
13-
on existing.month_date = incoming.month_date and existing.facility_name = incoming.facility_name
14-
when not matched
15-
insert (
16-
month_date,
17-
facility_name,
18-
follow_up_count,
19-
titrated_count,
20-
titration_rate,
21-
created_at,
22-
updated_at
23-
)
24-
values (
25-
incoming.month_date,
26-
incoming.facility_name,
27-
incoming.follow_up_count,
28-
incoming.titrated_count,
29-
incoming.titration_rate,
30-
now(), -- for created_at
31-
now(), -- for updated_at
32-
)
33-
when matched and existing.titration_rate != incoming.titration_rate
5+
CONFLICT_HANDLER_SQL = <<~SQL
6+
on conflict (month_date, facility_name) do
347
update
358
set
36-
follow_up_count = incoming.follow_up_count,
37-
titrated_count = incoming.titrated_count,
38-
titration_rate = incoming.titration_rate,
9+
follow_up_count = excluded.follow_up_count,
10+
titrated_count = excluded.titrated_count,
11+
titration_rate = excluded.titration_rate,
3912
updated_at = now(); -- ...for good bookkeeping
40-
SQL
13+
SQL
14+
15+
def inserter
16+
base_query(INSERTER_SQL, "") { |enhancement| enhancement }
17+
end
18+
19+
def updater
20+
base_query(INSERTER_SQL, CONFLICT_HANDLER_SQL) { |enhancement| enhancement }
4121
end
4222

4323
private
4424

45-
def base_query
25+
def base_query inserter, conflict_handler
4626
<<~SQL
4727
with facility_titrations as (
4828
select
@@ -88,12 +68,13 @@ def base_query
8868
group by month_date
8969
)
9070
91-
#{yield}
71+
#{yield inserter}
9272
(
9373
select * from selected_facility_titrations
9474
union all
9575
select * from averages
96-
);
76+
)
77+
#{yield conflict_handler};
9778
SQL
9879
end
9980
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddIndexToDrRaiDataTitrations < ActiveRecord::Migration[6.1]
2+
def change
3+
add_index :dr_rai_data_titrations, [:month_date, :facility_name], unique: true
4+
end
5+
end

db/structure.sql

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7081,6 +7081,13 @@ CREATE INDEX index_dr_rai_action_plans_on_region_id ON public.dr_rai_action_plan
70817081
CREATE UNIQUE INDEX index_dr_rai_data_statins_on_month_date_and_aggregate_root ON public.dr_rai_data_statins USING btree (month_date, aggregate_root);
70827082

70837083

7084+
--
7085+
-- Name: index_dr_rai_data_titrations_on_month_date_and_facility_name; Type: INDEX; Schema: public; Owner: -
7086+
--
7087+
7088+
CREATE UNIQUE INDEX index_dr_rai_data_titrations_on_month_date_and_facility_name ON public.dr_rai_data_titrations USING btree (month_date, facility_name);
7089+
7090+
70847091
--
70857092
-- Name: index_dr_rai_targets_on_dr_rai_indicators_id; Type: INDEX; Schema: public; Owner: -
70867093
--
@@ -8778,6 +8785,7 @@ INSERT INTO "schema_migrations" (version) VALUES
87788785
('20250813064810'),
87798786
('20250814092225'),
87808787
('20250827134615'),
8781-
('20250828111954');
8788+
('20250828111954'),
8789+
('20250923223358');
87828790

87838791

0 commit comments

Comments
 (0)