quality-measure-engine 3.0.3 → 3.1.0
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.
- data/lib/qme/map/measure_calculation_job.rb +1 -1
- data/lib/qme/quality_report.rb +25 -22
- data/lib/qme/version.rb +1 -1
- metadata +39 -23
- checksums.yaml +0 -7
@@ -19,7 +19,6 @@ module QME
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def perform
|
22
|
-
|
23
22
|
if !@quality_report.calculated?
|
24
23
|
map = QME::MapReduce::Executor.new(@quality_report.measure_id,@quality_report.sub_id, @options.merge('start_time' => Time.now.to_i))
|
25
24
|
if !@quality_report.patients_cached?
|
@@ -42,6 +41,7 @@ module QME
|
|
42
41
|
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]}")
|
43
42
|
QME::QualityReport.queue_staged_rollups(@quality_report.measure_id,@quality_report.sub_id,@quality_report.effective_date)
|
44
43
|
end
|
44
|
+
@quality_report
|
45
45
|
end
|
46
46
|
|
47
47
|
def completed(message)
|
data/lib/qme/quality_report.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module QME
|
2
|
-
|
2
|
+
|
3
3
|
class QualityReportResult
|
4
4
|
include Mongoid::Document
|
5
5
|
include Mongoid::Timestamps
|
@@ -20,14 +20,15 @@ module QME
|
|
20
20
|
# A class that allows you to create and obtain the results of running a
|
21
21
|
# quality measure against a set of patient records.
|
22
22
|
class QualityReport
|
23
|
-
|
23
|
+
|
24
24
|
include Mongoid::Document
|
25
25
|
include Mongoid::Timestamps
|
26
|
+
include Mongoid::Attributes::Dynamic
|
26
27
|
store_in collection: 'query_cache'
|
27
28
|
|
28
29
|
field :nqf_id, type: String
|
29
30
|
field :npi, type: String
|
30
|
-
field :calculation_time, type: Time
|
31
|
+
field :calculation_time, type: Time
|
31
32
|
field :status, type: Hash, default: {"state" => "unknown", "log" => []}
|
32
33
|
field :measure_id, type: String
|
33
34
|
field :sub_id, type: String
|
@@ -56,8 +57,8 @@ module QME
|
|
56
57
|
POSTAL_CODE = 'POSTAL_CODE'
|
57
58
|
PAYER = 'PAYER'
|
58
59
|
|
59
|
-
|
60
|
-
|
60
|
+
|
61
|
+
|
61
62
|
# Removes the cached results for the patient with the supplied id and
|
62
63
|
# recalculates as necessary
|
63
64
|
def self.update_patient_results(id)
|
@@ -66,12 +67,12 @@ module QME
|
|
66
67
|
|
67
68
|
# drop any cached measure result calculations for the modified patient
|
68
69
|
QME::PatientCache.where('value.medical_record_id' => id).destroy()
|
69
|
-
|
70
|
+
|
70
71
|
# get a list of cached measure results for a single patient
|
71
72
|
sample_patient = QME::PatientCache.where({}).first
|
72
73
|
if sample_patient
|
73
74
|
cached_results = QME::PatientCache.where({'value.patient_id' => sample_patient['value']['patient_id']})
|
74
|
-
|
75
|
+
|
75
76
|
# for each cached result (a combination of measure_id, sub_id, effective_date and test_id)
|
76
77
|
cached_results.each do |measure|
|
77
78
|
# recalculate patient_cache value for modified patient
|
@@ -81,13 +82,13 @@ module QME
|
|
81
82
|
map.map_record_into_measure_groups(id)
|
82
83
|
end
|
83
84
|
end
|
84
|
-
|
85
|
+
|
85
86
|
# remove the query totals so they will be recalculated using the new results for
|
86
87
|
# the modified patient
|
87
88
|
self.destroy_all
|
88
89
|
end
|
89
90
|
|
90
|
-
|
91
|
+
|
91
92
|
|
92
93
|
|
93
94
|
def self.find_or_create(measure_id, sub_id, parameter_values)
|
@@ -101,11 +102,13 @@ module QME
|
|
101
102
|
def self.queue_staged_rollups(measure_id,sub_id,effective_date)
|
102
103
|
query = Mongoid.default_session["rollup_buffer"].find({measure_id: measure_id, sub_id: sub_id, effective_date: effective_date})
|
103
104
|
query.each do |options|
|
104
|
-
QME::QualityReport.
|
105
|
+
if QME::QualityReport.where("_id" => options["quality_report_id"]).count == 1
|
106
|
+
QME::QualityReport.enque_job(options,:rollup)
|
107
|
+
end
|
105
108
|
end
|
106
109
|
query.remove_all
|
107
110
|
end
|
108
|
-
|
111
|
+
|
109
112
|
# Determines whether the quality report has been calculated for the given
|
110
113
|
# measure and parameters
|
111
114
|
# @return [true|false]
|
@@ -116,14 +119,14 @@ module QME
|
|
116
119
|
# Determines whether the patient mapping for the quality report has been
|
117
120
|
# completed
|
118
121
|
def patients_cached?
|
119
|
-
!QME::QualityReport.where({measure_id: self.measure_id,sub_id:self.sub_id, effective_date: self.effective_date,"status.state" => "completed" }).first.nil?
|
122
|
+
!QME::QualityReport.where({measure_id: self.measure_id,sub_id:self.sub_id, effective_date: self.effective_date, test_id: self.test_id, "status.state" => "completed" }).first.nil?
|
120
123
|
end
|
121
|
-
|
124
|
+
|
122
125
|
|
123
126
|
# Determines whether the patient mapping for the quality report has been
|
124
|
-
# queued up by another quality report or if it is currently running
|
127
|
+
# queued up by another quality report or if it is currently running
|
125
128
|
def calculation_queued_or_running?
|
126
|
-
!QME::QualityReport.where({measure_id: self.measure_id,sub_id:self.sub_id, effective_date: self.effective_date }).nin("status.state" =>["unknown","stagged"]).first.nil?
|
129
|
+
!QME::QualityReport.where({measure_id: self.measure_id,sub_id:self.sub_id, effective_date: self.effective_date, test_id: self.test_id }).nin("status.state" =>["unknown","stagged"]).first.nil?
|
127
130
|
end
|
128
131
|
|
129
132
|
# Kicks off a background job to calculate the measure
|
@@ -132,11 +135,11 @@ module QME
|
|
132
135
|
|
133
136
|
options = {'quality_report_id' => self.id}
|
134
137
|
options.merge! parameters || {}
|
135
|
-
|
138
|
+
|
136
139
|
if self.status["state"] == "completed" && !options["recalculate"]
|
137
140
|
return self
|
138
141
|
end
|
139
|
-
|
142
|
+
|
140
143
|
self.status["state"] = "queued"
|
141
144
|
if (asynchronous)
|
142
145
|
options[:asynchronous] = true
|
@@ -156,7 +159,7 @@ module QME
|
|
156
159
|
mcj.perform
|
157
160
|
end
|
158
161
|
end
|
159
|
-
|
162
|
+
|
160
163
|
def patient_results
|
161
164
|
ex = QME::MapReduce::Executor.new(self.measure_id,self.sub_id, self.attributes)
|
162
165
|
QME::PatientCache.where(patient_cache_matcher)
|
@@ -170,7 +173,7 @@ module QME
|
|
170
173
|
def self.normalize_filters(filters)
|
171
174
|
filters.each {|key, value| value.sort_by! {|v| (v.is_a? Hash) ? "#{v}" : v} if value.is_a? Array} unless filters.nil?
|
172
175
|
end
|
173
|
-
|
176
|
+
|
174
177
|
def patient_result(patient_id = nil)
|
175
178
|
query = patient_cache_matcher
|
176
179
|
if patient_id
|
@@ -181,7 +184,7 @@ module QME
|
|
181
184
|
|
182
185
|
|
183
186
|
def patient_cache_matcher
|
184
|
-
match = {'value.measure_id' => self.measure_id,
|
187
|
+
match = {'value.measure_id' => self.measure_id,
|
185
188
|
'value.sub_id' => self.sub_id,
|
186
189
|
'value.effective_date' => self.effective_date,
|
187
190
|
'value.test_id' => test_id,
|
@@ -215,7 +218,7 @@ module QME
|
|
215
218
|
# a new QR object which would then go to the db and see if the calculation was performed or
|
216
219
|
# not yet and then return the results. Now that QR objects are persisted you need to go through
|
217
220
|
# the find_or_create by method to ensure that duplicate entries are not being created. Protecting
|
218
|
-
# this method causes an exception to be thrown for anyone attempting to use this version of QME with the
|
221
|
+
# this method causes an exception to be thrown for anyone attempting to use this version of QME with the
|
219
222
|
# sematics of the older version to highlight the issue.
|
220
223
|
def initialize(attrs = nil)
|
221
224
|
super(attrs)
|
@@ -225,4 +228,4 @@ module QME
|
|
225
228
|
Delayed::Job.enqueue(QME::MapReduce::MeasureCalculationJob.new(options), {queue: queue})
|
226
229
|
end
|
227
230
|
end
|
228
|
-
end
|
231
|
+
end
|
data/lib/qme/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
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.1.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Marc Hadley
|
@@ -12,104 +13,118 @@ authors:
|
|
12
13
|
autorequire:
|
13
14
|
bindir: bin
|
14
15
|
cert_chain: []
|
15
|
-
date: 2014-
|
16
|
+
date: 2014-09-17 00:00:00.000000000 Z
|
16
17
|
dependencies:
|
17
18
|
- !ruby/object:Gem::Dependency
|
18
19
|
name: moped
|
19
20
|
requirement: !ruby/object:Gem::Requirement
|
21
|
+
none: false
|
20
22
|
requirements:
|
21
|
-
- -
|
23
|
+
- - ~>
|
22
24
|
- !ruby/object:Gem::Version
|
23
25
|
version: 2.0.0
|
24
26
|
type: :runtime
|
25
27
|
prerelease: false
|
26
28
|
version_requirements: !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
27
30
|
requirements:
|
28
|
-
- -
|
31
|
+
- - ~>
|
29
32
|
- !ruby/object:Gem::Version
|
30
33
|
version: 2.0.0
|
31
34
|
- !ruby/object:Gem::Dependency
|
32
35
|
name: mongoid
|
33
36
|
requirement: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
34
38
|
requirements:
|
35
|
-
- -
|
39
|
+
- - ~>
|
36
40
|
- !ruby/object:Gem::Version
|
37
41
|
version: 4.0.0
|
38
42
|
type: :runtime
|
39
43
|
prerelease: false
|
40
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
41
46
|
requirements:
|
42
|
-
- -
|
47
|
+
- - ~>
|
43
48
|
- !ruby/object:Gem::Version
|
44
49
|
version: 4.0.0
|
45
50
|
- !ruby/object:Gem::Dependency
|
46
51
|
name: rubyzip
|
47
52
|
requirement: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
48
54
|
requirements:
|
49
|
-
- -
|
55
|
+
- - ~>
|
50
56
|
- !ruby/object:Gem::Version
|
51
57
|
version: 0.9.9
|
52
58
|
type: :runtime
|
53
59
|
prerelease: false
|
54
60
|
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
55
62
|
requirements:
|
56
|
-
- -
|
63
|
+
- - ~>
|
57
64
|
- !ruby/object:Gem::Version
|
58
65
|
version: 0.9.9
|
59
66
|
- !ruby/object:Gem::Dependency
|
60
67
|
name: delayed_job_mongoid
|
61
68
|
requirement: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
62
70
|
requirements:
|
63
|
-
- -
|
71
|
+
- - ~>
|
64
72
|
- !ruby/object:Gem::Version
|
65
73
|
version: 2.1.0
|
66
74
|
type: :runtime
|
67
75
|
prerelease: false
|
68
76
|
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
69
78
|
requirements:
|
70
|
-
- -
|
79
|
+
- - ~>
|
71
80
|
- !ruby/object:Gem::Version
|
72
81
|
version: 2.1.0
|
73
82
|
- !ruby/object:Gem::Dependency
|
74
83
|
name: minitest
|
75
84
|
requirement: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
76
86
|
requirements:
|
77
|
-
- -
|
87
|
+
- - ~>
|
78
88
|
- !ruby/object:Gem::Version
|
79
89
|
version: 5.4.0
|
80
90
|
type: :development
|
81
91
|
prerelease: false
|
82
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
83
94
|
requirements:
|
84
|
-
- -
|
95
|
+
- - ~>
|
85
96
|
- !ruby/object:Gem::Version
|
86
97
|
version: 5.4.0
|
87
98
|
- !ruby/object:Gem::Dependency
|
88
99
|
name: simplecov
|
89
100
|
requirement: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
90
102
|
requirements:
|
91
|
-
- -
|
103
|
+
- - ~>
|
92
104
|
- !ruby/object:Gem::Version
|
93
105
|
version: 0.9.0
|
94
106
|
type: :development
|
95
107
|
prerelease: false
|
96
108
|
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
97
110
|
requirements:
|
98
|
-
- -
|
111
|
+
- - ~>
|
99
112
|
- !ruby/object:Gem::Version
|
100
113
|
version: 0.9.0
|
101
114
|
- !ruby/object:Gem::Dependency
|
102
115
|
name: rails
|
103
116
|
requirement: !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
104
118
|
requirements:
|
105
|
-
- -
|
119
|
+
- - ~>
|
106
120
|
- !ruby/object:Gem::Version
|
107
121
|
version: 4.1.5
|
108
122
|
type: :development
|
109
123
|
prerelease: false
|
110
124
|
version_requirements: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
111
126
|
requirements:
|
112
|
-
- -
|
127
|
+
- - ~>
|
113
128
|
- !ruby/object:Gem::Version
|
114
129
|
version: 4.1.5
|
115
130
|
description: A library for running clinical quality measures
|
@@ -119,8 +134,8 @@ executables: []
|
|
119
134
|
extensions: []
|
120
135
|
extra_rdoc_files: []
|
121
136
|
files:
|
122
|
-
-
|
123
|
-
-
|
137
|
+
- .gitignore
|
138
|
+
- .travis.yml
|
124
139
|
- Gemfile
|
125
140
|
- Gemfile.lock
|
126
141
|
- LICENSE.txt
|
@@ -167,26 +182,27 @@ files:
|
|
167
182
|
- test/unit/qme/quality_report_test.rb
|
168
183
|
homepage: http://www.projectpophealth.org
|
169
184
|
licenses: []
|
170
|
-
metadata: {}
|
171
185
|
post_install_message:
|
172
186
|
rdoc_options: []
|
173
187
|
require_paths:
|
174
188
|
- lib
|
175
189
|
required_ruby_version: !ruby/object:Gem::Requirement
|
190
|
+
none: false
|
176
191
|
requirements:
|
177
|
-
- -
|
192
|
+
- - ! '>='
|
178
193
|
- !ruby/object:Gem::Version
|
179
194
|
version: '0'
|
180
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
196
|
+
none: false
|
181
197
|
requirements:
|
182
|
-
- -
|
198
|
+
- - ! '>='
|
183
199
|
- !ruby/object:Gem::Version
|
184
200
|
version: '0'
|
185
201
|
requirements: []
|
186
202
|
rubyforge_project:
|
187
|
-
rubygems_version:
|
203
|
+
rubygems_version: 1.8.23
|
188
204
|
signing_key:
|
189
|
-
specification_version:
|
205
|
+
specification_version: 3
|
190
206
|
summary: This library can run JavaScript based clinical quality measures on a repository
|
191
207
|
of patients stored in MongoDB
|
192
208
|
test_files:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 2ac3f8a80c26556684d7f21bd6201e5265b256eb
|
4
|
-
data.tar.gz: b8379f12837783c518639ebadb3d21fe7e07546f
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: fb88b3fecf9ce6d5cee8f489195ed8e02b5d2a91f8549dd97a417af732d4225aadad6c0d0f1a5fd331736140d19d23821aee251b1f47ae40ee3f56b18334f589
|
7
|
-
data.tar.gz: 5da3dd5bc12ee8383df188b97d1dfefadd23591daee55674bed0ae2da4ec6a29209c36e3eac2310d6a4e206146bdbec3162f4a35922dbd2881753bdb286bc44c
|