Sha256: f613093e18375edb0975c8df471e2c50769dd3bc91a3054ac9d5b65cfdb75cf9

Contents?: true

Size: 1.96 KB

Versions: 19

Compression:

Stored size: 1.96 KB

Contents

module Elastics
  class Result
    module ActiveModel

      include Elastics::Result::Scope

      # extend if the context include a Elastics::ActiveModel
      def self.should_extend?(result)
        result.variables[:context] && result.variables[:context].include?(Elastics::ActiveModel)
      end

      def get_docs
        # super is from elastics-scopes
        docs = super
        return docs if variables[:raw_result]
        raw_result = self
        if docs.is_a?(Array)
          res = docs.map {|doc| build_object(doc)}
          res.extend(Struct::Paginable).setup(raw_result['hits']['total'], variables)
          class << res; self end.class_eval do
            define_method(:raw_result){ raw_result }
            define_method(:method_missing) do |meth, *args, &block|
              raw_result.respond_to?(meth) ? raw_result.send(meth, *args, &block) : super(meth, *args, &block)
            end
          end
          res
        else
          build_object docs
        end
      end

    private

      def build_object(doc)
        attrs      = (doc['_source']||{}).merge(doc['fields']||{})
        object     = variables[:context].new attrs
        raw_result = self
        object.instance_eval do
          class << self; self end.class_eval do
            define_method(:raw_result){ raw_result }
            define_method(:raw_document){ doc }
            define_method(:respond_to?) do |*args|
              doc.respond_to?(*args) || super(*args)
            end
            define_method(:method_missing) do |meth, *args, &block|
              doc.respond_to?(meth) ? doc.send(meth, *args, &block) : super(meth, *args, &block)
            end
          end
          @_id        = doc['_id']
          @_version   = doc['_version']
          @highlight  = doc['highlight']
          # load the elastics proxy before freezing
          elastics
          self.freeze if raw_result.variables[:params][:fields] || doc['fields']
        end
        object
      end

    end
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
elastics-models-1.1.11 lib/elastics/result/active_model.rb
elastics-models-1.1.10 lib/elastics/result/active_model.rb
elastics-models-1.1.9 lib/elastics/result/active_model.rb
elastics-models-1.1.8 lib/elastics/result/active_model.rb
elastics-models-1.1.7 lib/elastics/result/active_model.rb
elastics-models-1.1.6 lib/elastics/result/active_model.rb
elastics-models-1.1.5 lib/elastics/result/active_model.rb
elastics-models-1.1.4 lib/elastics/result/active_model.rb
elastics-models-1.1.3 lib/elastics/result/active_model.rb
elastics-models-1.1.2 lib/elastics/result/active_model.rb
elastics-models-1.1.1 lib/elastics/result/active_model.rb
elastics-models-1.1.0 lib/elastics/result/active_model.rb
elastics-models-1.0.10 lib/elastics/result/active_model.rb
elastics-models-1.0.9 lib/elastics/result/active_model.rb
elastics-models-1.0.8 lib/elastics/result/active_model.rb
elastics-models-1.0.7 lib/elastics/result/active_model.rb
elastics-models-1.0.6 lib/elastics/result/active_model.rb
elastics-models-1.0.5 lib/elastics/result/active_model.rb
elastics-models-1.0.4 lib/elastics/result/active_model.rb