elasticsearch-ruby 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +11 -0
- data/elastic_search.gemspec +29 -0
- data/lib/elastic_search/client.rb +44 -0
- data/lib/elastic_search/index.rb +75 -0
- data/lib/elastic_search/item.rb +14 -0
- data/lib/elastic_search/request.rb +33 -0
- data/lib/elastic_search/response.rb +38 -0
- data/lib/elastic_search/search/results.rb +28 -0
- data/lib/elastic_search/thrift/elastic_search_constants.rb +10 -0
- data/lib/elastic_search/thrift/elastic_search_types.rb +123 -0
- data/lib/elastic_search/thrift/elasticsearch.thrift +80 -0
- data/lib/elastic_search/thrift/rest.rb +79 -0
- data/lib/elastic_search/transport/base.rb +21 -0
- data/lib/elastic_search/transport/http.rb +18 -0
- data/lib/elastic_search/transport/thrift.rb +38 -0
- data/lib/elastic_search/type.rb +64 -0
- data/lib/elastic_search/version.rb +3 -0
- data/lib/elastic_search.rb +16 -0
- data/spec/elasticsearch/client_spec.rb +53 -0
- data/spec/elasticsearch/index_spec.rb +106 -0
- data/spec/elasticsearch/type_spec.rb +57 -0
- data/spec/spec_helper.rb +26 -0
- metadata +139 -0
    
        data/.gitignore
    ADDED
    
    
    
        data/Gemfile
    ADDED
    
    
    
        data/Rakefile
    ADDED
    
    
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            $:.push File.expand_path("../lib", __FILE__)
         | 
| 3 | 
            +
            require "elastic_search/version"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Gem::Specification.new do |s|
         | 
| 6 | 
            +
              s.name        = "elasticsearch-ruby"
         | 
| 7 | 
            +
              s.version     = ElasticSearch::VERSION
         | 
| 8 | 
            +
              s.authors     = ["Edmund Salvacion"]
         | 
| 9 | 
            +
              s.email       = ["edmund@edmundatwork.com"]
         | 
| 10 | 
            +
              s.homepage    = ""
         | 
| 11 | 
            +
              s.summary     = %q{Ruby Driver for Elastic Search}
         | 
| 12 | 
            +
              s.description = %q{Ruby Driver for Elastic Search}
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              s.rubyforge_project = "elasticsearch"
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              s.files         = `git ls-files`.split("\n")
         | 
| 17 | 
            +
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 18 | 
            +
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 19 | 
            +
              s.require_paths = ["lib"]
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              # = Library dependencies
         | 
| 22 | 
            +
              #
         | 
| 23 | 
            +
              s.add_dependency 'thrift'
         | 
| 24 | 
            +
              s.add_dependency 'faraday'
         | 
| 25 | 
            +
              s.add_dependency 'activesupport', ">= 3.0.0"
         | 
| 26 | 
            +
              s.add_development_dependency "rake"
         | 
| 27 | 
            +
              s.add_development_dependency "minitest"
         | 
| 28 | 
            +
              s.add_development_dependency "turn"
         | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            module ElasticSearch
         | 
| 2 | 
            +
              class Client
         | 
| 3 | 
            +
                def initialize(transport)
         | 
| 4 | 
            +
                  @transport = transport
         | 
| 5 | 
            +
                  @indexes = {}
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def get_index(index_name)
         | 
| 9 | 
            +
                  @indexes[index_name.to_sym] ||= ElasticSearch::Index.new(index_name, self)
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
                alias :[] :get_index
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def create_index(index_name, options = {})
         | 
| 14 | 
            +
                  body = { mappings: options[:mappings], settings: options[:settings] }.reject { |_, v| v.nil? }
         | 
| 15 | 
            +
                  request = Request.new({ method: :post, index: index_name, body: body })
         | 
| 16 | 
            +
                  status = self.execute(request).status
         | 
| 17 | 
            +
                  get_index(index_name) if status.eql?(200) || status.eql?(201)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def delete_index(index_name)
         | 
| 21 | 
            +
                  request = Request.new({ method: :delete, index: index_name })
         | 
| 22 | 
            +
                  execute(request)
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def has_index?(index_name)
         | 
| 26 | 
            +
                  request = Request.new({ method: :head, index: index_name })
         | 
| 27 | 
            +
                  begin
         | 
| 28 | 
            +
                    execute(request).status.between?(200, 206)
         | 
| 29 | 
            +
                  rescue ElasticSearch::ResponseError
         | 
| 30 | 
            +
                    return false
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def bulk(objects)
         | 
| 35 | 
            +
                  body = objects.flatten.join("\n") + "\n"
         | 
| 36 | 
            +
                  request = Request.new({ method: :post, action: :bulk, body: body })
         | 
| 37 | 
            +
                  execute(request)
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def execute(request)
         | 
| 41 | 
            +
                  @transport.execute(request)
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
| @@ -0,0 +1,75 @@ | |
| 1 | 
            +
            module ElasticSearch
         | 
| 2 | 
            +
              class Index
         | 
| 3 | 
            +
                attr_reader :index_name, :client
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def initialize(index_name, client)
         | 
| 6 | 
            +
                  @index_name = index_name
         | 
| 7 | 
            +
                  @client = client
         | 
| 8 | 
            +
                  @types = {}
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def get_type(type_name)
         | 
| 12 | 
            +
                  @types[type_name.to_sym] ||= ElasticSearch::Type.new(type_name, self)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
                alias :[] :get_type
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def search(body, parameters)
         | 
| 17 | 
            +
                  request = build_request(method: :get, action: :search, parameters: parameters, body: body || {})
         | 
| 18 | 
            +
                  response = execute(request)
         | 
| 19 | 
            +
                  ElasticSearch::Search::Results.new(response)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                def refresh
         | 
| 23 | 
            +
                  request = build_request(method: :post, action: :refresh)
         | 
| 24 | 
            +
                  execute(request)
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def open
         | 
| 28 | 
            +
                  request = build_request(method: :post, action: :open)
         | 
| 29 | 
            +
                  execute(request)
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def close
         | 
| 33 | 
            +
                  request = build_request(method: :post, action: :close)
         | 
| 34 | 
            +
                  execute(request)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                def settings
         | 
| 38 | 
            +
                  request = build_request(method: :get, action: :settings)
         | 
| 39 | 
            +
                  execute(request).body
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def settings=(settings)
         | 
| 43 | 
            +
                  request = build_request(method: :put, action: :settings, body: settings)
         | 
| 44 | 
            +
                  execute(request)
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                def mapping
         | 
| 48 | 
            +
                  request = build_request(method: :get, action: :mapping)
         | 
| 49 | 
            +
                  execute(request).body
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def mapping=(mapping)
         | 
| 53 | 
            +
                  request = build_request(method: :put, action: :mapping, body: mapping)
         | 
| 54 | 
            +
                  execute(request).status.eql?(200)
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                def optimize(options = {})
         | 
