class HQMF2::SpecificOccurrenceAndSource

Handles various tasks that the Data Criteria needs performed to obtain and modify secific occurrences

Public Class Methods

new(entry, id, local_variable_name, data_criteria_references, occurrences_map) click to toggle source
# File lib/hqmf-parser/2.0/data_criteria_helpers/dc_specific_occurrences_and_source_data_criteria_extract.rb, line 7
def initialize(entry, id, local_variable_name, data_criteria_references, occurrences_map)
  @entry = entry
  @id = id
  @local_variable_name = local_variable_name
  @occurrences_map = occurrences_map
  @is_variable = DataCriteriaMethods.extract_variable(@local_variable_name, @id)
  @data_criteria_references = data_criteria_references
end

Public Instance Methods

extract_specific_occurrences_and_source_data_criteria() click to toggle source

Retrieve the specific occurrence and source data criteria information (or just source if there is no specific)

# File lib/hqmf-parser/2.0/data_criteria_helpers/dc_specific_occurrences_and_source_data_criteria_extract.rb, line 17
def extract_specific_occurrences_and_source_data_criteria
  specific_def = @entry.at_xpath('./*/cda:outboundRelationship[@typeCode="OCCR"]', HQMF2::Document::NAMESPACES)
  source_def = @entry.at_xpath('./*/cda:outboundRelationship[cda:subsetCode/@code="SOURCE"]',
                               HQMF2::Document::NAMESPACES)
  if specific_def
    source_data_criteria_extension = HQMF2::Utilities.attr_val(specific_def,
                                                               './cda:criteriaReference/cda:id/@extension')
    source_data_criteria_root = HQMF2::Utilities.attr_val(specific_def, './cda:criteriaReference/cda:id/@root')

    occurrence_criteria = @data_criteria_references[strip_tokens("#{source_data_criteria_extension}_#{source_data_criteria_root}")]

    return if occurrence_criteria.nil?
    specific_occurrence_const = HQMF2::Utilities.attr_val(specific_def,
                                                          './cda:localVariableName/@controlInformationRoot')
    specific_occurrence = HQMF2::Utilities.attr_val(specific_def,
                                                    './cda:localVariableName/@controlInformationExtension')

    # FIXME: Remove debug statements after cleaning up occurrence handling
    # build regex for extracting alpha-index of specific occurrences
    occurrence_identifier = obtain_occurrence_identifier(strip_tokens(@id),
                                                         strip_tokens(@local_variable_name) || '',
                                                         strip_tokens(source_data_criteria_extension),
                                                         @is_variable)

    handle_specific_and_source(occurrence_identifier, source_data_criteria_extension, source_data_criteria_root,
                               specific_occurrence_const, specific_occurrence)

  elsif source_def
    extension = HQMF2::Utilities.attr_val(source_def, './cda:criteriaReference/cda:id/@extension')
    root = HQMF2::Utilities.attr_val(source_def, './cda:criteriaReference/cda:id/@root')
    ["#{extension}_#{root}_source", root, extension] # return the soruce data criteria itself, the rest will be blank
  end
end
handle_occurrence_var(stripped_id, stripped_lvn, stripped_sdc, occurrence_id_compare, occurrence_lvn_compare, occ_index) click to toggle source

If the occurrence is a variable, extract the occurrence identifier (if present)

# File lib/hqmf-parser/2.0/data_criteria_helpers/dc_specific_occurrences_and_source_data_criteria_extract.rb, line 106
def handle_occurrence_var(stripped_id, stripped_lvn, stripped_sdc, occurrence_id_compare, occurrence_lvn_compare, occ_index)
  # TODO: Handle specific occurrences of variables that don't self-reference?
  if stripped_id.match(/^#{occurrence_id_compare}/)
    return stripped_id[occ_index]
  elsif stripped_lvn.match(/^#{occurrence_lvn_compare}/)
    return stripped_lvn[occ_index]
  elsif stripped_sdc.match(/^#{occurrence_id_compare}/)
    return stripped_sdc[occ_index]
  end
end
handle_specific_and_source(occurrence_identifier, source_data_criteria_extension, source_data_criteria_root, specific_occurrence_const, specific_occurrence) click to toggle source

Handle setting the specific and source instance variables with a given occurrence identifier

# File lib/hqmf-parser/2.0/data_criteria_helpers/dc_specific_occurrences_and_source_data_criteria_extract.rb, line 52
def handle_specific_and_source(occurrence_identifier, source_data_criteria_extension, source_data_criteria_root,
                               specific_occurrence_const, specific_occurrence)
  source_data_criteria = "#{source_data_criteria_extension}_#{source_data_criteria_root}_source"
  if !occurrence_identifier.blank?
    # if it doesn't exist, add extracted occurrence to the map
    # puts "\tSetting #{@source_data_criteria}-#{@source_data_criteria_root} to #{occurrence_identifier}"
    @occurrences_map[strip_tokens(source_data_criteria)] ||= occurrence_identifier
    specific_occurrence ||= occurrence_identifier
    specific_occurrence_const = "#{source_data_criteria}".upcase
  else
    # create variable occurrences that do not already exist
    if @is_variable
      # puts "\tSetting #{@source_data_criteria}-#{@source_data_criteria_root} to #{occurrence_identifier}"
      @occurrences_map[strip_tokens(source_data_criteria)] ||= occurrence_identifier
    end
    occurrence = @occurrences_map.try(:[], strip_tokens(source_data_criteria))
    unless occurrence
      fail "Could not find occurrence mapping for #{source_data_criteria}, #{source_data_criteria_root}"
    end
    # puts "\tUsing #{occurrence} for #{@id}"
    specific_occurrence ||= occurrence
  end

  specific_occurrence = 'A' unless specific_occurrence
  specific_occurrence_const = source_data_criteria.upcase unless specific_occurrence_const
  [source_data_criteria, source_data_criteria_root, source_data_criteria_extension,
   specific_occurrence, specific_occurrence_const]
end
obtain_occurrence_identifier(stripped_id, stripped_lvn, stripped_sdc, is_variable) click to toggle source

Using the id, source data criteria id, and local variable name (and whether or not it's a variable),

extract the occurrence identifiter (if one exists).
# File lib/hqmf-parser/2.0/data_criteria_helpers/dc_specific_occurrences_and_source_data_criteria_extract.rb, line 83
def obtain_occurrence_identifier(stripped_id, stripped_lvn, stripped_sdc, is_variable)
  if is_variable || (stripped_sdc.include? 'qdm_var')
    occurrence_lvn_regex = 'occ[A-Z]of_qdm_var'
    occurrence_id_regex = 'occ[A-Z]of_qdm_var'
    occ_index = 3
    return handle_occurrence_var(stripped_id, stripped_lvn, stripped_sdc, occurrence_id_regex, occurrence_lvn_regex, occ_index)
  else
    occurrence_lvn_regex = 'Occurrence[A-Z]of'
    occurrence_id_regex = 'Occurrence[A-Z]_'
    occ_index = 10

    occurrence_identifier = handle_occurrence_var(
      stripped_id, stripped_lvn, stripped_sdc,
      "#{occurrence_id_regex}#{stripped_sdc}", "#{occurrence_lvn_regex}#{stripped_sdc}",
      occ_index)
    return occurrence_identifier if occurrence_identifier.present?

    stripped_sdc[occ_index] if stripped_sdc.match(
      /(^#{occurrence_id_regex}| ^#{occurrence_id_regex}qdm_var_| ^#{occurrence_lvn_regex})| ^#{occurrence_lvn_regex}qdm_var_/)
  end
end