Module: LaunchDarkly::Impl::EvaluatorOperators

Defined in:
lib/ldclient-rb/impl/evaluator_operators.rb

Overview

Defines the behavior of all operators that can be used in feature flag rules and segment rules.

Since:

  • 5.5.0

Class Method Summary collapse

Class Method Details

.apply(op, user_value, clause_value) ⇒ Boolean

Applies an operator to produce a boolean result.

Parameters:

  • op (Symbol)

    one of the supported LaunchDarkly operators, as a symbol

  • user_value

    the value of the user attribute that is referenced in the current clause (left-hand side of the expression)

  • clause_value

    the constant value that ‘user_value` is being compared to (right-hand side of the expression)

Returns:

  • (Boolean)

    true if the expression should be considered a match; false if it is not a match, or if the values cannot be compared because they are of the wrong types, or if the operator is unknown

Since:

  • 5.5.0



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
# File 'lib/ldclient-rb/impl/evaluator_operators.rb', line 18

def self.apply(op, user_value, clause_value)
  case op
  when :in
    user_value == clause_value
  when :startsWith
    string_op(user_value, clause_value, lambda { |a, b| a.start_with? b })
  when :endsWith
    string_op(user_value, clause_value, lambda { |a, b| a.end_with? b })
  when :contains
    string_op(user_value, clause_value, lambda { |a, b| a.include? b })
  when :matches
    string_op(user_value, clause_value, lambda { |a, b|
      begin
        re = Regexp.new b
        !re.match(a).nil?
      rescue
        false
      end
    })
  when :lessThan
    numeric_op(user_value, clause_value, lambda { |a, b| a < b })
  when :lessThanOrEqual
    numeric_op(user_value, clause_value, lambda { |a, b| a <= b })
  when :greaterThan
    numeric_op(user_value, clause_value, lambda { |a, b| a > b })
  when :greaterThanOrEqual
    numeric_op(user_value, clause_value, lambda { |a, b| a >= b })
  when :before
    date_op(user_value, clause_value, lambda { |a, b| a < b })
  when :after
    date_op(user_value, clause_value, lambda { |a, b| a > b })
  when :semVerEqual
    semver_op(user_value, clause_value, lambda { |a, b| a == b })
  when :semVerLessThan
    semver_op(user_value, clause_value, lambda { |a, b| a < b })
  when :semVerGreaterThan
    semver_op(user_value, clause_value, lambda { |a, b| a > b })
  when :segmentMatch
    # We should never reach this; it can't be evaluated based on just two parameters, because it requires
    # looking up the segment from the data store. Instead, we special-case this operator in clause_match_user.
    false
  else
    false
  end
end

.user_value(user, attribute) ⇒ Object

Retrieves the value of a user attribute by name.

Built-in attributes correspond to top-level properties in the user object. They are treated as strings and non-string values are coerced to strings, except for ‘anonymous` which is meant to be a boolean if present and is not currently coerced. This behavior is consistent with earlier versions of the Ruby SDK, but is not guaranteed to be consistent with other SDKs, since the evaluator specification is based on the strongly-typed SDKs where it is not possible for an attribute to have the wrong type.

Custom attributes correspond to properties within the ‘custom` property, if any, and can be of any type.

Parameters:

  • user (Object)

    the user properties

  • attribute (String|Symbol)

    the attribute to get, for instance ‘:key` or `:name` or `:some_custom_attr`

Returns:

  • the attribute value, or nil if the attribute is unknown

Since:

  • 5.5.0



77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/ldclient-rb/impl/evaluator_operators.rb', line 77

def self.user_value(user, attribute)
  attribute = attribute.to_sym
  if BUILTINS.include? attribute
    value = user[attribute]
    return nil if value.nil?
    (attribute == :anonymous) ? value : value.to_s
  elsif !user[:custom].nil?
    user[:custom][attribute]
  else
    nil
  end
end