Class: Mongoid::Attributes::Projector Private
| Relationships & Source Files | |
| Inherits: | Object | 
| Defined in: | lib/mongoid/attributes/projector.rb | 
Overview
This module defines projection helpers.
Projection rules are rather non-trivial. See www.mongodb.com/docs/manual/reference/method/db.collection.find/#find-projection for server documentation. 4.4 server (and presumably all older ones) requires that a projection for content fields is either exclusionary or inclusionary, i.e. one cannot mix exclusions and inclusions in the same query. However, _id can be excluded in a projection that includes content fields. ::Integer projection values other than 0 and 1 aren’t officially documented as of this writing; see DOCSP-15266. 4.4 server also allows nested hash projection specification in addition to dot notation, which I assume ::Mongoid doesn’t handle yet.
Class Method Summary
- .new(projection) ⇒ Projector constructor Internal use only
Instance Attribute Summary
- #content_projection readonly Internal use only
- #id_projection_value readonly Internal use only
- 
    
      #content_inclusionary?  ⇒ Boolean 
    
    readonly
    private
    Internal use only
    Determines whether the projection for content fields is inclusionary. 
Instance Method Summary
- 
    
      #attribute_or_path_allowed?(name)  ⇒ true | false 
    
    Internal use only
    Determine if the specified attribute, or a dot notation path, is allowed by the configured projection, if any. 
- #value_inclusionary?(value) ⇒ Boolean private Internal use only
Instance Attribute Details
#content_inclusionary? ⇒ Boolean (readonly, private)
Determines whether the projection for content fields is inclusionary.
An empty projection is inclusionary.
# File 'lib/mongoid/attributes/projector.rb', line 96
def content_inclusionary? if content_projection.empty? return value_inclusionary?(id_projection_value) end value_inclusionary?(content_projection.values.first) end
#content_projection (readonly)
[ GitHub ]# File 'lib/mongoid/attributes/projector.rb', line 36
attr_reader :content_projection
#id_projection_value (readonly)
[ GitHub ]# File 'lib/mongoid/attributes/projector.rb', line 35
attr_reader :id_projection_value
Instance Method Details
    #attribute_or_path_allowed?(name)  ⇒ true | false 
  
Determine if the specified attribute, or a dot notation path, is allowed by the configured projection, if any.
If there is no configured projection, returns true.
# File 'lib/mongoid/attributes/projector.rb', line 48
def attribute_or_path_allowed?(name) # Special handling for _id. if name == '_id' result = unless id_projection_value.nil? value_inclusionary?(id_projection_value) else true end return result end if content_projection.nil? # No projection (as opposed to an empty projection). # All attributes are allowed. return true end # Find an item which matches or is a parent of the requested name/path. # This handles the case when, for example, the projection was # {foo: true} and we want to know if foo.bar is allowed. item, value = content_projection.detect do |path, value| (name + '.').start_with?(path + '.') end if item return value_inclusionary?(value) end if content_inclusionary? # Find an item which would be a strict child of the requested name/path. # This handles the case when, for example, the projection was # {"foo.bar" => true} and we want to know if foo is allowed. # (It is as a container of bars.) item, value = content_projection.detect do |path, value| (path + '.').start_with?(name + '.') end if item return true end end !content_inclusionary? end
#value_inclusionary?(value) ⇒ Boolean (private)
# File 'lib/mongoid/attributes/projector.rb', line 104
def value_inclusionary?(value) case value when Integer value >= 1 when true true when false false else # The various expressions that are permitted as projection arguments # imply an inclusionary projection. true end end