quality-measure-engine 1.1.5 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
}
|