Class: QME::MapReduce::MeasureCalculationJob
- Inherits:
-
Object
- Object
- QME::MapReduce::MeasureCalculationJob
- 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
-
#quality_report ⇒ Object
Returns the value of attribute quality_report.
Class Method Summary collapse
-
.status(job_id) ⇒ Symbol
Returns the status of a measure calculation job.
Instance Method Summary collapse
- #after(job) ⇒ Object
- #completed(message) ⇒ Object
- #enqueue(job) ⇒ Object
- #error(job, exception) ⇒ Object
- #failure(job) ⇒ Object
-
#initialize(options) ⇒ MeasureCalculationJob
constructor
A new instance of MeasureCalculationJob.
- #perform ⇒ Object
- #tick(message) ⇒ Object
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() @quality_report = QME::QualityReport.find(["quality_report_id"]) @options = @options.merge! @quality_report.attributes end |
Instance Attribute Details
#quality_report ⇒ Object
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
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() @quality_report.status["state"] = "completed" @quality_report.status["log"] << @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 |
#perform ⇒ Object
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() @quality_report.status["state"] = "calculating" @quality_report.status["log"] << @quality_report.save end |