quality-measure-engine 2.5.3 → 3.0.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +9 -9
- data/Gemfile.lock +4 -4
- data/lib/qme/database_access.rb +2 -22
- data/lib/qme/manual_exclusion.rb +18 -0
- data/lib/qme/map/map_reduce_builder.rb +10 -10
- data/lib/qme/map/map_reduce_executor.rb +33 -33
- data/lib/qme/map/measure_calculation_job.rb +69 -15
- data/lib/qme/patient_cache.rb +31 -0
- data/lib/qme/quality_measure.rb +11 -55
- data/lib/qme/quality_report.rb +98 -74
- data/lib/qme/version.rb +1 -1
- data/lib/quality-measure-engine.rb +2 -3
- data/test/fixtures/library_functions/map_reduce_utils.js +6 -0
- data/test/fixtures/measures/0002.json +1 -1
- data/test/fixtures/measures/measure_metadata.json +1 -0
- data/test/mongoid.yml +6 -0
- data/test/test_helper.rb +3 -7
- data/test/unit/qme/map/map_reduce_builder_test.rb +2 -2
- data/test/unit/qme/map/map_reduce_executor_test.rb +27 -38
- data/test/unit/qme/map/measure_calculation_job_test.rb +2 -2
- data/test/unit/qme/quality_measure_test.rb +3 -39
- data/test/unit/qme/quality_report_test.rb +12 -9
- metadata +9 -11
- data/lib/qme/bundle/eh_measure_sheet.rb +0 -117
- data/lib/qme/bundle/eh_patient_importer.rb +0 -25
- data/test/unit/qme/bundle/eh_measure_sheet_test.rb +0 -37
- data/test/unit/qme/bundle/eh_patient_importer_test.rb +0 -20
data/lib/qme/quality_report.rb
CHANGED
@@ -1,12 +1,41 @@
|
|
1
1
|
module QME
|
2
2
|
|
3
|
+
class QualityReportResult
|
4
|
+
include Mongoid::Document
|
5
|
+
include Mongoid::Timestamps
|
6
|
+
|
7
|
+
field :population_ids, type: Hash
|
8
|
+
field :IPP, type: Integer
|
9
|
+
field :DENOM, type: Integer
|
10
|
+
field :NUMER, type: Integer
|
11
|
+
field :antinumerator, type: Integer
|
12
|
+
field :DENEX, type: Integer
|
13
|
+
field :DENEXCEP, type: Integer
|
14
|
+
field :MSRPOPL, type: Integer
|
15
|
+
field :OBSERV, type: Float
|
16
|
+
field :supplemental_data, type: Hash
|
17
|
+
|
18
|
+
embedded_in :quality_report, inverse_of: :result
|
19
|
+
end
|
3
20
|
# A class that allows you to create and obtain the results of running a
|
4
21
|
# quality measure against a set of patient records.
|
5
22
|
class QualityReport
|
6
23
|
|
7
|
-
include
|
8
|
-
|
9
|
-
|
24
|
+
include Mongoid::Document
|
25
|
+
include Mongoid::Timestamps
|
26
|
+
store_in collection: 'query_cache'
|
27
|
+
|
28
|
+
field :nqf_id, type: String
|
29
|
+
field :npi, type: String
|
30
|
+
field :calculation_time, type: Time
|
31
|
+
field :status, type: Hash, default: {"state" => "unkown", "log" => []}
|
32
|
+
field :measure_id, type: String
|
33
|
+
field :sub_id, type: String
|
34
|
+
field :test_id
|
35
|
+
field :effective_date, type: Integer
|
36
|
+
field :filters, type: Hash
|
37
|
+
embeds_one :result, class_name: "QME::QualityReportResult", inverse_of: :quality_report
|
38
|
+
|
10
39
|
|
11
40
|
POPULATION = 'IPP'
|
12
41
|
DENOMINATOR = 'DENOM'
|
@@ -24,29 +53,21 @@ module QME
|
|
24
53
|
POSTAL_CODE = 'POSTAL_CODE'
|
25
54
|
PAYER = 'PAYER'
|
26
55
|
|
27
|
-
|
28
|
-
# and query_cache collections
|
29
|
-
def self.destroy_all
|
30
|
-
determine_connection_information
|
31
|
-
get_db()["query_cache"].drop
|
32
|
-
get_db()["patient_cache"].drop
|
33
|
-
end
|
56
|
+
|
34
57
|
|
35
58
|
# Removes the cached results for the patient with the supplied id and
|
36
59
|
# recalculates as necessary
|
37
60
|
def self.update_patient_results(id)
|
38
|
-
determine_connection_information()
|
39
|
-
|
40
61
|
# TODO: need to wait for any outstanding calculations to complete and then prevent
|
41
62
|
# any new ones from starting until we are done.
|
42
63
|
|
43
64
|
# drop any cached measure result calculations for the modified patient
|
44
|
-
|
65
|
+
QME::PatientCache.where('value.medical_record_id' => id).destroy()
|
45
66
|
|
46
67
|
# get a list of cached measure results for a single patient
|
47
|
-
sample_patient =
|
68
|
+
sample_patient = QME::PatientCache.where({}).first
|
48
69
|
if sample_patient
|
49
|
-
cached_results =
|
70
|
+
cached_results = QME::PatientCache.where({'value.patient_id' => sample_patient['value']['patient_id']})
|
50
71
|
|
51
72
|
# for each cached result (a combination of measure_id, sub_id, effective_date and test_id)
|
52
73
|
cached_results.each do |measure|
|
@@ -60,27 +81,25 @@ module QME
|
|
60
81
|
|
61
82
|
# remove the query totals so they will be recalculated using the new results for
|
62
83
|
# the modified patient
|
63
|
-
|
84
|
+
self.destroy_all
|
64
85
|
end
|
65
86
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
# @param [Hash] parameter_values slots in the measure definition that need to
|
71
|
-
# be filled in and an optional test_id to identify a sub-population.
|
72
|
-
def initialize(measure_id, sub_id, parameter_values)
|
73
|
-
@measure_id = measure_id
|
74
|
-
@sub_id = sub_id
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
def self.find_or_create(measure_id, sub_id, parameter_values)
|
75
91
|
@parameter_values = parameter_values
|
76
|
-
|
92
|
+
@parameter_values[:filters] = self.normalize_filters(@parameter_values[:filters])
|
93
|
+
query = {measure_id: measure_id, sub_id: sub_id}
|
94
|
+
query.merge! @parameter_values
|
95
|
+
self.find_or_create_by(query)
|
77
96
|
end
|
78
97
|
|
79
98
|
# Determines whether the quality report has been calculated for the given
|
80
99
|
# measure and parameters
|
81
100
|
# @return [true|false]
|
82
101
|
def calculated?
|
83
|
-
|
102
|
+
self.status["state"] == "completed"
|
84
103
|
end
|
85
104
|
|
86
105
|
# Determines whether the patient mapping for the quality report has been
|
@@ -89,15 +108,19 @@ module QME
|
|
89
108
|
! patient_result().nil?
|
90
109
|
end
|
91
110
|
|
111
|
+
|
92
112
|
# Kicks off a background job to calculate the measure
|
93
113
|
# @return a unique id for the measure calculation job
|
94
|
-
def calculate(asynchronous=true)
|
95
|
-
|
96
|
-
options = {'
|
114
|
+
def calculate(parameters, asynchronous=true)
|
115
|
+
|
116
|
+
options = {'quality_report_id' => self.id}
|
117
|
+
options.merge! parameters || {}
|
97
118
|
|
98
|
-
|
99
|
-
|
119
|
+
if self.status["state"] == "completed" && !options["recalculate"]
|
120
|
+
return self
|
121
|
+
end
|
100
122
|
|
123
|
+
self.status["state"] = "queued"
|
101
124
|
if (asynchronous)
|
102
125
|
job = Delayed::Job.enqueue(QME::MapReduce::MeasureCalculationJob.new(options))
|
103
126
|
job._id
|
@@ -107,59 +130,60 @@ module QME
|
|
107
130
|
end
|
108
131
|
end
|
109
132
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
def status(job_id)
|
114
|
-
job = Delayed::Job.where(_id: job_id).first
|
115
|
-
if job.nil?
|
116
|
-
# If we can't find the job, we assume that it is complete
|
117
|
-
:complete
|
118
|
-
else
|
119
|
-
if job.locked_at.nil?
|
120
|
-
:queued
|
121
|
-
else
|
122
|
-
if job.failed?
|
123
|
-
:failed
|
124
|
-
else
|
125
|
-
:running
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
133
|
+
def patient_results
|
134
|
+
ex = QME::MapReduce::Executor.new(self.measure_id,self.sub_id, self.attributes)
|
135
|
+
QME::PatientCache.where(patient_cache_matcher)
|
129
136
|
end
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
# the measure has not yet been calculated
|
134
|
-
def result
|
135
|
-
cache = get_db()["query_cache"]
|
136
|
-
query = {:measure_id => @measure_id, :sub_id => @sub_id,
|
137
|
-
:effective_date => @parameter_values['effective_date'],
|
138
|
-
:test_id => @parameter_values['test_id']}
|
139
|
-
if @parameter_values['filters']
|
140
|
-
query.merge!({filters: QME::QualityReport.normalize_filters(@parameter_values['filters'])})
|
141
|
-
else
|
142
|
-
query.merge!({filters: nil})
|
143
|
-
end
|
144
|
-
|
145
|
-
cache.find(query).first()
|
137
|
+
|
138
|
+
def measure
|
139
|
+
QME::QualityMeasure.where({"hqmf_id"=>self.measure_id, "sub_id" => self.sub_id}).first
|
146
140
|
end
|
147
|
-
|
141
|
+
|
148
142
|
# make sure all filter id arrays are sorted
|
149
143
|
def self.normalize_filters(filters)
|
150
144
|
filters.each {|key, value| value.sort_by! {|v| (v.is_a? Hash) ? "#{v}" : v} if value.is_a? Array} unless filters.nil?
|
151
145
|
end
|
152
146
|
|
153
147
|
def patient_result(patient_id = nil)
|
154
|
-
|
155
|
-
query = {'value.measure_id' => @measure_id, 'value.sub_id' => @sub_id,
|
156
|
-
'value.effective_date' => @parameter_values['effective_date'],
|
157
|
-
'value.test_id' => @parameter_values['test_id']}
|
148
|
+
query = patient_cache_matcher
|
158
149
|
if patient_id
|
159
150
|
query['value.medical_record_id'] = patient_id
|
160
151
|
end
|
161
|
-
|
152
|
+
QME::PatientCache.where(query).first()
|
162
153
|
end
|
163
|
-
|
154
|
+
|
155
|
+
|
156
|
+
def patient_cache_matcher
|
157
|
+
match = {'value.measure_id' => self.measure_id,
|
158
|
+
'value.sub_id' => self.sub_id,
|
159
|
+
'value.effective_date' => self.effective_date,
|
160
|
+
'value.test_id' => test_id,
|
161
|
+
'value.manual_exclusion' => {'$in' => [nil, false]}}
|
162
|
+
|
163
|
+
if(filters)
|
164
|
+
if (filters['races'] && filters['races'].size > 0)
|
165
|
+
match['value.race.code'] = {'$in' => filters['races']}
|
166
|
+
end
|
167
|
+
if (filters['ethnicities'] && filters['ethnicities'].size > 0)
|
168
|
+
match['value.ethnicity.code'] = {'$in' => filters['ethnicities']}
|
169
|
+
end
|
170
|
+
if (filters['genders'] && filters['genders'].size > 0)
|
171
|
+
match['value.gender'] = {'$in' => filters['genders']}
|
172
|
+
end
|
173
|
+
if (filters['providers'] && filters['providers'].size > 0)
|
174
|
+
|
175
|
+
providers = filters['providers'].map { |pv| {'providers' => Moped::BSON::ObjectId(pv) } }
|
176
|
+
match['value.provider_performances.provider_id']= {'$in' => providers}
|
177
|
+
end
|
178
|
+
if (filters['languages'] && filters['languages'].size > 0)
|
179
|
+
match["value.languages"] = {'$in' => filters['languages']}
|
180
|
+
end
|
181
|
+
end
|
182
|
+
match
|
164
183
|
end
|
184
|
+
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
|
165
189
|
end
|
data/lib/qme/version.rb
CHANGED
@@ -9,6 +9,8 @@ require "qme/version"
|
|
9
9
|
require 'qme/database_access'
|
10
10
|
require 'qme/quality_measure'
|
11
11
|
require 'qme/quality_report'
|
12
|
+
require 'qme/patient_cache'
|
13
|
+
require 'qme/manual_exclusion'
|
12
14
|
|
13
15
|
require 'qme/map/map_reduce_builder'
|
14
16
|
require 'qme/map/map_reduce_executor'
|
@@ -17,8 +19,5 @@ require 'qme/map/cv_aggregator'
|
|
17
19
|
|
18
20
|
|
19
21
|
|
20
|
-
require 'qme/bundle/eh_measure_sheet'
|
21
|
-
require 'qme/bundle/eh_patient_importer'
|
22
|
-
|
23
22
|
|
24
23
|
require 'qme/railtie' if defined?(Rails)
|
@@ -41,5 +41,11 @@ root.map = function(record, population, denominator, numerator, exclusion, denex
|
|
41
41
|
|
42
42
|
if (typeof Logger != 'undefined') value['logger'] = Logger.logger
|
43
43
|
|
44
|
+
value.measure_id = hqmfjs.hqmf_id
|
45
|
+
value.sub_id = hqmfjs.sub_id
|
46
|
+
value.nqf_id = hqmfjs.nqf_id
|
47
|
+
value.test_id = hqmfjs.test_id
|
48
|
+
value.effective_date = hqmfjs.effective_date;
|
49
|
+
|
44
50
|
emit(ObjectId(), value);
|
45
51
|
};
|
@@ -621,7 +621,7 @@
|
|
621
621
|
"conjunction": "and",
|
622
622
|
"items": []
|
623
623
|
},
|
624
|
-
"map_fn": "function() {\n var patient = this;\n var effective_date = <%= effective_date %>;\n\n hqmfjs = {}\n <%= init_js_frameworks %>\n \n \n var patient_api = new hQuery.Patient(patient);\n\n \n\n // clear out logger\n if (typeof Logger != 'undefined') Logger.logger = [];\n // turn on logging if it is enabled\n if (Logger.enabled) enableLogging();\n \n \n // #########################\n // ##### DATA ELEMENTS #####\n // #########################\n\n OidDictionary = {'2.16.840.1.113883.3.464.0001.231':{'CPT':['99201','99202','99203','99204','99205','99211','99212','99213','99214','99215','99217','99218','99219','99220','99241','99242','99243','99244','99245','99384','99385','99394','99395','99401','99402','99403','99404','99411','99412','99420','99429'],'ICD-9-CM':['V70.0','V70.3','V70.5','V70.6','V70.8','V70.9']},'2.16.840.1.113883.3.464.0001.250':{'CPT':['87070','87071','87081','87430','87650','87651','87652','87880'],'LOINC':['11268-0','17656-0','18481-2','31971-5','49610-9','5036-9','626-2','6556-5','6557-3','6558-1','6559-9'],'SNOMED-CT':['89634005.0','122121004.0','122205003.0','122245007.0','122303007.0']},'2.16.840.1.113883.3.464.0001.369':{'ICD-9-CM':['034.0','462.0','463.0'],'SNOMED-CT':['140004.0','652005.0','1532007.0','2091005.0','2365002.0','10351008.0','11461005.0','13177009.0','14465002.0','17741008.0','23166004.0','24078009.0','27878001.0','31309002.0','39271004.0','40766000.0','41582007.0','43878008.0','47841006.0','51209006.0','51476001.0','55355000.0','58031004.0','59221008.0','59471009.0','63866002.0','70020005.0','72430001.0','76651006.0','78430008.0','78911000.0','82228008.0','87326000.0','90176007.0','90979004.0','95885008.0','102453009.0','109362006.0','111277007.0','111816002.0','111816002.0','126664009.0','164260005.0','186659004.0','186675001.0','186963008.0','195655000.0','195655000.0','195656004.0','195657008.0','195658003.0','195659006.0','195660001.0','195662009.0','195662009.0','195663004.0','195666007.0','195667003.0','195668008.0','195669000.0','195670004.0','195671000.0','195672007.0','195673002.0','195676005.0','195677001.0','195707008.0','195779005.0','195780008.0','195782000.0','195798007.0','195803003.0','195804009.0','195924009.0','232399005.0','232400003.0','232401004.0','232402006.0','232403001.0','232404007.0','232405008.0','232405008.0','232406009.0','232417005.0','232420002.0','234528007.0','240444009.0','240547000.0','300932000.0','302911003.0','312422001.0','363746003.0','399095008.0','405737000.0','415724006.0','J02','J02.0','J02.8','J02.9','J03','J03.0','J03.00','J03.01','J03.8','J03.80','J03.81','J03.9','J03.90','J03.91']},'2.16.840.1.113883.3.464.0001.373':{'RxNorm':['197450','197451','200346','204871','250156','309054','309058','309076','309077','309078','309079','309085','309086','309087','309090','309091','309092','309093','351127','419849','476576','562619','645956','746671','847360']},'2.16.840.1.113883.3.464.0001.157':{'RxNorm':['105134.0','105152.0','199693.0','199694.0','199928.0','199997.0','239187.0','239191.0','240984.0','246282.0','250463.0','308177.0','308181.0','308182.0','308183.0','308188.0','308189.0','308191.0','308192.0','308194.0','308207.0','308208.0','308209.0','308210.0','308212.0','313797.0','313798.0','313799.0','313800.0','313801.0','313819.0','313850.0','346892.0','392151.0','392152.0','403945.0','476299.0','562255.0','562256.0','598025.0','746669.0','756252.0','789980.0','791939.0','791947.0','802550.0','846994.0','852904.0','308206']},'2.16.840.1.113883.3.464.0001.172':{'RxNorm':['562251.0','562253.0','562508.0','617293.0','617295.0','617296.0','617302.0','617304.0','617309.0','617316.0','617322.0','617423.0','617430.0','617975.0','617976.0','617981.0','617989.0','617993.0','617995.0','617996.0','645806.0']},'2.16.840.1.113883.3.560.100.4':{'LOINC':['21112-8']},'2.16.840.1.113883.3.464.0001.45':{'CPT':['99281','99282','99283','99284','99285']},'2.16.840.1.113883.3.464.0001.48':{'CPT':['99201','99202','99203','99204','99205','99211','99212','99213','99214','99215','99217','99218','99219','99220','99241','99242','99243','99244','99245','99384','99385','99394','99395','99401','99402','99403','99404','99411','99412','99420','99429']},'2.16.840.1.113883.3.464.0001.50':{'ICD-9-CM':['V70.0','V70.3','V70.5','V70.6','V70.8','V70.9']},'2.16.840.1.113883.3.464.0001.246':{'RxNorm':['105170.0','105171.0','197454.0','197455.0','197456.0','242794.0','250582.0','309046.0','309047.0','309048.0','309049.0','309051.0','309052.0','309053.0','309110.0','309111.0','309112.0','309113.0','309114.0','309115.0','309121.0','313889.0','313920.0','313929.0','347996.0','406696.0','476193.0','562062.0','562641.0','637173.0','645617.0','755615.0','755616.0','755617.0','796301.0','854220.0']},'2.16.840.1.113883.3.464.0001.247':{'RxNorm':['108449.0','141843.0','198332.0','198333.0','244967.0','562707.0']},'2.16.840.1.113883.3.464.0001.249':{'CPT':['87070','87071','87081','87430','87650','87651','87652','87880']},'2.16.840.1.113883.3.464.0001.251':{'LOINC':['11268-0','17656-0','18481-2','31971-5','49610-9','5036-9','626-2','6556-5','6557-3','6558-1','6559-9']},'2.16.840.1.113883.3.464.0001.252':{'SNOMED-CT':['89634005.0','122121004.0','122205003.0','122245007.0','122303007.0']},'2.16.840.1.113883.3.464.0001.302':{'RxNorm':['141970.0','197518.0','197519.0','205964.0','259233.0','284215.0','309329.0','309332.0','309333.0','309335.0','309336.0','309337.0','309338.0','309339.0','309340.0','358917.0','392275.0','477451.0','562266.0','745483.0','797274.0','853019.0','882548.0','885131.0','890921.0','900391.0','900424.0','900460.0']},'2.16.840.1.113883.3.464.0001.308':{'RxNorm':['204844.0','248656.0','251854.0','141962.0','141963.0','197516.0','197517.0','197650.0','206085.0','240741.0','259543.0','308459.0','308460.0','308461.0','309321.0','309322.0','310157.0','310160.0','310161.0','310162.0','310165.0','346618.0','359385.0','486912.0','486955.0','486960.0','487129.0','577162.0','577378.0','597193.0','597194.0','597298.0','597455.0','686350.0','686354.0','686355.0','686400.0','686405.0','686406.0','686418.0','686447.0','750151.0','751864.0','861416.0']},'2.16.840.1.113883.3.464.0001.341':{'RxNorm':['105078.0','204466.0','207390.0','207391.0','312260.0','312263.0','312266.0','312270.0','617857.0','617881.0','623677.0','623695.0','731538.0','731558.0','731560.0','731564.0','731567.0','731570.0','731572.0','731575.0','731590.0','745047.0','745051.0','745053.0','745276.0','745278.0','745280.0','745282.0','745284.0','745286.0','745292.0','745296.0','745300.0','745302.0','745303.0','745462.0','745464.0','745477.0','745479.0','745519.0','745560.0','745561.0','745585.0','824584.0','834040.0','834046.0','834061.0','834102.0','834179.0','834182.0','836306.0','863538.0']},'2.16.840.1.113883.3.464.0001.368':{'RxNorm':['197595.0','197596.0','309860.0','313945.0','406366.0']},'2.16.840.1.113883.3.464.0001.371':{'ICD-9-CM':['034.0','462.0','463.0']},'2.16.840.1.113883.3.464.0001.372':{'SNOMED-CT':['140004.0','652005.0','1532007.0','2091005.0','2365002.0','10351008.0','11461005.0','13177009.0','14465002.0','17741008.0','23166004.0','24078009.0','27878001.0','31309002.0','39271004.0','40766000.0','41582007.0','43878008.0','47841006.0','51209006.0','51476001.0','55355000.0','58031004.0','59221008.0','59471009.0','63866002.0','70020005.0','72430001.0','76651006.0','78430008.0','78911000.0','82228008.0','87326000.0','90176007.0','90979004.0','95885008.0','102453009.0','109362006.0','111277007.0','111816002.0','111816002.0','126664009.0','164260005.0','186659004.0','186675001.0','186963008.0','195655000.0','195655000.0','195656004.0','195657008.0','195658003.0','195659006.0','195660001.0','195662009.0','195662009.0','195663004.0','195666007.0','195667003.0','195668008.0','195669000.0','195670004.0','195671000.0','195672007.0','195673002.0','195676005.0','195677001.0','195707008.0','195779005.0','195780008.0','195782000.0','195798007.0','195803003.0','195804009.0','195924009.0','232399005.0','232400003.0','232401004.0','232402006.0','232403001.0','232404007.0','232405008.0','232405008.0','232406009.0','232417005.0','232420002.0','234528007.0','240444009.0','240547000.0','300932000.0','302911003.0','312422001.0','363746003.0','399095008.0','405737000.0','415724006.0','J02','J02.0','J02.8','J02.9','J03','J03.0','J03.00','J03.01','J03.8','J03.80','J03.81','J03.9','J03.90','J03.91']},'2.16.840.1.113883.3.464.0001.385':{'RxNorm':['197511.0','197512.0','198044.0','198048.0','198049.0','198050.0','199370.0','199886.0','240639.0','240640.0','250095.0','259311.0','309304.0','309308.0','309309.0','309310.0','310445.0','311296.0','311364.0','311787.0','313522.0','313523.0','314009.0','315065.0','351156.0','359383.0','403921.0','477391.0','597446.0','637560.0','644541.0','794769.0','877486.0']},'2.16.840.1.113883.3.464.0001.397':{'RxNorm':['105189','197449','197452','197453','197898','197899','204929','245239','309040','309041','309042','309043','309044','309045','309080','309081','309095','309096','309097','309098','309099','309100','309101','309103','311370','311371','313888','313926','349507','349508','387065','387066','476322','476325','476327','476623']},'2.16.840.1.113883.3.464.0001.406':{'RxNorm':['142118.0','198334.0','198335.0','313137.0','648254.0','686383.0','894883.0','198235','198420','246252','312340','313134','315219','413716','756189']},'2.16.840.1.113883.3.464.0001.408':{'RxNorm':['105220','105227','197633','197984','197985','198249','198250','198252','199026','199027','207362','207364','242807','242814','283535','310026','310027','310028','310029','310030','313251','313252','313253','313254','314108','317127','348869','348870','349114','349115','349116','351121','359465','403840','406524','434018','597520','597521','597808','629695','629697','629699','630819','630824','630827','643821','645613','645614','645619','647109','687231','700408','705861','728207','756134','756192','799048','858062','858065','858372','858375']},'2.16.840.1.113883.3.464.0001.409':{'RxNorm':['197450','197451','200346','204871','250156','309054','309058','309076','309077','309078','309079','309085','309086','309087','309090','309091','309092','309093','351127','419849','476576','562619','645956','746671','847360']}};\n // Measure variables\nvar MeasurePeriod = {\n \"low\": new TS(\"20100101\", null, true),\n \"high\": new TS(\"20110101\", null, true)\n}\nhqmfjs.MeasurePeriod = function(patient) {\n return [new hQuery.CodedEntry(\n {\n \"start_time\": MeasurePeriod.low.asDate().getTime()/1000,\n \"end_time\": MeasurePeriod.high.asDate().getTime()/1000,\n \"codes\": {}\n }\n )];\n}\nif (typeof effective_date === 'number') {\n MeasurePeriod.high.date = new Date(1000*effective_date);\n MeasurePeriod.low.date = new Date(1000*effective_date);\n MeasurePeriod.low.date.setFullYear(MeasurePeriod.low.date.getFullYear()-1);\n}\n\n// Data critera\nhqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_4 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"dispensed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_6 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"ordered\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationActivePharyngitisAntibiotics_precondition_8 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_1 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n events = SBS(events, hqmfjs.GROUP_SBS_CHILDREN_1(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.GROUP_SBS_CHILDREN_1 = function(patient) {\n var events = UNION(\n hqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_4(patient),\n hqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_6(patient),\n hqmfjs.MedicationActivePharyngitisAntibiotics_precondition_8(patient)\n );\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.LaboratoryTestPerformedGroupAStreptococcusTest_precondition_11 = function(patient) {\n var events = patient.laboratoryTests();\n events = events.withStatuses([\"performed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.250\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SBE(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_1(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_16 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"dispensed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_18 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"ordered\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationActivePharyngitisAntibiotics_precondition_20 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_13 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n events = SBS(events, hqmfjs.GROUP_SBS_CHILDREN_2(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.GROUP_SBS_CHILDREN_2 = function(patient) {\n var events = UNION(\n hqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_16(patient),\n hqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_18(patient),\n hqmfjs.MedicationActivePharyngitisAntibiotics_precondition_20(patient)\n );\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.LaboratoryTestPerformedGroupAStreptococcusTest_precondition_23 = function(patient) {\n var events = patient.laboratoryTests();\n events = events.withStatuses([\"performed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.250\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SAE(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_13(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_26 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_28 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n return events;\n}\n\nhqmfjs.DiagnosisActivePharyngitis_precondition_29 = function(patient) {\n var events = patient.allProblems();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.369\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_28(patient));\n return events;\n}\n\nhqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_34 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"dispensed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_36 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"ordered\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationActivePharyngitisAntibiotics_precondition_38 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_31 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n events = SBS(events, hqmfjs.GROUP_SBS_CHILDREN_3(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.GROUP_SBS_CHILDREN_3 = function(patient) {\n var events = UNION(\n hqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_34(patient),\n hqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_36(patient),\n hqmfjs.MedicationActivePharyngitisAntibiotics_precondition_38(patient)\n );\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_49 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n return events;\n}\n\nhqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_42 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"dispensed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SBS(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_49(patient), new IVL_PQ(null, new PQ(30, \"d\", true)));\n return events;\n}\n\nhqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_44 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"ordered\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SBS(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_49(patient), new IVL_PQ(null, new PQ(30, \"d\", true)));\n return events;\n}\n\nhqmfjs.MedicationActivePharyngitisAntibiotics_precondition_46 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SBS(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_49(patient), new IVL_PQ(null, new PQ(30, \"d\", true)));\n return events;\n}\n\nhqmfjs.PatientCharacteristicBirthDate_precondition_53 = function(patient) {\nvar value = patient.birthtime();\nvar events = [value];\nevents = SBS(events, hqmfjs.MeasurePeriod(patient), new IVL_PQ(new PQ(2, \"a\", true), null));\nevents.specificContext=Specifics.identity();\nreturn events;\n\n}\n\nhqmfjs.PatientCharacteristicBirthDate_precondition_55 = function(patient) {\nvar value = patient.birthtime();\nvar events = [value];\nevents = SBS(events, hqmfjs.MeasurePeriod(patient), new IVL_PQ(null, new PQ(17, \"a\", true)));\nevents.specificContext=Specifics.identity();\nreturn events;\n\n}\n\n\n\n // #########################\n // ##### MEASURE LOGIC #####\n // #########################\n \n hqmfjs.initializeSpecifics = function(patient_api, hqmfjs) { Specifics.initialize(patient_api,hqmfjs) }\n\n // INITIAL PATIENT POPULATION\n hqmfjs.IPP = function(patient) {\n return allTrue( \n allTrue( \n hqmfjs.PatientCharacteristicBirthDate_precondition_53(patient), \n hqmfjs.PatientCharacteristicBirthDate_precondition_55(patient)\n )\n );\n};\n\n\n // DENOMINATOR\n hqmfjs.DENOM = function(patient) {\n return allTrue( \n allTrue( \n hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_26(patient), \n hqmfjs.DiagnosisActivePharyngitis_precondition_29(patient), \n atLeastOneTrue( \n hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_31(patient)\n ), \n atLeastOneFalse( \n atLeastOneTrue( \n hqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_42(patient), \n hqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_44(patient), \n hqmfjs.MedicationActivePharyngitisAntibiotics_precondition_46(patient)\n )\n )\n )\n );\n};\n\n\n // NUMERATOR\n hqmfjs.NUMER = function(patient) {\n return allTrue( \n allTrue( \n hqmfjs.LaboratoryTestPerformedGroupAStreptococcusTest_precondition_11(patient), \n hqmfjs.LaboratoryTestPerformedGroupAStreptococcusTest_precondition_23(patient)\n )\n );\n};\n\n\n hqmfjs.EXCL = function(patient) { return new Boolean(false); }\n hqmfjs.DENEXCEP = function(patient) { return new Boolean(false); }\n \n\n hqmfjs.initializeSpecifics(patient_api, hqmfjs)\n \n var population = function() {\n return executeIfAvailable(hqmfjs.IPP, patient_api);\n }\n var denominator = function() {\n return executeIfAvailable(hqmfjs.DENOM, patient_api);\n }\n var numerator = function() {\n return executeIfAvailable(hqmfjs.NUMER, patient_api);\n }\n var exclusion = function() {\n return executeIfAvailable(hqmfjs.EXCL, patient_api);\n }\n var denexcep = function() {\n return executeIfAvailable(hqmfjs.DENEXCEP, patient_api);\n }\n \n var executeIfAvailable = function(optionalFunction, arg) {\n if (typeof(optionalFunction)==='function')\n return optionalFunction(arg);\n else\n return false;\n }\n\n if (Logger.enabled) enableMeasureLogging(hqmfjs);\n\n map(patient, population, denominator, numerator, exclusion, denexcep);\n \n };\n ",
|
624
|
+
"map_fn": "function() {\n var patient = this;\n var effective_date = <%= effective_date %>;\n\n hqmfjs = {}\n hqmfjs.hqmf_id = '2E679CD2-3FEC-4A75-A75A-61403E5EFEE8'; hqmfjs.sub_id = null; hqmfjs.nqf_id = '0002'; hqmfjs.test_id=null; hqmfjs.effective_date = effective_date;\n <%= init_js_frameworks %>\n \n \n var patient_api = new hQuery.Patient(patient);\n\n \n\n // clear out logger\n if (typeof Logger != 'undefined') Logger.logger = [];\n // turn on logging if it is enabled\n if (Logger.enabled) enableLogging();\n \n \n // #########################\n // ##### DATA ELEMENTS #####\n // #########################\n\n OidDictionary = {'2.16.840.1.113883.3.464.0001.231':{'CPT':['99201','99202','99203','99204','99205','99211','99212','99213','99214','99215','99217','99218','99219','99220','99241','99242','99243','99244','99245','99384','99385','99394','99395','99401','99402','99403','99404','99411','99412','99420','99429'],'ICD-9-CM':['V70.0','V70.3','V70.5','V70.6','V70.8','V70.9']},'2.16.840.1.113883.3.464.0001.250':{'CPT':['87070','87071','87081','87430','87650','87651','87652','87880'],'LOINC':['11268-0','17656-0','18481-2','31971-5','49610-9','5036-9','626-2','6556-5','6557-3','6558-1','6559-9'],'SNOMED-CT':['89634005.0','122121004.0','122205003.0','122245007.0','122303007.0']},'2.16.840.1.113883.3.464.0001.369':{'ICD-9-CM':['034.0','462.0','463.0'],'SNOMED-CT':['140004.0','652005.0','1532007.0','2091005.0','2365002.0','10351008.0','11461005.0','13177009.0','14465002.0','17741008.0','23166004.0','24078009.0','27878001.0','31309002.0','39271004.0','40766000.0','41582007.0','43878008.0','47841006.0','51209006.0','51476001.0','55355000.0','58031004.0','59221008.0','59471009.0','63866002.0','70020005.0','72430001.0','76651006.0','78430008.0','78911000.0','82228008.0','87326000.0','90176007.0','90979004.0','95885008.0','102453009.0','109362006.0','111277007.0','111816002.0','111816002.0','126664009.0','164260005.0','186659004.0','186675001.0','186963008.0','195655000.0','195655000.0','195656004.0','195657008.0','195658003.0','195659006.0','195660001.0','195662009.0','195662009.0','195663004.0','195666007.0','195667003.0','195668008.0','195669000.0','195670004.0','195671000.0','195672007.0','195673002.0','195676005.0','195677001.0','195707008.0','195779005.0','195780008.0','195782000.0','195798007.0','195803003.0','195804009.0','195924009.0','232399005.0','232400003.0','232401004.0','232402006.0','232403001.0','232404007.0','232405008.0','232405008.0','232406009.0','232417005.0','232420002.0','234528007.0','240444009.0','240547000.0','300932000.0','302911003.0','312422001.0','363746003.0','399095008.0','405737000.0','415724006.0','J02','J02.0','J02.8','J02.9','J03','J03.0','J03.00','J03.01','J03.8','J03.80','J03.81','J03.9','J03.90','J03.91']},'2.16.840.1.113883.3.464.0001.373':{'RxNorm':['197450','197451','200346','204871','250156','309054','309058','309076','309077','309078','309079','309085','309086','309087','309090','309091','309092','309093','351127','419849','476576','562619','645956','746671','847360']},'2.16.840.1.113883.3.464.0001.157':{'RxNorm':['105134.0','105152.0','199693.0','199694.0','199928.0','199997.0','239187.0','239191.0','240984.0','246282.0','250463.0','308177.0','308181.0','308182.0','308183.0','308188.0','308189.0','308191.0','308192.0','308194.0','308207.0','308208.0','308209.0','308210.0','308212.0','313797.0','313798.0','313799.0','313800.0','313801.0','313819.0','313850.0','346892.0','392151.0','392152.0','403945.0','476299.0','562255.0','562256.0','598025.0','746669.0','756252.0','789980.0','791939.0','791947.0','802550.0','846994.0','852904.0','308206']},'2.16.840.1.113883.3.464.0001.172':{'RxNorm':['562251.0','562253.0','562508.0','617293.0','617295.0','617296.0','617302.0','617304.0','617309.0','617316.0','617322.0','617423.0','617430.0','617975.0','617976.0','617981.0','617989.0','617993.0','617995.0','617996.0','645806.0']},'2.16.840.1.113883.3.560.100.4':{'LOINC':['21112-8']},'2.16.840.1.113883.3.464.0001.45':{'CPT':['99281','99282','99283','99284','99285']},'2.16.840.1.113883.3.464.0001.48':{'CPT':['99201','99202','99203','99204','99205','99211','99212','99213','99214','99215','99217','99218','99219','99220','99241','99242','99243','99244','99245','99384','99385','99394','99395','99401','99402','99403','99404','99411','99412','99420','99429']},'2.16.840.1.113883.3.464.0001.50':{'ICD-9-CM':['V70.0','V70.3','V70.5','V70.6','V70.8','V70.9']},'2.16.840.1.113883.3.464.0001.246':{'RxNorm':['105170.0','105171.0','197454.0','197455.0','197456.0','242794.0','250582.0','309046.0','309047.0','309048.0','309049.0','309051.0','309052.0','309053.0','309110.0','309111.0','309112.0','309113.0','309114.0','309115.0','309121.0','313889.0','313920.0','313929.0','347996.0','406696.0','476193.0','562062.0','562641.0','637173.0','645617.0','755615.0','755616.0','755617.0','796301.0','854220.0']},'2.16.840.1.113883.3.464.0001.247':{'RxNorm':['108449.0','141843.0','198332.0','198333.0','244967.0','562707.0']},'2.16.840.1.113883.3.464.0001.249':{'CPT':['87070','87071','87081','87430','87650','87651','87652','87880']},'2.16.840.1.113883.3.464.0001.251':{'LOINC':['11268-0','17656-0','18481-2','31971-5','49610-9','5036-9','626-2','6556-5','6557-3','6558-1','6559-9']},'2.16.840.1.113883.3.464.0001.252':{'SNOMED-CT':['89634005.0','122121004.0','122205003.0','122245007.0','122303007.0']},'2.16.840.1.113883.3.464.0001.302':{'RxNorm':['141970.0','197518.0','197519.0','205964.0','259233.0','284215.0','309329.0','309332.0','309333.0','309335.0','309336.0','309337.0','309338.0','309339.0','309340.0','358917.0','392275.0','477451.0','562266.0','745483.0','797274.0','853019.0','882548.0','885131.0','890921.0','900391.0','900424.0','900460.0']},'2.16.840.1.113883.3.464.0001.308':{'RxNorm':['204844.0','248656.0','251854.0','141962.0','141963.0','197516.0','197517.0','197650.0','206085.0','240741.0','259543.0','308459.0','308460.0','308461.0','309321.0','309322.0','310157.0','310160.0','310161.0','310162.0','310165.0','346618.0','359385.0','486912.0','486955.0','486960.0','487129.0','577162.0','577378.0','597193.0','597194.0','597298.0','597455.0','686350.0','686354.0','686355.0','686400.0','686405.0','686406.0','686418.0','686447.0','750151.0','751864.0','861416.0']},'2.16.840.1.113883.3.464.0001.341':{'RxNorm':['105078.0','204466.0','207390.0','207391.0','312260.0','312263.0','312266.0','312270.0','617857.0','617881.0','623677.0','623695.0','731538.0','731558.0','731560.0','731564.0','731567.0','731570.0','731572.0','731575.0','731590.0','745047.0','745051.0','745053.0','745276.0','745278.0','745280.0','745282.0','745284.0','745286.0','745292.0','745296.0','745300.0','745302.0','745303.0','745462.0','745464.0','745477.0','745479.0','745519.0','745560.0','745561.0','745585.0','824584.0','834040.0','834046.0','834061.0','834102.0','834179.0','834182.0','836306.0','863538.0']},'2.16.840.1.113883.3.464.0001.368':{'RxNorm':['197595.0','197596.0','309860.0','313945.0','406366.0']},'2.16.840.1.113883.3.464.0001.371':{'ICD-9-CM':['034.0','462.0','463.0']},'2.16.840.1.113883.3.464.0001.372':{'SNOMED-CT':['140004.0','652005.0','1532007.0','2091005.0','2365002.0','10351008.0','11461005.0','13177009.0','14465002.0','17741008.0','23166004.0','24078009.0','27878001.0','31309002.0','39271004.0','40766000.0','41582007.0','43878008.0','47841006.0','51209006.0','51476001.0','55355000.0','58031004.0','59221008.0','59471009.0','63866002.0','70020005.0','72430001.0','76651006.0','78430008.0','78911000.0','82228008.0','87326000.0','90176007.0','90979004.0','95885008.0','102453009.0','109362006.0','111277007.0','111816002.0','111816002.0','126664009.0','164260005.0','186659004.0','186675001.0','186963008.0','195655000.0','195655000.0','195656004.0','195657008.0','195658003.0','195659006.0','195660001.0','195662009.0','195662009.0','195663004.0','195666007.0','195667003.0','195668008.0','195669000.0','195670004.0','195671000.0','195672007.0','195673002.0','195676005.0','195677001.0','195707008.0','195779005.0','195780008.0','195782000.0','195798007.0','195803003.0','195804009.0','195924009.0','232399005.0','232400003.0','232401004.0','232402006.0','232403001.0','232404007.0','232405008.0','232405008.0','232406009.0','232417005.0','232420002.0','234528007.0','240444009.0','240547000.0','300932000.0','302911003.0','312422001.0','363746003.0','399095008.0','405737000.0','415724006.0','J02','J02.0','J02.8','J02.9','J03','J03.0','J03.00','J03.01','J03.8','J03.80','J03.81','J03.9','J03.90','J03.91']},'2.16.840.1.113883.3.464.0001.385':{'RxNorm':['197511.0','197512.0','198044.0','198048.0','198049.0','198050.0','199370.0','199886.0','240639.0','240640.0','250095.0','259311.0','309304.0','309308.0','309309.0','309310.0','310445.0','311296.0','311364.0','311787.0','313522.0','313523.0','314009.0','315065.0','351156.0','359383.0','403921.0','477391.0','597446.0','637560.0','644541.0','794769.0','877486.0']},'2.16.840.1.113883.3.464.0001.397':{'RxNorm':['105189','197449','197452','197453','197898','197899','204929','245239','309040','309041','309042','309043','309044','309045','309080','309081','309095','309096','309097','309098','309099','309100','309101','309103','311370','311371','313888','313926','349507','349508','387065','387066','476322','476325','476327','476623']},'2.16.840.1.113883.3.464.0001.406':{'RxNorm':['142118.0','198334.0','198335.0','313137.0','648254.0','686383.0','894883.0','198235','198420','246252','312340','313134','315219','413716','756189']},'2.16.840.1.113883.3.464.0001.408':{'RxNorm':['105220','105227','197633','197984','197985','198249','198250','198252','199026','199027','207362','207364','242807','242814','283535','310026','310027','310028','310029','310030','313251','313252','313253','313254','314108','317127','348869','348870','349114','349115','349116','351121','359465','403840','406524','434018','597520','597521','597808','629695','629697','629699','630819','630824','630827','643821','645613','645614','645619','647109','687231','700408','705861','728207','756134','756192','799048','858062','858065','858372','858375']},'2.16.840.1.113883.3.464.0001.409':{'RxNorm':['197450','197451','200346','204871','250156','309054','309058','309076','309077','309078','309079','309085','309086','309087','309090','309091','309092','309093','351127','419849','476576','562619','645956','746671','847360']}};\n // Measure variables\nvar MeasurePeriod = {\n \"low\": new TS(\"20100101\", null, true),\n \"high\": new TS(\"20110101\", null, true)\n}\nhqmfjs.MeasurePeriod = function(patient) {\n return [new hQuery.CodedEntry(\n {\n \"start_time\": MeasurePeriod.low.asDate().getTime()/1000,\n \"end_time\": MeasurePeriod.high.asDate().getTime()/1000,\n \"codes\": {}\n }\n )];\n}\nif (typeof effective_date === 'number') {\n MeasurePeriod.high.date = new Date(1000*effective_date);\n MeasurePeriod.low.date = new Date(1000*effective_date);\n MeasurePeriod.low.date.setFullYear(MeasurePeriod.low.date.getFullYear()-1);\n}\n\n// Data critera\nhqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_4 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"dispensed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_6 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"ordered\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationActivePharyngitisAntibiotics_precondition_8 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_1 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n events = SBS(events, hqmfjs.GROUP_SBS_CHILDREN_1(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.GROUP_SBS_CHILDREN_1 = function(patient) {\n var events = UNION(\n hqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_4(patient),\n hqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_6(patient),\n hqmfjs.MedicationActivePharyngitisAntibiotics_precondition_8(patient)\n );\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.LaboratoryTestPerformedGroupAStreptococcusTest_precondition_11 = function(patient) {\n var events = patient.laboratoryTests();\n events = events.withStatuses([\"performed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.250\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SBE(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_1(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_16 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"dispensed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_18 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"ordered\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationActivePharyngitisAntibiotics_precondition_20 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_13 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n events = SBS(events, hqmfjs.GROUP_SBS_CHILDREN_2(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.GROUP_SBS_CHILDREN_2 = function(patient) {\n var events = UNION(\n hqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_16(patient),\n hqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_18(patient),\n hqmfjs.MedicationActivePharyngitisAntibiotics_precondition_20(patient)\n );\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.LaboratoryTestPerformedGroupAStreptococcusTest_precondition_23 = function(patient) {\n var events = patient.laboratoryTests();\n events = events.withStatuses([\"performed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.250\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SAE(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_13(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_26 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_28 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n return events;\n}\n\nhqmfjs.DiagnosisActivePharyngitis_precondition_29 = function(patient) {\n var events = patient.allProblems();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.369\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_28(patient));\n return events;\n}\n\nhqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_34 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"dispensed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_36 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"ordered\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.MedicationActivePharyngitisAntibiotics_precondition_38 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_31 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n events = SBS(events, hqmfjs.GROUP_SBS_CHILDREN_3(patient), new IVL_PQ(null, new PQ(3, \"d\", true)));\n return events;\n}\n\nhqmfjs.GROUP_SBS_CHILDREN_3 = function(patient) {\n var events = UNION(\n hqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_34(patient),\n hqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_36(patient),\n hqmfjs.MedicationActivePharyngitisAntibiotics_precondition_38(patient)\n );\n\n events.specificContext=Specifics.identity()\n return events;\n}\n\nhqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_49 = function(patient) {\n var events = patient.encounters();\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.231\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = DURING(events, hqmfjs.MeasurePeriod(patient));\n return events;\n}\n\nhqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_42 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"dispensed\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SBS(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_49(patient), new IVL_PQ(null, new PQ(30, \"d\", true)));\n return events;\n}\n\nhqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_44 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"ordered\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SBS(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_49(patient), new IVL_PQ(null, new PQ(30, \"d\", true)));\n return events;\n}\n\nhqmfjs.MedicationActivePharyngitisAntibiotics_precondition_46 = function(patient) {\n var events = patient.allMedications();\n events = events.withStatuses([\"active\"]);\n events = events.withoutNegation();\n var codes = getCodes(\"2.16.840.1.113883.3.464.0001.373\");\n var start = null;\n var end = null;\n events = events.match(codes, start, end, true);\n\n events = SBS(events, hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_49(patient), new IVL_PQ(null, new PQ(30, \"d\", true)));\n return events;\n}\n\nhqmfjs.PatientCharacteristicBirthDate_precondition_53 = function(patient) {\nvar value = patient.birthtime();\nvar events = [value];\nevents = SBS(events, hqmfjs.MeasurePeriod(patient), new IVL_PQ(new PQ(2, \"a\", true), null));\nevents.specificContext=Specifics.identity();\nreturn events;\n\n}\n\nhqmfjs.PatientCharacteristicBirthDate_precondition_55 = function(patient) {\nvar value = patient.birthtime();\nvar events = [value];\nevents = SBS(events, hqmfjs.MeasurePeriod(patient), new IVL_PQ(null, new PQ(17, \"a\", true)));\nevents.specificContext=Specifics.identity();\nreturn events;\n\n}\n\n\n\n // #########################\n // ##### MEASURE LOGIC #####\n // #########################\n \n hqmfjs.initializeSpecifics = function(patient_api, hqmfjs) { Specifics.initialize(patient_api,hqmfjs) }\n\n // INITIAL PATIENT POPULATION\n hqmfjs.IPP = function(patient) {\n return allTrue( \n allTrue( \n hqmfjs.PatientCharacteristicBirthDate_precondition_53(patient), \n hqmfjs.PatientCharacteristicBirthDate_precondition_55(patient)\n )\n );\n};\n\n\n // DENOMINATOR\n hqmfjs.DENOM = function(patient) {\n return allTrue( \n allTrue( \n hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_26(patient), \n hqmfjs.DiagnosisActivePharyngitis_precondition_29(patient), \n atLeastOneTrue( \n hqmfjs.EncounterEncounterAmbulatoryIncludingPediatrics_precondition_31(patient)\n ), \n atLeastOneFalse( \n atLeastOneTrue( \n hqmfjs.MedicationDispensedPharyngitisAntibiotics_precondition_42(patient), \n hqmfjs.MedicationOrderPharyngitisAntibiotics_precondition_44(patient), \n hqmfjs.MedicationActivePharyngitisAntibiotics_precondition_46(patient)\n )\n )\n )\n );\n};\n\n\n // NUMERATOR\n hqmfjs.NUMER = function(patient) {\n return allTrue( \n allTrue( \n hqmfjs.LaboratoryTestPerformedGroupAStreptococcusTest_precondition_11(patient), \n hqmfjs.LaboratoryTestPerformedGroupAStreptococcusTest_precondition_23(patient)\n )\n );\n};\n\n\n hqmfjs.EXCL = function(patient) { return new Boolean(false); }\n hqmfjs.DENEXCEP = function(patient) { return new Boolean(false); }\n \n\n hqmfjs.initializeSpecifics(patient_api, hqmfjs)\n \n var population = function() {\n return executeIfAvailable(hqmfjs.IPP, patient_api);\n }\n var denominator = function() {\n return executeIfAvailable(hqmfjs.DENOM, patient_api);\n }\n var numerator = function() {\n return executeIfAvailable(hqmfjs.NUMER, patient_api);\n }\n var exclusion = function() {\n return executeIfAvailable(hqmfjs.EXCL, patient_api);\n }\n var denexcep = function() {\n return executeIfAvailable(hqmfjs.DENEXCEP, patient_api);\n }\n \n var executeIfAvailable = function(optionalFunction, arg) {\n if (typeof(optionalFunction)==='function')\n return optionalFunction(arg);\n else\n return false;\n }\n\n if (Logger.enabled) enableMeasureLogging(hqmfjs);\n\n map(patient, population, denominator, numerator, exclusion, denexcep);\n \n };\n ",
|
625
625
|
"measure": {
|
626
626
|
"encounter_encounter_ambulatory_including_pediatrics": {
|
627
627
|
"type": "array",
|
data/test/mongoid.yml
ADDED
data/test/test_helper.rb
CHANGED
@@ -3,17 +3,13 @@ require 'minitest/autorun'
|
|
3
3
|
require 'quality-measure-engine'
|
4
4
|
require 'test/unit'
|
5
5
|
require 'turn'
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
Mongoid.configure do |config|
|
10
|
-
config.sessions = { default: { hosts: [ "#{db_host}:27017" ], database: 'test' }}
|
11
|
-
end
|
6
|
+
require 'pry-nav'
|
7
|
+
Mongoid.load!(File.join(File.dirname(__FILE__),"mongoid.yml"), :test)
|
12
8
|
|
13
9
|
class MiniTest::Unit::TestCase
|
14
10
|
|
15
11
|
def load_system_js
|
16
|
-
|
12
|
+
Mongoid.default_session['system.js'].find.remove_all
|
17
13
|
Dir.glob(File.join(File.dirname(__FILE__), 'fixtures', "library_functions", '*.js')).each do |json_fixture_file|
|
18
14
|
name = File.basename(json_fixture_file,".*")
|
19
15
|
fn = "function () {\n #{File.read(json_fixture_file)} \n }"
|
@@ -4,8 +4,8 @@ class MapReduceBuilderTest < MiniTest::Unit::TestCase
|
|
4
4
|
include QME::DatabaseAccess
|
5
5
|
|
6
6
|
def setup
|
7
|
-
|
8
|
-
@measure_json =
|
7
|
+
collection_fixtures(get_db(), 'measures')
|
8
|
+
@measure_json = QME::QualityMeasure.where({"nqf_id" => '0043'}).first
|
9
9
|
load_system_js
|
10
10
|
end
|
11
11
|
|
@@ -10,12 +10,15 @@ class MapReduceExecutorTest < MiniTest::Unit::TestCase
|
|
10
10
|
collection_fixtures(get_db(), 'measures')
|
11
11
|
collection_fixtures(get_db(), 'records', '_id')
|
12
12
|
collection_fixtures(get_db(), 'bundles')
|
13
|
+
options = {'measure_id' => "2E679CD2-3FEC-4A75-A75A-61403E5EFEE8",
|
14
|
+
'effective_date' => Time.gm(2011, 1, 15).to_i}
|
15
|
+
@quality_report =QME::QualityReport.find_or_create_by(options)
|
13
16
|
load_system_js
|
14
17
|
end
|
15
18
|
|
16
19
|
def test_map_records_into_measure_groups
|
17
|
-
executor = QME::MapReduce::Executor.new(
|
18
|
-
'effective_date' => Time.gm(2011, 1, 15).to_i)
|
20
|
+
executor = QME::MapReduce::Executor.new(@quality_report.measure_id,@quality_report.sub_id, {
|
21
|
+
'effective_date' => Time.gm(2011, 1, 15).to_i})
|
19
22
|
|
20
23
|
executor.map_records_into_measure_groups
|
21
24
|
|
@@ -29,14 +32,14 @@ class MapReduceExecutorTest < MiniTest::Unit::TestCase
|
|
29
32
|
|
30
33
|
|
31
34
|
def test_calculate_supplemental_data_elements
|
32
|
-
executor = QME::MapReduce::Executor.new(
|
33
|
-
'effective_date' => Time.gm(2011, 1, 15).to_i)
|
35
|
+
executor = QME::MapReduce::Executor.new(@quality_report.measure_id,@quality_report.sub_id, {
|
36
|
+
'effective_date' => Time.gm(2011, 1, 15).to_i})
|
34
37
|
|
35
38
|
executor.map_records_into_measure_groups
|
36
|
-
executor.count_records_in_measure_groups
|
37
|
-
|
38
|
-
|
39
|
-
|
39
|
+
result = executor.count_records_in_measure_groups
|
40
|
+
|
41
|
+
suppl = result["supplemental_data"]
|
42
|
+
|
40
43
|
assert !suppl.empty?, "should contain supplemental data entries"
|
41
44
|
ipp = {QME::QualityReport::RACE =>{"UNK"=>2, "1002-5"=>1},
|
42
45
|
QME::QualityReport::ETHNICITY => {"UNK"=>1, "2186-5"=>2},
|
@@ -66,46 +69,32 @@ class MapReduceExecutorTest < MiniTest::Unit::TestCase
|
|
66
69
|
end
|
67
70
|
|
68
71
|
def test_count_records_in_measure_groups
|
69
|
-
executor = QME::MapReduce::Executor.new(
|
70
|
-
'effective_date' => Time.gm(2011, 1, 15).to_i)
|
72
|
+
executor = QME::MapReduce::Executor.new(@quality_report.measure_id,@quality_report.sub_id, {
|
73
|
+
'effective_date' => Time.gm(2011, 1, 15).to_i})
|
71
74
|
executor.map_records_into_measure_groups
|
72
|
-
executor.count_records_in_measure_groups
|
73
|
-
assert_equal
|
74
|
-
|
75
|
-
assert_equal
|
76
|
-
assert_equal 2, doc[QME::QualityReport::DENOMINATOR]
|
77
|
-
assert_equal 1, doc[QME::QualityReport::NUMERATOR]
|
75
|
+
result = executor.count_records_in_measure_groups
|
76
|
+
assert_equal 3, result[QME::QualityReport::POPULATION]
|
77
|
+
assert_equal 2, result[QME::QualityReport::DENOMINATOR]
|
78
|
+
assert_equal 1, result[QME::QualityReport::NUMERATOR]
|
78
79
|
end
|
79
80
|
|
80
81
|
def test_map_record_into_measure_groups
|
81
|
-
executor = QME::MapReduce::Executor.new(
|
82
|
-
'effective_date' => Time.gm(2011, 1, 15).to_i)
|
82
|
+
executor = QME::MapReduce::Executor.new( @quality_report.measure_id,@quality_report.sub_id, {
|
83
|
+
'effective_date' => Time.gm(2011, 1, 15).to_i})
|
83
84
|
executor.map_record_into_measure_groups("12345")
|
84
85
|
|
85
|
-
assert_equal 1,
|
86
|
-
assert_equal 1,
|
87
|
-
assert_equal 0,
|
88
|
-
assert_equal 1,
|
89
|
-
assert_equal 1,
|
86
|
+
assert_equal 1, QME::PatientCache.count
|
87
|
+
assert_equal 1, QME::PatientCache.where("value.#{QME::QualityReport::POPULATION}" => 1).count
|
88
|
+
assert_equal 0, QME::PatientCache.where("value.#{QME::QualityReport::POPULATION}" => 0).count
|
89
|
+
assert_equal 1, QME::PatientCache.where("value.#{QME::QualityReport::DENOMINATOR}" => 1).count
|
90
|
+
assert_equal 1, QME::PatientCache.where("value.#{QME::QualityReport::NUMERATOR}" => 1).count
|
90
91
|
end
|
91
92
|
|
92
93
|
def test_get_patient_result
|
93
|
-
executor = QME::MapReduce::Executor.new(
|
94
|
-
'effective_date' => Time.gm(2011, 1, 15).to_i)
|
95
|
-
result = executor.get_patient_result("12345")
|
96
|
-
assert_equal 0, get_db['patient_cache'].find().count
|
97
|
-
assert result[QME::QualityReport::NUMERATOR]
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_get_patient_result_with_bundle_id
|
101
|
-
measure_id = "2E679CD2-3FEC-4A75-A75A-61403E5EFEE8"
|
102
|
-
bundle_id = get_db()['bundles'].find.first
|
103
|
-
get_db()['measures'].find('id' => measure_id).update(:$set => {'bundle_id' => bundle_id})
|
104
|
-
executor = QME::MapReduce::Executor.new(measure_id, nil,
|
105
|
-
'effective_date' => Time.gm(2011, 1, 15).to_i, 'bundle_id' => bundle_id)
|
94
|
+
executor = QME::MapReduce::Executor.new(@quality_report.measure_id,@quality_report.sub_id, {
|
95
|
+
'effective_date' => Time.gm(2011, 1, 15).to_i})
|
106
96
|
result = executor.get_patient_result("12345")
|
107
|
-
assert_equal 0,
|
97
|
+
assert_equal 0, QME::PatientCache.count
|
108
98
|
assert result[QME::QualityReport::NUMERATOR]
|
109
99
|
end
|
110
|
-
|
111
100
|
end
|
@@ -17,8 +17,8 @@ class MapCalculationJobTest < MiniTest::Unit::TestCase
|
|
17
17
|
def test_perform
|
18
18
|
options = {'measure_id' => "2E679CD2-3FEC-4A75-A75A-61403E5EFEE8",
|
19
19
|
'effective_date' => Time.gm(2011, 1, 15).to_i}
|
20
|
-
|
21
|
-
job = Delayed::Job.enqueue(QME::MapReduce::MeasureCalculationJob.new(
|
20
|
+
qr = QME::QualityReport.find_or_create_by(options)
|
21
|
+
job = Delayed::Job.enqueue(QME::MapReduce::MeasureCalculationJob.new({'quality_report_id' => qr.id,"oid_dictionary"=>{}}))
|
22
22
|
assert job
|
23
23
|
end
|
24
24
|
end
|