searchkick 0.7.4 → 0.7.5
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/lib/searchkick.rb +3 -0
- data/lib/searchkick/index.rb +8 -9
- data/lib/searchkick/query.rb +8 -2
- data/lib/searchkick/reindex.rb +0 -5
- data/lib/searchkick/results.rb +9 -3
- data/lib/searchkick/version.rb +1 -1
- data/test/index_test.rb +29 -0
- data/test/sql_test.rb +2 -2
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: f2b3dc0e591516c6ddd76101c1053211ae7f9fe9
         | 
| 4 | 
            +
              data.tar.gz: f56695cbbfcc4e92b6d751add7c00ec6bbdb82ed
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1a4ca76c448e90b4d838aa1e0076b01355866b837a046618222aaa7e65b9142b3370c8f93fc622be57e248a5ed8fd4941155fa915dda118c1781893266c832c6
         | 
| 7 | 
            +
              data.tar.gz: 2d7f62a4329cf8005f57ae60968f3e2aea626cff87e5073a8fa141250ec135424ba8bb2ccff46ddf8033bdf07d05ecad3dec59fceeb5d67d044911e7ffa9f561
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -353,7 +353,7 @@ Typically, you want to use a JavaScript library like [typeahead.js](http://twitt | |
| 353 353 |  | 
| 354 354 | 
             
            #### Here’s how to make it work with Rails
         | 
| 355 355 |  | 
| 356 | 
            -
            First, add a controller action.
         | 
| 356 | 
            +
            First, add a route and controller action.
         | 
| 357 357 |  | 
| 358 358 | 
             
            ```ruby
         | 
| 359 359 | 
             
            # app/controllers/cities_controller.rb
         | 
    
        data/lib/searchkick.rb
    CHANGED
    
    | @@ -13,6 +13,9 @@ require "searchkick/tasks" | |
| 13 13 | 
             
            require "searchkick/logging" if defined?(Rails)
         | 
| 14 14 |  | 
| 15 15 | 
             
            module Searchkick
         | 
| 16 | 
            +
              class MissingIndexError < StandardError; end
         | 
| 17 | 
            +
              class UnsupportedVersionError < StandardError; end
         | 
| 18 | 
            +
              class InvalidQueryError < Elasticsearch::Transport::Transport::Errors::BadRequest; end
         | 
| 16 19 |  | 
| 17 20 | 
             
              def self.client
         | 
| 18 21 | 
             
                @client ||= Elasticsearch::Client.new(url: ENV["ELASTICSEARCH_URL"])
         | 
    
        data/lib/searchkick/index.rb
    CHANGED
    
    | @@ -26,7 +26,7 @@ module Searchkick | |
| 26 26 | 
             
                  client.index(
         | 
| 27 27 | 
             
                    index: name,
         | 
| 28 28 | 
             
                    type: document_type(record),
         | 
| 29 | 
            -
                    id: record | 
| 29 | 
            +
                    id: search_id(record),
         | 
| 30 30 | 
             
                    body: search_data(record)
         | 
| 31 31 | 
             
                  )
         | 
| 32 32 | 
             
                end
         | 
| @@ -35,7 +35,7 @@ module Searchkick | |
| 35 35 | 
             
                  client.delete(
         | 
| 36 36 | 
             
                    index: name,
         | 
| 37 37 | 
             
                    type: document_type(record),
         | 
| 38 | 
            -
                    id: record | 
| 38 | 
            +
                    id: search_id(record)
         | 
| 39 39 | 
             
                  )
         | 
| 40 40 | 
             
                end
         | 
| 41 41 |  | 
| @@ -44,7 +44,7 @@ module Searchkick | |
| 44 44 | 
             
                    client.bulk(
         | 
| 45 45 | 
             
                      index: name,
         | 
| 46 46 | 
             
                      type: type,
         | 
| 47 | 
            -
                      body: batch.map{|r| data = search_data(r); {index: {_id:  | 
| 47 | 
            +
                      body: batch.map{|r| data = search_data(r); {index: {_id: search_id(r), data: data}} }
         | 
| 48 48 | 
             
                    )
         | 
| 49 49 | 
             
                  end
         | 
| 50 50 | 
             
                end
         | 
| @@ -71,16 +71,15 @@ module Searchkick | |
| 71 71 | 
             
                  klass_document_type(record.class)
         | 
| 72 72 | 
             
                end
         | 
| 73 73 |  | 
| 74 | 
            +
                def search_id(record)
         | 
| 75 | 
            +
                  record.id.is_a?(Numeric) ? record.id : record.id.to_s
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 74 78 | 
             
                def search_data(record)
         | 
| 75 79 | 
             
                  source = record.search_data
         | 
| 76 80 |  | 
| 77 81 | 
             
                  # stringify fields
         | 
| 78 | 
            -
                  source = source.inject({}){|memo,(k,v)| memo[k.to_s] = v; memo}
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                  # Mongoid 4 hack
         | 
| 81 | 
            -
                  if defined?(BSON::ObjectId) and source["_id"].is_a?(BSON::ObjectId)
         | 
| 82 | 
            -
                    source["_id"] = source["_id"].to_s
         | 
| 83 | 
            -
                  end
         | 
| 82 | 
            +
                  source = source.inject({}){|memo,(k,v)| memo[k.to_s] = v; memo}.except("id", "_id")
         | 
| 84 83 |  | 
| 85 84 | 
             
                  options = record.class.searchkick_options
         | 
| 86 85 |  | 
    
        data/lib/searchkick/query.rb
    CHANGED
    
    | @@ -328,7 +328,7 @@ module Searchkick | |
| 328 328 | 
             
                  rescue => e # TODO rescue type
         | 
| 329 329 | 
             
                    status_code = e.message[1..3].to_i
         | 
| 330 330 | 
             
                    if status_code == 404
         | 
| 331 | 
            -
                      raise "Index missing - run #{searchkick_klass.name}.reindex"
         | 
| 331 | 
            +
                      raise MissingIndexError, "Index missing - run #{searchkick_klass.name}.reindex"
         | 
| 332 332 | 
             
                    elsif status_code == 500 and (
         | 
| 333 333 | 
             
                        e.message.include?("IllegalArgumentException[minimumSimilarity >= 1]") or
         | 
| 334 334 | 
             
                        e.message.include?("No query registered for [multi_match]") or
         | 
| @@ -336,7 +336,13 @@ module Searchkick | |
| 336 336 | 
             
                        e.message.include?("No query registered for [function_score]]")
         | 
| 337 337 | 
             
                      )
         | 
| 338 338 |  | 
| 339 | 
            -
                      raise "This version of Searchkick requires Elasticsearch 0.90.4 or greater"
         | 
| 339 | 
            +
                      raise UnsupportedVersionError, "This version of Searchkick requires Elasticsearch 0.90.4 or greater"
         | 
| 340 | 
            +
                    elsif status_code == 400
         | 
| 341 | 
            +
                      if e.message.include?("[multi_match] analyzer [searchkick_search] not found")
         | 
| 342 | 
            +
                        raise InvalidQueryError, "Bad mapping - run #{searchkick_klass.name}.reindex"
         | 
| 343 | 
            +
                      else
         | 
| 344 | 
            +
                        raise InvalidQueryError, e.message
         | 
| 345 | 
            +
                      end
         | 
| 340 346 | 
             
                    else
         | 
| 341 347 | 
             
                      raise e
         | 
| 342 348 | 
             
                    end
         | 
    
        data/lib/searchkick/reindex.rb
    CHANGED
    
    | @@ -127,11 +127,6 @@ module Searchkick | |
| 127 127 | 
             
                            tokenizer: "standard",
         | 
| 128 128 | 
             
                            filter: ["lowercase", "asciifolding", "searchkick_suggest_shingle"]
         | 
| 129 129 | 
             
                          },
         | 
| 130 | 
            -
                          searchkick_suggest_index: {
         | 
| 131 | 
            -
                            type: "custom",
         | 
| 132 | 
            -
                            tokenizer: "standard",
         | 
| 133 | 
            -
                            filter: ["lowercase", "asciifolding", "searchkick_suggest_shingle"]
         | 
| 134 | 
            -
                          },
         | 
| 135 130 | 
             
                          searchkick_text_start_index: {
         | 
| 136 131 | 
             
                            type: "custom",
         | 
| 137 132 | 
             
                            tokenizer: "keyword",
         | 
    
        data/lib/searchkick/results.rb
    CHANGED
    
    | @@ -24,13 +24,18 @@ module Searchkick | |
| 24 24 | 
             
                        if options[:includes]
         | 
| 25 25 | 
             
                          records = records.includes(options[:includes])
         | 
| 26 26 | 
             
                        end
         | 
| 27 | 
            -
                        results[type] = | 
| 27 | 
            +
                        results[type] =
         | 
| 28 | 
            +
                          if records.respond_to?(:primary_key)
         | 
| 29 | 
            +
                            records.where(records.primary_key => grouped_hits.map{|hit| hit["_id"] }).to_a
         | 
| 30 | 
            +
                          else
         | 
| 31 | 
            +
                            records.queryable.for_ids(grouped_hits.map{|hit| hit["_id"] }).to_a
         | 
| 32 | 
            +
                          end
         | 
| 28 33 | 
             
                      end
         | 
| 29 34 |  | 
| 30 35 | 
             
                      # sort
         | 
| 31 36 | 
             
                      hits.map do |hit|
         | 
| 32 37 | 
             
                        results[hit["_type"]].find{|r| r.id.to_s == hit["_id"].to_s }
         | 
| 33 | 
            -
                      end
         | 
| 38 | 
            +
                      end.compact
         | 
| 34 39 | 
             
                    else
         | 
| 35 40 | 
             
                      hits.map do |hit|
         | 
| 36 41 | 
             
                        result = hit.except("_source").merge(hit["_source"])
         | 
| @@ -88,9 +93,10 @@ module Searchkick | |
| 88 93 | 
             
                def total_pages
         | 
| 89 94 | 
             
                  (total_count / per_page.to_f).ceil
         | 
| 90 95 | 
             
                end
         | 
| 96 | 
            +
                alias_method :num_pages, :total_pages
         | 
| 91 97 |  | 
| 92 98 | 
             
                def offset_value
         | 
| 93 | 
            -
                  current_page * per_page
         | 
| 99 | 
            +
                  (current_page - 1) * per_page
         | 
| 94 100 | 
             
                end
         | 
| 95 101 | 
             
                alias_method :offset, :offset_value
         | 
| 96 102 |  | 
    
        data/lib/searchkick/version.rb
    CHANGED
    
    
    
        data/test/index_test.rb
    CHANGED
    
    | @@ -35,6 +35,35 @@ class TestIndex < Minitest::Unit::TestCase | |
| 35 35 | 
             
                assert_equal ["Dollar Tree"], Store.search(query: {match: {name: "Dollar Tree"}}).map(&:name)
         | 
| 36 36 | 
             
              end
         | 
| 37 37 |  | 
| 38 | 
            +
              def test_record_not_found
         | 
| 39 | 
            +
                store_names ["Product A", "Product B"]
         | 
| 40 | 
            +
                Product.where(name: "Product A").delete_all
         | 
| 41 | 
            +
                assert_search "product", ["Product B"]
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              def test_bad_mapping
         | 
| 45 | 
            +
                Product.searchkick_index.delete
         | 
| 46 | 
            +
                store_names ["Product A"]
         | 
| 47 | 
            +
                assert_raises(Searchkick::InvalidQueryError){ Product.search "test" }
         | 
| 48 | 
            +
              ensure
         | 
| 49 | 
            +
                Product.reindex
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              def test_missing_index
         | 
| 53 | 
            +
                assert_raises(Searchkick::MissingIndexError){ Product.search "test", index_name: "not_found" }
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              def test_unsupported_version
         | 
| 57 | 
            +
                raises_exception = lambda { |s| raise Elasticsearch::Transport::Transport::Error.new("[500] No query registered for [multi_match]") }
         | 
| 58 | 
            +
                Searchkick.client.stub :search, raises_exception do
         | 
| 59 | 
            +
                  assert_raises(Searchkick::UnsupportedVersionError){ Product.search("test") }
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              def test_invalid_query
         | 
| 64 | 
            +
                assert_raises(Searchkick::InvalidQueryError){ Product.search(query: {}) }
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
             | 
| 38 67 | 
             
              if defined?(ActiveRecord)
         | 
| 39 68 |  | 
| 40 69 | 
             
                def test_transaction
         | 
    
        data/test/sql_test.rb
    CHANGED
    
    | @@ -30,8 +30,8 @@ class TestSql < Minitest::Unit::TestCase | |
| 30 30 | 
             
                assert_equal 5, products.total_count
         | 
| 31 31 | 
             
                assert_equal 5, products.total_entries
         | 
| 32 32 | 
             
                assert_equal 2, products.limit_value
         | 
| 33 | 
            -
                assert_equal  | 
| 34 | 
            -
                assert_equal  | 
| 33 | 
            +
                assert_equal 2, products.offset_value
         | 
| 34 | 
            +
                assert_equal 2, products.offset
         | 
| 35 35 | 
             
                assert !products.first_page?
         | 
| 36 36 | 
             
                assert !products.last_page?
         | 
| 37 37 | 
             
                assert !products.empty?
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: searchkick
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.7. | 
| 4 | 
            +
              version: 0.7.5
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Andrew Kane
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014-05- | 
| 11 | 
            +
            date: 2014-05-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activemodel
         |