Class: Ruby::Rego::Evaluator::RuleEvaluator

Inherits:
Object
  • Object
show all
Includes:
BindingHelpers
Defined in:
lib/ruby/rego/evaluator/rule_evaluator.rb,
lib/ruby/rego/evaluator/rule_evaluator/bindings.rb

Overview

Binding helpers for rule evaluation. :reek:DataClump

Defined Under Namespace

Classes: ModifierContext, QueryContext, ValueEvaluationContext

Instance Method Summary collapse

Constructor Details

#initialize(environment:, expression_evaluator:) ⇒ RuleEvaluator

Returns a new instance of RuleEvaluator.

Parameters:



38
39
40
41
42
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 38

def initialize(environment:, expression_evaluator:)
  @environment = environment
  @expression_evaluator = expression_evaluator
  @unifier = Unifier.new
end

Instance Method Details

#evaluate_function_call(name, args) ⇒ Value

Parameters:

  • name (String)
  • args (Array<Value>)

Returns:



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 60

def evaluate_function_call(name, args)
  cache = memoization&.context&.function_values
  if cache
    key = [name.to_s, args]
    return cache[key] if cache.key?(key)

    cache[key] = evaluate_function_call_uncached(name, args)
    return cache[key]
  end

  evaluate_function_call_uncached(name, args)
end

#evaluate_function_call_uncached(name, args) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 73

def evaluate_function_call_uncached(name, args)
  rules = environment.rules.fetch(name.to_s) { [] }
  function_rules = rules.select(&:function?)
  return UndefinedValue.new if function_rules.empty?

  value = evaluate_function_rules(function_rules, args)
  return value unless value.is_a?(Array)

  resolved = resolve_conflicts(value, name)
  resolved || UndefinedValue.new
end

#evaluate_group(rules) ⇒ Value

Parameters:

Returns:



46
47
48
49
50
51
52
53
54
55
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 46

def evaluate_group(rules)
  return UndefinedValue.new if rules.empty?

  first_rule = rules.first
  return UndefinedValue.new if first_rule.function?
  return evaluate_partial_set_rules(rules) if first_rule.partial_set?
  return evaluate_partial_object_rules(rules) if first_rule.partial_object?

  evaluate_complete_rules(rules)
end

#evaluate_rule(rule) ⇒ Value, Array

:reek:FeatureEnvy

Parameters:

Returns:



88
89
90
91
92
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 88

def evaluate_rule(rule)
  values = rule_body_values(rule)
  resolved = resolve_conflicts(values, rule.name)
  resolved || UndefinedValue.new
end

#query_solutions(literals, env = environment) ⇒ Enumerator

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parameters:

  • literals (Array<Object>)
  • env (Environment) (defaults to: environment)

Returns:

  • (Enumerator)


98
99
100
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 98

def query_solutions(literals, env = environment)
  eval_query(literals, env)
end