Class: HQMF2::DataCriteria

Inherits:
Object
  • Object
show all
Includes:
Utilities
Defined in:
lib/hqmf-parser/2.0/data_criteria.rb

Overview

Represents a data criteria specification

Constant Summary collapse

VARIABLE_TEMPLATE =
"0.1.2.3.4.5.6.7.8.9.1"
SATISFIES_ANY_TEMPLATE =
"0.1.2.3.4.5.6.7.8.9.2"
SATISFIES_ALL_TEMPLATE =
"0.1.2.3.4.5.6.7.8.9.3"
CONJUNCTION_CODE_TO_DERIVATION_OP =
{
  'OR' => 'UNION',
  'AND' => 'XPRODUCT'
}
CRITERIA_GLOB =
"*[substring(name(),string-length(name())-7) = \'Criteria\']"

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utilities

#attr_val, attr_val, #to_xml

Methods included from HQMF::Conversion::Utilities

#build_hash, #check_equality, #json_array, #openstruct_to_json

Constructor Details

#initialize(entry) ⇒ DataCriteria

Create a new instance based on the supplied HQMF entry

Parameters:

  • entry (Nokogiri::XML::Element)

    the parsed HQMF entry



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 26

def initialize(entry)
  @entry = entry
  @local_variable_name = extract_local_variable_name
  @status = attr_val('./*/cda:statusCode/@code')
  @description = attr_val("./#{CRITERIA_GLOB}/cda:text/@value")
  extract_negation()
  extract_specific_or_source()
  @effective_time = extract_effective_time
  @temporal_references = extract_temporal_references
  @derivation_operator = extract_derivation_operator
  @field_values = extract_field_values
  @subset_operators = extract_subset_operators
  @children_criteria = extract_child_criteria
  @id_xpath = './*/cda:id/@extension'
  @code_list_xpath = './*/cda:code'
  @value_xpath = './*/cda:value'
  @comments = @entry.xpath("./#{CRITERIA_GLOB}/cda:text/cda:xml/cda:qdmUserComments/cda:item/text()", HQMF2::Document::NAMESPACES).map{ |v| v.content }
  @variable = false

  # Try to determine what kind of data criteria we are dealing with
  # First we look for a template id and if we find one just use the definition
  # status and negation associated with that
  if !extract_type_from_template_id()
    # If no template id or not one we recognize then try to determine type from
    # the definition element
    extract_type_from_definition()
  end
  
  patch_xpaths_for_criteria_type()
end

Instance Attribute Details

#children_criteriaObject (readonly)

Returns the value of attribute children_criteria.



8
9
10
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 8

def children_criteria
  @children_criteria
end

#commentsObject (readonly)

Returns the value of attribute comments.



11
12
13
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 11

def comments
  @comments
end

#derivation_operatorObject (readonly)

Returns the value of attribute derivation_operator.



9
10
11
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 9

def derivation_operator
  @derivation_operator
end

#descriptionObject (readonly)

Returns the value of attribute description.



9
10
11
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 9

def description
  @description
end

#effective_timeObject (readonly)

Returns the value of attribute effective_time.



7
8
9
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 7

def effective_time
  @effective_time
end

#field_valuesObject (readonly)

Returns the value of attribute field_values.



10
11
12
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 10

def field_values
  @field_values
end

#is_source_data_criteriaObject (readonly)

Returns the value of attribute is_source_data_criteria.



11
12
13
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 11

def is_source_data_criteria
  @is_source_data_criteria
end

#negationObject (readonly)

Returns the value of attribute negation.



9
10
11
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 9

def negation
  @negation
end

#negation_code_list_idObject (readonly)

Returns the value of attribute negation_code_list_id.



9
10
11
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 9

def negation_code_list_id
  @negation_code_list_id
end

#propertyObject (readonly)

Returns the value of attribute property.



7
8
9
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 7

def property
  @property
end

#sectionObject (readonly)

Returns the value of attribute section.



7
8
9
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 7

def section
  @section
end

#source_data_criteriaObject (readonly)

Returns the value of attribute source_data_criteria.



10
11
12
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 10

def source_data_criteria
  @source_data_criteria
end

#specific_occurrenceObject (readonly)

