class HQMF::DataCriteria
Represents a data criteria specification
Constants
- 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 theHQMF
. 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.- INTERSECT
- SATISFIES_ALL
- SATISFIES_ANY
- SOURCE_DATA_CRITERIA_TEMPLATE_ID
- SOURCE_DATA_CRITERIA_TEMPLATE_TITLE
- UNION
- VALUE_FIELDS
maps attribute codes to the attribute keys
- VARIABLE
- XPRODUCT
Attributes
Public Class Methods
create a new data criteria given a category and sub_category. A sub category can either be a status or a sub category
# 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
# 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
Create a new data criteria instance from a JSON hash keyed with symbols
# 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
# 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
# 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
# File lib/hqmf-model/data_criteria.rb, line 439 def self.get_template_id_map(version="r1") read_template_id_map(version) end
Create a new data criteria instance @param [String] id @param [String] title @param [String] display_name
@param [String] description @param [String] code_list_id
@param [String] negation_code_list_id
@param [List<String>] children_criteria
(ids of children data criteria) @param [String] derivation_operator
@param [String] definition @param [String] status @param [Value|Range|Coded] value @param [Hash<String,Value|Range|Coded>] field_values
@param [Range] effective_time
@param [Hashinline_code_list
@param [boolean] negation @param [String] negation_code_list_id
@param [List<TemporalReference>] temporal_references
@param [List<SubsetOperator>] subset_operators
@param [String] specific_occurrence
@param [String] specific_occurrence_const
@param [String] source_data_criteria
(id for the source data criteria, important for specific occurrences) @param [String] user comments for the criteria @param [Boolean] variable defines if the element is a QDM variable
# 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
# 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
# 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
# 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
Private Class Methods
# File lib/hqmf-model/data_criteria.rb, line 466 def self.convert_value(json) return nil unless json.present? type = json["type"] case type when 'TS', 'PQ' value = HQMF::Value.from_json(json) when 'IVL_PQ', 'IVL_TS' value = HQMF::Range.from_json(json) when 'CD' value = HQMF::Coded.from_json(json) when 'ANYNonNull' value = HQMF::AnyValue.from_json(json) when 'FLFS' value = HQMF::TypedReference.from_json(json) when 'ACT' # Currentlty forcing this as the SimpleXML reresentation contains a fulfills for these types value = HQMF::TypedReference.new(json["reference"], 'FLFS', '') when 'CMP' # For ResultComponent, json will have a value or "" for referenceRangeLow_value, for Component, will be nil if json['referenceRangeLow_value'] value = ResultComponent.new(json) else value = Component.new(json) end when 'COL' value = HQMF::Collection.from_json(json) when 'FAC' value = Facility.new(json) when 'ID' value = HQMF::Identifier.from_json(json) when 'RT' value = HQMF::Ratio.from_json(json) else raise "Unknown value type [#{type}]" end value end
# File lib/hqmf-model/data_criteria.rb, line 445 def self.read_template_id_map(version) HealthDataStandards::Util::HQMFTemplateHelper.template_id_map(version) end
Public Instance Methods
# 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
# 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
# File lib/hqmf-model/data_criteria.rb, line 263 def definition=(definition) @definition = definition @settings = HQMF::DataCriteria.get_settings_for_definition(@definition, @status) end
# File lib/hqmf-model/data_criteria.rb, line 253 def hard_status @settings['hard_status'] end
# 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
# 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
# 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
# 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
# File lib/hqmf-model/data_criteria.rb, line 247 def property @settings['property'].to_sym unless @settings['property'].nil? end
# 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
# File lib/hqmf-model/data_criteria.rb, line 267 def status=(status) @status = status @settings = HQMF::DataCriteria.get_settings_for_definition(@definition, @status) end
# File lib/hqmf-model/data_criteria.rb, line 306 def to_json json = base_json {self.id.to_s.to_sym => json} end
# File lib/hqmf-model/data_criteria.rb, line 244 def type @settings['category'].to_sym end
# 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
Private Instance Methods
# File lib/hqmf-model/data_criteria.rb, line 449 def normalize_status(definition, status) return status if status.nil? case status.downcase when 'completed', 'complete' case definition when 'diagnosis' 'active' else 'performed' end when 'order' 'ordered' else status.downcase end end