searchkick 0.7.1 → 0.7.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 357856a821b11d5671469d3bdd8e7e9f4a2051db
4
- data.tar.gz: 7986b966d2b34b4e05e53bc8feb9e737ade83f87
3
+ metadata.gz: 7cffd1af1407a4da1aedcc1a7af63202939586c5
4
+ data.tar.gz: 3fa1d499bb7f1fd4ff7a71a92fc2237931cc04fd
5
5
  SHA512:
6
- metadata.gz: 856a6df897efc1bdd28f09bbf996ae1101575ae41971001f5be9688d2de052674a5ff5baf2a079d32308cd8dfdeb1d112890111e69b3275e3f1c8e4232ef2a19
7
- data.tar.gz: 242d7f27d25952405a6a06745d4dc83a2e116da5d6f365a7be6a5fba3261080405b79541898d20d2bbe1719299c3b999589d04d2e42093da876e71ad25f49d6b
6
+ metadata.gz: 0c98bdf5690ec1bb4b837033f9e08c80cd6aacaa2d811c651108fedcee940df68168ec015c4207b210c3003315a9910517d7fd8210e7b3b2daec1d50c280cf15
7
+ data.tar.gz: a101b6f2ccd2d7c65d8290b9da7bdc5da8da1efceef7cd51371c743e7bef5cb988b9a6193ef50bf2d5f206c019712090b30f573046bed2058bc3eeef611ab9f1
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ test/version_tmp
17
17
  tmp
18
18
  *.log
19
19
  .DS_Store
20
+ .ruby-*
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 0.7.2
2
+
3
+ - Added smart facets
4
+ - Added more fields to `load: false` result
5
+ - Fixed logging for multi-index searches
6
+ - Added `first_page?` and `last_page?` for improved Kaminari support
7
+
1
8
  ## 0.7.1
2
9
 
3
10
  - Fixed huge issue w/ zero-downtime reindexing on 0.90
data/README.md CHANGED
@@ -43,6 +43,8 @@ Add this line to your application’s Gemfile:
43
43
  gem "searchkick"
44
44
  ```
45
45
 
46
+ For Elasticsearch 0.90, use version `0.6.3`.
47
+
46
48
  Add searchkick to models you want to search.
47
49
 
48
50
  ```ruby
