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 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.

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

children_criteria[RW]
code_list_id[R]
comments[RW]
definition[RW]
derivation_operator[R]
description[R]
display_name[RW]
effective_time[RW]
field_values[RW]
id[RW]
inline_code_list[RW]
negation[RW]
negation_code_list_id[RW]
source_data_criteria[R]
specific_occurrence[R]
specific_occurrence_const[R]
status[RW]
subset_operators[RW]
temporal_references[RW]
title[R]
value[RW]
variable[R]

Public Class Methods

create_from_category(id, title, description, code_list_id, category, sub_category=nil, negation=false, negation_code_list_id=nil) click to toggle source

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
definition_for_template_id(template_id, version='r1') click to toggle source
# 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) click to toggle source

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
get_settings_for_definition(definition, status) click to toggle source
# 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_map() click to toggle source
# 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") click to toggle source
# File lib/hqmf-model/data_criteria.rb, line 439
def self.get_template_id_map(version="r1")
  read_template_id_map(version)
end
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=nil, comments=nil, variable=false) click to toggle source

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 [Hash>] inline_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
statuses_by_definition() click to toggle source
# 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") click to toggle source
# 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') click to toggle source
# 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

convert_value(json) click to toggle source
# 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
read_template_id_map(version) click to toggle source
# 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

all_code_set_oids() click to toggle source
# 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_json() click to toggle source
# 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
definition=(definition) click to toggle source
# File lib/hqmf-model/data_criteria.rb, line 263
def definition=(definition)
  @definition = definition
  @settings = HQMF::DataCriteria.get_settings_for_definition(@definition, @status)
end
hard_status() click to toggle source
# File lib/hqmf-model/data_criteria.rb, line 253
def hard_status
  @settings['hard_status']
end
has_subset(subset_operator) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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_function() click to toggle source
# 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
property() click to toggle source
# File lib/hqmf-model/data_criteria.rb, line 247
def property
  @settings['property'].to_sym unless @settings['property'].nil?
end
referenced_data_criteria(document) click to toggle source
# 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
status=(status) click to toggle source
# File lib/hqmf-model/data_criteria.rb, line 267
def status=(status)
  @status = status
  @settings = HQMF::DataCriteria.get_settings_for_definition(@definition, @status)
end
to_json() click to toggle source
# File lib/hqmf-model/data_criteria.rb, line 306
def to_json
  json = base_json
  {self.id.to_s.to_sym => json}
end
type() click to toggle source
# 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) click to toggle source
# 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

normalize_status(definition, status) click to toggle source
# 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