quality-measure-engine 1.1.5 → 2.0.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/.gitignore +12 -0
- data/.travis.yml +16 -0
- data/Gemfile +5 -21
- data/Gemfile.lock +126 -0
- data/LICENSE.txt +13 -0
- data/README.md +23 -44
- data/Rakefile +6 -29
- data/lib/qme/bundle/bundle.rb +34 -0
- data/lib/qme/bundle/importer.rb +69 -0
- data/lib/qme/database_access.rb +7 -11
- data/lib/qme/map/map_reduce_builder.rb +4 -1
- data/lib/qme/map/map_reduce_executor.rb +55 -43
- data/lib/qme/map/measure_calculation_job.rb +24 -23
- data/lib/qme/quality_measure.rb +5 -5
- data/lib/qme/quality_report.rb +37 -19
- data/lib/qme/railtie.rb +7 -0
- data/lib/qme/tasks/bundle.rake +14 -0
- data/lib/qme/version.rb +3 -0
- data/lib/quality-measure-engine.rb +13 -25
- data/quality-measure-engine.gemspec +28 -0
- data/test/fixtures/bundles/just_measure_0002.zip +0 -0
- data/test/fixtures/delayed_backend_mongoid_jobs/queued_job.json +9 -0
- data/test/fixtures/measures/measure_metadata.json +52 -0
- data/test/fixtures/records/barry_berry.json +471 -0
- data/test/fixtures/records/billy_jones_ipp.json +78 -0
- data/test/fixtures/records/jane_jones_numerator.json +120 -0
- data/test/fixtures/records/jill_jones_denominator.json +78 -0
- data/test/simplecov_setup.rb +18 -0
- data/test/test_helper.rb +26 -0
- data/test/unit/qme/map/map_reduce_builder_test.rb +38 -0
- data/test/unit/qme/map/map_reduce_executor_test.rb +56 -0
- data/test/unit/qme/map/measure_calculation_job_test.rb +22 -0
- data/test/unit/qme/quality_measure_test.rb +14 -0
- data/{spec/qme/quality_report_spec.rb → test/unit/qme/quality_report_test.rb} +32 -20
- metadata +91 -115
- data/VERSION +0 -1
- data/js/map_reduce_utils.js +0 -173
- data/js/underscore_min.js +0 -25
- data/lib/qme/ext/record.rb +0 -43
- data/lib/qme/importer/entry.rb +0 -126
- data/lib/qme/importer/generic_importer.rb +0 -117
- data/lib/qme/importer/measure_properties_generator.rb +0 -39
- data/lib/qme/importer/property_matcher.rb +0 -110
- data/lib/qme/measure/database_loader.rb +0 -83
- data/lib/qme/measure/measure_loader.rb +0 -174
- data/lib/qme/measure/properties_builder.rb +0 -184
- data/lib/qme/measure/properties_converter.rb +0 -27
- data/lib/qme/randomizer/patient_randomization_job.rb +0 -47
- data/lib/qme/randomizer/patient_randomizer.rb +0 -250
- data/lib/qme/randomizer/random_patient_creator.rb +0 -47
- data/lib/qme_test.rb +0 -13
- data/lib/tasks/fixtures.rake +0 -91
- data/lib/tasks/measure.rake +0 -110
- data/lib/tasks/mongo.rake +0 -68
- data/lib/tasks/patient_random.rake +0 -45
- data/spec/qme/bundle_spec.rb +0 -37
- data/spec/qme/importer/generic_importer_spec.rb +0 -73
- data/spec/qme/importer/measure_properties_generator_spec.rb +0 -15
- data/spec/qme/importer/property_matcher_spec.rb +0 -174
- data/spec/qme/map/map_reduce_builder_spec.rb +0 -38
- data/spec/qme/map/measures_spec.rb +0 -38
- data/spec/qme/map/patient_mapper_spec.rb +0 -11
- data/spec/qme/measure_loader_spec.rb +0 -12
- data/spec/qme/properties_builder_spec.rb +0 -61
- data/spec/spec_helper.rb +0 -120
- data/spec/validate_measures_spec.rb +0 -21
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class QualityMeasureTest < MiniTest::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
importer = QME::Bundle::Importer.new
|
6
|
+
importer.import(File.new('test/fixtures/bundles/just_measure_0002.zip'), true)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_getting_all_measures
|
10
|
+
all_measures = QME::QualityMeasure.all
|
11
|
+
assert_equal 1, all_measures.size
|
12
|
+
assert all_measures["2E679CD2-3FEC-4A75-A75A-61403E5EFEE8.json"]
|
13
|
+
end
|
14
|
+
end
|
@@ -1,9 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class QualityReportTest < MiniTest::Unit::TestCase
|
4
|
+
include QME::DatabaseAccess
|
5
|
+
|
6
|
+
def setup
|
7
|
+
get_db()['query_cache'].drop()
|
8
|
+
get_db()['patient_cache'].drop()
|
9
|
+
get_db()['query_cache'].insert(
|
7
10
|
"measure_id" => "test2",
|
8
11
|
"sub_id" => "b",
|
9
12
|
"initialPopulation" => 4,
|
@@ -12,7 +15,7 @@ describe QME::QualityReport do
|
|
12
15
|
"exclusions" => 1,
|
13
16
|
"effective_date" => Time.gm(2010, 9, 19).to_i
|
14
17
|
)
|
15
|
-
|
18
|
+
get_db()['patient_cache'].insert(
|
16
19
|
"value" => {
|
17
20
|
"population" => false,
|
18
21
|
"denominator" => false,
|
@@ -40,35 +43,44 @@ describe QME::QualityReport do
|
|
40
43
|
}
|
41
44
|
)
|
42
45
|
end
|
43
|
-
|
44
|
-
|
46
|
+
|
47
|
+
def test_calculated
|
45
48
|
qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
|
46
|
-
qr.calculated
|
49
|
+
assert qr.calculated?
|
47
50
|
|
48
51
|
qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 20).to_i)
|
49
|
-
qr.calculated
|
52
|
+
assert !qr.calculated?
|
50
53
|
end
|
51
54
|
|
52
|
-
|
55
|
+
def test_result
|
53
56
|
qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
|
54
57
|
result = qr.result
|
55
58
|
|
56
|
-
result['numerator']
|
59
|
+
assert_equal 1, result['numerator']
|
57
60
|
end
|
58
61
|
|
59
|
-
|
62
|
+
def test_destroy_all
|
60
63
|
QME::QualityReport.destroy_all
|
61
64
|
|
62
65
|
qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
|
63
|
-
qr.calculated
|
66
|
+
assert !qr.calculated?
|
64
67
|
end
|
65
68
|
|
66
|
-
|
69
|
+
def test_update_patient_results
|
67
70
|
qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
|
68
|
-
qr.calculated
|
69
|
-
qr.patients_cached
|
71
|
+
assert qr.calculated?
|
72
|
+
assert qr.patients_cached?
|
70
73
|
QME::QualityReport.update_patient_results("0616911582")
|
71
|
-
qr.calculated
|
72
|
-
qr.patients_cached
|
74
|
+
assert !qr.calculated?
|
75
|
+
assert !qr.patients_cached?
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_status
|
79
|
+
qr = QME::QualityReport.new('test2', 'b', "effective_date" => Time.gm(2010, 9, 19).to_i)
|
80
|
+
status = qr.status('not really a job id')
|
81
|
+
assert_equal :complete, status
|
82
|
+
status = qr.status("508aeff07042f9f88900000d")
|
83
|
+
assert_equal :queued, status
|
73
84
|
end
|
85
|
+
|
74
86
|
end
|
metadata
CHANGED
@@ -1,211 +1,173 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quality-measure-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Marc Hadley
|
9
9
|
- Andy Gregorowicz
|
10
10
|
- Rob Dingwell
|
11
|
+
- Adam Goldstein
|
11
12
|
autorequire:
|
12
13
|
bindir: bin
|
13
14
|
cert_chain: []
|
14
|
-
date: 2012-
|
15
|
+
date: 2012-10-31 00:00:00.000000000 Z
|
15
16
|
dependencies:
|
16
17
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
18
|
-
requirement:
|
18
|
+
name: moped
|
19
|
+
requirement: !ruby/object:Gem::Requirement
|
19
20
|
none: false
|
20
21
|
requirements:
|
21
22
|
- - ~>
|
22
23
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
24
|
+
version: 1.2.7
|
24
25
|
type: :runtime
|
25
26
|
prerelease: false
|
26
|
-
version_requirements:
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rubyzip
|
29
|
-
requirement: &2153470520 !ruby/object:Gem::Requirement
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
29
|
requirements:
|
32
30
|
- - ~>
|
33
31
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
35
|
-
type: :runtime
|
36
|
-
prerelease: false
|
37
|
-
version_requirements: *2153470520
|
32
|
+
version: 1.2.7
|
38
33
|
- !ruby/object:Gem::Dependency
|
39
|
-
name:
|
40
|
-
requirement:
|
34
|
+
name: mongoid
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
41
36
|
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: 3.0.9
|
46
41
|
type: :runtime
|
47
42
|
prerelease: false
|
48
|
-
version_requirements:
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: resque
|
51
|
-
requirement: &2153469500 !ruby/object:Gem::Requirement
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
44
|
none: false
|
53
45
|
requirements:
|
54
46
|
- - ~>
|
55
47
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
57
|
-
type: :runtime
|
58
|
-
prerelease: false
|
59
|
-
version_requirements: *2153469500
|
48
|
+
version: 3.0.9
|
60
49
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
62
|
-
requirement:
|
50
|
+
name: rubyzip
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
63
52
|
none: false
|
64
53
|
requirements:
|
65
54
|
- - ~>
|
66
55
|
- !ruby/object:Gem::Version
|
67
|
-
version:
|
56
|
+
version: 0.9.9
|
68
57
|
type: :runtime
|
69
58
|
prerelease: false
|
70
|
-
version_requirements:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ~>
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 0.9.9
|
71
65
|
- !ruby/object:Gem::Dependency
|
72
|
-
name:
|
73
|
-
requirement:
|
66
|
+
name: delayed_job_mongoid
|
67
|
+
requirement: !ruby/object:Gem::Requirement
|
74
68
|
none: false
|
75
69
|
requirements:
|
76
70
|
- - ~>
|
77
71
|
- !ruby/object:Gem::Version
|
78
|
-
version: 0.
|
72
|
+
version: 2.0.0
|
79
73
|
type: :runtime
|
80
74
|
prerelease: false
|
81
|
-
version_requirements:
|
82
|
-
- !ruby/object:Gem::Dependency
|
83
|
-
name: jsonschema
|
84
|
-
requirement: &2153461740 !ruby/object:Gem::Requirement
|
75
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
76
|
none: false
|
86
77
|
requirements:
|
87
78
|
- - ~>
|
88
79
|
- !ruby/object:Gem::Version
|
89
80
|
version: 2.0.0
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: *2153461740
|
93
81
|
- !ruby/object:Gem::Dependency
|
94
|
-
name:
|
95
|
-
requirement:
|
82
|
+
name: minitest
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
96
84
|
none: false
|
97
85
|
requirements:
|
98
86
|
- - ~>
|
99
87
|
- !ruby/object:Gem::Version
|
100
|
-
version:
|
88
|
+
version: 4.1.0
|
101
89
|
type: :development
|
102
90
|
prerelease: false
|
103
|
-
version_requirements:
|
104
|
-
- !ruby/object:Gem::Dependency
|
105
|
-
name: awesome_print
|
106
|
-
requirement: &2153459880 !ruby/object:Gem::Requirement
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
92
|
none: false
|
108
93
|
requirements:
|
109
94
|
- - ~>
|
110
95
|
- !ruby/object:Gem::Version
|
111
|
-
version:
|
112
|
-
type: :development
|
113
|
-
prerelease: false
|
114
|
-
version_requirements: *2153459880
|
96
|
+
version: 4.1.0
|
115
97
|
- !ruby/object:Gem::Dependency
|
116
|
-
name:
|
117
|
-
requirement:
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
118
100
|
none: false
|
119
101
|
requirements:
|
120
102
|
- - ~>
|
121
103
|
- !ruby/object:Gem::Version
|
122
|
-
version:
|
104
|
+
version: 0.7.1
|
123
105
|
type: :development
|
124
106
|
prerelease: false
|
125
|
-
version_requirements:
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: builder
|
128
|
-
requirement: &2153456780 !ruby/object:Gem::Requirement
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
129
108
|
none: false
|
130
109
|
requirements:
|
131
110
|
- - ~>
|
132
111
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: *2153456780
|
112
|
+
version: 0.7.1
|
137
113
|
- !ruby/object:Gem::Dependency
|
138
|
-
name:
|
139
|
-
requirement:
|
114
|
+
name: rails
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
140
116
|
none: false
|
141
117
|
requirements:
|
142
118
|
- - ~>
|
143
119
|
- !ruby/object:Gem::Version
|
144
|
-
version:
|
120
|
+
version: 3.2.8
|
145
121
|
type: :development
|
146
122
|
prerelease: false
|
147
|
-
version_requirements:
|
148
|
-
- !ruby/object:Gem::Dependency
|
149
|
-
name: google-spreadsheet-ruby
|
150
|
-
requirement: &2153410360 !ruby/object:Gem::Requirement
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
151
124
|
none: false
|
152
125
|
requirements:
|
153
126
|
- - ~>
|
154
127
|
- !ruby/object:Gem::Version
|
155
|
-
version:
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
description: A library for extracting quality measure information from HITSP C32's
|
160
|
-
and ASTM CCR's
|
161
|
-
email: talk@projectpophealth.org
|
128
|
+
version: 3.2.8
|
129
|
+
description: A library for running clinical quality measures
|
130
|
+
email:
|
131
|
+
- talk@projectpophealth.org
|
162
132
|
executables: []
|
163
133
|
extensions: []
|
164
134
|
extra_rdoc_files: []
|
165
135
|
files:
|
136
|
+
- .gitignore
|
137
|
+
- .travis.yml
|
138
|
+
- Gemfile
|
139
|
+
- Gemfile.lock
|
140
|
+
- LICENSE.txt
|
141
|
+
- README.md
|
142
|
+
- Rakefile
|
143
|
+
- lib/qme/bundle/bundle.rb
|
144
|
+
- lib/qme/bundle/importer.rb
|
166
145
|
- lib/qme/database_access.rb
|
167
|
-
- lib/qme/ext/record.rb
|
168
|
-
- lib/qme/importer/entry.rb
|
169
|
-
- lib/qme/importer/generic_importer.rb
|
170
|
-
- lib/qme/importer/measure_properties_generator.rb
|
171
|
-
- lib/qme/importer/property_matcher.rb
|
172
146
|
- lib/qme/map/map_reduce_builder.rb
|
173
147
|
- lib/qme/map/map_reduce_executor.rb
|
174
148
|
- lib/qme/map/measure_calculation_job.rb
|
175
|
-
- lib/qme/measure/database_loader.rb
|
176
|
-
- lib/qme/measure/measure_loader.rb
|
177
|
-
- lib/qme/measure/properties_builder.rb
|
178
|
-
- lib/qme/measure/properties_converter.rb
|
179
149
|
- lib/qme/quality_measure.rb
|
180
150
|
- lib/qme/quality_report.rb
|
181
|
-
- lib/qme/
|
182
|
-
- lib/qme/
|
183
|
-
- lib/qme/
|
184
|
-
- lib/qme_test.rb
|
151
|
+
- lib/qme/railtie.rb
|
152
|
+
- lib/qme/tasks/bundle.rake
|
153
|
+
- lib/qme/version.rb
|
185
154
|
- lib/quality-measure-engine.rb
|
186
|
-
-
|
187
|
-
-
|
188
|
-
-
|
189
|
-
-
|
190
|
-
-
|
191
|
-
-
|
192
|
-
-
|
193
|
-
-
|
194
|
-
-
|
195
|
-
-
|
196
|
-
-
|
197
|
-
-
|
198
|
-
-
|
199
|
-
-
|
200
|
-
-
|
201
|
-
|
202
|
-
- spec/spec_helper.rb
|
203
|
-
- spec/validate_measures_spec.rb
|
204
|
-
- Gemfile
|
205
|
-
- README.md
|
206
|
-
- Rakefile
|
207
|
-
- VERSION
|
208
|
-
homepage: http://github.com/pophealth/quality-measure-engine
|
155
|
+
- quality-measure-engine.gemspec
|
156
|
+
- test/fixtures/bundles/just_measure_0002.zip
|
157
|
+
- test/fixtures/delayed_backend_mongoid_jobs/queued_job.json
|
158
|
+
- test/fixtures/measures/measure_metadata.json
|
159
|
+
- test/fixtures/records/barry_berry.json
|
160
|
+
- test/fixtures/records/billy_jones_ipp.json
|
161
|
+
- test/fixtures/records/jane_jones_numerator.json
|
162
|
+
- test/fixtures/records/jill_jones_denominator.json
|
163
|
+
- test/simplecov_setup.rb
|
164
|
+
- test/test_helper.rb
|
165
|
+
- test/unit/qme/map/map_reduce_builder_test.rb
|
166
|
+
- test/unit/qme/map/map_reduce_executor_test.rb
|
167
|
+
- test/unit/qme/map/measure_calculation_job_test.rb
|
168
|
+
- test/unit/qme/quality_measure_test.rb
|
169
|
+
- test/unit/qme/quality_report_test.rb
|
170
|
+
homepage: http://www.projectpophealth.org
|
209
171
|
licenses: []
|
210
172
|
post_install_message:
|
211
173
|
rdoc_options: []
|
@@ -225,10 +187,24 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
187
|
version: '0'
|
226
188
|
requirements: []
|
227
189
|
rubyforge_project:
|
228
|
-
rubygems_version: 1.8.
|
190
|
+
rubygems_version: 1.8.24
|
229
191
|
signing_key:
|
230
192
|
specification_version: 3
|
231
|
-
summary:
|
232
|
-
|
233
|
-
test_files:
|
193
|
+
summary: This library can run JavaScript based clinical quality measures on a repository
|
194
|
+
of patients stored in MongoDB
|
195
|
+
test_files:
|
196
|
+
- test/fixtures/bundles/just_measure_0002.zip
|
197
|
+
- test/fixtures/delayed_backend_mongoid_jobs/queued_job.json
|
198
|
+
- test/fixtures/measures/measure_metadata.json
|
199
|
+
- test/fixtures/records/barry_berry.json
|
200
|
+
- test/fixtures/records/billy_jones_ipp.json
|
201
|
+
- test/fixtures/records/jane_jones_numerator.json
|
202
|
+
- test/fixtures/records/jill_jones_denominator.json
|
203
|
+
- test/simplecov_setup.rb
|
204
|
+
- test/test_helper.rb
|
205
|
+
- test/unit/qme/map/map_reduce_builder_test.rb
|
206
|
+
- test/unit/qme/map/map_reduce_executor_test.rb
|
207
|
+
- test/unit/qme/map/measure_calculation_job_test.rb
|
208
|
+
- test/unit/qme/quality_measure_test.rb
|
209
|
+
- test/unit/qme/quality_report_test.rb
|
234
210
|
has_rdoc:
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.1.0
|
data/js/map_reduce_utils.js
DELETED
@@ -1,173 +0,0 @@
|
|
1
|
-
function() {
|
2
|
-
// Adds common utility functions to the root JS object. These are then
|
3
|
-
// available for use by the map-reduce functions for each measure.
|
4
|
-
// lib/qme/mongo_helpers.rb executes this function on a database
|
5
|
-
// connection.
|
6
|
-
|
7
|
-
var root = this;
|
8
|
-
|
9
|
-
// Takes an arbitrary number of arrays and single values and returns a flattened
|
10
|
-
// array of all of the elements with any null values removed. For efficiency, if
|
11
|
-
// called with just a single array then it simply returns that array
|
12
|
-
root.normalize = function() {
|
13
|
-
if (arguments.length==1 && _.isArray(arguments[0]))
|
14
|
-
return arguments[0];
|
15
|
-
return _.compact(_.flatten(arguments));
|
16
|
-
}
|
17
|
-
|
18
|
-
// returns the number of values which fall between the supplied limits
|
19
|
-
// value may be a number or an array of numbers
|
20
|
-
root.inRange = function(value, min, max) {
|
21
|
-
value = normalize(value);
|
22
|
-
var count = 0;
|
23
|
-
for (i=0;i<value.length;i++) {
|
24
|
-
if ((value[i]>=min) && (value[i]<=max))
|
25
|
-
count++;
|
26
|
-
}
|
27
|
-
return count;
|
28
|
-
};
|
29
|
-
|
30
|
-
// returns the largest member of value that is within the supplied range
|
31
|
-
root.maxInRange = function(value, min, max) {
|
32
|
-
value = normalize(value);
|
33
|
-
var allInRange = _.select(value, function(v) {return v>=min && v<=max;});
|
34
|
-
return _.max(allInRange);
|
35
|
-
}
|
36
|
-
|
37
|
-
// returns the number of values which are less than the supplied limit
|
38
|
-
// value may be a number or an array of numbers
|
39
|
-
root.lessThan = function(value, max) {
|
40
|
-
value = normalize(value);
|
41
|
-
var matching = _.select(value, function(v) {return v<=max;});
|
42
|
-
return matching.length;
|
43
|
-
};
|
44
|
-
|
45
|
-
// Returns true if any conditions[i].end is within the specified period,
|
46
|
-
// false otherwise
|
47
|
-
root.conditionResolved = function(conditions, startDate, endDate) {
|
48
|
-
conditions = normalize(conditions);
|
49
|
-
var resolvedWithinPeriod = function(condition) {
|
50
|
-
return (condition.end>=startDate && condition.end<=endDate);
|
51
|
-
};
|
52
|
-
return _.any(conditions, resolvedWithinPeriod);
|
53
|
-
};
|
54
|
-
|
55
|
-
// Returns the minimum of readings[i].value where readings[i].date is in
|
56
|
-
// the supplied startDate and endDate. If no reading meet this criteria,
|
57
|
-
// returns defaultValue.
|
58
|
-
root.minValueInDateRange = function(readings, startDate, endDate, defaultValue) {
|
59
|
-
readings = normalize(readings);
|
60
|
-
|
61
|
-
var readingInDateRange = function(reading) {
|
62
|
-
return (reading.date>=startDate && reading.date<=endDate);
|
63
|
-
};
|
64
|
-
|
65
|
-
var allInDateRange = _.select(readings, readingInDateRange);
|
66
|
-
if (allInDateRange.length==0)
|
67
|
-
return defaultValue;
|
68
|
-
var min = _.min(allInDateRange, function(reading) {return reading.value;});
|
69
|
-
if (min==undefined)
|
70
|
-
return defaultValue;
|
71
|
-
return min.value;
|
72
|
-
};
|
73
|
-
|
74
|
-
// Returns the most recent readings[i].value where readings[i].date is in
|
75
|
-
// the supplied startDate and endDate. If no reading meet this criteria,
|
76
|
-
// returns defaultValue.
|
77
|
-
root.latestValueInDateRange = function(readings, startDate, endDate, defaultValue) {
|
78
|
-
readings = normalize(readings);
|
79
|
-
|
80
|
-
var readingInDateRange = function(reading) {
|
81
|
-
return (reading.date>=startDate && reading.date<=endDate);
|
82
|
-
};
|
83
|
-
|
84
|
-
var allInDateRange = _.select(readings, readingInDateRange);
|
85
|
-
if (allInDateRange.length==0)
|
86
|
-
return defaultValue;
|
87
|
-
var latest = _.max(allInDateRange, function(reading) {return reading.date;});
|
88
|
-
if (latest==undefined)
|
89
|
-
return defaultValue;
|
90
|
-
return latest.value;
|
91
|
-
};
|
92
|
-
|
93
|
-
// Returns the number of actions that occur within the specified time period of
|
94
|
-
// something. The first two arguments are arrays or single-valued time stamps in
|
95
|
-
// seconds-since-the-epoch, timePeriod is in seconds.
|
96
|
-
root.actionFollowingSomething = function(something, action, timePeriod) {
|
97
|
-
something = normalize(something);
|
98
|
-
action = normalize(action);
|
99
|
-
if (timePeriod===undefined)
|
100
|
-
timePeriod=Infinity;
|
101
|
-
|
102
|
-
var result = 0;
|
103
|
-
for (i=0; i<something.length; i++) {
|
104
|
-
var timeStamp = something[i];
|
105
|
-
for (j=0; j<action.length;j++) {
|
106
|
-
if (action[j]>=timeStamp && (action[j] <= (timeStamp+timePeriod)))
|
107
|
-
result++;
|
108
|
-
}
|
109
|
-
}
|
110
|
-
|
111
|
-
return result;
|
112
|
-
}
|
113
|
-
|
114
|
-
// Returns all members of the values array that fall between min and max inclusive
|
115
|
-
root.selectWithinRange = function(values, min, max) {
|
116
|
-
values = normalize(values);
|
117
|
-
return _.select(values, function(value) { return value<=max && value>=min; });
|
118
|
-
}
|
119
|
-
|
120
|
-
// calculates the earliest birthdate for a maximum age given a target date.
|
121
|
-
// calculation is inclusive of the full year for the target age
|
122
|
-
// returns: (earliest birthdate that will reach by not exceed the age by the target date)
|
123
|
-
// age: integer in years
|
124
|
-
// effective_date: end of the measurement period, in seconds
|
125
|
-
root.earliestBirthdayForThisAge = function(age, effective_date) {
|
126
|
-
return calculateDateForAge(age, effective_date, true);
|
127
|
-
}
|
128
|
-
// calculates the latest birthdate for a minimum age given a target date
|
129
|
-
// returns: (latest birthdate that will reach the age by the target date)
|
130
|
-
// age: integer in years
|
131
|
-
// effective_date: end of the measurement period, in seconds
|
132
|
-
root.latestBirthdayForThisAge = function(age, effective_date) {
|
133
|
-
return calculateDateForAge(age, effective_date, false);
|
134
|
-
}
|
135
|
-
// returns birth date for an age value given a specific date
|
136
|
-
// age: integer in years
|
137
|
-
// effective_date: end of the measurement period, in seconds
|
138
|
-
// is_inclusive: boolean for including or excluding age
|
139
|
-
root.calculateDateForAge = function(age, effective_date, is_inclusive) {
|
140
|
-
var earliest_birthdate = new Date(effective_date*1000);
|
141
|
-
var difference = age;
|
142
|
-
if (is_inclusive) difference += 1;
|
143
|
-
earliest_birthdate.setFullYear(earliest_birthdate.getFullYear()-difference);
|
144
|
-
return earliest_birthdate.getTime()/1000;
|
145
|
-
}
|
146
|
-
|
147
|
-
|
148
|
-
root.map = function(record, population, denominator, numerator, exclusion) {
|
149
|
-
var value = {population: false, denominator: false, numerator: false,
|
150
|
-
exclusions: false, antinumerator: false, patient_id: record._id,
|
151
|
-
medical_record_id: record.medical_record_number,
|
152
|
-
first: record.first, last: record.last, gender: record.gender,
|
153
|
-
birthdate: record.birthdate, test_id: record.test_id,
|
154
|
-
provider_performances: record.provider_performances,
|
155
|
-
race: record.race, ethnicity: record.ethnicity, languages: record.languages};
|
156
|
-
if (population()) {
|
157
|
-
value.population = true;
|
158
|
-
if (denominator()) {
|
159
|
-
value.denominator = true;
|
160
|
-
if (numerator()) {
|
161
|
-
value.numerator = true;
|
162
|
-
} else if (exclusion()) {
|
163
|
-
value.exclusions = true;
|
164
|
-
value.denominator = false;
|
165
|
-
} else {
|
166
|
-
value.antinumerator = true;
|
167
|
-
}
|
168
|
-
}
|
169
|
-
}
|
170
|
-
emit(ObjectId(), value);
|
171
|
-
};
|
172
|
-
|
173
|
-
}
|