Class: Ruby::Rego::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby/rego/evaluator.rb,
lib/ruby/rego/evaluator/rule_evaluator.rb,
lib/ruby/rego/evaluator/binding_helpers.rb,
lib/ruby/rego/evaluator/assignment_support.rb,
lib/ruby/rego/evaluator/operator_evaluator.rb,
lib/ruby/rego/evaluator/query_node_builder.rb,
lib/ruby/rego/evaluator/reference_resolver.rb,
lib/ruby/rego/evaluator/variable_collector.rb,
lib/ruby/rego/evaluator/expression_dispatch.rb,
lib/ruby/rego/evaluator/rule_value_provider.rb,
lib/ruby/rego/evaluator/expression_evaluator.rb,
lib/ruby/rego/evaluator/reference_key_resolver.rb,
lib/ruby/rego/evaluator/comprehension_evaluator.rb,
lib/ruby/rego/evaluator/rule_evaluator/bindings.rb,
lib/ruby/rego/evaluator/object_literal_evaluator.rb

Overview

Evaluates compiled Rego modules against input and data.

Defined Under Namespace

Modules: AssignmentSupport, BindingHelpers, OperatorEvaluator, VariableCollectorHelpers Classes: BoundVariableCollector, ComprehensionEvaluator, ExpressionDispatch, ExpressionEvaluator, ObjectLiteralEvaluator, QueryNodeBuilder, ReferenceKeyResolver, ReferenceResolver, RuleEvaluator, RuleValueProvider, TemplateValueFormatter, VariableCollector

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(compiled_module, input: {}, data: {}) ⇒ Evaluator

Create an evaluator for a compiled module.

Parameters:

  • compiled_module (#rules_by_name, #package_path)

    compiled module

  • input (Object) (defaults to: {})

    input document

  • data (Object) (defaults to: {})

    data document



59
60
61
62
63
64
65
# File 'lib/ruby/rego/evaluator.rb', line 59

def initialize(compiled_module, input: {}, data: {})
  @compiled_module = compiled_module
  rules_by_name = compiled_module.rules_by_name
  package_path = compiled_module.package_path
  @environment = Environment.new(input: input, data: data, rules: rules_by_name)
  @expression_evaluator, @rule_evaluator = build_evaluators(rules_by_name, package_path)
end

Instance Attribute Details

#compiled_module#rules_by_name, #package_path (readonly)

The compiled module being evaluated.

Returns:

  • (#rules_by_name, #package_path)


70
71
72
# File 'lib/ruby/rego/evaluator.rb', line 70

def compiled_module
  @compiled_module
end

#environmentEnvironment (readonly)

The environment used to evaluate expressions and rules.

Returns:



75
76
77
# File 'lib/ruby/rego/evaluator.rb', line 75

def environment
  @environment
end

Class Method Details

.from_ast(ast_module, options = {}) ⇒ Evaluator

Build an evaluator directly from an AST module.

Parameters:

  • ast_module (AST::Module)

    parsed module

  • options (Hash) (defaults to: {})

    evaluator options (input, data, compiler)

Returns:



47
48
49
50
51
52
# File 'lib/ruby/rego/evaluator.rb', line 47

def self.from_ast(ast_module, options = {})
  default_input = {} # @type var default_input: Hash[untyped, untyped]
  default_data = {} # @type var default_data: Hash[untyped, untyped]
  options = { input: default_input, data: default_data, compiler: Compiler.new }.merge(options)
  new(options[:compiler].compile(ast_module), input: options[:input], data: options[:data])
end

.from_environment(compiled_module, environment) ⇒ Evaluator

Builds an evaluator with a preconfigured environment.

Parameters:

  • compiled_module (#rules_by_name, #package_path)

    compiled module

  • environment (Environment)

    preconfigured environment

Returns:



36
37
38
39
40
# File 'lib/ruby/rego/evaluator.rb', line 36

def self.from_environment(compiled_module, environment)
  evaluator = allocate
  evaluator.send(:initialize_with_environment, compiled_module, environment)
  evaluator
end

Instance Method Details

#evaluate(query = nil) ⇒ Result?

Evaluate either a query path or all rules.

Parameters:

  • query (Object, nil) (defaults to: nil)

    query path (e.g. “data.package.rule”)

Returns:

  • (Result, nil)

    evaluation result, or nil when a query is undefined



81
82
83
84
85
86
87
# File 'lib/ruby/rego/evaluator.rb', line 81

def evaluate(query = nil)
  environment.memoization.reset!
  value, bindings = query ? evaluate_query(query) : [evaluate_rules, nil]
  return nil if query && value.is_a?(UndefinedValue)

  ResultBuilder.new(value, bindings).build
end