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}, # ABATEMENT_DATETIME is no longer used.
    'ACTIVE_DATETIME' => {title:'Active Date/Time', coded_entry_method: :active_datetime, field_type: :timestamp},
    # ADMISSION_DATETIME is no longer used.
    '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 is no longer used.
    '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 is no longer used.
    '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},
    # AUTHOR DATETIME
    'AUTHOR_DATETIME' => {title:'Author Date/Time', coded_entry_method: :author_datetime, field_type: :timestamp},
    # Added in QDM 5.4
    'CATEGORY' => {title:'Category', coded_entry_method: :category, 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 is no longer used
    '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
    # Could not find a code and code_system for this data criteria (days supplied) in HQMF QDM IG v3
    'DAYS_SUPPLIED' => {title:'Days Supplied', coded_entry_method: :days_supplied, field_type: :value},
    'DIAGNOSIS' => {title:'Diagnosis', coded_entry_method: :diagnosis, field_type: :value},
    # DISCHARGE_DATETIME is no longer used.
    '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 is no longer used.
    '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},
    'DISPENSER_IDENTIFIER' => {title:'Dispenser Identifier', coded_entry_method: :dispenser_identifier, 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 is no longer used.
    '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 is no longer used.
    '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},
    # Added in QDM 5.4
    'MEDIUM' => {title:'Medium', coded_entry_method: :medium, field_type: :value},
    'METHOD' => {title:'Method', coded_entry_method: :method, template_id: '', field_type: :value},
    # Negation Rationale isn't encoded
    # ONSET_AGE is no longer used.
    '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 is no longer used.
    'ONSET_DATETIME' => {title:'Onset Datetime', coded_entry_method: :start_date, field_type: :timestamp},
    # ORDINAL is no longer used.
    '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 is no longer used.
    '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},
    'PRESCRIBER_IDENTIFIER' => {title:'Prescriber Identifier', coded_entry_method: :prescriber_identifier, field_type: :value},
    'PRINCIPAL_DIAGNOSIS' => {title:'Principal Diagnosis', coded_entry_method: :principal_diagnosis, field_type: :value},
    # PROVIDER_PREFERENCE is no longer used.
    '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 is no longer used.
    '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 is no longer used.
    '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 is no longer used.
    '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},
    # Added in QDM 5.4
    'RECIPIENT' => {title:'Recipient', coded_entry_method: :recipient, field_type: :value},
    # RECORDED_DATETIME is no longer used.
    '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 is no longer used.
    '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},
    # Added in QDM 5.4
    'SENDER' => {title:'Sender', coded_entry_method: :sender, field_type: :value},
    'SETTING' => {title:'Setting', coded_entry_method: :setting, 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 is no longer used.
    'SIGNED_DATETIME' =>  {title:'Signed Date/Time', coded_entry_method: :signed_date_time, field_type: :timestamp},
    # START_DATETIME is no longer used.
    '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 is no longer used.
    '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},

    # 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, TRANSFER_FROM_DATETIME, TRANSFER_TO, and TRANSFER_TO_DATETIME are no longer used.
    '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:



210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/hqmf-model/data_criteria.rb', line 210

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.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def children_criteria
  @children_criteria
end

#code_list_idObject (readonly)

Returns the value of attribute code_list_id.



183
184
185
# File 'lib/hqmf-model/data_criteria.rb', line 183

def code_list_id
  @code_list_id
end

#commentsObject

Returns the value of attribute comments.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def comments
  @comments
end

#definitionObject

Returns the value of attribute definition.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def definition
  @definition
end

#derivation_operatorObject (readonly)

Returns the value of attribute derivation_operator.



183
184
185
# File 'lib/hqmf-model/data_criteria.rb', line 183

def derivation_operator
  @derivation_operator
end

#descriptionObject (readonly)

Returns the value of attribute description.



183
184
185
# File 'lib/hqmf-model/data_criteria.rb', line 183

def description
  @description
end

#display_nameObject

Returns the value of attribute display_name.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def display_name
  @display_name
end

#effective_timeObject

Returns the value of attribute effective_time.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def effective_time
  @effective_time
end

#field_valuesObject

Returns the value of attribute field_values.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def field_values
  @field_values
end

#idObject

Returns the value of attribute id.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def id
  @id
end

#inline_code_listObject

Returns the value of attribute inline_code_list.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def inline_code_list
  @inline_code_list
end

#negationObject

Returns the value of attribute negation.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def negation
  @negation
end

#negation_code_list_idObject

Returns the value of attribute negation_code_list_id.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def negation_code_list_id
  @negation_code_list_id
end

#source_data_criteriaObject (readonly)

Returns the value of attribute source_data_criteria.



183
184
185
# File 'lib/hqmf-model/data_criteria.rb', line 183

def source_data_criteria
  @source_data_criteria
end

#specific_occurrenceObject (readonly)

Returns the value of attribute specific_occurrence.



183
184
185
# File 'lib/hqmf-model/data_criteria.rb', line 183

def specific_occurrence
  @specific_occurrence
end

#specific_occurrence_constObject (readonly)

Returns the value of attribute specific_occurrence_const.



183
184
185
# File 'lib/hqmf-model/data_criteria.rb', line 183

def specific_occurrence_const
  @specific_occurrence_const
end

#statusObject

Returns the value of attribute status.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def status
  @status
end

#subset_operatorsObject

Returns the value of attribute subset_operators.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def subset_operators
  @subset_operators
end

#temporal_referencesObject

Returns the value of attribute temporal_references.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def temporal_references
  @temporal_references
end

#titleObject (readonly)

Returns the value of attribute title.



183
184
185
# File 'lib/hqmf-model/data_criteria.rb', line 183

def title
  @title
end

#valueObject

Returns the value of attribute value.



184
185
186
# File 'lib/hqmf-model/data_criteria.rb', line 184

def value
  @value
end

#variableObject (readonly)

Returns the value of attribute variable.



183
184
185
# File 'lib/hqmf-model/data_criteria.rb', line 183

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



240
241
242
243
# File 'lib/hqmf-model/data_criteria.rb', line 240

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



415
416
417
# File 'lib/hqmf-model/data_criteria.rb', line 415

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



273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/hqmf-model/data_criteria.rb', line 273

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



404
405
406
407
408
409
410
411
412
413
# File 'lib/hqmf-model/data_criteria.rb', line 404

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



398
399
400
401
402
# File 'lib/hqmf-model/data_criteria.rb', line 398

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



439
440
441
# File 'lib/hqmf-model/data_criteria.rb', line 439

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

.statuses_by_definitionObject



332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# File 'lib/hqmf-model/data_criteria.rb', line 332

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



419
420
421
422
423
# File 'lib/hqmf-model/data_criteria.rb', line 419

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



425
426
427
428
429
430
431
432
433
434
435
436
437
# File 'lib/hqmf-model/data_criteria.rb', line 425

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



378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
# File 'lib/hqmf-model/data_criteria.rb', line 378

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



311
312
313
314
315
316
317
318
319
320
321
322
323
# File 'lib/hqmf-model/data_criteria.rb', line 311

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



253
254
255
# File 'lib/hqmf-model/data_criteria.rb', line 253

def hard_status
  @settings['hard_status']
end

#has_subset(subset_operator) ⇒ Object



328
329
330
# File 'lib/hqmf-model/data_criteria.rb', line 328

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

#has_temporal(temporal_reference) ⇒ Object



325
326
327
# File 'lib/hqmf-model/data_criteria.rb', line 325

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

#is_same_type?(criteria) ⇒ Boolean

Returns:

  • (Boolean)


301
302
303
304
# File 'lib/hqmf-model/data_criteria.rb', line 301

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



250
251
252
# File 'lib/hqmf-model/data_criteria.rb', line 250

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

#propertyObject



247
248
249
# File 'lib/hqmf-model/data_criteria.rb', line 247

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

#referenced_data_criteria(document) ⇒ Object



356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
# File 'lib/hqmf-model/data_criteria.rb', line 356

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



306
307
308
309
# File 'lib/hqmf-model/data_criteria.rb', line 306

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

#typeObject



244
245
246
# File 'lib/hqmf-model/data_criteria.rb', line 244

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

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



256
257
258
259
260
261
262
# File 'lib/hqmf-model/data_criteria.rb', line 256

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