Class: QME::MapReduce::MeasureCalculationJob

Inherits:
Object
  • Object
show all
Defined in:
lib/qme/map/measure_calculation_job.rb

Overview

A delayed_job that allows for measure calculation by a delayed_job worker. Can be created as follows:

Delayed::Job.enqueue QME::MapRedude::MeasureCalculationJob.new(quality_report, :effective_date => 1291352400, :test_id => xyzzy)

MeasureCalculationJob will check to see if a measure has been calculated before running the calculation. It will do this by checking the status of the quality report that this calculation job was created with.

When a measure needs calculation, the job will create a QME::MapReduce::Executor and interact with it to calculate the report.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ MeasureCalculationJob

Returns a new instance of MeasureCalculationJob.



15
16
17
18
19
# File 'lib/qme/map/measure_calculation_job.rb', line 15

def initialize(options)
  @quality_report = QME::QualityReport.find(options["quality_report_id"])
  @options = options
  @options.merge! @quality_report.attributes
end

Instance Attribute Details

#quality_reportObject

Returns the value of attribute quality_report.



13
14
15
# File 'lib/qme/map/measure_calculation_job.rb', line 13

def quality_report
  @quality_report
end

Class Method Details

.status(job_id) ⇒ Symbol

Returns the status of a measure calculation job

Parameters:

  • job_id

    the id of the job to check on

Returns:

  • (Symbol)

    Will return the status: :complete, :queued, :running, :failed



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/qme/map/measure_calculation_job.rb', line 86

def self.status(job_id)
  job = Delayed::Job.where(_id: job_id).first
  if job.nil?
    # If we can't find the job, we assume that it is complete
    :complete
  else
    if job.locked_at.nil?
      :queued
    else
      if job.failed?
        :failed
      else
        :running
      end
    end
  end
end

Instance Method Details

#after(job) ⇒ Object



78
79
80
81
# File 'lib/qme/map/measure_calculation_job.rb', line 78

def after(job)
  @quality_report.status.delete("job_id")
  @quality_report.save
end

#completed(message) ⇒ Object



47
48
49
50
51
52
# File 'lib/qme/map/measure_calculation_job.rb', line 47

def completed(message)
  @quality_report.status["state"] = "completed"
  @quality_report.status["log"] << message
  @quality_report.calculation_time = Time.now
  @quality_report.save
end

#enqueue(job) ⇒ Object



60
61
62
63
# File 'lib/qme/map/measure_calculation_job.rb', line 60

def enqueue(job)
  @quality_report.status = {"state" => "queued", "log" => ["Queued at #{Time.now}"], "job_id" => job.id}
  @quality_report.save
end

#error(job, exception) ⇒ Object



66
67
68
69
70
# File 'lib/qme/map/measure_calculation_job.rb', line 66

def error(job, exception)
  @quality_report.status["state"] = "error"
  @quality_report.status["log"] << exception.to_s
  @quality_report.save
end

#failure(job) ⇒ Object



72
73
74
75
76
# File 'lib/qme/map/measure_calculation_job.rb', line 72

def failure(job)
  @quality_report.status["state"] = "failed"
  @quality_report.status["log"] << "Failed at #{Time.now}"
  @quality_report.save
end

#performObject



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/qme/map/measure_calculation_job.rb', line 21

def perform
  if !@quality_report.calculated?
    map = QME::MapReduce::Executor.new(@quality_report.measure_id,@quality_report.sub_id, @options.merge('start_time' => Time.now.to_i))
    if !@quality_report.patients_cached?
      tick('Starting MapReduce')
      map.map_records_into_measure_groups(@options['prefilter'])
      tick('MapReduce complete')
    end

    tick('Calculating group totals')
    result = map.count_records_in_measure_groups
    @quality_report.result=result
    # backwards compatibility with previous q cahce users.  Should be reomved going foward
    # and provide a means to update existing results to the newer format
    result.attributes.each_pair do |k,v|
      unless k.to_s == "_id"
        @quality_report[k]=v
      end
    end
    @quality_report.save
    completed("#{@measure_id}#{@sub_id}: p#{result[QME::QualityReport::POPULATION]}, d#{result[QME::QualityReport::DENOMINATOR]}, n#{result[QME::QualityReport::NUMERATOR]}, excl#{result[QME::QualityReport::EXCLUSIONS]}, excep#{result[QME::QualityReport::EXCEPTIONS]}")
    QME::QualityReport.queue_staged_rollups(@quality_report.measure_id,@quality_report.sub_id,@quality_report.effective_date)
  end
  @quality_report
end

#tick(message) ⇒ Object



54
55
56
57
58
# File 'lib/qme/map/measure_calculation_job.rb', line 54

def tick(message)
  @quality_report.status["state"] = "calculating"
  @quality_report.status["log"] << message
  @quality_report.save
end