Class: Inferno::DSL::FHIREvaluation::Rules::AllSearchParametersHaveExamples

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

Instance Method Summary collapse

Methods included from Inferno::DSL::FhirpathEvaluation

#evaluate_fhirpath

Instance Method Details

#check(context) ⇒ Object



10
11
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
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_search_parameters_have_examples.rb', line 10

def check(context)
  unless ENV['FHIRPATH_URL']
    message = 'FHIRPATH_URL is not found. Skipping rule AllSearchParametersHaveExamples.'
    result = EvaluationResult.new(message, severity: 'warning', rule: self)
    context.add_result result
    return
  end

  unused_resource_urls = []
  search_params = context.ig.resources_by_type['SearchParameter']

  search_params.each do |search_param|
    unused_resource_urls.push search_param.url unless param_is_used?(search_param, context)
  end

  if unused_resource_urls.any?
    message = "Found SearchParameters with no searchable data: \n\t#{unused_resource_urls.join(' ,')}"
    result = EvaluationResult.new(message, rule: self)
  elsif !search_params.empty?
    message = 'All SearchParameters have examples'
    result = EvaluationResult.new(message, severity: 'success', rule: self)
  else
    message = 'IG contains no SearchParameter'
    result = EvaluationResult.new(message, severity: 'information', rule: self)
  end

  context.add_result result
end

#param_is_used?(param, context) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_search_parameters_have_examples.rb', line 39

def param_is_used?(param, context)
  # Assume that all params have an expression (fhirpath)
  # This is not guaranteed since the field is 0..1
  # but without it there's no other way to select a value
  # Return warning if params don't include expression
  unless param.expression
    message = "Search parameter #{param.url} doesn't have an expression."
    result = EvaluationResult.new(message, severity: 'warning', rule: self)
    context.add_result result
    return false
  end

  used = false

  context.data.each do |resource|
    next unless param.base.include? resource.resourceType

    begin
      result = evaluate_fhirpath(resource: resource, path: param.expression)
    rescue StandardError => e
      message = "SearchParameter #{param.url} failed to evaluate due to an error. " \
                "Expression: #{param.expression}. #{e}"
      result = EvaluationResult.new(message)
      context.add_result result

      used = true
      break
    end

    if result.present?
      used = true
      break
    end
  end
  used
end