Sha256: e21b4cc3f6ac9483aa80b70aec7b396746e48e248d30db055b53764f6a089dbf

Contents?: true

Size: 1.46 KB

Versions: 2

Compression:

Stored size: 1.46 KB

Contents

module Sunspot
  #
  # InstantiatedFacet instances allow access to a model instance based on a
  # primary key stored in facet rows' values. The rows are hydrated lazily, but
  # all rows are hydrated the first time #instance is called on any of the rows.
  #
  # The #rows method returns InstantiatedFacetRow objects.
  #
  class InstantiatedFacet < Facet
    # 
    # Hydrate all rows for the facet. For data accessors that can efficiently
    # batch load, this is more efficient than individually lazy-loading
    # instances for each row, but allows us to still stay lazy and not do work
    # in the persistent store if the instances are not needed.
    #
    def populate_instances! #:nodoc:
      ids = rows.map { |row| row.value }
      reference_class = Sunspot::Util.full_const_get(@facet_data.reference.to_s)
      accessor = Adapters::DataAccessor.create(reference_class)
      instance_map = accessor.load_all(ids).inject({}) do |map, instance|
        map[Adapters::InstanceAdapter.adapt(instance).id] = instance
        map
      end
      for row in rows
        row.instance = instance_map[row.value]
      end
    end

    # 
    # A collection of InstantiatedFacetRow objects
    #
    def rows
      @facet_data.rows { |value, count| InstantiatedFacetRow.new(value, count, self) }
    end

    private

    # 
    # Override the Facet#new_row method to return an InstantiatedFacetRow
    #
    def new_row(pair)
      InstantiatedFacetRow.new(pair, self)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
benjaminkrause-sunspot-0.9.7 lib/sunspot/instantiated_facet.rb
benjaminkrause-sunspot-0.9.8 lib/sunspot/instantiated_facet.rb