quality-measure-engine 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -1
- data/Gemfile.lock +0 -6
- data/Rakefile +32 -2
- data/VERSION +1 -1
- data/lib/qme/query/json_document_builder.rb +9 -3
- data/lib/qme/query/json_query_executor.rb +44 -0
- data/lib/{quality_measure_engine.rb → quality-measure-engine.rb} +1 -1
- data/measures/0032/0032_NQF_Cervical_Cancer_Screening.json +4 -4
- data/quality-measure-engine.gemspec +4 -9
- data/spec/spec_helper.rb +1 -1
- metadata +15 -44
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
activesupport (3.0.1)
|
5
4
|
awesome_print (0.2.1)
|
6
5
|
bson (1.1)
|
7
6
|
bson_ext (1.1.1)
|
@@ -16,10 +15,6 @@ GEM
|
|
16
15
|
jsonschema (2.0.0)
|
17
16
|
mongo (1.1)
|
18
17
|
bson (>= 1.0.5)
|
19
|
-
mongomatic (0.5.8)
|
20
|
-
activesupport (>= 2.3.5)
|
21
|
-
bson (= 1.1)
|
22
|
-
mongo (= 1.1)
|
23
18
|
rake (0.8.7)
|
24
19
|
rspec (2.0.0)
|
25
20
|
rspec-core (= 2.0.0)
|
@@ -44,7 +39,6 @@ DEPENDENCIES
|
|
44
39
|
jeweler
|
45
40
|
jsonschema
|
46
41
|
mongo
|
47
|
-
mongomatic
|
48
42
|
rake
|
49
43
|
rspec
|
50
44
|
therubyracer
|
data/Rakefile
CHANGED
@@ -15,12 +15,42 @@ Jeweler::Tasks.new do |gem|
|
|
15
15
|
gem.authors = ["Marc Hadley", "Andy Gregorowicz"]
|
16
16
|
|
17
17
|
gem.add_dependency 'mongo', '~> 1.1'
|
18
|
-
gem.add_dependency 'mongomatic', '~> 0.5.8'
|
19
18
|
gem.add_dependency 'therubyracer', '~> 0.7.5'
|
20
|
-
gem.add_dependency 'bson_ext', '~> 1.1.1'
|
21
19
|
|
22
20
|
gem.add_development_dependency "jsonschema", "~> 2.0.0"
|
23
21
|
gem.add_development_dependency "rspec", "~> 2.0.0"
|
24
22
|
gem.add_development_dependency "awesome_print", "~> 0.2.1"
|
25
23
|
gem.add_development_dependency "jeweler", "~> 1.4.0"
|
26
24
|
end
|
25
|
+
|
26
|
+
desc 'Load all the measures and sample patient files into the database'
|
27
|
+
task :loaddb do
|
28
|
+
require './spec/spec_helper'
|
29
|
+
db_host = nil
|
30
|
+
if ENV['TEST_DB_HOST']
|
31
|
+
db_host = ENV['TEST_DB_HOST']
|
32
|
+
else
|
33
|
+
db_host = 'localhost'
|
34
|
+
end
|
35
|
+
db = Mongo::Connection.new(db_host, 27017).db('test')
|
36
|
+
|
37
|
+
db.drop_collection('measures')
|
38
|
+
db.drop_collection('records')
|
39
|
+
|
40
|
+
measures = Dir.glob('measures/*')
|
41
|
+
measures.each do |dir|
|
42
|
+
# load db with measure and sample patient records
|
43
|
+
files = Dir.glob(File.join(dir,'*.json'))
|
44
|
+
measure_file = files[0]
|
45
|
+
patient_files = Dir.glob(File.join(dir, 'patients', '*.json'))
|
46
|
+
measure = JSON.parse(File.read(measure_file))
|
47
|
+
measure_id = measure['id']
|
48
|
+
measure_collection = db.create_collection('measures')
|
49
|
+
record_collection = db.create_collection('records')
|
50
|
+
measure_collection.save(measure)
|
51
|
+
patient_files.each do |patient_file|
|
52
|
+
patient = JSON.parse(File.read(patient_file))
|
53
|
+
record_collection.save(patient)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
@@ -18,14 +18,16 @@ module QME
|
|
18
18
|
# Calculates all dates necessary to create a query for this measure
|
19
19
|
# This will be run by the constructor if params were passed in
|
20
20
|
def calculate_dates
|
21
|
-
|
21
|
+
@calculated_dates = {}
|
22
|
+
|
23
|
+
ctx = V8::Context.new
|
22
24
|
@parameters.each_pair do |key, value|
|
23
25
|
ctx[key] = value
|
26
|
+
@calculated_dates[key] = value
|
24
27
|
end
|
25
28
|
|
26
29
|
ctx['year'] = 365 * 24 * 60 * 60 # TODO: Replace this with a js file that has all constants
|
27
30
|
|
28
|
-
@calculated_dates = {}
|
29
31
|
@measure_json["calculated_dates"].each_pair do |key, value|
|
30
32
|
@calculated_dates[key] = ctx.eval(value)
|
31
33
|
end
|
@@ -61,7 +63,11 @@ module QME
|
|
61
63
|
definition_json['or'].each do |operand|
|
62
64
|
operands << create_query(operand)
|
63
65
|
end
|
64
|
-
args['$or']
|
66
|
+
if args['$or']
|
67
|
+
args['$ne'] = {'$or' => operands}
|
68
|
+
else
|
69
|
+
args['$or'] = operands
|
70
|
+
end
|
65
71
|
elsif definition_json.has_key?('query')
|
66
72
|
process_query(definition_json['query'], args)
|
67
73
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module QME
|
2
|
+
module Query
|
3
|
+
class JsonQueryExecutor
|
4
|
+
def initialize(db)
|
5
|
+
@db = db
|
6
|
+
end
|
7
|
+
|
8
|
+
def measure_def(measure_id)
|
9
|
+
measures = @db.collection('measures')
|
10
|
+
measures.find({'id'=> "#{measure_id}"}).to_a[0]
|
11
|
+
end
|
12
|
+
|
13
|
+
def measure_result(measure_id, parameter_values)
|
14
|
+
jdb = JSONDocumentBuilder.new(measure_def(measure_id),
|
15
|
+
parameter_values)
|
16
|
+
|
17
|
+
collection = @db.collection('records')
|
18
|
+
result = {}
|
19
|
+
|
20
|
+
collection.find(jdb.numerator_query) do |cursor|
|
21
|
+
result[:numerator] = cursor.count
|
22
|
+
end
|
23
|
+
|
24
|
+
collection.find(jdb.denominator_query) do |cursor|
|
25
|
+
result[:denominator] = cursor.count
|
26
|
+
end
|
27
|
+
collection.find(jdb.initial_population_query) do |cursor|
|
28
|
+
result[:population] = cursor.count
|
29
|
+
end
|
30
|
+
|
31
|
+
exclusions_query = jdb.exclusions_query
|
32
|
+
if exclusions_query.empty?
|
33
|
+
result[:exceptions] = 0
|
34
|
+
else
|
35
|
+
collection.find(exclusions_query) do |cursor|
|
36
|
+
result[:exceptions] = cursor.count
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
result
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -149,8 +149,8 @@
|
|
149
149
|
{
|
150
150
|
"or": [
|
151
151
|
{
|
152
|
-
"category": "Procedure performed",
|
153
|
-
"title": "
|
152
|
+
"category": "Procedure not performed",
|
153
|
+
"title": "Hysterectomy",
|
154
154
|
"query": {"hysterectomy": null}
|
155
155
|
},
|
156
156
|
{
|
@@ -163,8 +163,8 @@
|
|
163
163
|
]
|
164
164
|
},
|
165
165
|
"numerator": {
|
166
|
-
"category": "
|
167
|
-
"title": "
|
166
|
+
"category": "Laboratory test result",
|
167
|
+
"title": "Pap test",
|
168
168
|
"query": {"pap_test": {"_gte": "@earliest_pap"}}
|
169
169
|
},
|
170
170
|
"exception": {}
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{quality-measure-engine}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Marc Hadley", "Andy Gregorowicz"]
|
12
|
-
s.date = %q{2010-10-
|
12
|
+
s.date = %q{2010-10-29}
|
13
13
|
s.description = %q{A library for extracting quality measure information from HITSP C32's and ASTM CCR's}
|
14
14
|
s.email = %q{talk@projectpophealth.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,7 +28,8 @@ Gem::Specification.new do |s|
|
|
28
28
|
"lib/qme/map/map_reduce_builder.rb",
|
29
29
|
"lib/qme/map/map_reduce_executor.rb",
|
30
30
|
"lib/qme/query/json_document_builder.rb",
|
31
|
-
"lib/
|
31
|
+
"lib/qme/query/json_query_executor.rb",
|
32
|
+
"lib/quality-measure-engine.rb",
|
32
33
|
"measures/0032/0032_NQF_Cervical_Cancer_Screening.json",
|
33
34
|
"measures/0032/patients/denominator1.json",
|
34
35
|
"measures/0032/patients/denominator2.json",
|
@@ -71,18 +72,14 @@ Gem::Specification.new do |s|
|
|
71
72
|
|
72
73
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
73
74
|
s.add_runtime_dependency(%q<mongo>, ["~> 1.1"])
|
74
|
-
s.add_runtime_dependency(%q<mongomatic>, ["~> 0.5.8"])
|
75
75
|
s.add_runtime_dependency(%q<therubyracer>, ["~> 0.7.5"])
|
76
|
-
s.add_runtime_dependency(%q<bson_ext>, ["~> 1.1.1"])
|
77
76
|
s.add_development_dependency(%q<jsonschema>, ["~> 2.0.0"])
|
78
77
|
s.add_development_dependency(%q<rspec>, ["~> 2.0.0"])
|
79
78
|
s.add_development_dependency(%q<awesome_print>, ["~> 0.2.1"])
|
80
79
|
s.add_development_dependency(%q<jeweler>, ["~> 1.4.0"])
|
81
80
|
else
|
82
81
|
s.add_dependency(%q<mongo>, ["~> 1.1"])
|
83
|
-
s.add_dependency(%q<mongomatic>, ["~> 0.5.8"])
|
84
82
|
s.add_dependency(%q<therubyracer>, ["~> 0.7.5"])
|
85
|
-
s.add_dependency(%q<bson_ext>, ["~> 1.1.1"])
|
86
83
|
s.add_dependency(%q<jsonschema>, ["~> 2.0.0"])
|
87
84
|
s.add_dependency(%q<rspec>, ["~> 2.0.0"])
|
88
85
|
s.add_dependency(%q<awesome_print>, ["~> 0.2.1"])
|
@@ -90,9 +87,7 @@ Gem::Specification.new do |s|
|
|
90
87
|
end
|
91
88
|
else
|
92
89
|
s.add_dependency(%q<mongo>, ["~> 1.1"])
|
93
|
-
s.add_dependency(%q<mongomatic>, ["~> 0.5.8"])
|
94
90
|
s.add_dependency(%q<therubyracer>, ["~> 0.7.5"])
|
95
|
-
s.add_dependency(%q<bson_ext>, ["~> 1.1.1"])
|
96
91
|
s.add_dependency(%q<jsonschema>, ["~> 2.0.0"])
|
97
92
|
s.add_dependency(%q<rspec>, ["~> 2.0.0"])
|
98
93
|
s.add_dependency(%q<awesome_print>, ["~> 0.2.1"])
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Marc Hadley
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-29 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -32,25 +32,10 @@ dependencies:
|
|
32
32
|
version: "1.1"
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: mongomatic
|
37
|
-
prerelease: false
|
38
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
- 5
|
46
|
-
- 8
|
47
|
-
version: 0.5.8
|
48
|
-
type: :runtime
|
49
|
-
version_requirements: *id002
|
50
35
|
- !ruby/object:Gem::Dependency
|
51
36
|
name: therubyracer
|
52
37
|
prerelease: false
|
53
|
-
requirement: &
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
54
39
|
none: false
|
55
40
|
requirements:
|
56
41
|
- - ~>
|
@@ -61,26 +46,11 @@ dependencies:
|
|
61
46
|
- 5
|
62
47
|
version: 0.7.5
|
63
48
|
type: :runtime
|
64
|
-
version_requirements: *
|
65
|
-
- !ruby/object:Gem::Dependency
|
66
|
-
name: bson_ext
|
67
|
-
prerelease: false
|
68
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
|
-
requirements:
|
71
|
-
- - ~>
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
segments:
|
74
|
-
- 1
|
75
|
-
- 1
|
76
|
-
- 1
|
77
|
-
version: 1.1.1
|
78
|
-
type: :runtime
|
79
|
-
version_requirements: *id004
|
49
|
+
version_requirements: *id002
|
80
50
|
- !ruby/object:Gem::Dependency
|
81
51
|
name: jsonschema
|
82
52
|
prerelease: false
|
83
|
-
requirement: &
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
84
54
|
none: false
|
85
55
|
requirements:
|
86
56
|
- - ~>
|
@@ -91,11 +61,11 @@ dependencies:
|
|
91
61
|
- 0
|
92
62
|
version: 2.0.0
|
93
63
|
type: :development
|
94
|
-
version_requirements: *
|
64
|
+
version_requirements: *id003
|
95
65
|
- !ruby/object:Gem::Dependency
|
96
66
|
name: rspec
|
97
67
|
prerelease: false
|
98
|
-
requirement: &
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
99
69
|
none: false
|
100
70
|
requirements:
|
101
71
|
- - ~>
|
@@ -106,11 +76,11 @@ dependencies:
|
|
106
76
|
- 0
|
107
77
|
version: 2.0.0
|
108
78
|
type: :development
|
109
|
-
version_requirements: *
|
79
|
+
version_requirements: *id004
|
110
80
|
- !ruby/object:Gem::Dependency
|
111
81
|
name: awesome_print
|
112
82
|
prerelease: false
|
113
|
-
requirement: &
|
83
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
114
84
|
none: false
|
115
85
|
requirements:
|
116
86
|
- - ~>
|
@@ -121,11 +91,11 @@ dependencies:
|
|
121
91
|
- 1
|
122
92
|
version: 0.2.1
|
123
93
|
type: :development
|
124
|
-
version_requirements: *
|
94
|
+
version_requirements: *id005
|
125
95
|
- !ruby/object:Gem::Dependency
|
126
96
|
name: jeweler
|
127
97
|
prerelease: false
|
128
|
-
requirement: &
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
129
99
|
none: false
|
130
100
|
requirements:
|
131
101
|
- - ~>
|
@@ -136,7 +106,7 @@ dependencies:
|
|
136
106
|
- 0
|
137
107
|
version: 1.4.0
|
138
108
|
type: :development
|
139
|
-
version_requirements: *
|
109
|
+
version_requirements: *id006
|
140
110
|
description: A library for extracting quality measure information from HITSP C32's and ASTM CCR's
|
141
111
|
email: talk@projectpophealth.org
|
142
112
|
executables: []
|
@@ -158,7 +128,8 @@ files:
|
|
158
128
|
- lib/qme/map/map_reduce_builder.rb
|
159
129
|
- lib/qme/map/map_reduce_executor.rb
|
160
130
|
- lib/qme/query/json_document_builder.rb
|
161
|
-
- lib/
|
131
|
+
- lib/qme/query/json_query_executor.rb
|
132
|
+
- lib/quality-measure-engine.rb
|
162
133
|
- measures/0032/0032_NQF_Cervical_Cancer_Screening.json
|
163
134
|
- measures/0032/patients/denominator1.json
|
164
135
|
- measures/0032/patients/denominator2.json
|