Sha256: 7afeebcc2e20c2f43db4812283707263d6395c824e5f754413582bae097a4777

Contents?: true

Size: 1.89 KB

Versions: 25

Compression:

Stored size: 1.89 KB

Contents

module Elastics
  class Result

    #  adds sugar to documents with the following structure (_source is optional):
    #
    #    {
    #        "_index" : "twitter",
    #        "_type" : "tweet",
    #        "_id" : "1",
    #        "_source" : {
    #            "user" : "kimchy",
    #            "postDate" : "2009-11-15T14:12:12",
    #            "message" : "trying out Elastics Search"
    #        }
    #    }

    module Document

      # extend if result has a structure like a document
      def self.should_extend?(obj)
        %w[_index _type _id].all? {|k| obj.has_key?(k)}
      end

      def respond_to?(meth, private=false)
        smeth = meth.to_s
        readers.has_key?(smeth) || has_key?(smeth) || has_key?("_#{smeth}") || super
      end

      # exposes _source and readers: automatically supply object-like reader access
      # also expose meta readers like _id, _source, etc, also callable without the leading '_'
      def method_missing(meth, *args, &block)
        smeth = meth.to_s
        case
        # field name
        when readers.has_key?(smeth)
          readers[smeth]
        # result item
        when has_key?(smeth)
          self[smeth]
        # result item called without the '_' prefix
        when has_key?("_#{smeth}")
          self["_#{smeth}"]
        else
          super
        end
      end

      # used to get the unprefixed (by live-reindex) index name
      def index_basename
        @index_basename ||= self['_index'].sub(/^\d{14}_/, '')
      end


      private

      def readers
        @readers ||= begin
                       readers = (self['_source']||{}).merge(self['fields']||{})
                       # flattened reader for multi_readers or attachment readers
                       readers.keys.each{|k| readers[k.gsub('.','_')] = readers.delete(k) if k.include?('.')}
                       readers
                     end
      end

    end
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
elastics-client-1.3.3 lib/elastics/result/document.rb
elastics-client-1.3.2 lib/elastics/result/document.rb
elastics-client-1.3.1 lib/elastics/result/document.rb
elastics-client-1.3.0 lib/elastics/result/document.rb
elastics-client-1.2.1 lib/elastics/result/document.rb
elastics-client-1.2.0 lib/elastics/result/document.rb
elastics-client-1.1.11 lib/elastics/result/document.rb
elastics-client-1.1.10 lib/elastics/result/document.rb
elastics-client-1.1.9 lib/elastics/result/document.rb
elastics-client-1.1.8 lib/elastics/result/document.rb
elastics-client-1.1.7 lib/elastics/result/document.rb
elastics-client-1.1.6 lib/elastics/result/document.rb
elastics-client-1.1.5 lib/elastics/result/document.rb
elastics-client-1.1.4 lib/elastics/result/document.rb
elastics-client-1.1.3 lib/elastics/result/document.rb
elastics-client-1.1.2 lib/elastics/result/document.rb
elastics-client-1.1.1 lib/elastics/result/document.rb
elastics-client-1.1.0 lib/elastics/result/document.rb
elastics-client-1.0.10 lib/elastics/result/document.rb
elastics-client-1.0.9 lib/elastics/result/document.rb