@@ -403,10 +405,29 @@ products = Product.search "chuck taylor", facets: [:product_type, :gender, :bran
403
405
  p products.facets
404
406
  ```
405
407
 
406
- Advanced
408
+ By default, `where` conditions are not applied to facets (for backward compatibility).
409
+
410
+ ```ruby
411
+ Product.search "wingtips", where: {color: "brandy"}, facets: [:size]
412
+ # facets *not* filtered by color :(
413
+ ```
414
+
415
+ Change this with:
416
+
417
+ ```ruby
418
+ Product.search "wingtips", where: {color: "brandy"}, facets: [:size], smart_facets: true
419
+ ```
420
+
421
+ or set `where` conditions for each facet separately:
407
422
 
408
423
  ```ruby
409
- Product.search "2% Milk", facets: {store_id: {where: {in_stock: true}, limit: 10}}
424
+ Product.search "wingtips", facets: {size: {where: {color: "brandy"}}}
425
+ ```
426
+
427
+ Limit
428
+
429
+ ```ruby
430
+ Product.search "2% Milk", facets: {store_id: {limit: 10}}
410
431
  ```
411
432
 
412
433
  Ranges
@@ -595,8 +616,6 @@ products = query.execute
595
616
 
596
617
  ## Reference
597
618
 
598
- Searchkick requires Elasticsearch `0.90.4` or higher.
599
-
600
619
  Reindex one record
601
620
 
602
621
  ```ruby
@@ -746,7 +765,7 @@ rake searchkick:reindex:all
746
765
 
747
766
  ## Note about 0.6.0 and 0.7.0
748
767
 
749
- If running Searchkick `0.6.0` or `0.7.0` and Elasticsearch `0.90`, we recommend upgrading to Searchkick `0.7.1` to fix an issue that causes downtime when reindexing.
768
+ If running Searchkick `0.6.0` or `0.7.0` and Elasticsearch `0.90`, we recommend upgrading to Searchkick `0.6.1` or `0.7.1` to fix an issue that causes downtime when reindexing.
750
769
 
751
770
  ## Elasticsearch Gotchas
752
771
 
@@ -37,10 +37,11 @@ module Searchkick
37
37
  payload = event.payload
38
38
  name = "#{payload[:name]} (#{event.duration.round(1)}ms)"
39
39
  type = payload[:query][:type]
40
+ index = payload[:query][:index].is_a?(Array) ? payload[:query][:index].join(",") : payload[:query][:index]
40
41
 
41
42
  # no easy way to tell which host the client will use
42
43
  host = Searchkick.client.transport.hosts.first
43
- debug " #{color(name, YELLOW, true)} curl #{host[:protocol]}://#{host[:host]}:#{host[:port]}/#{CGI.escape(payload[:query][:index])}#{type ? "/#{type.map{|t| CGI.escape(t) }.join(",")}" : ""}/_search?pretty -d '#{payload[:query][:body].to_json}'"
44
+ debug " #{color(name, YELLOW, true)} curl #{host[:protocol]}://#{host[:host]}:#{host[:port]}/#{CGI.escape(index)}#{type ? "/#{type.map{|t| CGI.escape(t) }.join(",")}" : ""}/_search?pretty -d '#{payload[:query][:body].to_json}'"
44
45
  end
45
46
  end
46
47
 
@@ -239,6 +239,7 @@ module Searchkick
239
239
  # offset is not possible
240
240
  # http://elasticsearch-users.115913.n3.nabble.com/Is-pagination-possible-in-termsStatsFacet-td3422943.html
241
241
 
242
+ facet_options.deep_merge!(where: options[:where].reject{|k| k == field}) if options[:smart_facets] == true
242
243
  facet_filters = where_filters(facet_options[:where])
243
244
  if facet_filters.any?
244
245
  payload[:facets][field][:facet_filter] = {
@@ -448,4 +449,4 @@ module Searchkick
448
449
  end
449
450
 
450
451
  end
451
- end
452
+ end
@@ -25,7 +25,11 @@ module Searchkick
25
25
  hit_ids = hit_ids.map(&:to_s)
26
26
  records.sort_by{|r| hit_ids.index(r.id.to_s) }
27
27
  else
28
- hits.map{|hit| Hashie::Mash.new(hit["_source"]) }
28
+ hits.map do |hit|
29
+ result = hit.except("_source").merge(hit["_source"])
30
+ result["id"] = result["_id"]
31
+ Hashie::Mash.new(result)
32
+ end
29
33
  end
30
34
  end
31
35
  end
@@ -90,6 +94,14 @@ module Searchkick
90
94
  current_page < total_pages ? (current_page + 1) : nil
91
95
  end
92
96
 
97
+ def first_page?
98
+ previous_page.nil?
99
+ end
100
+
101
+ def last_page?
102
+ next_page.nil?
103
+ end
104
+
93
105
  protected
94
106
 
95
107
  def hits
@@ -1,3 +1,3 @@
1
1
  module Searchkick
2
- VERSION = "0.7.1"
2
+ VERSION = "0.7.2"
3
3
  end
data/test/facets_test.rb CHANGED
@@ -5,18 +5,19 @@ class TestFacets < Minitest::Unit::TestCase
5
5
  def setup
6
6
  super
7
7
  store [
8
- {name: "Product Show", store_id: 1, in_stock: true, color: "blue", price: 21},
9
- {name: "Product Hide", store_id: 2, in_stock: false, color: "green", price: 25},
10
- {name: "Product B", store_id: 2, in_stock: false, color: "red", price: 5}
8
+ {name: "Product Show", latitude: 37.7833, longitude: 12.4167, store_id: 1, in_stock: true, color: "blue", price: 21},
9
+ {name: "Product Hide", latitude: 29.4167, longitude: -98.5000, store_id: 2, in_stock: false, color: "green", price: 25},
10
+ {name: "Product B", latitude: 43.9333, longitude: -122.4667, store_id: 2, in_stock: false, color: "red", price: 5},
11
+ {name: "Foo", latitude: 43.9333, longitude: 12.4667, store_id: 3, in_stock: false, color: "yellow", price: 15}
11
12
  ]
12
13
  end
13
14
 
14
15
  def test_basic
15
- assert_equal 2, Product.search("Product", facets: [:store_id]).facets["store_id"]["terms"].size
16
+ assert_equal ({1 => 1, 2 => 2}), store_facet(facets: [:store_id])
16
17
  end
17
18
 
18
19
  def test_where
19
- assert_equal 1, Product.search("Product", facets: {store_id: {where: {in_stock: true}}}).facets["store_id"]["terms"].size
20
+ assert_equal ({1 => 1}), store_facet(facets: {store_id: {where: {in_stock: true}}})
20
21
  end
21
22
 
22
23
  def test_limit
@@ -37,4 +38,31 @@ class TestFacets < Minitest::Unit::TestCase
37
38
  assert_equal 0, facet["ranges"][1]["count"]
38
39
  assert_equal 2, facet["ranges"][2]["count"]
39
40
  end
41
+
42
+ def test_where_no_smart_facets
43
+ assert_equal ({2 => 2}), store_facet(where: {color: "red"}, facets: {store_id: {where: {in_stock: false}}})
44
+ end
45
+
46
+ def test_smart_facets
47
+ assert_equal ({1 => 1}), store_facet(where: {in_stock: true}, facets: [:store_id], smart_facets: true)
48
+ end
49
+
50
+ def test_smart_facets_where
51
+ assert_equal ({2 => 1}), store_facet(where: {color: "red"}, facets: {store_id: {where: {in_stock: false}}}, smart_facets: true)
52
+ end
53
+
54
+ def test_smart_facets_skip_facet
55
+ assert_equal ({1 => 1, 2 => 2}), store_facet(where: {store_id: 2}, facets: [:store_id], smart_facets: true)
56
+ end
57
+
58
+ def test_smart_facets_skip_facet_complex
59
+ assert_equal ({1 => 1, 2 => 1}), store_facet(where: {store_id: 2, price: {gt: 5}}, facets: [:store_id], smart_facets: true)
60
+ end
61
+
62
+ protected
63
+
64
+ def store_facet(options)
65
+ Hash[ Product.search("Product", options).facets["store_id"]["terms"].map{|v| [v["term"], v["count"]] } ]
66
+ end
67
+
40
68
  end
data/test/sql_test.rb CHANGED
@@ -29,6 +29,8 @@ class TestSql < Minitest::Unit::TestCase
29
29
  assert_equal 5, products.total_entries
30
30
  assert_equal 2, products.limit_value
31
31
  assert_equal 4, products.offset_value
32
+ assert !products.first_page?
33
+ assert !products.last_page?
32
34
  end
33
35
 
34
36
  def test_pagination_nil_page
@@ -36,6 +38,7 @@ class TestSql < Minitest::Unit::TestCase
36
38
  products = Product.search("product", order: {name: :asc}, page: nil, per_page: 2)
37
39
  assert_equal ["Product A", "Product B"], products.map(&:name)
38
40
  assert_equal 1, products.current_page
41
+ assert products.first_page?
39
42
  end
40
43
 
41
44
  def test_where
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.1
4
+ version: 0.7.2
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-04-12 00:00:00.000000000 Z
11
+ date: 2014-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel