quality-measure-engine 3.0.1 → 3.0.2
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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/qme/map/map_reduce_executor.rb +28 -28
- data/lib/qme/map/measure_calculation_job.rb +8 -8
- data/lib/qme/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35e476899eb214e4601ce6d61c96bbb2e9dbbd7a
|
4
|
+
data.tar.gz: f4d5ac3ac53c4e6fcbd39d4237799443274368a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e0eac215433503529b1ad7eaf3c0adea2f212e5f5ceec48097064374edca2d34355ecc367e452688cbe56b98a68c88a6bd8e1a35560724ff59a9756bd9b6177
|
7
|
+
data.tar.gz: 866b367b2d0a978294854ffc125ef7e70628bfefc49038decabc88abd867c4bfe3c27e4e096c333364bb3f9fb684f8571ed6c00349fb0f5a77ebf8fd19ee7888
|
data/Gemfile.lock
CHANGED
@@ -19,13 +19,13 @@ module QME
|
|
19
19
|
|
20
20
|
@measure_id = measure_id
|
21
21
|
@sub_id =sub_id
|
22
|
-
|
22
|
+
|
23
23
|
@parameter_values = parameter_values
|
24
24
|
q_filter = {hqmf_id: @measure_id,sub_id: @sub_id}
|
25
25
|
if @parameter_values.keys.index("bundle_id")
|
26
26
|
q_filter["bundle_id"] == @parameter_values['bundle_id']
|
27
27
|
@bundle_id = @parameter_values['bundle_id']
|
28
|
-
end
|
28
|
+
end
|
29
29
|
@measure_def = QualityMeasure.where(q_filter).first
|
30
30
|
end
|
31
31
|
|
@@ -34,8 +34,8 @@ module QME
|
|
34
34
|
|
35
35
|
filters = @parameter_values["filters"]
|
36
36
|
|
37
|
-
|
38
|
-
match = {'value.measure_id' => @measure_id,
|
37
|
+
|
38
|
+
match = {'value.measure_id' => @measure_id,
|
39
39
|
'value.sub_id' => @sub_id,
|
40
40
|
'value.effective_date' => @parameter_values['effective_date'],
|
41
41
|
'value.test_id' => @parameter_values['test_id'],
|
@@ -53,8 +53,8 @@ module QME
|
|
53
53
|
end
|
54
54
|
if (filters['providers'] && filters['providers'].size > 0)
|
55
55
|
providers = filters['providers'].map { |pv| {'providers' => Moped::BSON::ObjectId(pv) } }
|
56
|
-
pipeline.concat [{'$project' => {'value' => 1, 'providers' => "$value.provider_performances.provider_id"}},
|
57
|
-
{'$unwind' => '$providers'},
|
56
|
+
pipeline.concat [{'$project' => {'value' => 1, 'providers' => "$value.provider_performances.provider_id"}},
|
57
|
+
{'$unwind' => '$providers'},
|
58
58
|
{'$match' => {'$or' => providers}},
|
59
59
|
{'$group' => {"_id" => "$_id", "value" => {"$first" => "$value"}}}]
|
60
60
|
end
|
@@ -74,32 +74,32 @@ module QME
|
|
74
74
|
end
|
75
75
|
|
76
76
|
|
77
|
-
#Calculate all of the supoplemental data elements
|
77
|
+
#Calculate all of the supoplemental data elements
|
78
78
|
def calculate_supplemental_data_elements
|
79
79
|
|
80
|
-
match = {'value.measure_id' => @measure_id,
|
80
|
+
match = {'value.measure_id' => @measure_id,
|
81
81
|
'value.sub_id' => @sub_id,
|
82
82
|
'value.effective_date' => @parameter_values['effective_date'],
|
83
83
|
'value.test_id' => @parameter_values['test_id'],
|
84
|
-
'value.manual_exclusion' => {'$in' => [nil, false]}}
|
85
|
-
|
84
|
+
'value.manual_exclusion' => {'$in' => [nil, false]}}
|
85
|
+
|
86
86
|
keys = @measure_def.population_ids.keys - [QME::QualityReport::OBSERVATION, "stratification"]
|
87
87
|
supplemental_data = Hash[*keys.map{|k| [k,{QME::QualityReport::RACE => {},
|
88
88
|
QME::QualityReport::ETHNICITY => {},
|
89
89
|
QME::QualityReport::SEX => {},
|
90
90
|
QME::QualityReport::PAYER => {}}]}.flatten]
|
91
|
-
|
91
|
+
|
92
92
|
keys.each do |pop_id|
|
93
93
|
_match = match.clone
|
94
94
|
_match["value.#{pop_id}"] = {"$gt" => 0}
|
95
95
|
SUPPLEMENTAL_DATA_ELEMENTS.each_pair do |supp_element,location|
|
96
|
-
group1 = {"$group" => { "_id" => { "id" => "$_id", "val" => location}}}
|
96
|
+
group1 = {"$group" => { "_id" => { "id" => "$_id", "val" => location}}}
|
97
97
|
group2 = {"$group" => {"_id" => "$_id.val", "val" =>{"$sum" => 1} }}
|
98
98
|
pipeline = [{"$match" =>_match},group1,group2]
|
99
99
|
aggregate = get_db.command(:aggregate => 'patient_cache', :pipeline => pipeline)
|
100
100
|
|
101
101
|
v = {}
|
102
|
-
(aggregate["result"] || []).each do |entry|
|
102
|
+
(aggregate["result"] || []).each do |entry|
|
103
103
|
code = entry["_id"].nil? ? "UNK" : entry["_id"]
|
104
104
|
v[code] = entry["val"]
|
105
105
|
end
|
@@ -119,8 +119,8 @@ module QME
|
|
119
119
|
pipeline = build_query
|
120
120
|
|
121
121
|
pipeline << {'$group' => {
|
122
|
-
"_id" => "$value.measure_id", # we don't really need this, but Mongo requires that we group
|
123
|
-
QME::QualityReport::POPULATION => {"$sum" => "$value.#{QME::QualityReport::POPULATION}"},
|
122
|
+
"_id" => "$value.measure_id", # we don't really need this, but Mongo requires that we group
|
123
|
+
QME::QualityReport::POPULATION => {"$sum" => "$value.#{QME::QualityReport::POPULATION}"},
|
124
124
|
QME::QualityReport::DENOMINATOR => {"$sum" => "$value.#{QME::QualityReport::DENOMINATOR}"},
|
125
125
|
QME::QualityReport::NUMERATOR => {"$sum" => "$value.#{QME::QualityReport::NUMERATOR}"},
|
126
126
|
QME::QualityReport::ANTINUMERATOR => {"$sum" => "$value.#{QME::QualityReport::ANTINUMERATOR}"},
|
@@ -135,7 +135,7 @@ module QME
|
|
135
135
|
raise RuntimeError, "Aggregation Failed"
|
136
136
|
elsif aggregate['result'].size !=1
|
137
137
|
aggregate['result'] =[{"defaults" => true,
|
138
|
-
QME::QualityReport::POPULATION => 0,
|
138
|
+
QME::QualityReport::POPULATION => 0,
|
139
139
|
QME::QualityReport::DENOMINATOR => 0,
|
140
140
|
QME::QualityReport::NUMERATOR =>0,
|
141
141
|
QME::QualityReport::ANTINUMERATOR => 0,
|
@@ -151,7 +151,7 @@ module QME
|
|
151
151
|
|
152
152
|
|
153
153
|
if @measure_def.continuous_variable
|
154
|
-
aggregated_value = calculate_cv_aggregation
|
154
|
+
aggregated_value = calculate_cv_aggregation
|
155
155
|
result[QME::QualityReport::OBSERVATION] = aggregated_value
|
156
156
|
end
|
157
157
|
|
@@ -167,8 +167,8 @@ module QME
|
|
167
167
|
|
168
168
|
end
|
169
169
|
|
170
|
-
# This method calculates the aggregated value for a CV measure. It extracts all
|
171
|
-
# the values for patients in the MSRPOPL and uses the aggregator to combine those
|
170
|
+
# This method calculates the aggregated value for a CV measure. It extracts all
|
171
|
+
# the values for patients in the MSRPOPL and uses the aggregator to combine those
|
172
172
|
# values into an aggregated value. The currently supported aggregators are:
|
173
173
|
# MEDIAN
|
174
174
|
# MEAN
|
@@ -193,17 +193,17 @@ module QME
|
|
193
193
|
# This method runs the MapReduce job for the measure which will create documents
|
194
194
|
# in the patient_cache collection. These documents will state the measure groups
|
195
195
|
# that the record belongs to, such as numerator, etc.
|
196
|
-
def map_records_into_measure_groups
|
196
|
+
def map_records_into_measure_groups(prefilter={})
|
197
197
|
measure = Builder.new(get_db(), @measure_def, @parameter_values)
|
198
198
|
get_db().command(:mapreduce => 'records',
|
199
199
|
:map => measure.map_function,
|
200
200
|
:reduce => "function(key, values){return values;}",
|
201
|
-
:out => {:reduce => 'patient_cache', :sharded => true},
|
201
|
+
:out => {:reduce => 'patient_cache', :sharded => true},
|
202
202
|
:finalize => measure.finalize_function,
|
203
|
-
:query =>
|
203
|
+
:query => prefilter)
|
204
204
|
QME::ManualExclusion.apply_manual_exclusions(@measure_id,@sub_id)
|
205
205
|
end
|
206
|
-
|
206
|
+
|
207
207
|
# This method runs the MapReduce job for the measure and a specific patient.
|
208
208
|
# This will create a document in the patient_cache collection. This document
|
209
209
|
# will state the measure groups that the record belongs to, such as numerator, etc.
|
@@ -212,13 +212,13 @@ module QME
|
|
212
212
|
get_db().command(:mapreduce => 'records',
|
213
213
|
:map => measure.map_function,
|
214
214
|
:reduce => "function(key, values){return values;}",
|
215
|
-
:out => {:reduce => 'patient_cache', :sharded => true},
|
215
|
+
:out => {:reduce => 'patient_cache', :sharded => true},
|
216
216
|
:finalize => measure.finalize_function,
|
217
217
|
:query => {:medical_record_number => patient_id, :test_id => @parameter_values["test_id"]})
|
218
218
|
QME::ManualExclusion.apply_manual_exclusions(@measure_id,@sub_id)
|
219
219
|
|
220
220
|
end
|
221
|
-
|
221
|
+
|
222
222
|
# This method runs the MapReduce job for the measure and a specific patient.
|
223
223
|
# This will *not* create a document in the patient_cache collection, instead the
|
224
224
|
# result is returned directly.
|
@@ -227,14 +227,14 @@ module QME
|
|
227
227
|
result = get_db().command(:mapreduce => 'records',
|
228
228
|
:map => measure.map_function,
|
229
229
|
:reduce => "function(key, values){return values;}",
|
230
|
-
:out => {:inline => true},
|
231
|
-
:raw => true,
|
230
|
+
:out => {:inline => true},
|
231
|
+
:raw => true,
|
232
232
|
:query => {:medical_record_number => patient_id, :test_id => @parameter_values["test_id"]})
|
233
233
|
|
234
234
|
raise result['err'] if result['ok']!=1
|
235
235
|
result['results'][0]['value']
|
236
236
|
end
|
237
|
-
|
237
|
+
|
238
238
|
|
239
239
|
end
|
240
240
|
end
|
@@ -4,7 +4,7 @@ module QME
|
|
4
4
|
#
|
5
5
|
# Delayed::Job.enqueue QME::MapRedude::MeasureCalculationJob.new(quality_report, :effective_date => 1291352400, :test_id => xyzzy)
|
6
6
|
#
|
7
|
-
# MeasureCalculationJob will check to see if a measure has been calculated before running the calculation. It will do this by
|
7
|
+
# MeasureCalculationJob will check to see if a measure has been calculated before running the calculation. It will do this by
|
8
8
|
# checking the status of the quality report that this calculation job was created with.
|
9
9
|
#
|
10
10
|
# When a measure needs calculation, the job will create a QME::MapReduce::Executor and interact with it to calculate
|
@@ -17,21 +17,21 @@ module QME
|
|
17
17
|
@options = options
|
18
18
|
@options.merge! @quality_report.attributes
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def perform
|
22
22
|
|
23
23
|
if !@quality_report.calculated?
|
24
24
|
map = QME::MapReduce::Executor.new(@quality_report.measure_id,@quality_report.sub_id, @options.merge('start_time' => Time.now.to_i))
|
25
25
|
if !@quality_report.patients_cached?
|
26
26
|
tick('Starting MapReduce')
|
27
|
-
map.map_records_into_measure_groups
|
27
|
+
map.map_records_into_measure_groups(@options['prefilter'])
|
28
28
|
tick('MapReduce complete')
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
tick('Calculating group totals')
|
32
32
|
result = map.count_records_in_measure_groups
|
33
33
|
@quality_report.result=result
|
34
|
-
# backwards compatibility with previous q cahce users. Should be reomved going foward
|
34
|
+
# backwards compatibility with previous q cahce users. Should be reomved going foward
|
35
35
|
# and provide a means to update existing results to the newer format
|
36
36
|
result.attributes.each_pair do |k,v|
|
37
37
|
unless k.to_s == "_id"
|
@@ -58,7 +58,7 @@ module QME
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def enqueue(job)
|
61
|
-
@quality_report.status = {"state" => "queued", "log" => ["Queued at #{Time.now}"], "job_id" => job.id}
|
61
|
+
@quality_report.status = {"state" => "queued", "log" => ["Queued at #{Time.now}"], "job_id" => job.id}
|
62
62
|
@quality_report.save
|
63
63
|
end
|
64
64
|
|
@@ -96,10 +96,10 @@ module QME
|
|
96
96
|
:failed
|
97
97
|
else
|
98
98
|
:running
|
99
|
-
end
|
99
|
+
end
|
100
100
|
end
|
101
101
|
end
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
105
|
-
end
|
105
|
+
end
|
data/lib/qme/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quality-measure-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc Hadley
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2014-
|
15
|
+
date: 2014-05-15 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: moped
|