Module: DecisionAgent::Dsl::Operators::BasicComparisonOperators

Defined in:
lib/decision_agent/dsl/operators/basic_comparison_operators.rb

Overview

Handles basic comparison operators: eq, neq, gt, gte, lt, lte, in, present, blank

Class Method Summary collapse

Class Method Details

.comparable?(val1, val2) ⇒ Boolean

Checks if two values can be compared with <, >, <=, >= Allows comparison between numeric types (Float, Integer, etc.) or same string types

Returns:

  • (Boolean)


67
68
69
70
71
72
73
74
75
76
# File 'lib/decision_agent/dsl/operators/basic_comparison_operators.rb', line 67

def self.comparable?(val1, val2)
  # Both are numeric - allow comparison between different numeric types
  # (e.g., Integer and Float are comparable in Ruby)
  return true if val1.is_a?(Numeric) && val2.is_a?(Numeric)

  # Both are strings - require exact same type
  return val1.instance_of?(val2.class) if val1.is_a?(String) && val2.is_a?(String)

  false
end

.handle(op, actual_value, expected_value) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/decision_agent/dsl/operators/basic_comparison_operators.rb', line 8

def self.handle(op, actual_value, expected_value)
  case op
  when "eq"
    # Equality - uses Ruby's == for comparison
    actual_value == expected_value

  when "neq"
    # Not equal - inverse of ==
    actual_value != expected_value

  when "gt"
    # Greater than - only for comparable types (numbers, strings)
    comparable?(actual_value, expected_value) && actual_value > expected_value

  when "gte"
    # Greater than or equal - only for comparable types
    comparable?(actual_value, expected_value) && actual_value >= expected_value

  when "lt"
    # Less than - only for comparable types
    comparable?(actual_value, expected_value) && actual_value < expected_value

  when "lte"
    # Less than or equal - only for comparable types
    comparable?(actual_value, expected_value) && actual_value <= expected_value

  when "in"
    # Array membership - checks if actual_value is in the expected array
    Array(expected_value).include?(actual_value)

  when "present"
    # PRESENT SEMANTICS:
    # Returns true if value exists AND is not empty
    # - nil: false
    # - Empty string "": false
    # - Empty array []: false
    # - Empty hash {}: false
    # - Zero 0: true (zero is a valid value)
    # - False boolean: true (false is a valid value)
    # - Non-empty values: true
    !actual_value.nil? && (actual_value.respond_to?(:empty?) ? !actual_value.empty? : true)

  when "blank"
    # BLANK SEMANTICS:
    # Returns true if value is nil OR empty
    # - nil: true
    # - Empty string "": true
    # - Empty array []: true
    # - Empty hash {}: true
    # - Zero 0: false (zero is a valid value)
    # - False boolean: false (false is a valid value)
    # - Non-empty values: false
    actual_value.nil? || (actual_value.respond_to?(:empty?) ? actual_value.empty? : false)
  end
  # Returns nil if not handled by this module
end