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
-
.comparable?(val1, val2) ⇒ Boolean
Checks if two values can be compared with <, >, <=, >= Allows comparison between numeric types (Float, Integer, etc.) or same string types.
- .handle(op, actual_value, expected_value) ⇒ Object
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
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 |