Class: Ruby::Rego::Evaluator::RuleEvaluator
- Inherits:
-
Object
- Object
- Ruby::Rego::Evaluator::RuleEvaluator
- 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
-
#evaluate_function_call(name, args) ⇒ Value
-
#evaluate_function_call_uncached(name, args) ⇒ Object
-
#evaluate_group(rules) ⇒ Value
-
#evaluate_rule(rule) ⇒ Value, Array
:reek:FeatureEnvy.
-
#function_rule_table ⇒ Object
-
#initialize(environment:, expression_evaluator:, rules: nil, package_key: "") ⇒ RuleEvaluator
constructor
:reek:LongParameterList.
-
#query_solutions(literals, env = environment) ⇒ Enumerator
private
Constructor Details
#initialize(environment:, expression_evaluator:, rules: nil, package_key: "") ⇒ RuleEvaluator
:reek:LongParameterList
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
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
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
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_table ⇒ Object
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.
105 106 107 |
# File 'lib/ruby/rego/evaluator/rule_evaluator.rb', line 105 def query_solutions(literals, env = environment) eval_query(literals, env) end |