123456789_123456789_123456789_123456789_123456789_

Module: Mongoid::Matcher::Bits Private

Do not use. This module is for internal use only.
Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Defined in: lib/mongoid/matcher/bits.rb

Overview

Mixin module included in bitwise expression matchers.

Instance Method Summary

Instance Method Details

#matches?(_exists, value, condition) ⇒ true | false

Returns whether a value satisfies a bitwise expression.

Parameters:

  • exists (true | false)

    Not used.

  • value (Object)

    The value to check.

  • condition (Numeric | Array<Numeric>)

    The expression predicate as a bitmask or position list.

Returns:

  • (true | false)

    Whether the value matches.

[ GitHub ]

  
# File 'lib/mongoid/matcher/bits.rb', line 17

def matches?(_exists, value, condition)
  case value
  when BSON::Binary
    value = value.data.split('').map { |n| '%02x' % n.ord }.join.to_i(16)
  end
  case condition
  when Array
    array_matches?(value, condition)
  when BSON::Binary
    int_cond = condition.data.split('').map { |n| '%02x' % n.ord }.join.to_i(16)
    int_matches?(value, int_cond)
  when Integer
    if condition < 0
      raise Errors::InvalidQuery,
            "Invalid value for $#{operator_name} argument: negative integers are not allowed: #{condition}"
    end

    int_matches?(value, condition)
  when Float
    # Allow floats that are whole numbers (e.g. 50.0), but reject those
    # with a fractional part (e.g. 50.1) since bitwise ops require integers.
    int_cond = condition.to_i
    if int_cond == condition
      if int_cond < 0
        raise Errors::InvalidQuery,
              "Invalid value for $#{operator_name} argument: negative numbers are not allowed: #{condition}"
      end

      int_matches?(value, int_cond)
    else
      raise Errors::InvalidQuery,
            "Invalid type for $#{operator_name} argument: not representable as an integer: #{condition}"
    end
  else
    raise Errors::InvalidQuery, "Invalid type for $#{operator_name} argument: #{condition}"
  end
end