quality-measure-engine 2.5.3 → 3.0.0.beta.1

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.
@@ -2,52 +2,16 @@ require 'test_helper'
2
2
 
3
3
  class QualityMeasureTest < MiniTest::Unit::TestCase
4
4
  include QME::DatabaseAccess
5
-
6
5
  def setup
6
+
7
7
  collection_fixtures(get_db(), 'measures')
8
8
  collection_fixtures(get_db(), 'bundles')
9
- @bundle_id = get_db['bundles'].find.first['_id']
10
- get_db['measures'].find({}).update(:$set => {'bundle_id' => @bundle_id})
11
9
  load_system_js
12
10
  end
13
11
 
14
- def test_getting_all_measures_without_bundle_id
12
+ def test_getting_all_measures
15
13
  all_measures = QME::QualityMeasure.all
16
14
  assert_equal 5, all_measures.size
17
-
18
- assert all_measures["2E679CD2-3FEC-4A75-A75A-61403E5EFEE8.json"]
19
- end
20
-
21
- def test_getting_definition_with_bundle_id
22
- result = QME::QualityMeasure.all(@bundle_id).to_a.first.last
23
- measure = QME::QualityMeasure.new(result['id'], result['sub_id'], @bundle_id)
24
- assert measure.definition
25
- assert_equal result['id'], measure.definition['id']
26
- end
27
-
28
- def test_getting_all_measure_with_bundle_id
29
- get_db()['measures']
30
- all_measures = QME::QualityMeasure.all(@bundle_id)
31
-
32
- assert_equal 1, all_measures.size
15
+ assert all_measures.where({"hqmf_id" => "2E679CD2-3FEC-4A75-A75A-61403E5EFEE8"}).first
33
16
  end
34
-
35
- def test_getting_measure_subset
36
- measure_ids = get_db['measures'].find({}).map { |m| m['id'] }
37
- measure_ids.pop
38
- measures = QME::QualityMeasure.get_measures(measure_ids)
39
- measure_ids2 = measures.map { |m| m['id'] }
40
- assert_equal [], measure_ids - measure_ids2
41
- end
42
-
43
- def test_getting_sub_measures
44
- measures = QME::QualityMeasure.sub_measures("8A4D92B2-3887-5DF3-0139-0C4E41594C98")
45
- assert_equal 2, measures.count
46
- end
47
-
48
- def test_getting_sub_measure
49
- measure = QME::QualityMeasure.get("8A4D92B2-3887-5DF3-0139-0C4E41594C98", 'a')
50
- assert measure
51
- end
52
-
53
17
  end
@@ -11,10 +11,12 @@ class QualityReportTest < MiniTest::Unit::TestCase
11
11
  get_db()['query_cache'].insert(
12
12
  "measure_id" => "test2",
13
13
  "sub_id" => "b",
14
+ "status" =>{"state" => "completed"},
14
15
  "initialPopulation" => 4,
16
+ "result" => {
15
17
  QME::QualityReport::NUMERATOR => 1,
16
18
  QME::QualityReport::DENOMINATOR => 2,
17
- QME::QualityReport::EXCLUSIONS => 1,
19
+ QME::QualityReport::EXCLUSIONS => 1},
18
20
  "effective_date" => Time.gm(2010, 9, 19).to_i
19
21
  )
20
22
  get_db()['patient_cache'].insert(
@@ -48,15 +50,15 @@ class QualityReportTest < MiniTest::Unit::TestCase
48
50
  end
49
51
 
50
52
  def test_calculated
51
- qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
53
+ qr = QME::QualityReport.find_or_create('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
52
54
  assert qr.calculated?
53
55
 
54
- qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 20).to_i)
56
+ qr = QME::QualityReport.find_or_create('test2', 'b', "effective_date" => Time.gm(2010, 9, 20).to_i)
55
57
  assert !qr.calculated?
56
58
  end
57
59
 
58
60
  def test_result
