module Mongoid::Criteria::Queryable::Expandable

This module encapsulates methods that expand various high level query forms to the MongoDB hash condition selector syntax.

@example Example high level form.

Band.where(:foo.gt => 5)

@api private

Private Instance Methods

expand_condition(condition) click to toggle source

Expands the specified condition to MongoDB syntax.

The condition must be a hash in one of the following forms:

  • {field_name: value}

  • {'field_name' => value}

  • {key_instance: value}

  • {'$operator' => operator_value_expression}

This method expands the key instance form to the the operator form, and also converts hash key to string.

The hash may contain multiple items, each representing a separate condition.

@param [ Hash ] condition The condition to expand.

@return [ Hash ] The expanded condition.

# File lib/mongoid/criteria/queryable/expandable.rb, line 35
def expand_condition(condition)
  mapped = condition.map do |field, value|
    expand_one_condition(field, value)
  end
  Hash[mapped]
end
expand_condition_to_array_values(criterion) click to toggle source

Expand criterion values to arrays, to be used with operators that take an array as argument such as $in.

@example Convert all the values to arrays.

selectable.with_array_values({ key: 1...4 })

@param [ Hash ] criterion The criterion.

@return [ Hash ] The $in friendly criterion with array values.

@api private

# File lib/mongoid/criteria/queryable/expandable.rb, line 80
def expand_condition_to_array_values(criterion)
  if criterion.nil?
    raise ArgumentError, 'Criterion cannot be nil here'
  end

  Hash[criterion.map do |key, value|
    [key, value.__array__]
  end]
end
expand_one_condition(field, value) click to toggle source

Expands the specified condition to MongoDB syntax.

This method is meant to be called when processing the items of a condition hash and the key and the value of each item are already available separately.

The following parameter forms are accepted:

  • field is a string or symbol; value is the field query expresision

  • field is a Key instance; value is the field query expression

  • field is a string corresponding to a MongoDB operator; value is the operator value expression.

This method expands the field-value combination to the MongoDB selector syntax and returns an array of [expanded key, expanded value]. The expanded key is converted to a string if it wasn't already a string.

@param [ String | Symbol | Key ] field The field to expand. @param [ Object ] value The field's value.

@return [ Array<String, Object> ] The expanded field and value.

# File lib/mongoid/criteria/queryable/expandable.rb, line 64
def expand_one_condition(field, value)
  kv = field.__expr_part__(value.__expand_complex__, negating?)
  [kv.keys.first.to_s, kv.values.first]
end