Class: Inferno::DSL::FHIREvaluation::Rules::AllResourcesReachable

Inherits:
Inferno::DSL::FHIREvaluation::Rule show all
Defined in:
lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#configObject

Returns the value of attribute config.



10
11
12
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb', line 10

def config
  @config
end

#referenced_resourcesObject

Returns the value of attribute referenced_resources.



10
11
12
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb', line 10

def referenced_resources
  @referenced_resources
end

#referencing_resourcesObject

Returns the value of attribute referencing_resources.



10
11
12
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb', line 10

def referencing_resources
  @referencing_resources
end

#resource_idsObject

Returns the value of attribute resource_ids.



10
11
12
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb', line 10

def resource_ids
  @resource_ids
end

#resource_type_idsObject

Returns the value of attribute resource_type_ids.



10
11
12
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb', line 10

def resource_type_ids
  @resource_type_ids
end

Instance Method Details

#assess_reachability(resource_id, references) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb', line 41

def assess_reachability(resource_id, references)
  makes_resolvable_reference = false
  references.each do |reference|
    type = reference[:type]
    referenced_id = reference[:id]

    if type == ''
      if resource_ids.include?(referenced_id)
        makes_resolvable_reference = true
        referenced_resources.add(referenced_id)
      end
    elsif resource_type_ids[type].include?(referenced_id)
      makes_resolvable_reference = true
      referenced_resources.add(referenced_id)
    end
  end
  referencing_resources.add(resource_id) if makes_resolvable_reference
end

#check(context) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb', line 12

def check(context)
  @config = context.config
  @referenced_resources = Set.new
  @referencing_resources = Set.new

  extractor = Inferno::DSL::FHIREvaluation::ReferenceExtractor.new
  @resource_type_ids = extractor.extract_resource_type_ids(context.data)
  @resource_ids = Set.new(resource_type_ids.values.flatten.uniq)
  reference_map = extractor.extract_references(context.data)

  reference_map.each do |resource_id, references|
    assess_reachability(resource_id, references)
  end

  island_resources = resource_ids - referenced_resources - referencing_resources
  island_resources.to_a.sort!

  if island_resources.any?
    message = "Found resources that have no resolved references and are not referenced: #{
      island_resources.join(', ')}"
    result = EvaluationResult.new(message, rule: self)
  else
    message = 'All resources are reachable'
    result = EvaluationResult.new(message, severity: 'success', rule: self)
  end

  context.add_result result
end