Class: HQMF::DataCriteria

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

Overview

Represents a data criteria specification

Direct Known Subclasses

Converter::SimpleDataCriteria

Constant Summary collapse

SOURCE_DATA_CRITERIA_TEMPLATE_ID =
'2.16.840.1.113883.3.100.1.1'
SOURCE_DATA_CRITERIA_TEMPLATE_TITLE =
'Source data criteria'
XPRODUCT =
'XPRODUCT'
UNION =
'UNION'
FIELDS =
{'SEVERITY' => {title:'Severity', coded_entry_method: :severity, code: 'SEV', code_system:'2.16.840.1.113883.5.4', template_id: '2.16.840.1.113883.3.560.1.1021.2', field_type: :value},
'ORDINAL' => {title:'Ordinal', coded_entry_method: :ordinality, code: '117363000', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1012.2', field_type: :value},
'REASON' => {title:'Reason', coded_entry_method: :reason, code: '410666004', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1017.2', field_type: :value},
'SOURCE' => {title:'Source', coded_entry_method: :source, code: '260753009', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.2001.2', field_type: :value},
'CUMULATIVE_MEDICATION_DURATION' => {title:'Cumulative Medication Duration', coded_entry_method: :cumulative_medication_duration, code: '363819003', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1001.3', field_type: :value},
'FACILITY_LOCATION' => {title:'Facility Location', coded_entry_method: :facility, code: 'SDLOC', field_type: :value},
'FACILITY_LOCATION_ARRIVAL_DATETIME' => {title:'Facility Location Arrival Date/Time', coded_entry_method: :facility_arrival, code: 'SDLOC_ARRIVAL', field_type: :nested_timestamp},
'FACILITY_LOCATION_DEPARTURE_DATETIME' => {title:'Facility Location Departure Date/Time', coded_entry_method: :facility_departure, code: 'SDLOC_DEPARTURE', field_type: :nested_timestamp},
'DISCHARGE_DATETIME' => {title:'Discharge Date/Time', coded_entry_method: :discharge_time, code: '442864001', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1025.1', field_type: :timestamp},
'DISCHARGE_STATUS' => {title:'Discharge Status', coded_entry_method: :discharge_disposition, code: '309039003', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1003.2', field_type: :value},
'ADMISSION_DATETIME' => {title:'Admission Date/Time', coded_entry_method: :admit_time, code: '399423000', code_system:'2.16.840.1.113883.6.96', field_type: :timestamp},
'LENGTH_OF_STAY' => {title:'Length of Stay', coded_entry_method: :length_of_stay, code: '183797002', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1029.3', field_type: :value},
'DOSE' => {title:'Dose', coded_entry_method: :dose, code: '398232005', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1004.1', field_type: :value},
'ROUTE' => {title:'Route', coded_entry_method: :route, code: '263513008', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1020.2', field_type: :value},
'START_DATETIME' => {title:'Start Date/Time', coded_entry_method: :start_date, code: '398201009', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1027.1', field_type: :timestamp},
'FREQUENCY' => {title:'Frequency', coded_entry_method: :frequency, code: '260864003', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1006.1', field_type: :value},
'ANATOMICAL_STRUCTURE' => {title:'Anatomical Structure', coded_entry_method: :anatomical_structure, code: '91723000', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1000.2', field_type: :value},
'STOP_DATETIME' => {title:'Stop Date/Time', coded_entry_method: :end_date, code: '397898000', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1026.1', field_type: :timestamp},
'INCISION_DATETIME' => {title:'Incision Date/Time', coded_entry_method: :incision_time, code: '34896006', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1007.1', field_type: :timestamp},
'REMOVAL_DATETIME' => {title:'Removal Date/Time', coded_entry_method: :removal_time, code: '118292001', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1032.1', field_type: :timestamp},
'TRANSFER_TO' => {title:'Transfer To', coded_entry_method: :transfer_to, code: 'TRANSFER_TO', template_id: '2.16.840.1.113883.3.560.1.72', field_type: :value},
'TRANSFER_FROM' => {title:'Transfer From', coded_entry_method: :transfer_from, code: 'TRANSFER_FROM', template_id: '2.16.840.1.113883.3.560.1.71', field_type: :value}
}
VALUE_FIELDS =
{'SEV'      => 'SEVERITY',
 '117363000' => 'ORDINAL',
 '410666004' => 'REASON',
 '260753009' => 'SOURCE',
 '363819003' => 'CUMULATIVE_MEDICATION_DURATION',
 'SDLOC'     => 'FACILITY_LOCATION',
 '442864001' => 'DISCHARGE_DATETIME',
 '309039003' => 'DISCHARGE_STATUS',
 '399423000' => 'ADMISSION_DATETIME',
 '183797002' => 'LENGTH_OF_STAY',
 '398232005' => 'DOSE',
 '263513008' => 'ROUTE',
 '398201009' => 'START_DATETIME',
 '260864003' =>'FREQUENCY',
 '91723000'  => 'ANATOMICAL_STRUCTURE',
 '397898000' => 'STOP_DATETIME',
 '34896006'  => 'INCISION_DATETIME',
 '118292001' =>'REMOVAL_DATETIME'
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Conversion::Utilities

#build_hash, #check_equality, #json_array, #openstruct_to_json

Constructor Details

#initialize(id, title, display_name, description, code_list_id, children_criteria, derivation_operator, definition, status, value, field_values, effective_time, inline_code_list, negation, negation_code_list_id, temporal_references, subset_operators, specific_occurrence, specific_occurrence_const, source_data_criteria = nil) ⇒ DataCriteria

Create a new data criteria instance

Parameters:

  • id (String)
  • title (String)
  • display_name (String)
  • description (String)
  • code_list_id (String)
  • negation_code_list_id (String)
  • children_criteria (List<String>)

    (ids of children data criteria)

  • derivation_operator (String)
  • definition (String)
  • status (String)
  • value (Value|Range|Coded)
  • field_values (Hash<String,Value|Range|Coded>)
  • effective_time (Range)
  • inline_code_list (Hash<String,[String]>)
  • negation (boolean)
  • negation_code_list_id (String)
  • temporal_references (List<TemporalReference>)
  • subset_operators (List<SubsetOperator>)
  • specific_occurrence (String)
  • specific_occurrence_const (String)
  • source_data_criteria (String) (defaults to: nil)

    (id for the source data criteria, important for specific occurrences)



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/hqmf-model/data_criteria.rb', line 83

def initialize(id, title, display_name, description, code_list_id, children_criteria, derivation_operator, definition, status, value, field_values, effective_time, inline_code_list, negation, negation_code_list_id, temporal_references, subset_operators, specific_occurrence, specific_occurrence_const, source_data_criteria=nil)

  status = normalize_status(definition, status)
  @settings = HQMF::DataCriteria.get_settings_for_definition(definition, status)

  @id = id
  @title = title
  @description = description
  @code_list_id = code_list_id
  @negation_code_list_id = negation_code_list_id
  @children_criteria = children_criteria
  @derivation_operator = derivation_operator
  @definition = definition
  @status = status
  @value = value
  @field_values = field_values
  @effective_time = effective_time
  @inline_code_list = inline_code_list
  @negation = negation
  @negation_code_list_id = negation_code_list_id
  @temporal_references = temporal_references
  @subset_operators = subset_operators
  @specific_occurrence = specific_occurrence
  @specific_occurrence_const = specific_occurrence_const
  @source_data_criteria = source_data_criteria || id
end

Instance Attribute Details

#children_criteriaObject (readonly)

Returns the value of attribute children_criteria.



58
59
60
# File 'lib/hqmf-model/data_criteria.rb', line 58

def children_criteria
  @children_criteria
end

#code_list_idObject (readonly)

Returns the value of attribute code_list_id.



58
59
60
# File 'lib/hqmf-model/data_criteria.rb', line 58

def code_list_id
  @code_list_id
end

#definitionObject

Returns the value of attribute definition.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def definition
  @definition
end

#derivation_operatorObject (readonly)

Returns the value of attribute derivation_operator.



58
59
60
# File 'lib/hqmf-model/data_criteria.rb', line 58

def derivation_operator
  @derivation_operator
end

#descriptionObject (readonly)

Returns the value of attribute description.



58
59
60
# File 'lib/hqmf-model/data_criteria.rb', line 58

def description
  @description
end

#display_nameObject

Returns the value of attribute display_name.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def display_name
  @display_name
end

#effective_timeObject

Returns the value of attribute effective_time.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def effective_time
  @effective_time
end

#field_valuesObject

Returns the value of attribute field_values.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def field_values
  @field_values
end

#idObject

Returns the value of attribute id.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def id
  @id
end

#inline_code_listObject

Returns the value of attribute inline_code_list.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def inline_code_list
  @inline_code_list
end

#negationObject

Returns the value of attribute negation.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def negation
  @negation
end

#negation_code_list_idObject

Returns the value of attribute negation_code_list_id.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def negation_code_list_id
  @negation_code_list_id
end

#source_data_criteriaObject (readonly)

Returns the value of attribute source_data_criteria.



58
59
60
# File 'lib/hqmf-model/data_criteria.rb', line 58

def source_data_criteria
  @source_data_criteria
end

#specific_occurrenceObject (readonly)

Returns the value of attribute specific_occurrence.



58
59
60
# File 'lib/hqmf-model/data_criteria.rb', line 58

def specific_occurrence
  @specific_occurrence
end

#specific_occurrence_constObject (readonly)

Returns the value of attribute specific_occurrence_const.



58
59
60
# File 'lib/hqmf-model/data_criteria.rb', line 58

def specific_occurrence_const
  @specific_occurrence_const
end

#statusObject

Returns the value of attribute status.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def status
  @status
end

#subset_operatorsObject

Returns the value of attribute subset_operators.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def subset_operators
  @subset_operators
end

#temporal_referencesObject

Returns the value of attribute temporal_references.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def temporal_references
  @temporal_references
end

#titleObject (readonly)

Returns the value of attribute title.



58
59
60
# File 'lib/hqmf-model/data_criteria.rb', line 58

def title
  @title
end

#valueObject

Returns the value of attribute value.



59
60
61
# File 'lib/hqmf-model/data_criteria.rb', line 59

def value
  @value
end

Class Method Details

.create_from_category(id, title, description, code_list_id, category, sub_category = nil, negation = false, negation_code_list_id = nil) ⇒ Object

create a new data criteria given a category and sub_category. A sub category can either be a status or a sub category



111
112
113
114
# File 'lib/hqmf-model/data_criteria.rb', line 111

def self.create_from_category(id, title, description, code_list_id, category, sub_category=nil, negation=false, negation_code_list_id=nil)
  settings = HQMF::DataCriteria.get_settings_for_definition(category, sub_category)
  HQMF::DataCriteria.new(id, title, nil, description, code_list_id, nil, nil, settings['definition'], settings['status'], nil, nil, nil, nil, negation, negation_code_list_id, nil, nil, nil,nil)
end

.definition_for_template_id(template_id) ⇒ Object



273
274
275
# File 'lib/hqmf-model/data_criteria.rb', line 273

def self.definition_for_template_id(template_id)
  get_template_id_map()[template_id]
end

.from_json(id, json) ⇒ Object

Create a new data criteria instance from a JSON hash keyed with symbols



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/hqmf-model/data_criteria.rb', line 145

def self.from_json(id, json)

  title = json["title"] if json["title"]
  display_name = json["display_name"] if json["display_name"]
  description = json["description"] if json["description"]
  code_list_id = json["code_list_id"] if json["code_list_id"]
  children_criteria = json["children_criteria"] if json["children_criteria"]
  derivation_operator = json["derivation_operator"] if json["derivation_operator"]
  definition = json["definition"] if json["definition"]
  status = json["status"] if json["status"]
  value = convert_value(json["value"]) if json["value"]
  field_values = json["field_values"].inject({}){|memo,(k,v)| memo[k.to_s] = convert_value(v); memo} if json["field_values"]
  effective_time = HQMF::Range.from_json(json["effective_time"]) if json["effective_time"]
  inline_code_list = json["inline_code_list"].inject({}){|memo,(k,v)| memo[k.to_s] = v; memo} if json["inline_code_list"]
  negation = json["negation"] || false
  negation_code_list_id = json['negation_code_list_id'] if json['negation_code_list_id']
  temporal_references = json["temporal_references"].map {|reference| HQMF::TemporalReference.from_json(reference)} if json["temporal_references"]
  subset_operators = json["subset_operators"].map {|operator| HQMF::SubsetOperator.from_json(operator)} if json["subset_operators"]
  specific_occurrence = json['specific_occurrence'] if json['specific_occurrence']
  specific_occurrence_const = json['specific_occurrence_const'] if json['specific_occurrence_const']
  source_data_criteria = json['source_data_criteria'] if json['source_data_criteria']

  HQMF::DataCriteria.new(id, title, display_name, description, code_list_id, children_criteria, derivation_operator, definition, status, value, field_values,
                         effective_time, inline_code_list, negation, negation_code_list_id, temporal_references, subset_operators,specific_occurrence,specific_occurrence_const,source_data_criteria)
end

.get_settings_for_definition(definition, status) ⇒ Object



262
263
264
265
266
267
268
269
270
271
# File 'lib/hqmf-model/data_criteria.rb', line 262

def self.get_settings_for_definition(definition, status)
  settings_file = File.expand_path('../data_criteria.json', __FILE__)
  settings_map = JSON.parse(File.read(settings_file))
  key = definition + ((status.nil? || status.empty?) ? '' : "_#{status}")
  settings = settings_map[key]
  
  raise "data criteria is not supported #{key}" if settings.nil? || settings["not_supported"]

  settings
end

.get_template_id_mapObject



295
296
297
298
# File 'lib/hqmf-model/data_criteria.rb', line 295

def self.get_template_id_map
  @@template_id_map ||= read_template_id_map
  @@template_id_map
end

.statuses_by_definitionObject



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/hqmf-model/data_criteria.rb', line 196

def self.statuses_by_definition
  settings_file = File.expand_path('../data_criteria.json', __FILE__)
  settings_map = JSON.parse(File.read(settings_file))
  all_defs = (settings_map.map {|key, value| {category: value['category'],definition:value['definition'],status:(value['status'].empty? ? nil : value['status']), sub_category: value['sub_category'],title:value['title']} unless value['not_supported']}).compact
  by_categories = {}
  all_defs.each do |definition| 
    by_categories[definition[:category]]||={}
    status = definition[:status]
    def_key = definition[:definition]
    if status.nil? and definition[:sub_category] and !definition[:sub_category].empty?
      status = definition[:sub_category]
      def_key = def_key.gsub("_#{status}",'')
    end
    by_categories[definition[:category]][def_key]||={category:def_key,statuses:[]}
    by_categories[definition[:category]][def_key][:statuses] << status unless status.nil?
  end
  status_by_category = {}
  by_categories.each {|key, value| status_by_category[key] = value.values}
  status_by_category.delete('derived')
  status_by_category.delete('variable')
  status_by_category.delete('measurement_period')
  status_by_category.values.flatten
end

.template_id_for_definition(definition, status, negation) ⇒ Object



277
278
279
# File 'lib/hqmf-model/data_criteria.rb', line 277

def self.template_id_for_definition(definition, status, negation)
  get_template_id_map().key({'definition' => definition, 'status' => status || '', 'negation' => negation})
end

.title_for_template_id(template_id) ⇒ Object



281
282
283
284
285
286
287
288
289
290
291
292
293
# File 'lib/hqmf-model/data_criteria.rb', line 281

def self.title_for_template_id(template_id)
  value = get_template_id_map()[template_id]
  if value
    settings = self.get_settings_for_definition(value['definition'], value['status'])
    if settings
      settings['title']
    else
      'Unknown data criteria'
    end
  else
    'Unknown template id'
  end
end

Instance Method Details

#all_code_set_oidsObject



242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/hqmf-model/data_criteria.rb', line 242

def all_code_set_oids
  
  # root oid
  referenced_oids = [code_list_id]
  
  # value oid
  referenced_oids << value.code_list_id if value != nil and value.type == 'CD'
  
  # negation oid
  referenced_oids << negation_code_list_id if negation_code_list_id != nil
  
  # field oids
  if field_values != nil
    referenced_oids.concat (field_values.map {|key,field| field.code_list_id if field != nil and field.type == 'CD'})
  end
  
  referenced_oids
  
end

#base_jsonObject



176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/hqmf-model/data_criteria.rb', line 176

def base_json
  x = nil
  json = build_hash(self, [:title,:display_name,:description,:standard_category,:qds_data_type,:code_list_id,:children_criteria, :derivation_operator, :property, :type, :definition, :status, :hard_status, :negation, :negation_code_list_id,:specific_occurrence,:specific_occurrence_const,:source_data_criteria])
  json[:children_criteria] = @children_criteria unless @children_criteria.nil? || @children_criteria.empty?
  json[:value] = ((@value.is_a? String) ? @value : @value.to_json) if @value
  json[:field_values] = @field_values.inject({}) {|memo,(k,v)| memo[k] = (!v.nil? ? v.to_json : nil); memo} if @field_values
  json[:effective_time] = @effective_time.to_json if @effective_time
  json[:inline_code_list] = @inline_code_list if @inline_code_list
  json[:temporal_references] = x if x = json_array(@temporal_references)
  json[:subset_operators] = x if x = json_array(@subset_operators)
  json
end

#hard_statusObject



131
132
133
# File 'lib/hqmf-model/data_criteria.rb', line 131

def hard_status
  @settings['hard_status']
end

#has_subset(subset_operator) ⇒ Object



192
193
194
# File 'lib/hqmf-model/data_criteria.rb', line 192

def has_subset(subset_operator)
  @subset_operators.reduce(false) {|found, item| found ||= item == subset_operator }
end

#has_temporal(temporal_reference) ⇒ Object



189
190
191
# File 'lib/hqmf-model/data_criteria.rb', line 189

def has_temporal(temporal_reference)
  @temporal_references.reduce(false) {|found, item| found ||= item == temporal_reference }
end

#patient_api_functionObject



128
129
130
# File 'lib/hqmf-model/data_criteria.rb', line 128

def patient_api_function
  @settings['patient_api_function'].to_sym unless @settings['patient_api_function'].empty?
end

#propertyObject



125
126
127
# File 'lib/hqmf-model/data_criteria.rb', line 125

def property
  @settings['property'].to_sym unless @settings['property'].nil?
end

#qds_data_typeObject



119
120
121
# File 'lib/hqmf-model/data_criteria.rb', line 119

def qds_data_type
  @settings['qds_data_type']
end

#referenced_data_criteria(document) ⇒ Object



220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/hqmf-model/data_criteria.rb', line 220

def referenced_data_criteria(document)
  referenced = []
  if (@children_criteria)
    @children_criteria.each do |id|
      dc = document.data_criteria(id) 
      referenced << id
      referenced.concat(dc.referenced_data_criteria(document))
    end
  end
  if (@temporal_references)
    @temporal_references.each do |tr|
      id = tr.reference.id
      if (id != HQMF::Document::MEASURE_PERIOD_ID)
        dc = document.data_criteria(id) 
        referenced << id
        referenced.concat(dc.referenced_data_criteria(document))
      end
    end
  end
  referenced
end

#standard_categoryObject



116
117
118
# File 'lib/hqmf-model/data_criteria.rb', line 116

def standard_category
  @settings['standard_category']
end

#to_jsonObject



171
172
173
174
# File 'lib/hqmf-model/data_criteria.rb', line 171

def to_json
  json = base_json
  {self.id.to_s.to_sym => json}
end

#typeObject



122
123
124
# File 'lib/hqmf-model/data_criteria.rb', line 122

def type
  @settings['category'].to_sym
end