59
- qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
61
+ qr = QME::QualityReport.find_or_create('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
60
62
  result = qr.result
61
63
 
62
64
  assert_equal 1, result[QME::QualityReport::NUMERATOR]
@@ -65,24 +67,25 @@ class QualityReportTest < MiniTest::Unit::TestCase
65
67
  def test_destroy_all
66
68
  QME::QualityReport.destroy_all
67
69
 
68
- qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
70
+ qr = QME::QualityReport.find_or_create('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
69
71
  assert !qr.calculated?
70
72
  end
71
73
 
72
74
  def test_update_patient_results
73
- qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
75
+ qr = QME::QualityReport.find_or_create('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
74
76
  assert qr.calculated?
75
77
  assert qr.patients_cached?
76
78
  QME::QualityReport.update_patient_results("0616911582")
79
+ qr = QME::QualityReport.find_or_create('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
77
80
  assert !qr.calculated?
78
81
  assert !qr.patients_cached?
79
82
  end
80
83
 
81
84
  def test_status
82
- qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
83
- status = qr.status('not really a job id')
85
+
86
+ status = QME::MapReduce::MeasureCalculationJob.status('not really a job id')
84
87
  assert_equal :complete, status
85
- status = qr.status("508aeff07042f9f88900000d")
88
+ status = QME::MapReduce::MeasureCalculationJob.status("508aeff07042f9f88900000d")
86
89
  assert_equal :queued, status
87
90
  end
88
91
 
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: 2.5.3
4
+ version: 3.0.0.beta.1
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: 2013-12-09 00:00:00.000000000 Z
15
+ date: 2013-12-11 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: moped
@@ -154,13 +154,13 @@ files:
154
154
  - LICENSE.txt
155
155
  - README.md
156
156
  - Rakefile
157
- - lib/qme/bundle/eh_measure_sheet.rb
158
- - lib/qme/bundle/eh_patient_importer.rb
159
157
  - lib/qme/database_access.rb
158
+ - lib/qme/manual_exclusion.rb
160
159
  - lib/qme/map/cv_aggregator.rb
161
160
  - lib/qme/map/map_reduce_builder.rb
162
161
  - lib/qme/map/map_reduce_executor.rb
163
162
  - lib/qme/map/measure_calculation_job.rb
163
+ - lib/qme/patient_cache.rb
164
164
  - lib/qme/quality_measure.rb
165
165
  - lib/qme/quality_report.rb
166
166
  - lib/qme/railtie.rb
@@ -184,10 +184,9 @@ files:
184
184
  - test/fixtures/records/billy_jones_ipp.json
185
185
  - test/fixtures/records/jane_jones_numerator.json
186
186
  - test/fixtures/records/jill_jones_denominator.json
187
+ - test/mongoid.yml
187
188
  - test/simplecov_setup.rb
188
189
  - test/test_helper.rb
189
- - test/unit/qme/bundle/eh_measure_sheet_test.rb
190
- - test/unit/qme/bundle/eh_patient_importer_test.rb
191
190
  - test/unit/qme/map/cv_aggregator_test.rb
192
191
  - test/unit/qme/map/map_reduce_builder_test.rb
193
192
  - test/unit/qme/map/map_reduce_executor_test.rb
@@ -208,12 +207,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
208
207
  version: '0'
209
208
  required_rubygems_version: !ruby/object:Gem::Requirement
210
209
  requirements:
211
- - - ! '>='
210
+ - - ! '>'
212
211
  - !ruby/object:Gem::Version
213
- version: '0'
212
+ version: 1.3.1
214
213
  requirements: []
215
214
  rubyforge_project:
216
- rubygems_version: 2.1.3
215
+ rubygems_version: 2.0.7
217
216
  signing_key:
218
217
  specification_version: 4
219
218
  summary: This library can run JavaScript based clinical quality measures on a repository
@@ -236,10 +235,9 @@ test_files:
236
235
  - test/fixtures/records/billy_jones_ipp.json
237
236
  - test/fixtures/records/jane_jones_numerator.json
238
237
  - test/fixtures/records/jill_jones_denominator.json
238
+ - test/mongoid.yml
239
239
  - test/simplecov_setup.rb
240
240
  - test/test_helper.rb
241
- - test/unit/qme/bundle/eh_measure_sheet_test.rb
242
- - test/unit/qme/bundle/eh_patient_importer_test.rb
243
241
  - test/unit/qme/map/cv_aggregator_test.rb
244
242
  - test/unit/qme/map/map_reduce_builder_test.rb
245
243
  - test/unit/qme/map/map_reduce_executor_test.rb
@@ -1,117 +0,0 @@
1
- module QME
2
- module Bundle
3
- class EHMeasureSheet
4
- attr_reader :query_cache_document, :patient_cache_documents,
5
- :patient_updates
6
-
7
- def initialize(db, sheet, effective_date=nil)
8
- @db = db
9
- @sheet = sheet
10
- @effective_date = effective_date
11
- @patient_cache_documents = []
12
- @patient_updates = []
13
- end
14
-
15
- def parse
16
- qc_document = {}
17
- measure_info = extract_measure_info
18
- qc_document['population_ids'] = measure_info
19
- measure_doc = @db['measures'].where('population_ids' => measure_info).first
20
- measure_ids = measure_doc.slice('sub_id', 'nqf_id')
21
- measure_ids['measure_id'] = measure_doc['hqmf_id']
22
- qc_document.merge!(measure_ids)
23
- extract_patients(measure_ids)
24
-
25
- qc_document[QME::QualityReport::POPULATION] = extract_data_from_cell("C#{@population_totals_row}")
26
- qc_document[QME::QualityReport::CONSIDERED] = @population_totals_row - 3 # header row, blank row and totals row
27
- if cv_measure?
28
- qc_document[QME::QualityReport::MSRPOPL] = extract_data_from_cell("E#{@population_totals_row}")
29
- qc_document[QME::QualityReport::OBSERVATION] = extract_data_from_cell("F#{@population_totals_row}")
30
- else
31
- qc_document[QME::QualityReport::DENOMINATOR] = extract_data_from_cell("D#{@population_totals_row}")
32
- qc_document[QME::QualityReport::NUMERATOR] = extract_data_from_cell("E#{@population_totals_row}")
33
- qc_document[QME::QualityReport::ANTINUMERATOR] = qc_document[QME::QualityReport::DENOMINATOR] - qc_document[QME::QualityReport::NUMERATOR]
34
- qc_document[QME::QualityReport::EXCLUSIONS] = extract_data_from_cell("F#{@population_totals_row}")
35
- qc_document[QME::QualityReport::EXCEPTIONS] = extract_data_from_cell("G#{@population_totals_row}")
36
- end
37
-
38
- qc_document['test_id'] = nil
39
- qc_document['filters'] = nil
40
- qc_document['execution_time'] = 0
41
- qc_document['effective_date'] = @effective_date
42
-
43
- @query_cache_document = qc_document
44
- end
45
-
46
- def extract_patients(measure_ids)
47
- row = 2
48
- medical_record_number = extract_data_from_cell("B#{row}")
49
- while medical_record_number.present?
50
- patient_document = extract_patient(row, medical_record_number.to_s)
51
- patient_document.merge!(measure_ids)
52
- @patient_cache_documents << {'value' => patient_document}
53
- @patient_updates << {'medical_record_number' => medical_record_number.to_s,
54
- 'measure_id' => measure_ids['measure_id']}
55
- row = row + 1
56
- medical_record_number = extract_data_from_cell("B#{row}")
57
- end
58
-
59
- @population_totals_row = row + 1
60
- end
61
-
62
- def extract_measure_info
63
- measure_info = {}
64
- measure_info[QME::QualityReport::POPULATION] = extract_data_from_cell('I5')
65
- if cv_measure?
66
- measure_info[QME::QualityReport::MSRPOPL] = extract_data_from_cell('I10')
67
- measure_info[QME::QualityReport::OBSERVATION] = extract_data_from_cell('I11') if extract_data_from_cell('I11').present?
68
- measure_info['stratification'] = extract_data_from_cell('I12') if extract_data_from_cell('I12').present?
69
- else
70
- measure_info['DENOM'] = extract_data_from_cell('I6')
71
- measure_info['NUMER'] = extract_data_from_cell('I7')
72
- measure_info['DENEXCEP'] = extract_data_from_cell('I8') if extract_data_from_cell('I8').present?
73
- measure_info['DENEX'] = extract_data_from_cell('I9') if extract_data_from_cell('I9').present?
74
- measure_info['stratification'] = extract_data_from_cell('I12') if extract_data_from_cell('I12').present?
75
- end
76
-
77
- measure_info
78
- end
79
-
80
- def extract_patient(row, medical_record_number)
81
- record = @db['records'].where('medical_record_number' => medical_record_number).first
82
- patient_document = record.slice('first', 'last', 'gender', 'birthdate', 'race',
83
- 'ethnicity', 'languages')
84
- patient_document['medical_record_id'] = medical_record_number
85
- patient_document['patient_id'] = record['_id'].to_s
86
- patient_document[QME::QualityReport::POPULATION] = extract_data_from_cell("C#{row}") || 0
87
- if cv_measure?
88
- patient_document[QME::QualityReport::MSRPOPL] = extract_data_from_cell("E#{row}") || 0
89
- patient_document['values'] = [extract_data_from_cell("F#{row}")]
90
- else
91
- patient_document[QME::QualityReport::DENOMINATOR] = extract_data_from_cell("D#{row}") || 0
92
- patient_document[QME::QualityReport::NUMERATOR] = extract_data_from_cell("E#{row}") || 0
93
- patient_document[QME::QualityReport::EXCLUSIONS] = extract_data_from_cell("F#{row}") || 0
94
- patient_document[QME::QualityReport::EXCEPTIONS] = extract_data_from_cell("G#{row}") || 0
95
- patient_document[QME::QualityReport::ANTINUMERATOR] = patient_document[QME::QualityReport::DENOMINATOR] - patient_document[QME::QualityReport::NUMERATOR]
96
-
97
- end
98
- patient_document['test_id'] = nil
99
- patient_document['effective_date'] = @effective_date
100
-
101
- patient_document
102
- end
103
-
104
- def cv_measure?
105
- extract_data_from_cell('E1').eql?('MSRPOPL')
106
- end
107
-
108
- private
109
-
110
- def extract_data_from_cell(cell_name)
111
- row, column = RubyXL::Parser.convert_to_index(cell_name)
112
- @sheet.sheet_data[row][column].try(:value)
113
- end
114
- end
115
-
116
- end
117
- end
@@ -1,25 +0,0 @@
1
- module QME
2
- module Bundle
3
- class EHPatientImporter
4
- def self.load(db, spreadsheet, effective_date=nil)
5
- spreadsheet.worksheets.each do |worksheet|
6
- ms = EHMeasureSheet.new(db, worksheet, effective_date)
7
- ms.parse
8
- qc_document = ms.query_cache_document
9
- db['query_cache'].find({measure_id: qc_document['measure_id'], sub_id: qc_document['sub_id']}).remove
10
- db.command(getLastError: 1)
11
- db['query_cache'].insert(qc_document)
12
- ms.patient_cache_documents.each do |pcd|
13
- db['patient_cache'].find({'value.measure_id'=>pcd['value']['measure_id'], 'value.sub_id'=>pcd['value']['sub_id'],'value.medical_record_id'=>pcd['value']['medical_record_id']}).remove
14
- db.command(getLastError: 1)
15
- db['patient_cache'].insert(pcd)
16
- end
17
- ms.patient_updates.each do |patient_update|
18
- db['records'].find('medical_record_number' => patient_update['medical_record_number']).update(
19
- '$push' => {'measure_ids' => patient_update['measure_id']})
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,37 +0,0 @@
1
- require 'test_helper'
2
-
3
- class EHMeasureSheetTest < MiniTest::Unit::TestCase
4
- include QME::DatabaseAccess
5
-
6
- def setup
7
- collection_fixtures(get_db(), 'measures')
8
- collection_fixtures(get_db(), 'records', '_id')
9
- @workbook = RubyXL::Parser.parse(File.join('test', 'fixtures', 'eh_patient_sheets', 'results_matrix_eh.xlsx'))
10
- sheet = @workbook.worksheets[0]
11
- @ms = QME::Bundle::EHMeasureSheet.new(get_db(), sheet, 12345000)
12
- end
13
-
14
- def test_extract_measure_info
15
- measure_info = @ms.extract_measure_info
16
- assert_equal 'EDD90083-3417-4221-B3B9-52C4E5FAFAF4', measure_info['IPP']
17
- assert_equal '193A17EC-66B4-4C44-9302-192556C78454', measure_info['DENOM']
18
- end
19
-
20
- def test_query_cache_document
21
- @ms.parse
22
- qcd = @ms.query_cache_document
23
- assert_equal '0142', qcd['nqf_id']
24
- assert_equal 4, qcd[QME::QualityReport::POPULATION]
25
- assert_equal 12345000, qcd['effective_date']
26
- end
27
-
28
- def test_patient_cache_documents
29
- @ms.parse
30
- pcd = @ms.patient_cache_documents.first
31
- assert_equal 1, pcd['value'][QME::QualityReport::POPULATION]
32
- assert_equal 0, pcd['value'][QME::QualityReport::NUMERATOR]
33
- assert_equal 1, pcd['value'][QME::QualityReport::ANTINUMERATOR]
34
- assert_equal '1234', pcd['value']['medical_record_id']
35
- assert_equal 12345000, pcd['value']['effective_date']
36
- end
37
- end
@@ -1,20 +0,0 @@
1
- require 'test_helper'
2
-
3
- class EHPatientImporterTest < MiniTest::Unit::TestCase
4
- include QME::DatabaseAccess
5
-
6
- def setup
7
- get_db['query_cache'].drop()
8
- get_db['patient_cache'].drop()
9
- collection_fixtures(get_db(), 'measures')
10
- collection_fixtures(get_db(), 'records', '_id')
11
- @workbook = RubyXL::Parser.parse(File.join('test', 'fixtures', 'eh_patient_sheets', 'results_matrix_eh.xlsx'))
12
- end
13
-
14
- def test_load
15
- assert_equal 0, get_db['query_cache'].find().count
16
- QME::Bundle::EHPatientImporter.load(get_db, @workbook)
17
- assert_equal 3, get_db['query_cache'].find().count
18
- assert_equal 12, get_db['patient_cache'].find().count
19
- end
20
- end