Module: Mongoid::Matcher Private

Defined in:
lib/mongoid/matcher.rb,
lib/mongoid/matcher/eq.rb,
lib/mongoid/matcher/gt.rb,
lib/mongoid/matcher/in.rb,
lib/mongoid/matcher/lt.rb,
lib/mongoid/matcher/ne.rb,
lib/mongoid/matcher/or.rb,
lib/mongoid/matcher/all.rb,
lib/mongoid/matcher/and.rb,
lib/mongoid/matcher/gte.rb,
lib/mongoid/matcher/lte.rb,
lib/mongoid/matcher/mod.rb,
lib/mongoid/matcher/nin.rb,
lib/mongoid/matcher/nor.rb,
lib/mongoid/matcher/not.rb,
lib/mongoid/matcher/bits.rb,
lib/mongoid/matcher/size.rb,
lib/mongoid/matcher/type.rb,
lib/mongoid/matcher/regex.rb,
lib/mongoid/matcher/exists.rb,
lib/mongoid/matcher/eq_impl.rb,
lib/mongoid/matcher/elem_match.rb,
lib/mongoid/matcher/expression.rb,
lib/mongoid/matcher/bits_all_set.rb,
lib/mongoid/matcher/bits_any_set.rb,
lib/mongoid/matcher/bits_all_clear.rb,
lib/mongoid/matcher/bits_any_clear.rb,
lib/mongoid/matcher/field_operator.rb,
lib/mongoid/matcher/field_expression.rb,
lib/mongoid/matcher/eq_impl_with_regexp.rb,
lib/mongoid/matcher/expression_operator.rb,
lib/mongoid/matcher/elem_match_expression.rb

Overview

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

Utility module containing methods which assist in performing in-memory matching of documents with MQL query expressions.

Defined Under Namespace

Modules: All, And, Bits, BitsAllClear, BitsAllSet, BitsAnyClear, BitsAnySet, ElemMatch, ElemMatchExpression, Eq, EqImpl, EqImplWithRegexp, Exists, Expression, ExpressionOperator, FieldExpression, FieldOperator, Gt, Gte, In, Lt, Lte, Mod, Ne, Nin, Nor, Not, Or, Regex, Size, Type

Class Method Summary collapse

Class Method Details

.extract_attribute(document, key) ⇒ Object | Array

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Extracts field values in the document at the specified key.

The document can be a Hash or a model instance.

The key is a valid MongoDB dot notation key. The following use cases are supported:

  • Simple field traversal (‘foo`) - retrieves the field `foo` in the current document.

  • Hash/embedded document field traversal (‘foo.bar`) - retrieves the field `foo` in the current document, then retrieves the field `bar` from the value of `foo`. Each path segment could descend into an embedded document or a hash field.

  • Array element retrieval (‘foo.N`) - retrieves the Nth array element from the field `foo` which must be an array. N must be a non-negative integer.

  • Array traversal (‘foo.bar`) - if `foo` is an array field, and the elements of `foo` are hashes or embedded documents, this returns an array of values of the `bar` field in each of the hashes in the `foo` array.

This method can return an individual field value in some document or an array of values from multiple documents. The array can be returned because a field value in the specified path is an array of primitive values (e.g. integers) or because a field value in the specified path is an array of documents (e.g. a one-to-many embedded association), in which case the leaf value may be a scalar for each individual document. If the leaf value is an array and a one-to-many association was traversed, the return value will be an array of arrays. Note that an individual field value can also be an array and this case is indistinguishable from and behaves identically to association traversal for the purposes of, for example, subsequent array element retrieval.

Parameters:

  • document (Document | Hash)

    The document to extract from.

  • key (String)

    The key path to extract.

Returns:

  • (Object | Array)

    Field value or values.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/mongoid/matcher.rb', line 46

module_function def extract_attribute(document, key)
  if document.respond_to?(:as_attributes, true)
    # If a document has hash fields, as_attributes would keep those fields
    # as Hash instances which do not offer indifferent access.
    # Convert to BSON::Document to get indifferent access on hash fields.
    document = document.send(:as_attributes)
  end

  current = [document]

  key.to_s.split('.').each do |field|
    new = []
    current.each do |doc|
      case doc
      when Hash
        actual_key = find_exact_key(doc, field)
        if !actual_key.nil?
          new << doc[actual_key]
        end
      when Array
        if (index = field.to_i).to_s == field
          if doc.length > index
            new << doc[index]
          end
        end
        doc.each do |subdoc|
          if Hash === subdoc
            actual_key = find_exact_key(subdoc, field)
            if !actual_key.nil?
              new << subdoc[actual_key]
            end
          end
        end
      end
    end
    current = new
    break if current.empty?
  end

  current
end

.find_exact_key(hash, key) ⇒ String | Symbol | nil

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Indifferent string or symbol key lookup, returning the exact key.

Parameters:

  • hash (Hash)

    The input hash.

  • key (String | Symbol)

    The key to perform indifferent lookups with.

Returns:

  • (String | Symbol | nil)

    The exact key (with the correct type) that exists in the hash, or nil if the key does not exist.



94
95
96
97
98
99
100
# File 'lib/mongoid/matcher.rb', line 94

module_function def find_exact_key(hash, key)
  key_s = key.to_s
  return key_s if hash.key?(key_s)

  key_sym = key.to_sym
  hash.key?(key_sym) ? key_sym : nil
end