# encoding: utf-8 module Mongoid module Matchable # Contains all the default behavior for checking for matching documents # given MongoDB expressions. class Default attr_accessor :attribute, :document # Creating a new matcher only requires the value. # # @example Create a new matcher. # Default.new("attribute") # # @param [ Object ] attribute The current attribute to check against. # # @since 1.0.0 def initialize(attribute, document = nil) @attribute, @document = attribute, document end # Return true if the attribute and value are equal, or if it is an array # if the value is included. # # @example Does this value match? # default.matches?("value") # # @param [ Object ] value The value to check if it matches. # # @return [ true, false ] True if matches, false if not. # # @since 1.0.0 def matches?(value) attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.any? { |_attribute| value === _attribute } : value === attribute end protected # Convenience method for getting the first value in a hash. # # @example Get the first value. # matcher.first(:test => "value") # # @param [ Hash ] hash The has to pull from. # # @return [ Object ] The first value. # # @since 1.0.0 def first(hash) hash.values.first end # If object exists then compare the two, otherwise return false # # @example Determine if we can compare. # matcher.determine("test", "$in") # # @param [ Object ] value The value to compare with. # @param [ Symbol, String ] operator The comparison operation. # # @return [ true, false ] The comparison or false. # # @since 1.0.0 def determine(value, operator) attribute.__array__.any? {|attr| attr ? attr.send(operator, first(value)) : false } end end end end