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'
INTERSECT =
'INTERSECT'
SATISFIES_ALL =
'satisfies_all'
SATISFIES_ANY =
'satisfies_any'
VARIABLE =
'variable'
FIELDS =

An object containing metadata information for all attributes that are used within the measure data criteria being parsed.

fields include: ‘title`: The QDM human readable title for the attribute. `coded_entry_method`: this appears to be a way that fields here are referenced within Bonnie. `field_type`: The type of whatever will be stored for this attribute. This will often be `:timestamp` or `:value`. `code`: The code for the entry. This should be included to make HQMF generation work properly. This is whatever code is dictated in the HQMF. For Diagnosis, this is in [HQMF QDM IG](www.hl7.org/implement/standards/product_brief.cfm?product_id=346) vol 2 page 155 and is `29308-4`. `code_system`: This is the oid for whatever code system contains `code`. For Diagnosis, this is LOINC: `2.16.840.1.113883.6.1`. This is also located at (www.hl7.org/implement/standards/product_brief.cfm?product_id=346) vol 2 page 155. `template_id`: These appear to be related to HQMFr1 template ids. These appear to be dangerously out of date. Don’t use.

{'ABATEMENT_DATETIME' => {title:'Abatement Datetime', coded_entry_method: :end_date, field_type: :timestamp},
    'ACTIVE_DATETIME' => {title:'Active Date/Time', coded_entry_method: :active_datetime, field_type: :timestamp},
    '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},
    # QDM 5.0 addition. This is the same as FACILITY_LOCATION.
    # TODO: (LDY 10/5/2016) this is a new attribute from QDM 5.0. We do not yet have the code or template_id for this. This should be updated when we do.
    'ADMISSION_SOURCE' => {title:'Admission Source', coded_entry_method: :admission_source, field_type: :value},
    'ANATOMICAL_APPROACH_SITE' => {title:'Anatomical Approach Site', coded_entry_method: :anatomical_approach,  field_type: :value},
    'ANATOMICAL_LOCATION_SITE' => {title:'Anatomical Location Site', coded_entry_method: :anatomical_location,  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},
    'CAUSE' => {title:'Cause', coded_entry_method: :cause_of_death, code: '42752001', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1017.2', field_type: :value},
    # TODO: Determine actual code and code_system for component attribute
    'COMPONENT' => {title: 'Component', coded_entry_method: :components, field_type: :value},
    'CUMULATIVE_MEDICATION_DURATION' => {title:'Cumulative Medication Duration', coded_entry_method: :cumulative_medication_duration, code: '261773006', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1001.3', field_type: :value},
    # MISSING Date - The date that the patient passed away. - Patient Characteristic Expired
    'DIAGNOSIS' => {title:'Diagnosis', coded_entry_method: :diagnosis, field_type: :value},
    '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},
    # TODO: (LDY 10/5/2016) this changed from "discharge status" to "discharge disposition". likely there is a code and template id change necessary. these are not yet known.
    'DISCHARGE_STATUS' => {title:'Discharge Disposition', 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},
    # TODO: (LDY 10/4/2016) this changed from "dose" to "dosage". it's possible that there's another code associated with this. this code was not available at the time of this change.
    'DOSE' => {title:'Dosage', 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},
    'FACILITY_LOCATION' => {title:'Facility Location', coded_entry_method: :facility, code: 'SDLOC', field_type: :value},
    # TODO: (LDY 10/5/2016) this changed from 'facility arrival/departure' to 'location period'. likely there is a code and template id change necessary. these are not yet known.
    'FACILITY_LOCATION_ARRIVAL_DATETIME' => {title:'Location Period Start Date/Time', coded_entry_method: :facility_arrival, code: 'SDLOC_ARRIVAL', field_type: :nested_timestamp},
    'FACILITY_LOCATION_DEPARTURE_DATETIME' => {title:'Location Period End Date/Time', coded_entry_method: :facility_departure, code: 'SDLOC_DEPARTURE', field_type: :nested_timestamp},
    'FREQUENCY' => {title:'Frequency', coded_entry_method: :administration_timing, code: '307430002', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.3.560.1.1006.1', field_type: :value},
    'HEALTH_RECORD_FIELD' => {title: 'Health Record Field', coded_entry_method: :health_record_field, code: '395676008', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.10.20.28.3.102:2014-11-24', field_type: :value},
    '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.10.20.24.3.89', field_type: :timestamp},
    'LATERALITY' => {title:'Laterality', coded_entry_method: :laterality, code: '272741003', code_system:'2.16.840.1.113883.6.96', template_id: '', field_type: :value},
    '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},
    'METHOD' => {title:'Method', coded_entry_method: :method, template_id: '', field_type: :value},
    # Negation Rationale isn't encoded
    'ONSET_AGE' => {title:'Onset Age', coded_entry_method: :onset_age, code: '445518008', code_system:'2.16.840.1.113883.6.96', template_id: '', field_type: :value},
    'ONSET_DATETIME' => {title:'Onset Datetime', coded_entry_method: :start_date, field_type: :timestamp},
    'ORDINAL' => {title:'Ordinality', 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}, # previous
    'ORDINALITY' => {title:'Ordinality', 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},
    'PATIENT_PREFERENCE' => {title:'Patient Preference', coded_entry_method: :patient_preference,  code: 'PAT', code_system: '2.16.840.1.113883.5.8', template_id: '2.16.840.1.113883.10.20.24.3.83', field_type: :value},
    'PRINCIPAL_DIAGNOSIS' => {title:'Principal Diagnosis', coded_entry_method: :principal_diagnosis, field_type: :value},
    'PROVIDER_PREFERENCE' => {title:'Provider Preference', coded_entry_method: :provider_preference, code: '103323008', code_system: '2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.10.20.24.3.84', field_type: :value},
    'RADIATION_DOSAGE' => {title:'Radiation Dosage', coded_entry_method: :radiation_dose, code: '228815006', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.10.20.24.3.91', field_type: :value},
    'RADIATION_DURATION' => {title:'Radiation Duration', coded_entry_method: :radiation_duration, code: '306751006', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.10.20.24.3.91', field_type: :value},
    'REACTION'=> {title:'Reaction', coded_entry_method: :reaction, code: '263851003', code_system:'2.16.840.1.113883.6.96', template_id: '2.16.840.1.113883.10.20.24.3.85', 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.10.20.24.3.88', field_type: :value},
    'RECORDED_DATETIME' => {title:'Recorded Datetime', coded_entry_method: :start_date, field_type: :timestamp},
    'REFERENCE_RANGE_HIGH' => {title:'Reference Range - High', coded_entry_method: :reference_range_high, field_type: :value},
    'REFERENCE_RANGE_LOW' => {title:'Reference Range - Low', coded_entry_method: :reference_range_low, field_type: :value},
    'REFILLS' => {title:'Refills', coded_entry_method: :refills,  field_type: :value},
    'RELATED_TO' => {title:'Related To', coded_entry_method: :related_to,  code: 'REL', codeSystem: '2.16.840.1.113883.1.11.11603', field_type: :value},
    'RELATIONSHIP' => {title:'Relationship', coded_entry_method: :relationship_to_patient, field_type: :value},
    '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},
    # Result isn't encoded
    # TODO: (LDY 10/4/2016) RESULT_DATETIME is a new attribute in QDM 5.0. We do not yet have codes/template information for this.
    'RESULT_DATETIME' => {title:'Result Date/Time', coded_entry_method: :result_date_time, field_type: :timestamp},
    '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},
    '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.10.20.22.4.8', field_type: :value},
    'SIGNED_DATETIME' =>  {title:'Signed Date/Time', coded_entry_method: :signed_date_time, field_type: :timestamp},
    '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},
    # STATUS is referenced in the code as `qdm_status` because entry/Record already has a `status`/`status_code` field which has a different meaning
    'STATUS' => {title: 'Status', coded_entry_method: :qdm_status, code: '33999-4', code_system:'2.16.840.1.113883.6.1', 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},
    # TODO: (LDY 10/4/2016) SUPPLY is a new attribute in QDM 5.0. We do not yet have codes/template information for this.
    'SUPPLY' => {title:'Supply', coded_entry_method: :supply, field_type: :value},
    'TARGET_OUTCOME' => {title:'Target Outcome', coded_entry_method: :target_outcome, code: '385676005', code_system:'2.16.840.1.113883.6.96', template_id: '', field_type: :value},
    # MISSING Time - The time that the patient passed away

    # Custom field values
    # QDM 5.3 Update: "Related To" replaces Fulfills. We are keeping the fulfills code and only make changes to the UI.
    'FLFS' => {title:'Related To', coded_entry_method: :fulfills, code: 'FLFS', field_type: :reference},
    '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},
    'TRANSFER_FROM' => {title:'Transfer From', coded_entry_method: :transfer_from, code: 'TRANSFER_FROM', template_id: '2.16.840.1.113883.10.20.24.3.81', field_type: :value},
    'TRANSFER_FROM_DATETIME' => {title:'Transfer From Date/Time', coded_entry_method: :transfer_from_time, code: 'ORG_TIME', template_id: '2.16.840.1.113883.10.20.24.3.81', field_type: :nested_timestamp},
    'TRANSFER_TO' => {title:'Transfer To', coded_entry_method: :transfer_to, code: 'TRANSFER_TO', template_id: '2.16.840.1.113883.10.20.24.3.82', field_type: :value},
    'TRANSFER_TO_DATETIME' => {title:'Transfer To Date/Time', coded_entry_method: :transfer_to_time, code: 'DST_TIME', template_id: '2.16.840.1.113883.10.20.24.3.82', field_type: :nested_timestamp}
}
VALUE_FIELDS =

maps attribute codes to the attribute keys

{'399423000' => 'ADMISSION_DATETIME',
 '42752001' => 'CAUSE',
 '261773006' => 'CUMULATIVE_MEDICATION_DURATION',
 '363819003' => 'CUMULATIVE_MEDICATION_DURATION', # previous
 '442864001' => 'DISCHARGE_DATETIME',
 '309039003' => 'DISCHARGE_STATUS',
 '398232005' => 'DOSE',
 'SDLOC'     => 'FACILITY_LOCATION',
 'SDLOC_ARRIVAL'   => 'FACILITY_LOCATION_ARRIVAL_DATETIME',
 'SDLOC_DEPARTURE' => 'FACILITY_LOCATION_DEPARTURE_DATETIME',
 '307430002' => 'FREQUENCY',
 '260864003' => 'FREQUENCY', # previous
 '395676008' => 'HEALTH_RECORD_FIELD',
 '34896006'  => 'INCISION_DATETIME',
 '272741003' => 'LATERALITY',
 '183797002' => 'LENGTH_OF_STAY',
 '445518008' => 'ONSET_AGE',
 '117363000' => 'ORDINALITY',
 'PAT'       => 'PATIENT_PREFERENCE',
 '103323008' => 'PROVIDER_PREFERENCE',
 '228815006' => 'RADIATION_DOSAGE',
 '306751006' => 'RADIATION_DURATION',
 '263851003' => 'REACTION',
 '410666004' => 'REASON',
 'REL'       => 'RELATED_TO',
 '118292001' => 'REMOVAL_DATETIME',
 '263513008' => 'ROUTE',
 'SEV'       => 'SEVERITY',
 '398201009' => 'START_DATETIME',
 '33999-4'   => 'STATUS',
 '397898000' => 'STOP_DATETIME',
 '385676005' => 'TARGET_OUTCOME',

 # Custom field values
 '91723000'  => 'ANATOMICAL_STRUCTURE',
 'FLFS' => 'FLFS',
 '260753009' => 'SOURCE',
 'TRANSFER_FROM' => 'TRANSFER_FROM',
 'ORG_TIME' => 'TRANSFER_FROM_DATETIME',
 'TRANSFER_TO' => 'TRANSFER_TO',
 'DST_TIME' => 'TRANSFER_TO_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, comments = nil, variable = false) ⇒ DataCriteria

Create a new data criteria instance

Parameters:



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/hqmf-model/data_criteria.rb', line 174

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, comments=nil, variable=false)

  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
  @comments = comments
  @variable = variable
end

Instance Attribute Details

#children_criteriaObject

Returns the value of attribute children_criteria.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def children_criteria
  @children_criteria
end

#code_list_idObject (readonly)

Returns the value of attribute code_list_id.



147
148
149
# File 'lib/hqmf-model/data_criteria.rb', line 147

def code_list_id
  @code_list_id
end

#commentsObject

Returns the value of attribute comments.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def comments
  @comments
end

#definitionObject

Returns the value of attribute definition.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def definition
  @definition
end

#derivation_operatorObject (readonly)

Returns the value of attribute derivation_operator.



147
148
149
# File 'lib/hqmf-model/data_criteria.rb', line 147

def derivation_operator
  @derivation_operator
end

#descriptionObject (readonly)

Returns the value of attribute description.



147
148
149
# File 'lib/hqmf-model/data_criteria.rb', line 147

def description
  @description
end

#display_nameObject

Returns the value of attribute display_name.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def display_name
  @display_name
end

#effective_timeObject

Returns the value of attribute effective_time.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def effective_time
  @effective_time
end

#field_valuesObject

Returns the value of attribute field_values.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def field_values
  @field_values
end

#idObject

Returns the value of attribute id.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def id
  @id
end

#inline_code_listObject

Returns the value of attribute inline_code_list.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def inline_code_list
  @inline_code_list
end

#negationObject

Returns the value of attribute negation.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def negation
  @negation
end

#negation_code_list_idObject

Returns the value of attribute negation_code_list_id.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def negation_code_list_id
  @negation_code_list_id
end

#source_data_criteriaObject (readonly)

Returns the value of attribute source_data_criteria.



147
148
149
# File 'lib/hqmf-model/data_criteria.rb', line 147

def source_data_criteria
  @source_data_criteria
end

#specific_occurrenceObject (readonly)

Returns the value of attribute specific_occurrence.



147
148
149
# File 'lib/hqmf-model/data_criteria.rb', line 147

def specific_occurrence
  @specific_occurrence
end

#specific_occurrence_constObject (readonly)

Returns the value of attribute specific_occurrence_const.



147
148
149
# File 'lib/hqmf-model/data_criteria.rb', line 147

def specific_occurrence_const
  @specific_occurrence_const
end

#statusObject

Returns the value of attribute status.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def status
  @status
end

#subset_operatorsObject

Returns the value of attribute subset_operators.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def subset_operators
  @subset_operators
end

#temporal_referencesObject

Returns the value of attribute temporal_references.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def temporal_references
  @temporal_references
end

#titleObject (readonly)

Returns the value of attribute title.



147
148
149
# File 'lib/hqmf-model/data_criteria.rb', line 147

def title
  @title
end

#valueObject

Returns the value of attribute value.



148
149
150
# File 'lib/hqmf-model/data_criteria.rb', line 148

def value
  @value
end

#variableObject (readonly)

Returns the value of attribute variable.



147
148
149
# File 'lib/hqmf-model/data_criteria.rb', line 147

def variable
  @variable
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



204
205
206
207
# File 'lib/hqmf-model/data_criteria.rb', line 204

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, version = 'r1') ⇒ Object



379
380
381
# File 'lib/hqmf-model/data_criteria.rb', line 379

def self.definition_for_template_id(template_id, version='r1')
  get_template_id_map(version)[template_id]
end

.from_json(id, json) ⇒ Object

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



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

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']
  comments = json['comments'] if json['comments']
  variable = json['variable'] || false

  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, comments, variable)
end

.get_settings_for_definition(definition, status) ⇒ Object



368
369
370
371
372
373
374
375
376
377
# File 'lib/hqmf-model/data_criteria.rb', line 368

def self.get_settings_for_definition(definition, status)
  settings_file = File.expand_path('../data_criteria.json', __FILE__)
  settings_map = get_settings_map
  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_settings_mapObject



362
363
364
365
366
# File 'lib/hqmf-model/data_criteria.rb', line 362

def self.get_settings_map
  return @settings_map if @settings_map
  settings_file = File.expand_path('../data_criteria.json', __FILE__)
  @settings_map = JSON.parse(File.read(settings_file))
end

.get_template_id_map(version = "r1") ⇒ Object



403
404
405
# File 'lib/hqmf-model/data_criteria.rb', line 403

def self.get_template_id_map(version="r1")
  read_template_id_map(version)
end

.statuses_by_definitionObject



296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
# File 'lib/hqmf-model/data_criteria.rb', line 296

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, version = "r1") ⇒ Object



383
384
385
386
387
# File 'lib/hqmf-model/data_criteria.rb', line 383

def self.template_id_for_definition(definition, status, negation, version="r1")
  # in r2 negation uses the same template as a positive assertion
  negation = false if version == "r2"
  get_template_id_map(version).key({'definition' => definition, 'status' => status || '', 'negation' => negation})
end

.title_for_template_id(template_id, version = 'r1') ⇒ Object



389
390
391
392
393
394
395
396
397
398
399
400
401
# File 'lib/hqmf-model/data_criteria.rb', line 389

def self.title_for_template_id(template_id, version='r1')
  value = get_template_id_map(version)[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



342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
# File 'lib/hqmf-model/data_criteria.rb', line 342

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



275
276
277
278
279
280
281
282
283
284
285
286
287
# File 'lib/hqmf-model/data_criteria.rb', line 275

def base_json
  x = nil
  json = build_hash(self, [:title,:display_name,:description,: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,:variable])
  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[:comments] = @comments if @comments
  json
end

#hard_statusObject



217
218
219
# File 'lib/hqmf-model/data_criteria.rb', line 217

def hard_status
  @settings['hard_status']
end

#has_subset(subset_operator) ⇒ Object



292
293
294
# File 'lib/hqmf-model/data_criteria.rb', line 292

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

#has_temporal(temporal_reference) ⇒ Object



289
290
291
# File 'lib/hqmf-model/data_criteria.rb', line 289

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

#is_same_type?(criteria) ⇒ Boolean

Returns:

  • (Boolean)


265
266
267
268
# File 'lib/hqmf-model/data_criteria.rb', line 265

def is_same_type?(criteria)
   return @definition == criteria.definition && @hard_status == criteria.hard_status &&
          @negation == criteria.negation && all_code_set_oids.sort == criteria.all_code_set_oids.sort
end

#patient_api_functionObject



214
215
216
# File 'lib/hqmf-model/data_criteria.rb', line 214

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

#propertyObject



211
212
213
# File 'lib/hqmf-model/data_criteria.rb', line 211

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

#referenced_data_criteria(document) ⇒ Object



320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
# File 'lib/hqmf-model/data_criteria.rb', line 320

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

#to_jsonObject



270
271
272
273
# File 'lib/hqmf-model/data_criteria.rb', line 270

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

#typeObject



208
209
210
# File 'lib/hqmf-model/data_criteria.rb', line 208

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

#update_copy(hard_status, title, description, derivation_operator, definition) ⇒ Object



220
221
222
223
224
225
226
# File 'lib/hqmf-model/data_criteria.rb', line 220

def update_copy(hard_status, title, description, derivation_operator, definition)
  @settings['hard_status'] = hard_status
  @title = title
  @description = description
  @derivation_operator = derivation_operator
  @definition = definition
end