| 58 | 
            +
                  request = build_request(method: :post, action: :optimize, parameters: options)
         | 
| 59 | 
            +
                  execute(request).status.eql?(200)
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def exists?
         | 
| 63 | 
            +
                  @client.has_index?(@index_name)
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def execute(request)
         | 
| 67 | 
            +
                  @client.execute(request)
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                private
         | 
| 71 | 
            +
                def build_request(options = {})
         | 
| 72 | 
            +
                  Request.new({ index: @index_name }.merge(options))
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            module ElasticSearch
         | 
| 2 | 
            +
              class Item < HashWithIndifferentAccess
         | 
| 3 | 
            +
                attr_reader :index, :type, :item, :version, :exists
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def initialize(request)
         | 
| 6 | 
            +
                  @index = request.body['_index']
         | 
| 7 | 
            +
                  @type = request.body['_type']
         | 
| 8 | 
            +
                  @item = request.body['_id']
         | 
| 9 | 
            +
                  @version = request.body['_version']
         | 
| 10 | 
            +
                  @exists = request.body['exists']
         | 
| 11 | 
            +
                  self.replace(request.body['_source'])
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            module ElasticSearch
         | 
| 2 | 
            +
              class Request
         | 
| 3 | 
            +
                attr_reader :method, :index, :type, :id, :action
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def initialize(options = {})
         | 
| 6 | 
            +
                  @method = options[:method] ? options[:method].to_sym : :get
         | 
| 7 | 
            +
                  @index = options[:index]
         | 
| 8 | 
            +
                  @type = options[:type]
         | 
| 9 | 
            +
                  @id = options[:id]
         | 
| 10 | 
            +
                  @action = options[:action]
         | 
| 11 | 
            +
                  @parameters = options[:parameters]
         | 
| 12 | 
            +
                  @body = options[:body]
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def parameters
         | 
| 16 | 
            +
                  @stringified_parameters ||= @parameters.inject({}) do |options, (key, value)|
         | 
| 17 | 
            +
                    options[key.to_s] = value
         | 
| 18 | 
            +
                    options
         | 
| 19 | 
            +
                  end if @parameters
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                def body
         | 
| 23 | 
            +
                  @encoded_body ||= @body.to_json
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def path
         | 
| 27 | 
            +
                  components = [@index, @type]
         | 
| 28 | 
            +
                  components << @id if @id
         | 
| 29 | 
            +
                  components << "_#{@action.to_s}" if @action
         | 
| 30 | 
            +
                  components.compact.join("/")
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            module ElasticSearch
         | 
| 2 | 
            +
              class Response
         | 
| 3 | 
            +
                attr_reader :status
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def initialize(options)
         | 
| 6 | 
            +
                  @body = options[:body].eql?("") ? "{}" : options[:body]
         | 
| 7 | 
            +
                  @status = options[:status]
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  case @status
         | 
| 10 | 
            +
                  when 200..206
         | 
| 11 | 
            +
                  when 404
         | 
| 12 | 
            +
                    if self.body['error'] =~ /^IndexMissingException/ || self.body.eql?(nil)
         | 
| 13 | 
            +
                      raise ElasticSearch::IndexMissingException, "#{self.body['status']}: #{self.body['error']}"
         | 
| 14 | 
            +
                    elsif self.body['exists'].eql?(false)
         | 
| 15 | 
            +
                      raise ElasticSearch::ItemMissingException, "_id: #{self.body['id']} NOT FOUND"
         | 
| 16 | 
            +
                    else
         | 
| 17 | 
            +
                      raise ElasticSearch::ResponseError
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  else
         | 
| 20 | 
            +
                    raise ElasticSearch::ResponseError, "#{self.body['status']}: #{self.body['error']}"
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def body
         | 
| 25 | 
            +
                  @decoded_body ||= (@body ? ActiveSupport::JSON.decode(@body) : {})
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                private
         | 
| 29 | 
            +
                def recursive_symbolize_keys!(hash)
         | 
| 30 | 
            +
                  hash.symbolize_keys!
         | 
| 31 | 
            +
                  hash.values.select{|v| v.is_a? Hash}.each{|h| recursive_symbolize_keys!(h)}
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              class ResponseError < StandardError; end
         | 
| 36 | 
            +
              class IndexMissingException < StandardError; end
         | 
| 37 | 
            +
              class ItemMissingException < StandardError; end
         | 
| 38 | 
            +
            end
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            module ElasticSearch
         | 
| 2 | 
            +
              module Search
         | 
| 3 | 
            +
                class Results < Array
         | 
| 4 | 
            +
                  attr_reader :took, :timed_out, :shards, :total, :max_score
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def initialize(response)
         | 
| 7 | 
            +
                    @took = response.body['took']
         | 
| 8 | 
            +
                    @timed_out = response.body['timed_out']
         | 
| 9 | 
            +
                    @shards = response.body['shards']
         | 
| 10 | 
            +
                    @total = response.body['hits']['total']
         | 
| 11 | 
            +
                    @max_score = response.body['hits']['max_score']
         | 
| 12 | 
            +
                    self.replace(response.body['hits']['hits'].collect { |h| ResultItem.new(h) })
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                class ResultItem < HashWithIndifferentAccess
         | 
| 17 | 
            +
                  attr_reader :index, :type, :id, :score
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def initialize(hit)
         | 
| 20 | 
            +
                    @index = hit['_index']
         | 
| 21 | 
            +
                    @type = hit['_type']
         | 
| 22 | 
            +
                    @id = hit['_id']
         | 
| 23 | 
            +
                    @score = hit['_score']
         | 
| 24 | 
            +
                    self.replace(hit['_source'])
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| @@ -0,0 +1,123 @@ | |
| 1 | 
            +
            #
         | 
| 2 | 
            +
            # Autogenerated by Thrift Compiler (0.8.0)
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
            # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
         | 
| 5 | 
            +
            #
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module ElasticSearch
         | 
| 8 | 
            +
              module Thrift
         | 
| 9 | 
            +
                module Method
         | 
| 10 | 
            +
                  GET = 0
         | 
| 11 | 
            +
                  PUT = 1
         | 
| 12 | 
            +
                  POST = 2
         | 
| 13 | 
            +
                  DELETE = 3
         | 
| 14 | 
            +
                  HEAD = 4
         | 
| 15 | 
            +
                  OPTIONS = 5
         | 
| 16 | 
            +
                  VALUE_MAP = {0 => "GET", 1 => "PUT", 2 => "POST", 3 => "DELETE", 4 => "HEAD", 5 => "OPTIONS"}
         | 
| 17 | 
            +
                  VALID_VALUES = Set.new([GET, PUT, POST, DELETE, HEAD, OPTIONS]).freeze
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                module Status
         | 
| 21 | 
            +
                  CONT = 100
         | 
| 22 | 
            +
                  SWITCHING_PROTOCOLS = 101
         | 
| 23 | 
            +
                  OK = 200
         | 
