Module: Ruby::Rego::Builtins::Aggregates

Defined in:
lib/ruby/rego/builtins/aggregates.rb

Overview

Built-in aggregation helpers.

Constant Summary collapse

AGGREGATE_FUNCTIONS =
{
  "count" => :count,
  "sum" => :sum,
  "max" => :max,
  "min" => :min,
  "all" => :all,
  "any" => :any
}.freeze

Class Method Summary collapse

Class Method Details

.all(array) ⇒ Ruby::Rego::BooleanValue

Parameters:

Returns:



75
76
77
78
# File 'lib/ruby/rego/builtins/aggregates.rb', line 75

def self.all(array)
  Base.assert_type(array, expected: ArrayValue, context: "all")
  BooleanValue.new(array.value.all?(&:truthy?))
end

.any(array) ⇒ Ruby::Rego::BooleanValue

Parameters:

Returns:



82
83
84
85
# File 'lib/ruby/rego/builtins/aggregates.rb', line 82

def self.any(array)
  Base.assert_type(array, expected: ArrayValue, context: "any")
  BooleanValue.new(array.value.any?(&:truthy?))
end

.count(collection) ⇒ Ruby::Rego::NumberValue

Parameters:

Returns:



40
41
42
43
44
45
46
47
48
# File 'lib/ruby/rego/builtins/aggregates.rb', line 40

def self.count(collection)
  Base.assert_type(
    collection,
    expected: [ArrayValue, ObjectValue, SetValue, StringValue],
    context: "count"
  )

  NumberValue.new(collection.value.size)
end

.max(array) ⇒ Ruby::Rego::NumberValue

Parameters:

Returns:



59
60
61
62
63
# File 'lib/ruby/rego/builtins/aggregates.rb', line 59

def self.max(array)
  numbers = numeric_array(array, name: "max")
  ensure_non_empty(numbers, name: "max")
  NumberValue.new(numbers.max)
end

.min(array) ⇒ Ruby::Rego::NumberValue

Parameters:

Returns:



67
68
69
70
71
# File 'lib/ruby/rego/builtins/aggregates.rb', line 67

def self.min(array)
  numbers = numeric_array(array, name: "min")
  ensure_non_empty(numbers, name: "min")
  NumberValue.new(numbers.min)
end

.register!Ruby::Rego::Builtins::BuiltinRegistry



21
22
23
24
25
26
27
28
29
# File 'lib/ruby/rego/builtins/aggregates.rb', line 21

def self.register!
  registry = BuiltinRegistry.instance

  AGGREGATE_FUNCTIONS.each do |name, handler|
    register_function(registry, name, handler)
  end

  registry
end

.sum(array) ⇒ Ruby::Rego::NumberValue

Parameters:

Returns:



52
53
54
55
# File 'lib/ruby/rego/builtins/aggregates.rb', line 52

def self.sum(array)
  numbers = numeric_array(array, name: "sum")
  NumberValue.new(numbers.sum)
end