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/query.rb,
lib/ruby/rego/evaluator/rule_evaluator/bindings.rb,
lib/ruby/rego/evaluator/rule_evaluator/rule_bodies.rb,
lib/ruby/rego/evaluator/rule_evaluator/rule_values.rb,
lib/ruby/rego/evaluator/rule_evaluator/partial_rules.rb,
lib/ruby/rego/evaluator/rule_evaluator/function_rules.rb

Overview

Function-rule evaluation: argument unification and else clauses. :reek:DataClump

Defined Under Namespace

Classes: ModifierContext, QueryContext, ValueEvaluationContext

Instance Method Summary collapse

Constructor Details

#initialize(environment:, expression_evaluator:, rules: nil, package_key: "") ⇒ RuleEvaluator

:reek:LongParameterList

Parameters:

  • environment (Environment)
  • expression_evaluator (ExpressionEvaluator)
  • rules (Hash{String => Array<AST::Rule>}, nil) (defaults to: nil)

    function lookup table (defaults to environment.rules)

  • package_key (String) (defaults to: "")

    namespaces the function-value cache



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

def initialize(environment:, expression_evaluator:, rules: nil, package_key: "")
  @environment = environment
  @expression_evaluator = expression_evaluator
  @unifier = Unifier.new
  @rules = rules
  @package_key = package_key
end

Instance Method Details

#evaluate_function_call(name, args) ⇒ Value

Parameters:

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

Returns:



63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 63

def evaluate_function_call(name, args)
  cache = memoization&.context&.function_values
  if cache
    key = [package_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



76
77
78
79
80
81
82
83
84
85
86
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 76

def evaluate_function_call_uncached(name, args)
  rules = function_rule_table.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:



49
50
51
52
53
54
55
56
57
58
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 49

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:



95
96
97
98
99
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 95

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

#function_rule_tableObject



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

def function_rule_table
  @rules || environment.rules
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)


105
106
107
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 105

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