malawi_hiv_program_reports 1.1.15 → 1.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 394a402d0b5e0c9b210bbf5feff0959854bb2b8d1322ecd97b07107201dcd694
|
4
|
+
data.tar.gz: 51615fcd686c06088e928b6b10e1bba26a754825e9c3d891e0e7c43c00647098
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa30a38678f9f6dbeded4d8b3fe6ae920a46c6bea63937906f330cdf50b2cbc1ca6ae95edcf004caa2b4ca5501c6dbf627210f2f496dd49e1ba3964815e3a28f
|
7
|
+
data.tar.gz: cccee12cb7e4e5d9e5e685230b63309f93ad6db7199de3ae244d461a95e0f825f71a0d82f9b01a535636ad2c45fffc617dfcc68460d1f9508853c059ee71be9e
|
@@ -7,10 +7,11 @@ module MalawiHivProgramReports
|
|
7
7
|
class CumulativeCohort
|
8
8
|
include MalawiHivProgramReports::Utils::CommonSqlQueryUtils
|
9
9
|
|
10
|
-
attr_reader :start_date, :end_date, :locations, :rebuild, :outcome, :definition
|
10
|
+
attr_reader :start_date, :end_date, :locations, :rebuild, :outcome, :definition, :iteration, :redis, :start_time
|
11
11
|
|
12
12
|
LOCK_FILE = 'art_service/reports/cumulative_cohort.lock'
|
13
13
|
|
14
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
14
15
|
def initialize(start_date:, end_date:, **kwargs)
|
15
16
|
@start_date = ActiveRecord::Base.connection.quote(start_date)
|
16
17
|
@end_date = ActiveRecord::Base.connection.quote(end_date)
|
@@ -18,13 +19,17 @@ module MalawiHivProgramReports
|
|
18
19
|
locations = kwargs[:locations]
|
19
20
|
@locations = locations.present? ? locations.split(',') : []
|
20
21
|
@definition = kwargs[:definition] || 'pepfar'
|
21
|
-
|
22
|
+
@iteration = Concurrent::AtomicFixnum.new(0)
|
23
|
+
@start_time = Time.now
|
24
|
+
@redis = Redis.new
|
25
|
+
@redis.set('cumulative_progress', 0)
|
26
|
+
@redis.set('cumulative_status', 'running')
|
27
|
+
@redis.set('cumulative_time_taken', 0)
|
22
28
|
definition = @definition.downcase
|
23
29
|
raise ArgumentError, "Invalid outcomes definition: #{definition}" unless %w[moh pepfar].include?(definition)
|
24
30
|
end
|
25
31
|
|
26
32
|
def find_report
|
27
|
-
start_time = Time.now
|
28
33
|
handle_tables
|
29
34
|
clear_cohort_status unless rebuild
|
30
35
|
process_thread(locations:)
|
@@ -33,8 +38,11 @@ module MalawiHivProgramReports
|
|
33
38
|
handle_failed
|
34
39
|
time_taken_for_failed = ((Time.now - end_time) / 60).round(2)
|
35
40
|
Rails.logger.info("Cumulative Cohort report took #{time_in_minutes} minutes to generate for these locations: #{locations}")
|
41
|
+
redis.set('cumulative_time_taken', time_in_minutes)
|
42
|
+
redis.set('cumulative_status', 'completed')
|
36
43
|
{ cohort_time: time_in_minutes, processing_failed: time_taken_for_failed }
|
37
44
|
end
|
45
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
38
46
|
|
39
47
|
private
|
40
48
|
|
@@ -46,13 +54,12 @@ module MalawiHivProgramReports
|
|
46
54
|
# 5. We want to get information on clients birthdate etc after joining all the above
|
47
55
|
# 6. Finally we want to get the outcomes of the clients in 5 above
|
48
56
|
|
49
|
-
# rubocop:disable Metrics/MethodLength
|
57
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
50
58
|
def process_thread(locations: [])
|
51
|
-
# use locations to thread but process 10 locations at a time
|
52
59
|
queue = Queue.new
|
53
60
|
locations.each { |loc| queue << loc }
|
54
61
|
|
55
|
-
threads = Array.new(
|
62
|
+
threads = Array.new(65) do
|
56
63
|
Thread.new do
|
57
64
|
until queue.empty?
|
58
65
|
loc = begin
|
@@ -64,6 +71,8 @@ module MalawiHivProgramReports
|
|
64
71
|
|
65
72
|
ActiveRecord::Base.connection_pool.with_connection do
|
66
73
|
process_data loc
|
74
|
+
current_iteration = iteration.increment
|
75
|
+
update_progress(current_iteration, locations.size)
|
67
76
|
rescue StandardError => e
|
68
77
|
Rails.logger.info("Error processing location #{loc}: #{e.message}")
|
69
78
|
Rails.logger.info(e.backtrace.join("\n"))
|
@@ -75,7 +84,18 @@ module MalawiHivProgramReports
|
|
75
84
|
|
76
85
|
threads.each(&:join)
|
77
86
|
end
|
78
|
-
# rubocop:enable Metrics/MethodLength
|
87
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
88
|
+
|
89
|
+
# update progress in redis and channel
|
90
|
+
def update_progress(current_iteration, total)
|
91
|
+
percentage = (current_iteration.to_f / total * 100).round(2)
|
92
|
+
redis.set('cumulative_progress', percentage)
|
93
|
+
ActionCable.server.broadcast('cumulative_updates_channel', {
|
94
|
+
progress: percentage,
|
95
|
+
status: 'running',
|
96
|
+
time_taken: ((Time.now - start_time) / 60).round(2)
|
97
|
+
})
|
98
|
+
end
|
79
99
|
|
80
100
|
def reprocess_failed
|
81
101
|
failed_locs = failed_sites&.map { |loc| loc[:site_id] }
|
@@ -84,6 +104,7 @@ module MalawiHivProgramReports
|
|
84
104
|
process_thread(locations: failed_locs)
|
85
105
|
end
|
86
106
|
|
107
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
87
108
|
def handle_failed
|
88
109
|
failed_locs = failed_sites&.map { |loc| loc['site_id'].to_i }
|
89
110
|
return if failed_locs.empty?
|
@@ -102,9 +123,13 @@ module MalawiHivProgramReports
|
|
102
123
|
Rails.logger.info("Error processing location #{loc}: #{e.message}")
|
103
124
|
Rails.logger.info(e.backtrace.join("\n"))
|
104
125
|
save_incomplete_site(location: loc, time_taken: 0)
|
126
|
+
ensure
|
127
|
+
current_iteration = iteration.increment
|
128
|
+
update_progress(current_iteration, locations.size)
|
105
129
|
end
|
106
130
|
end
|
107
131
|
end
|
132
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
108
133
|
|
109
134
|
def failed_sites
|
110
135
|
ActiveRecord::Base.connection.select_all <<~SQL
|
@@ -317,7 +317,7 @@ module MalawiHivProgramReports
|
|
317
317
|
INSERT INTO cdr_temp_patient_outcomes#{start ? '_start' : ''} PARTITION (p#{location})
|
318
318
|
SELECT patient_id, #{patient_outcome_function('patient_id', 'site_id', start)}, NULL, #{location}, 6
|
319
319
|
FROM cdr_temp_cohort_members PARTITION (p#{location})
|
320
|
-
WHERE date_enrolled <=
|
320
|
+
WHERE date_enrolled <= DATE(#{start ? start_date : end_date}) #{start ? '- INTERVAL 1 DAY' : ''}
|
321
321
|
AND (patient_id, site_id) NOT IN (SELECT patient_id, site_id FROM cdr_temp_patient_outcomes#{start ? '_start' : ''} PARTITION (p#{location}) WHERE step IN (1, 2, 3, 4, 5))
|
322
322
|
ON DUPLICATE KEY UPDATE cum_outcome = VALUES(cum_outcome), outcome_date = VALUES(outcome_date), step = VALUES(step)
|
323
323
|
SQL
|
@@ -586,7 +586,7 @@ module MalawiHivProgramReports
|
|
586
586
|
|
587
587
|
def clear_tables(start: false)
|
588
588
|
# we truncate if @locations is empty otherwise we only clean the specifieds
|
589
|
-
if location.
|
589
|
+
if location.blank?
|
590
590
|
ActiveRecord::Base.connection.execute("TRUNCATE cdr_temp_patient_outcomes#{start ? '_start' : ''}")
|
591
591
|
ActiveRecord::Base.connection.execute("TRUNCATE cdr_temp_max_drug_orders#{start ? '_start' : ''}")
|
592
592
|
ActiveRecord::Base.connection.execute("TRUNCATE cdr_temp_min_auto_expire_date#{start ? '_start' : ''}")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: malawi_hiv_program_reports
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roy Chanunkha
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|