class QME::MapReduce::MeasureCalculationJob

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.

Attributes

quality_report[RW]

Public Class Methods

new(options) click to toggle source
# 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
status(job_id) click to toggle source

Returns the status of a measure calculation job @param job_id the id of the job to check on @return [Symbol] Will return the status: :complete, :queued, :running, :failed

# 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

Public Instance Methods

after(job) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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() click to toggle source
# 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) click to toggle source
# 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