quality-measure-engine 1.0.4 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -2
- data/Rakefile +0 -8
- data/VERSION +1 -1
- data/js/map_reduce_utils.js +1 -1
- data/lib/qme/database_access.rb +4 -0
- data/lib/qme/ext/record.rb +49 -0
- data/lib/qme/importer/entry.rb +1 -1
- data/lib/qme/importer/generic_importer.rb +24 -47
- data/lib/qme/importer/measure_properties_generator.rb +39 -0
- data/lib/qme/importer/provider_importer.rb +7 -4
- data/lib/qme/map/map_reduce_builder.rb +1 -1
- data/lib/qme/map/map_reduce_executor.rb +29 -25
- data/lib/qme/randomizer/patient_randomization_job.rb +5 -6
- data/lib/qme/randomizer/random_patient_creator.rb +47 -0
- data/lib/quality-measure-engine.rb +5 -8
- data/lib/tasks/patient_random.rake +3 -3
- metadata +99 -107
- data/lib/qme/ext/string.rb +0 -5
- data/lib/qme/importer/code_system_helper.rb +0 -41
- data/lib/qme/importer/hl7_helper.rb +0 -27
- data/lib/qme/importer/patient_importer.rb +0 -228
- data/lib/qme/importer/section_importer.rb +0 -138
@@ -1,138 +0,0 @@
|
|
1
|
-
module QME
|
2
|
-
module Importer
|
3
|
-
# Class that can be used to create an importer for a section of a HITSP C32 document. It usually
|
4
|
-
# operates by selecting all CDA entries in a section and then creates entries for them.
|
5
|
-
class SectionImporter
|
6
|
-
attr_accessor :check_for_usable
|
7
|
-
# Creates a new SectionImporter
|
8
|
-
# @param [Hash] id_map A hash of all ID tags to values for the enclosing document. Used to look up descriptions.
|
9
|
-
# @param [String] entry_xpath An XPath expression that can be used to find the desired entries
|
10
|
-
# @param [String] code_xpath XPath expression to find the code element as a child of the desired CDA entry.
|
11
|
-
# Defaults to "./cda:code"
|
12
|
-
# @param [String] status_xpath XPath expression to find the status element as a child of the desired CDA
|
13
|
-
# entry. Defaults to nil. If not provided, a status will not be checked for since it is not applicable
|
14
|
-
# to all enrty types
|
15
|
-
def initialize(entry_xpath, code_xpath="./cda:code", status_xpath=nil, description_xpath="./cda:code/cda:originalText/cda:reference[@value] | ./cda:text/cda:reference[@value] ")
|
16
|
-
@entry_xpath = entry_xpath
|
17
|
-
@code_xpath = code_xpath
|
18
|
-
@status_xpath = status_xpath
|
19
|
-
@description_xpath = description_xpath
|
20
|
-
@check_for_usable = true # Pilot tools will set this to false
|
21
|
-
@id_map = {}
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
# @param [String] tag
|
26
|
-
# @return [String] text description of tag
|
27
|
-
def lookup_tag(tag)
|
28
|
-
value = @id_map[tag]
|
29
|
-
# Not sure why, but sometimes the reference is #<Reference> and the ID value is <Reference>, and
|
30
|
-
# sometimes it is #<Reference>. We look for both.
|
31
|
-
if !value and tag[0] == '#'
|
32
|
-
tag = tag[1,tag.length]
|
33
|
-
value = @id_map[tag]
|
34
|
-
end
|
35
|
-
|
36
|
-
value
|
37
|
-
end
|
38
|
-
|
39
|
-
# Traverses that HITSP C32 document passed in using XPath and creates an Array of Entry
|
40
|
-
# objects based on what it finds
|
41
|
-
# @param [Nokogiri::XML::Document] doc It is expected that the root node of this document
|
42
|
-
# will have the "cda" namespace registered to "urn:hl7-org:v3"
|
43
|
-
# measure definition
|
44
|
-
# @return [Array] will be a list of Entry objects
|
45
|
-
def create_entries(doc,id_map = {})
|
46
|
-
@id_map = id_map
|
47
|
-
entry_list = []
|
48
|
-
entry_elements = doc.xpath(@entry_xpath)
|
49
|
-
entry_elements.each do |entry_element|
|
50
|
-
entry = Entry.new
|
51
|
-
extract_codes(entry_element, entry)
|
52
|
-
extract_dates(entry_element, entry)
|
53
|
-
extract_value(entry_element, entry)
|
54
|
-
if @status_xpath
|
55
|
-
extract_status(entry_element, entry)
|
56
|
-
end
|
57
|
-
if @description_xpath
|
58
|
-
extract_description(entry_element, entry, id_map)
|
59
|
-
end
|
60
|
-
if @check_for_usable
|
61
|
-
entry_list << entry if entry.usable?
|
62
|
-
else
|
63
|
-
entry_list << entry
|
64
|
-
end
|
65
|
-
end
|
66
|
-
entry_list
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def extract_status(parent_element, entry)
|
72
|
-
status_element = parent_element.at_xpath(@status_xpath)
|
73
|
-
if status_element
|
74
|
-
case status_element['code']
|
75
|
-
when '55561003'
|
76
|
-
entry.status = :active
|
77
|
-
when '73425007'
|
78
|
-
entry.status = :inactive
|
79
|
-
when '413322009'
|
80
|
-
entry.status = :resolved
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def extract_description(parent_element, entry, id_map)
|
86
|
-
code_elements = parent_element.xpath(@description_xpath)
|
87
|
-
code_elements.each do |code_element|
|
88
|
-
tag = code_element['value']
|
89
|
-
entry.description = lookup_tag(tag)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def extract_codes(parent_element, entry)
|
94
|
-
code_elements = parent_element.xpath(@code_xpath)
|
95
|
-
code_elements.each do |code_element|
|
96
|
-
add_code_if_present(code_element, entry)
|
97
|
-
translations = code_element.xpath('cda:translation')
|
98
|
-
translations.each do |translation|
|
99
|
-
add_code_if_present(translation, entry)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def add_code_if_present(code_element, entry)
|
105
|
-
if code_element['codeSystem'] && code_element['code']
|
106
|
-
entry.add_code(code_element['code'], CodeSystemHelper.code_system_for(code_element['codeSystem']))
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def extract_dates(parent_element, entry)
|
111
|
-
if parent_element.at_xpath('cda:effectiveTime')
|
112
|
-
entry.time = HL7Helper.timestamp_to_integer(parent_element.at_xpath('cda:effectiveTime')['value'])
|
113
|
-
end
|
114
|
-
if parent_element.at_xpath('cda:effectiveTime/cda:low')
|
115
|
-
entry.start_time = HL7Helper.timestamp_to_integer(parent_element.at_xpath('cda:effectiveTime/cda:low')['value'])
|
116
|
-
end
|
117
|
-
if parent_element.at_xpath('cda:effectiveTime/cda:high')
|
118
|
-
entry.end_time = HL7Helper.timestamp_to_integer(parent_element.at_xpath('cda:effectiveTime/cda:high')['value'])
|
119
|
-
end
|
120
|
-
if parent_element.at_xpath('cda:effectiveTime/cda:center')
|
121
|
-
entry.time = HL7Helper.timestamp_to_integer(parent_element.at_xpath('cda:effectiveTime/cda:center')['value'])
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def extract_value(parent_element, entry)
|
126
|
-
value_element = parent_element.at_xpath('cda:value')
|
127
|
-
if value_element
|
128
|
-
value = value_element['value']
|
129
|
-
unit = value_element['unit']
|
130
|
-
if value
|
131
|
-
entry.set_value(value, unit)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|