| 24 | 
            +
                  CREATED = 201
         | 
| 25 | 
            +
                  ACCEPTED = 202
         | 
| 26 | 
            +
                  NON_AUTHORITATIVE_INFORMATION = 203
         | 
| 27 | 
            +
                  NO_CONTENT = 204
         | 
| 28 | 
            +
                  RESET_CONTENT = 205
         | 
| 29 | 
            +
                  PARTIAL_CONTENT = 206
         | 
| 30 | 
            +
                  MULTI_STATUS = 207
         | 
| 31 | 
            +
                  MULTIPLE_CHOICES = 300
         | 
| 32 | 
            +
                  MOVED_PERMANENTLY = 301
         | 
| 33 | 
            +
                  FOUND = 302
         | 
| 34 | 
            +
                  SEE_OTHER = 303
         | 
| 35 | 
            +
                  NOT_MODIFIED = 304
         | 
| 36 | 
            +
                  USE_PROXY = 305
         | 
| 37 | 
            +
                  TEMPORARY_REDIRECT = 307
         | 
| 38 | 
            +
                  BAD_REQUEST = 400
         | 
| 39 | 
            +
                  UNAUTHORIZED = 401
         | 
| 40 | 
            +
                  PAYMENT_REQUIRED = 402
         | 
| 41 | 
            +
                  FORBIDDEN = 403
         | 
| 42 | 
            +
                  NOT_FOUND = 404
         | 
| 43 | 
            +
                  METHOD_NOT_ALLOWED = 405
         | 
| 44 | 
            +
                  NOT_ACCEPTABLE = 406
         | 
| 45 | 
            +
                  PROXY_AUTHENTICATION = 407
         | 
| 46 | 
            +
                  REQUEST_TIMEOUT = 408
         | 
| 47 | 
            +
                  CONFLICT = 409
         | 
| 48 | 
            +
                  GONE = 410
         | 
| 49 | 
            +
                  LENGTH_REQUIRED = 411
         | 
| 50 | 
            +
                  PRECONDITION_FAILED = 412
         | 
| 51 | 
            +
                  REQUEST_ENTITY_TOO_LARGE = 413
         | 
| 52 | 
            +
                  REQUEST_URI_TOO_LONG = 414
         | 
| 53 | 
            +
                  UNSUPPORTED_MEDIA_TYPE = 415
         | 
| 54 | 
            +
                  REQUESTED_RANGE_NOT_SATISFIED = 416
         | 
| 55 | 
            +
                  EXPECTATION_FAILED = 417
         | 
| 56 | 
            +
                  UNPROCESSABLE_ENTITY = 422
         | 
| 57 | 
            +
                  LOCKED = 423
         | 
| 58 | 
            +
                  FAILED_DEPENDENCY = 424
         | 
| 59 | 
            +
                  INTERNAL_SERVER_ERROR = 500
         | 
| 60 | 
            +
                  NOT_IMPLEMENTED = 501
         | 
| 61 | 
            +
                  BAD_GATEWAY = 502
         | 
| 62 | 
            +
                  SERVICE_UNAVAILABLE = 503
         | 
| 63 | 
            +
                  GATEWAY_TIMEOUT = 504
         | 
| 64 | 
            +
                  INSUFFICIENT_STORAGE = 506
         | 
| 65 | 
            +
                  VALUE_MAP = {100 => "CONT", 101 => "SWITCHING_PROTOCOLS", 200 => "OK", 201 => "CREATED", 202 => "ACCEPTED", 203 => "NON_AUTHORITATIVE_INFORMATION", 204 => "NO_CONTENT", 205 => "RESET_CONTENT", 206 => "PARTIAL_CONTENT", 207 => "MULTI_STATUS", 300 => "MULTIPLE_CHOICES", 301 => "MOVED_PERMANENTLY", 302 => "FOUND", 303 => "SEE_OTHER", 304 => "NOT_MODIFIED", 305 => "USE_PROXY", 307 => "TEMPORARY_REDIRECT", 400 => "BAD_REQUEST", 401 => "UNAUTHORIZED", 402 => "PAYMENT_REQUIRED", 403 => "FORBIDDEN", 404 => "NOT_FOUND", 405 => "METHOD_NOT_ALLOWED", 406 => "NOT_ACCEPTABLE", 407 => "PROXY_AUTHENTICATION", 408 => "REQUEST_TIMEOUT", 409 => "CONFLICT", 410 => "GONE", 411 => "LENGTH_REQUIRED", 412 => "PRECONDITION_FAILED", 413 => "REQUEST_ENTITY_TOO_LARGE", 414 => "REQUEST_URI_TOO_LONG", 415 => "UNSUPPORTED_MEDIA_TYPE", 416 => "REQUESTED_RANGE_NOT_SATISFIED", 417 => "EXPECTATION_FAILED", 422 => "UNPROCESSABLE_ENTITY", 423 => "LOCKED", 424 => "FAILED_DEPENDENCY", 500 => "INTERNAL_SERVER_ERROR", 501 => "NOT_IMPLEMENTED", 502 => "BAD_GATEWAY", 503 => "SERVICE_UNAVAILABLE", 504 => "GATEWAY_TIMEOUT", 506 => "INSUFFICIENT_STORAGE"}
         | 
| 66 | 
            +
                  VALID_VALUES = Set.new([CONT, SWITCHING_PROTOCOLS, OK, CREATED, ACCEPTED, NON_AUTHORITATIVE_INFORMATION, NO_CONTENT, RESET_CONTENT, PARTIAL_CONTENT, MULTI_STATUS, MULTIPLE_CHOICES, MOVED_PERMANENTLY, FOUND, SEE_OTHER, NOT_MODIFIED, USE_PROXY, TEMPORARY_REDIRECT, BAD_REQUEST, UNAUTHORIZED, PAYMENT_REQUIRED, FORBIDDEN, NOT_FOUND, METHOD_NOT_ALLOWED, NOT_ACCEPTABLE, PROXY_AUTHENTICATION, REQUEST_TIMEOUT, CONFLICT, GONE, LENGTH_REQUIRED, PRECONDITION_FAILED, REQUEST_ENTITY_TOO_LARGE, REQUEST_URI_TOO_LONG, UNSUPPORTED_MEDIA_TYPE, REQUESTED_RANGE_NOT_SATISFIED, EXPECTATION_FAILED, UNPROCESSABLE_ENTITY, LOCKED, FAILED_DEPENDENCY, INTERNAL_SERVER_ERROR, NOT_IMPLEMENTED, BAD_GATEWAY, SERVICE_UNAVAILABLE, GATEWAY_TIMEOUT, INSUFFICIENT_STORAGE]).freeze
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                class RestRequest
         | 
| 70 | 
            +
                  include ::Thrift::Struct, ::Thrift::Struct_Union
         | 
| 71 | 
            +
                  METHOD = 1
         | 
| 72 | 
            +
                  URI = 2
         | 
