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
         |