Returns the value of attribute specific_occurrence.



11
12
13
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 11

def specific_occurrence
  @specific_occurrence
end

#specific_occurrence_constObject (readonly)

Returns the value of attribute specific_occurrence_const.



10
11
12
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 10

def specific_occurrence_const
  @specific_occurrence_const
end

#statusObject (readonly)

Returns the value of attribute status.



7
8
9
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 7

def status
  @status
end

#subset_operatorsObject (readonly)

Returns the value of attribute subset_operators.



8
9
10
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 8

def subset_operators
  @subset_operators
end

#temporal_referencesObject (readonly)

Returns the value of attribute temporal_references.



8
9
10
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 8

def temporal_references
  @temporal_references
end

#typeObject (readonly)

Returns the value of attribute type.



7
8
9
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 7

def type
  @type
end

#valueObject (readonly)

Returns the value of attribute value.



7
8
9
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 7

def value
  @value
end

Instance Method Details

#code_list_idString

Get the code list OID of the criteria, used as an index to the code list database

Returns:

  • (String)

    the code list identifier of this data criteria



199
200
201
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 199

def code_list_id
  attr_val("#{@code_list_xpath}/@valueSet")
end

#extract_local_variable_nameObject



83
84
85
86
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 83

def extract_local_variable_name
  lvn = @entry.at_xpath("./cda:localVariableName")
  lvn["value"] if lvn
end

#extract_type_from_definitionObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 88

def extract_type_from_definition
  if @entry.at_xpath("./cda:grouperCriteria") 
    if @local_variable_name && @local_variable_name.match(/qdm_/)
      @variable = true
    end
    @definition = 'derived'
    return 
  end
  # See if we can find a match for the entry definition value and status.
  entry_type = attr_val('./*/cda:definition/*/cda:id/@extension')
  begin
    settings = HQMF::DataCriteria.get_settings_for_definition(entry_type, @status)
    @definition = entry_type
  rescue
    # if no exact match then try a string match just using entry definition value
    case entry_type
    when 'Problem', 'Problems'
      @definition = 'diagnosis'
    when 'Encounter', 'Encounters'
      @definition = 'encounter'
    when 'LabResults', 'Results'
      @definition = 'laboratory_test'
    when 'Procedure', 'Procedures'
      @definition = 'procedure'
    when 'Medication', 'Medications'
      @definition = 'medication'
      if !@status
        @status = 'active'
      end
    when 'RX'
      @definition = 'medication'
      if !@status
        @status = 'dispensed'
      end
    when 'Demographics'
      @definition = definition_for_demographic
    when 'Derived'
      @definition = 'derived'
    when nil
      @definition = 'variable'
    else
      raise "Unknown data criteria template identifier [#{entry_type}]"
    end
  end
end

#extract_type_from_template_idObject



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 134

def extract_type_from_template_id
  template_ids = @entry.xpath('./*/cda:templateId/cda:item', HQMF2::Document::NAMESPACES).collect do |template_def|
    HQMF2::Utilities.attr_val(template_def, '@root')
  end
  if template_ids.include?(HQMF::DataCriteria::SOURCE_DATA_CRITERIA_TEMPLATE_ID)
    @is_source_data_criteria = true
  end
  found = false
  template_ids.each do |template_id|
    defs = HQMF::DataCriteria.definition_for_template_id(template_id)
    
    if defs
      @definition = defs['definition']
      @status = defs['status'].length > 0 ? defs['status'] : nil
      @negation = defs['negation']
      found ||= true
    elsif template_id == VARIABLE_TEMPLATE
      @derivation_operator = HQMF::DataCriteria::INTERSECT if @derivation_operator == HQMF::DataCriteria::XPRODUCT
      @definition ||= 'derived'
      @negation = false
      @variable = true
      found ||= true
    elsif template_id == SATISFIES_ANY_TEMPLATE
      @definition = HQMF::DataCriteria::SATISFIES_ANY
      @negation = false
      return true
    elsif template_id == SATISFIES_ALL_TEMPLATE
      @definition = HQMF::DataCriteria::SATISFIES_ALL
      @derivation_operator = HQMF::DataCriteria::INTERSECT
      @negation = false
      found ||= true
    end
  end
  found