| 73 | 
            +
                  PARAMETERS = 3
         | 
| 74 | 
            +
                  HEADERS = 4
         | 
| 75 | 
            +
                  BODY = 5
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  FIELDS = {
         | 
| 78 | 
            +
                    METHOD => {:type => ::Thrift::Types::I32, :name => 'method', :enum_class => ElasticSearch::Thrift::Method},
         | 
| 79 | 
            +
                    URI => {:type => ::Thrift::Types::STRING, :name => 'uri'},
         | 
| 80 | 
            +
                    PARAMETERS => {:type => ::Thrift::Types::MAP, :name => 'parameters', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING}, :optional => true},
         | 
| 81 | 
            +
                    HEADERS => {:type => ::Thrift::Types::MAP, :name => 'headers', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING}, :optional => true},
         | 
| 82 | 
            +
                    BODY => {:type => ::Thrift::Types::STRING, :name => 'body', :binary => true, :optional => true}
         | 
| 83 | 
            +
                  }
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  def struct_fields; FIELDS; end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  def validate
         | 
| 88 | 
            +
                    raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field method is unset!') unless @method
         | 
| 89 | 
            +
                    raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field uri is unset!') unless @uri
         | 
| 90 | 
            +
                    unless @method.nil? || ElasticSearch::Thrift::Method::VALID_VALUES.include?(@method)
         | 
| 91 | 
            +
                      raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field method!')
         | 
| 92 | 
            +
                    end
         | 
| 93 | 
            +
                  end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                  ::Thrift::Struct.generate_accessors self
         | 
| 96 | 
            +
                end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                class RestResponse
         | 
| 99 | 
            +
                  include ::Thrift::Struct, ::Thrift::Struct_Union
         | 
| 100 | 
            +
                  STATUS = 1
         | 
| 101 | 
            +
                  HEADERS = 2
         | 
| 102 | 
            +
                  BODY = 3
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  FIELDS = {
         | 
| 105 | 
            +
                    STATUS => {:type => ::Thrift::Types::I32, :name => 'status', :enum_class => ElasticSearch::Thrift::Status},
         | 
| 106 | 
            +
                    HEADERS => {:type => ::Thrift::Types::MAP, :name => 'headers', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING}, :optional => true},
         | 
| 107 | 
            +
                    BODY => {:type => ::Thrift::Types::STRING, :name => 'body', :binary => true, :optional => true}
         | 
| 108 | 
            +
                  }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  def struct_fields; FIELDS; end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                  def validate
         | 
| 113 | 
            +
                    raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field status is unset!') unless @status
         | 
| 114 | 
            +
                    unless @status.nil? || ElasticSearch::Thrift::Status::VALID_VALUES.include?(@status)
         | 
| 115 | 
            +
                      raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field status!')
         | 
| 116 | 
            +
                    end
         | 
| 117 | 
            +
                  end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                  ::Thrift::Struct.generate_accessors self
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
            end
         | 
| @@ -0,0 +1,80 @@ | |
| 1 | 
            +
            namespace java org.elasticsearch.thrift
         | 
| 2 | 
            +
            namespace csharp ElasticSearch.Thrift
         | 
| 3 | 
            +
            namespace cpp  elasticsearch.thrift
         | 
| 4 | 
            +
            namespace rb ElasticSearch.Thrift
         | 
| 5 | 
            +
            namespace py elasticsearch
         | 
| 6 | 
            +
            namespace perl Elasticsearch
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            enum Method {
         | 
| 9 | 
            +
                GET = 0,
         | 
| 10 | 
            +
                PUT = 1,
         | 
| 11 | 
            +
                POST = 2,
         | 
| 12 | 
            +
                DELETE = 3,
         | 
| 13 | 
            +
                HEAD = 4,
         | 
| 14 | 
            +
                OPTIONS = 5
         | 
| 15 | 
            +
            }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            struct RestRequest {
         | 
| 18 | 
            +
                1: required Method method,
         | 
| 19 | 
            +
                2: required string uri
         | 
| 20 | 
            +
                3: optional map<string, string> parameters
         | 
| 21 | 
            +
                4: optional map<string, string> headers
         | 
| 22 | 
            +
                5: optional binary body
         | 
| 23 | 
            +
            }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            enum Status {
         | 
| 26 | 
            +
                CONT = 100,
         | 
| 27 | 
            +
                SWITCHING_PROTOCOLS = 101,
         | 
| 28 | 
            +
                OK = 200,
         | 
| 29 | 
            +
                CREATED = 201,
         | 
| 30 | 
            +
                ACCEPTED = 202,
         | 
| 31 | 
            +
                NON_AUTHORITATIVE_INFORMATION = 203,
         | 
| 32 | 
            +
                NO_CONTENT = 204,
         | 
| 33 | 
            +
                RESET_CONTENT = 205,
         | 
| 34 | 
            +
                PARTIAL_CONTENT = 206,
         | 
| 35 | 
            +
                MULTI_STATUS = 207,
         | 
| 36 | 
            +
                MULTIPLE_CHOICES = 300,
         | 
| 37 | 
            +
                MOVED_PERMANENTLY = 301,
         | 
| 38 | 
            +
                FOUND = 302,
         | 
| 39 | 
            +
                SEE_OTHER = 303,
         | 
| 40 | 
            +
                NOT_MODIFIED = 304,
         | 
| 41 | 
            +
                USE_PROXY = 305,
         | 
| 42 | 
            +
                TEMPORARY_REDIRECT = 307,
         | 
| 43 | 
            +
                BAD_REQUEST = 400,
         | 
| 44 | 
            +
                UNAUTHORIZED = 401,
         | 
| 45 | 
            +
                PAYMENT_REQUIRED = 402,
         | 
| 46 | 
            +
                FORBIDDEN = 403,
         | 
| 47 | 
            +
                NOT_FOUND = 404,
         | 
| 48 | 
            +
                METHOD_NOT_ALLOWED = 405,
         | 
| 49 | 
            +
                NOT_ACCEPTABLE = 406,
         | 
| 50 | 
            +
                PROXY_AUTHENTICATION = 407,
         | 
| 51 | 
            +
                REQUEST_TIMEOUT = 408,
         | 
| 52 | 
            +
                CONFLICT = 409,
         | 
| 53 | 
            +
                GONE = 410,
         | 
| 54 | 
            +
                LENGTH_REQUIRED = 411,
         | 
| 55 | 
            +
                PRECONDITION_FAILED = 412,
         | 
| 56 | 
            +
                REQUEST_ENTITY_TOO_LARGE = 413,
         | 
| 57 | 
            +
                REQUEST_URI_TOO_LONG = 414,
         | 
| 58 | 
            +
                UNSUPPORTED_MEDIA_TYPE = 415,
         | 
| 59 | 
            +
                REQUESTED_RANGE_NOT_SATISFIED = 416,
         | 
| 60 | 
            +
                EXPECTATION_FAILED = 417,
         | 
| 61 | 
            +
                UNPROCESSABLE_ENTITY = 422,
         | 
| 62 | 
            +
                LOCKED = 423,
         | 
| 63 | 
            +
                FAILED_DEPENDENCY = 424,
         | 
| 64 | 
            +
                INTERNAL_SERVER_ERROR = 500,
         | 
| 65 | 
            +
                NOT_IMPLEMENTED = 501,
         | 
| 66 | 
            +
                BAD_GATEWAY = 502,
         | 
| 67 | 
            +
                SERVICE_UNAVAILABLE = 503,
         | 
| 68 | 
            +
                GATEWAY_TIMEOUT = 504,
         | 
| 69 | 
            +
                INSUFFICIENT_STORAGE = 506
         | 
| 70 | 
            +
            }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            struct RestResponse {
         | 
| 73 | 
            +
                1: required Status status,
         | 
| 74 | 
            +
                2: optional map<string, string> headers,
         | 
| 75 | 
            +
                3: optional binary body
         | 
| 76 | 
            +
            }
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            service Rest {
         | 
| 79 | 
            +
                RestResponse execute(1:required RestRequest request)
         | 
| 80 | 
            +
            }
         | 