end

#idString

Get the identifier of the criteria, used elsewhere within the document for referencing

Returns:

  • (String)

    the identifier of this data criteria



182
183
184
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 182

def id
  attr_val(@id_xpath)
end

#inline_code_listObject



203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 203

def inline_code_list
  codeSystem = attr_val("#{@code_list_xpath}/@codeSystem")
  if codeSystem
    codeSystemName = HealthDataStandards::Util::CodeSystemHelper.code_system_for(codeSystem)
  else
    codeSystemName = attr_val("#{@code_list_xpath}/@codeSystemName")
  end
  codeValue = attr_val("#{@code_list_xpath}/@code")
  if codeSystemName && codeValue
    {codeSystemName => [codeValue]}
  else
    nil
  end
end

#patch_xpaths_for_criteria_typeObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 57

def patch_xpaths_for_criteria_type  
  # Patch xpaths when necessary, HQMF data criteria are irregular in structure so
  # the same information is found in different places depending on the type of
  # criteria
  # Assumes @definition and @status are already set
  case @definition
  when 'transfer_to', 'transfer_from'
    @code_list_xpath = './cda:observationCriteria/cda:value'
  when 'diagnosis', 'diagnosis_family_history'
    @code_list_xpath = './cda:observationCriteria/cda:value'
  when 'physical_exam', 'risk_category_assessment', 'procedure_result', 'laboratory_test', 'diagnostic_study_result', 'functional_status_result', 'intervention_result'
    @value = extract_value
  when 'medication'
    case @status
    when 'dispensed', 'ordered'
      @code_list_xpath = './cda:supplyCriteria/cda:participation/cda:role/cda:code'
    else # active or administered
      @code_list_xpath = './cda:substanceAdministrationCriteria/cda:participation/cda:role/cda:code'
    end
  when 'patient_characteristic', 'patient_characteristic_birthdate', 'patient_characteristic_clinical_trial_participant', 'patient_characteristic_expired', 'patient_characteristic_gender', 'patient_characteristic_age', 'patient_characteristic_languages', 'patient_characteristic_marital_status', 'patient_characteristic_race'
    @value = extract_value
  when 'variable'
    @value = extract_value
  end
end

#titleString

Get the title of the criteria, provides a human readable description

Returns:

  • (String)

    the title of this data criteria



188
189
190
191
192
193
194
195
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 188

def title
  dispValue = attr_val("#{@code_list_xpath}/cda:displayName/@value") 
  desc = nil
  if @description && (@description.include? ":")
     desc = @description.match(/.*:\s+(.+)/)[1]
  end
  dispValue || desc || id
end

#to_modelObject



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 218

def to_model

  mv = value ? value.to_model : nil
  met = effective_time ? effective_time.to_model : nil
  mtr = temporal_references.collect {|ref| ref.to_model}
  mso = subset_operators.collect {|opr| opr.to_model}
  field_values = {}
  @field_values.each_pair do |id, val|
    field_values[id] = val.to_model
  end

  # Model transfers as a field
  if ['transfer_to', 'transfer_from'].include? @definition 
    field_values ||= {}
    field_code_list_id = @code_list_id
    if !field_code_list_id
      field_code_list_id = attr_val("./#{CRITERIA_GLOB}/cda:outboundRelationship/#{CRITERIA_GLOB}/cda:value/@valueSet")
    end
    field_values[@definition.upcase] = HQMF::Coded.for_code_list(field_code_list_id, title)
  end

  field_values = nil if field_values.empty?

  HQMF::DataCriteria.new(id, title, nil, description, code_list_id, children_criteria, 
    derivation_operator, @definition, status, mv, field_values, met, inline_code_list, 
    @negation, @negation_code_list_id, mtr, mso, @specific_occurrence, 
    @specific_occurrence_const, @source_data_criteria, @comments, @variable)
end

#to_sObject



170
171
172
173
174
175
176
177
178
# File 'lib/hqmf-parser/2.0/data_criteria.rb', line 170

def to_s
  props = {
    :property => property,
    :type => type,
    :status => status,
    :section => section
  }
  "DataCriteria#{props.to_s}"
end