| @@ -0,0 +1,79 @@ | |
| 1 | 
            +
            #
         | 
| 2 | 
            +
            # Autogenerated by Thrift Compiler (0.8.0)
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
            # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
         | 
| 5 | 
            +
            #
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            require 'thrift'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module ElasticSearch
         | 
| 10 | 
            +
              module Thrift
         | 
| 11 | 
            +
                module Rest
         | 
| 12 | 
            +
                  class Client
         | 
| 13 | 
            +
                    include ::Thrift::Client
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    def execute(request)
         | 
| 16 | 
            +
                      send_execute(request)
         | 
| 17 | 
            +
                      return recv_execute()
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def send_execute(request)
         | 
| 21 | 
            +
                      send_message('execute', Execute_args, :request => request)
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    def recv_execute()
         | 
| 25 | 
            +
                      result = receive_message(Execute_result)
         | 
| 26 | 
            +
                      return result.success unless result.success.nil?
         | 
| 27 | 
            +
                      raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'execute failed: unknown result')
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  class Processor
         | 
| 33 | 
            +
                    include ::Thrift::Processor
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    def process_execute(seqid, iprot, oprot)
         | 
| 36 | 
            +
                      args = read_args(iprot, Execute_args)
         | 
| 37 | 
            +
                      result = Execute_result.new()
         | 
| 38 | 
            +
                      result.success = @handler.execute(args.request)
         | 
| 39 | 
            +
                      write_result(result, oprot, 'execute', seqid)
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  # HELPER FUNCTIONS AND STRUCTURES
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  class Execute_args
         | 
| 46 | 
            +
                    include ::Thrift::Struct, ::Thrift::Struct_Union
         | 
| 47 | 
            +
                    REQUEST = 1
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    FIELDS = {
         | 
| 50 | 
            +
                      REQUEST => {:type => ::Thrift::Types::STRUCT, :name => 'request', :class => ElasticSearch::Thrift::RestRequest}
         | 
| 51 | 
            +
                    }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    def struct_fields; FIELDS; end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    def validate
         | 
| 56 | 
            +
                      raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field request is unset!') unless @request
         | 
| 57 | 
            +
                    end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    ::Thrift::Struct.generate_accessors self
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  class Execute_result
         | 
| 63 | 
            +
                    include ::Thrift::Struct, ::Thrift::Struct_Union
         | 
| 64 | 
            +
                    SUCCESS = 0
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    FIELDS = {
         | 
| 67 | 
            +
                      SUCCESS => {:type => ::Thrift::Types::STRUCT, :name => 'success', :class => ElasticSearch::Thrift::RestResponse}
         | 
| 68 | 
            +
                    }
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                    def struct_fields; FIELDS; end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    def validate
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    ::Thrift::Struct.generate_accessors self
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module ElasticSearch
         | 
| 2 | 
            +
              class TransportBase
         | 
| 3 | 
            +
                def initialize(hosts, options = {})
         | 
| 4 | 
            +
                  @options = options
         | 
| 5 | 
            +
                  @connections =  hosts.collect { |host| get_connection(host) }
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def current_connection
         | 
| 9 | 
            +
                  @connections.sample
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def execute(request)
         | 
| 13 | 
            +
                  raise NotImplementedError
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                private
         | 
| 17 | 
            +
                def get_connection(host)
         | 
| 18 | 
            +
                  raise NotImplementedError
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            require 'faraday'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ElasticSearch
         | 
| 4 | 
            +
              class HTTPTransport < TransportBase
         | 
| 5 | 
            +
                def execute(request)
         | 
| 6 | 
            +
                  response = current_connection.send(request.method, request.path) do |req|
         | 
| 7 | 
            +
                    req.body = request.body unless request.method.eql?(:delete)
         | 
| 8 | 
            +
                    req.params = request.parameters if request.parameters
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
                  ElasticSearch::Response.new(body: response.body, status: response.status)
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                private
         | 
| 14 | 
            +
                def get_connection(host)
         | 
| 15 | 
            +
                  Faraday.new(:url => host)
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            require 'thrift'
         | 
| 2 | 
            +
            require 'elastic_search/thrift/elastic_search_constants'
         | 
| 3 | 
            +
            require 'elastic_search/thrift/elastic_search_types'
         | 
| 4 | 
            +
            require 'elastic_search/thrift/rest'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module ElasticSearch
         | 
| 7 | 
            +
              class ThriftTransport < TransportBase
         | 
| 8 | 
            +
                def execute(request)
         | 
| 9 | 
            +
                  thrift_request = ElasticSearch::Thrift::RestRequest.new
         | 
| 10 | 
            +
                  thrift_request.method = get_method(request.method)
         | 
| 11 | 
            +
                  thrift_request.uri = request.path
         | 
| 12 | 
            +
                  thrift_request.body = request.body
         | 
| 13 | 
            +
                  thrift_request.parameters = request.parameters
         | 
| 14 | 
            +
                  response = current_connection.execute(thrift_request)
         | 
| 15 | 
            +
                  ElasticSearch::Response.new(body: response.body, status: response.status)
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                private
         | 
| 19 | 
            +
                def get_method(method)
         | 
| 20 | 
            +
                  case method
         | 
| 21 | 
            +
                  when :get then ElasticSearch::Thrift::Method::GET
         | 
| 22 | 
            +
                  when :post then ElasticSearch::Thrift::Method::POST
         | 
| 23 | 
            +
                  when :put then ElasticSearch::Thrift::Method::PUT
         | 
| 24 | 
            +
                  when :delete then ElasticSearch::Thrift::Method::DELETE
         | 
| 25 | 
            +
                  when :head then ElasticSearch::Thrift::Method::HEAD
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def get_connection(host)
         | 
| 30 | 
            +
                  host, port = host.to_s.split(":")
         | 
| 31 | 
            +
                  transport = ::Thrift::Socket.new(host, port.to_i, @options[:timeout])
         | 
| 32 | 
            +
                  buffered_transport = ::Thrift::BufferedTransport.new(transport)
         | 
| 33 | 
            +
                  buffered_transport.open
         | 
| 34 | 
            +
                  protocol = ::Thrift::BinaryProtocol.new(buffered_transport)
         | 
| 35 | 
            +
                  ElasticSearch::Thrift::Rest::Client.new(protocol)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            module ElasticSearch
         | 
| 2 | 
            +
              class Type
         | 
| 3 | 
            +
                def initialize(type_name, index)
         | 
| 4 | 
            +
                  @type_name = type_name
         | 
| 5 | 
            +
                  @index = index
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def search(body, parameters = {})
         | 
| 9 | 
            +
                  request = build_request({ method: :get, action: :search, parameters: parameters, body: body || {} })
         | 
| 10 | 
            +
                  response = execute(request)
         | 
| 11 | 
            +
                  ElasticSearch::Search::Results.new(response)
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def put(id, doc)
         | 
| 15 | 
            +
                  request = build_request({ method: :put, id: id.to_s, body: doc })
         | 
| 16 | 
            +
                  execute(request)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
                alias :index :put
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def get(id)
         | 
| 21 | 
            +
                  request = build_request({ method: :get, id: id.to_s })
         | 
| 22 | 
            +
                  response = execute(request)
         | 
| 23 | 
            +
                  ElasticSearch::Item.new(response)
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def delete(id)
         | 
| 27 | 
            +
                  request = build_request({ method: :delete, id: id.to_s })
         | 
| 28 | 
            +
                  execute(request)
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def delete_by_query(body, parameters = {})
         | 
| 32 | 
            +
                  request = build_request({ method: :delete, action: :search, parameters: parameters, body: body || {} })
         | 
| 33 | 
            +
                  execute(request)
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def update(id, body, parameters = {})
         | 
| 37 | 
            +
                  request = build_request({ method: :post, id: id.to_s, action: :update, parameters: parameters, body: doc })
         | 
| 38 | 
            +
                  execute(request)
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def count(parameters = {})
         | 
| 42 | 
            +
                  request = build_request({ method: :post, action: :update, id: id.to_s, body: doc })
         | 
| 43 | 
            +
                  execute(request).body['count']
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def more_like_this(id, parameters = {})
         | 
| 47 | 
            +
                  request = build_request({ method: :get, id: id.to_s, action: :mlt, parameters: parameters, body: doc })
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def delete_mapping
         | 
| 51 | 
            +
                  request = build_request({ method: :delete })
         | 
| 52 | 
            +
                  execute(request).status.eql?(200)
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def execute(request)
         | 
| 56 | 
            +
                  @index.client.execute(request)
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                private
         | 
| 60 | 
            +
                def build_request(parameters = {})
         | 
| 61 | 
            +
                  Request.new({ index: @index.index_name, type: @type_name }.merge(parameters))
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require "active_support/all"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "elastic_search/client"
         | 
| 4 | 
            +
            require "elastic_search/index"
         | 
| 5 | 
            +
            require "elastic_search/item"
         | 
| 6 | 
            +
            require "elastic_search/request"
         | 
| 7 | 
            +
            require "elastic_search/response"
         | 
| 8 | 
            +
            require "elastic_search/search/results"
         | 
| 9 | 
            +
            require "elastic_search/transport/base"
         | 
| 10 | 
            +
            require "elastic_search/transport/thrift"
         | 
| 11 | 
            +
            require "elastic_search/transport/http"
         | 
| 12 | 
            +
            require "elastic_search/type"
         | 
| 13 | 
            +
            require "elastic_search/version"
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            module ElasticSearch
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe ElasticSearch::Client do
         | 
| 4 | 
            +
              TRANSPORT_CONTEXTS.each do |transport, context|
         | 
| 5 | 
            +
                describe context do
         | 
| 6 | 
            +
                  let :client do
         | 
| 7 | 
            +
                    ElasticSearch::Client.new(transport)
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  after do
         | 
| 11 | 
            +
                    begin
         | 
| 12 | 
            +
                      client.delete_index(TEST_INDEX)
         | 
| 13 | 
            +
                    rescue
         | 
| 14 | 
            +
                    end
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  describe :create_index do
         | 
| 18 | 
            +
                    it "should create a new index" do
         | 
| 19 | 
            +
                      index = client.create_index(TEST_INDEX)
         | 
| 20 | 
            +
                      index.must_be_instance_of ElasticSearch::Index
         | 
| 21 | 
            +
                      index.refresh
         | 
| 22 | 
            +
                      client.has_index?(TEST_INDEX).must_equal true
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    it "should create a new index with a mapping" do
         | 
| 26 | 
            +
                      mapping = {
         | 
| 27 | 
            +
                        test_type: {
         | 
| 28 | 
            +
                          properties: {
         | 
| 29 | 
            +
                            foo: { type: :string, analyzer: :keyword }
         | 
| 30 | 
            +
                          }
         | 
| 31 | 
            +
                        }
         | 
| 32 | 
            +
                      }
         | 
| 33 | 
            +
                      index = client.create_index(TEST_INDEX, mappings: mapping)
         | 
| 34 | 
            +
                      index.mapping['test_index']['test_type']['properties']['foo']['analyzer'].must_equal "keyword"
         | 
| 35 | 
            +
                      index.mapping['test_index']['test_type']['properties']['foo']['type'].must_equal "string"
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  describe :delete_index do
         | 
| 40 | 
            +
                    it "should delete an index" do
         | 
| 41 | 
            +
                      client.has_index?(TEST_INDEX).must_equal false
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  describe :has_index? do
         | 
| 46 | 
            +
                    it "should know if an index exists" do
         | 
| 47 | 
            +
                      client.create_index(TEST_INDEX).refresh
         | 
| 48 | 
            +
                      client.has_index?(TEST_INDEX).must_equal true
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -0,0 +1,106 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe ElasticSearch::Index do
         | 
| 4 | 
            +
              TRANSPORT_CONTEXTS.each do |transport, context|
         | 
| 5 | 
            +
                describe context do
         | 
| 6 | 
            +
                  let :client do
         | 
| 7 | 
            +
                    ElasticSearch::Client.new(transport)
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  let :index do
         | 
| 11 | 
            +
                    client[TEST_INDEX]
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  before do
         | 
| 15 | 
            +
                    client.create_index(TEST_INDEX).refresh
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  after do
         | 
| 19 | 
            +
                    begin
         | 
| 20 | 
            +
                      client.delete_index(TEST_INDEX)
         | 
| 21 | 
            +
                    rescue ElasticSearch::IndexMissingException
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  describe :search do
         | 
| 26 | 
            +
                    it "should return results" do
         | 
| 27 | 
            +
                      index['type_1'].put(1, { foo: 'bar' })
         | 
| 28 | 
            +
                      index['type_2'].put(2, { foo: 'baz' })
         | 
| 29 | 
            +
                      index.refresh
         | 
| 30 | 
            +
                      results = index.search(nil, q: '*')
         | 
| 31 | 
            +
                      results.must_be_instance_of ElasticSearch::Search::Results
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    it "should return the total" do
         | 
| 35 | 
            +
                      (1..20).each { |i| index['type'].put(i, { foo: 'bar' }) }
         | 
| 36 | 
            +
                      index.refresh
         | 
| 37 | 
            +
                      results = index.search(nil, q: '*')
         | 
| 38 | 
            +
                      results.total.must_equal 20
         | 
| 39 | 
            +
                      results.count.must_equal 10
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    it "should know the type of results" do
         | 
| 43 | 
            +
                      index['type_1'].put(1, { foo: 'bar' })
         | 
| 44 | 
            +
                      index.refresh
         | 
| 45 | 
            +
                      results = index.search(nil, q: '*')
         | 
| 46 | 
            +
                      results[0].type.must_equal 'type_1'
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  describe :refresh do
         | 
| 51 | 
            +
                    it "should refresh the index" do
         | 
| 52 | 
            +
                      index.refresh
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  describe :open do
         | 
| 57 | 
            +
                    it "should not raise an error if index is open" do
         | 
| 58 | 
            +
                      index.close
         | 
| 59 | 
            +
                      index.open
         | 
| 60 | 
            +
                      index[TEST_TYPE].put(1, { foo: 'bar' })
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  describe :close do
         | 
| 65 | 
            +
                    it "should throw an error when trying to put into a closed index" do
         | 
| 66 | 
            +
                      index.close
         | 
| 67 | 
            +
                      proc { index[TEST_TYPE].put(1, { foo: 'bar' }) }.must_raise ElasticSearch::ResponseError
         | 
| 68 | 
            +
                    end
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  describe :settings do
         | 
| 72 | 
            +
                    it "should return the index settings"
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                  describe :settings= do
         | 
| 76 | 
            +
                    it "should set the index settings"
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                  describe :mapping do
         | 
| 80 | 
            +
                    it "should return the mapping" do
         | 
| 81 | 
            +
                      index.mapping
         | 
| 82 | 
            +
                    end
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  describe :mapping= do
         | 
| 86 | 
            +
                    it "should set the index mapping"
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                  describe :delete_mapping do
         | 
| 90 | 
            +
                    it "should set delete the index mapping"
         | 
| 91 | 
            +
                  end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  describe :optimize do
         | 
| 94 | 
            +
                    it "should optimize the index"
         | 
| 95 | 
            +
                  end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                  describe :exists? do
         | 
| 98 | 
            +
                    it "should check if the index exists" do
         | 
| 99 | 
            +
                      index.exists?.must_equal true
         | 
| 100 | 
            +
                      client.delete_index(TEST_INDEX)
         | 
| 101 | 
            +
                      index.exists?.must_equal false
         | 
| 102 | 
            +
                    end
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
              end
         | 
| 106 | 
            +
            end
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe ElasticSearch::Type do
         | 
| 4 | 
            +
              TRANSPORT_CONTEXTS.each do |transport, context|
         | 
| 5 | 
            +
                describe context do
         | 
| 6 | 
            +
                  let :client do
         | 
| 7 | 
            +
                    ElasticSearch::Client.new(transport)
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  let :index do
         | 
| 11 | 
            +
                    client[TEST_INDEX]
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  let :type do
         | 
| 15 | 
            +
                    index[TEST_TYPE]
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  before do
         | 
| 19 | 
            +
                    client.create_index(TEST_INDEX).refresh
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  after do
         | 
| 23 | 
            +
                    begin client.delete_index(TEST_INDEX) end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  describe :put do
         | 
| 27 | 
            +
                    it "should index a document" do
         | 
| 28 | 
            +
                      type.put(1, { foo: 'bar' })
         | 
| 29 | 
            +
                      index.refresh
         | 
| 30 | 
            +
                      type.get(1)['foo'].must_equal 'bar'
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  describe :get do
         | 
| 35 | 
            +
                    it "should return an error if document does not exist"
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  describe :search do
         | 
| 39 | 
            +
                    it "should return results" do
         | 
| 40 | 
            +
                      type.put(1, { foo: 'bar' })
         | 
| 41 | 
            +
                      type.put(2, { foo: 'baz' })
         | 
| 42 | 
            +
                      index.refresh
         | 
| 43 | 
            +
                      results = type.search(nil, q: '*')
         | 
| 44 | 
            +
                      results.must_be_instance_of ElasticSearch::Search::Results
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    it "should return the total" do
         | 
| 48 | 
            +
                      (1..20).each { |i| type.put(i, { foo: 'bar' }) }
         | 
| 49 | 
            +
                      index.refresh
         | 
| 50 | 
            +
                      results = type.search(nil, q: '*')
         | 
| 51 | 
            +
                      results.total.must_equal 20
         | 
| 52 | 
            +
                      results.count.must_equal 10
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    | @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            require "bundler/setup"
         | 
| 2 | 
            +
            require 'minitest/spec'
         | 
| 3 | 
            +
            require 'minitest/mock'
         | 
| 4 | 
            +
            require 'turn/autorun'
         | 
| 5 | 
            +
            require 'active_support/all'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            require 'elastic_search'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            class MiniTest::Spec
         | 
| 10 | 
            +
              alias :method_name :__name__ if defined? :__name__
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              class << self
         | 
| 13 | 
            +
                alias :context :describe
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            Turn.config.format = :progress
         | 
| 18 | 
            +
            Turn.config.natural = true
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            TEST_INDEX = 'test_index'
         | 
| 21 | 
            +
            TEST_TYPE = 'test_type'
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            TRANSPORT_CONTEXTS = [
         | 
| 24 | 
            +
              [ElasticSearch::ThriftTransport.new(['localhost:9500']), 'Using Thrift'],
         | 
| 25 | 
            +
              [ElasticSearch::HTTPTransport.new(['http://localhost:9200']), 'Using HTTP']
         | 
| 26 | 
            +
            ]
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,139 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: elasticsearch-ruby
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.0.1
         | 
| 5 | 
            +
              prerelease: 
         | 
| 6 | 
            +
            platform: ruby
         | 
| 7 | 
            +
            authors:
         | 
| 8 | 
            +
            - Edmund Salvacion
         | 
| 9 | 
            +
            autorequire: 
         | 
| 10 | 
            +
            bindir: bin
         | 
| 11 | 
            +
            cert_chain: []
         | 
| 12 | 
            +
            date: 2012-04-16 00:00:00.000000000 Z
         | 
| 13 | 
            +
            dependencies:
         | 
| 14 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 15 | 
            +
              name: thrift
         | 
| 16 | 
            +
              requirement: &70333353079280 !ruby/object:Gem::Requirement
         | 
| 17 | 
            +
                none: false
         | 
| 18 | 
            +
                requirements:
         | 
| 19 | 
            +
                - - ! '>='
         | 
| 20 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            +
                    version: '0'
         | 
| 22 | 
            +
              type: :runtime
         | 
| 23 | 
            +
              prerelease: false
         | 
| 24 | 
            +
              version_requirements: *70333353079280
         | 
| 25 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 26 | 
            +
              name: faraday
         | 
| 27 | 
            +
              requirement: &70333353078860 !ruby/object:Gem::Requirement
         | 
| 28 | 
            +
                none: false
         | 
| 29 | 
            +
                requirements:
         | 
| 30 | 
            +
                - - ! '>='
         | 
| 31 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 32 | 
            +
                    version: '0'
         | 
| 33 | 
            +
              type: :runtime
         | 
| 34 | 
            +
              prerelease: false
         | 
| 35 | 
            +
              version_requirements: *70333353078860
         | 
| 36 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 37 | 
            +
              name: activesupport
         | 
| 38 | 
            +
              requirement: &70333353078200 !ruby/object:Gem::Requirement
         | 
| 39 | 
            +
                none: false
         | 
| 40 | 
            +
                requirements:
         | 
| 41 | 
            +
                - - ! '>='
         | 
| 42 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 43 | 
            +
                    version: 3.0.0
         | 
| 44 | 
            +
              type: :runtime
         | 
| 45 | 
            +
              prerelease: false
         | 
| 46 | 
            +
              version_requirements: *70333353078200
         | 
| 47 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 48 | 
            +
              name: rake
         | 
| 49 | 
            +
              requirement: &70333353077540 !ruby/object:Gem::Requirement
         | 
| 50 | 
            +
                none: false
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ! '>='
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '0'
         | 
| 55 | 
            +
              type: :development
         | 
| 56 | 
            +
              prerelease: false
         | 
| 57 | 
            +
              version_requirements: *70333353077540
         | 
| 58 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 59 | 
            +
              name: minitest
         | 
| 60 | 
            +
              requirement: &70333353077040 !ruby/object:Gem::Requirement
         | 
| 61 | 
            +
                none: false
         | 
| 62 | 
            +
                requirements:
         | 
| 63 | 
            +
                - - ! '>='
         | 
| 64 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 65 | 
            +
                    version: '0'
         | 
| 66 | 
            +
              type: :development
         | 
| 67 | 
            +
              prerelease: false
         | 
| 68 | 
            +
              version_requirements: *70333353077040
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: turn
         | 
| 71 | 
            +
              requirement: &70333353076580 !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                none: false
         | 
| 73 | 
            +
                requirements:
         | 
| 74 | 
            +
                - - ! '>='
         | 
| 75 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 76 | 
            +
                    version: '0'
         | 
| 77 | 
            +
              type: :development
         | 
| 78 | 
            +
              prerelease: false
         | 
| 79 | 
            +
              version_requirements: *70333353076580
         | 
| 80 | 
            +
            description: Ruby Driver for Elastic Search
         | 
| 81 | 
            +
            email:
         | 
| 82 | 
            +
            - edmund@edmundatwork.com
         | 
| 83 | 
            +
            executables: []
         | 
| 84 | 
            +
            extensions: []
         | 
| 85 | 
            +
            extra_rdoc_files: []
         | 
| 86 | 
            +
            files:
         | 
| 87 | 
            +
            - .gitignore
         | 
| 88 | 
            +
            - Gemfile
         | 
| 89 | 
            +
            - Rakefile
         | 
| 90 | 
            +
            - elastic_search.gemspec
         | 
| 91 | 
            +
            - lib/elastic_search.rb
         | 
| 92 | 
            +
            - lib/elastic_search/client.rb
         | 
| 93 | 
            +
            - lib/elastic_search/index.rb
         | 
| 94 | 
            +
            - lib/elastic_search/item.rb
         | 
| 95 | 
            +
            - lib/elastic_search/request.rb
         | 
| 96 | 
            +
            - lib/elastic_search/response.rb
         | 
| 97 | 
            +
            - lib/elastic_search/search/results.rb
         | 
| 98 | 
            +
            - lib/elastic_search/thrift/elastic_search_constants.rb
         | 
| 99 | 
            +
            - lib/elastic_search/thrift/elastic_search_types.rb
         | 
| 100 | 
            +
            - lib/elastic_search/thrift/elasticsearch.thrift
         | 
| 101 | 
            +
            - lib/elastic_search/thrift/rest.rb
         | 
| 102 | 
            +
            - lib/elastic_search/transport/base.rb
         | 
| 103 | 
            +
            - lib/elastic_search/transport/http.rb
         | 
| 104 | 
            +
            - lib/elastic_search/transport/thrift.rb
         | 
| 105 | 
            +
            - lib/elastic_search/type.rb
         | 
| 106 | 
            +
            - lib/elastic_search/version.rb
         | 
| 107 | 
            +
            - spec/elasticsearch/client_spec.rb
         | 
| 108 | 
            +
            - spec/elasticsearch/index_spec.rb
         | 
| 109 | 
            +
            - spec/elasticsearch/type_spec.rb
         | 
| 110 | 
            +
            - spec/spec_helper.rb
         | 
| 111 | 
            +
            homepage: ''
         | 
| 112 | 
            +
            licenses: []
         | 
| 113 | 
            +
            post_install_message: 
         | 
| 114 | 
            +
            rdoc_options: []
         | 
| 115 | 
            +
            require_paths:
         | 
| 116 | 
            +
            - lib
         | 
| 117 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 118 | 
            +
              none: false
         | 
| 119 | 
            +
              requirements:
         | 
| 120 | 
            +
              - - ! '>='
         | 
| 121 | 
            +
                - !ruby/object:Gem::Version
         | 
| 122 | 
            +
                  version: '0'
         | 
| 123 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 124 | 
            +
              none: false
         | 
| 125 | 
            +
              requirements:
         | 
| 126 | 
            +
              - - ! '>='
         | 
| 127 | 
            +
                - !ruby/object:Gem::Version
         | 
| 128 | 
            +
                  version: '0'
         | 
| 129 | 
            +
            requirements: []
         | 
| 130 | 
            +
            rubyforge_project: elasticsearch
         | 
| 131 | 
            +
            rubygems_version: 1.8.17
         | 
| 132 | 
            +
            signing_key: 
         | 
| 133 | 
            +
            specification_version: 3
         | 
| 134 | 
            +
            summary: Ruby Driver for Elastic Search
         | 
| 135 | 
            +
            test_files:
         | 
| 136 | 
            +
            - spec/elasticsearch/client_spec.rb
         | 
| 137 | 
            +
            - spec/elasticsearch/index_spec.rb
         | 
| 138 | 
            +
            - spec/elasticsearch/type_spec.rb
         | 
| 139 | 
            +
            - spec/spec_helper.rb
         |