tire 0.4.3 → 0.5.0

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.
Files changed (57) hide show
  1. data/.gitignore +1 -1
  2. data/.yardopts +1 -0
  3. data/README.markdown +2 -2
  4. data/examples/rails-application-template.rb +20 -6
  5. data/lib/tire.rb +2 -0
  6. data/lib/tire/alias.rb +1 -1
  7. data/lib/tire/configuration.rb +8 -0
  8. data/lib/tire/dsl.rb +69 -2
  9. data/lib/tire/index.rb +33 -20
  10. data/lib/tire/model/indexing.rb +7 -1
  11. data/lib/tire/model/persistence.rb +7 -4
  12. data/lib/tire/model/persistence/attributes.rb +1 -1
  13. data/lib/tire/model/persistence/finders.rb +4 -16
  14. data/lib/tire/model/search.rb +21 -8
  15. data/lib/tire/multi_search.rb +263 -0
  16. data/lib/tire/results/collection.rb +78 -49
  17. data/lib/tire/results/item.rb +6 -3
  18. data/lib/tire/results/pagination.rb +15 -1
  19. data/lib/tire/rubyext/ruby_1_8.rb +1 -7
  20. data/lib/tire/rubyext/uri_escape.rb +74 -0
  21. data/lib/tire/search.rb +33 -11
  22. data/lib/tire/search/facet.rb +8 -3
  23. data/lib/tire/search/filter.rb +1 -1
  24. data/lib/tire/search/highlight.rb +1 -1
  25. data/lib/tire/search/queries/match.rb +40 -0
  26. data/lib/tire/search/query.rb +42 -6
  27. data/lib/tire/search/scan.rb +1 -1
  28. data/lib/tire/search/script_field.rb +1 -1
  29. data/lib/tire/search/sort.rb +1 -1
  30. data/lib/tire/tasks.rb +17 -14
  31. data/lib/tire/version.rb +26 -8
  32. data/test/integration/active_record_searchable_test.rb +248 -129
  33. data/test/integration/boosting_queries_test.rb +32 -0
  34. data/test/integration/custom_score_queries_test.rb +1 -0
  35. data/test/integration/dsl_search_test.rb +9 -1
  36. data/test/integration/facets_test.rb +19 -6
  37. data/test/integration/match_query_test.rb +79 -0
  38. data/test/integration/multi_search_test.rb +114 -0
  39. data/test/integration/persistent_model_test.rb +58 -0
  40. data/test/models/article.rb +1 -1
  41. data/test/models/persistent_article_in_index.rb +16 -0
  42. data/test/models/persistent_article_with_defaults.rb +4 -3
  43. data/test/test_helper.rb +3 -1
  44. data/test/unit/configuration_test.rb +10 -0
  45. data/test/unit/index_test.rb +69 -27
  46. data/test/unit/model_initialization_test.rb +31 -0
  47. data/test/unit/model_persistence_test.rb +21 -7
  48. data/test/unit/model_search_test.rb +56 -5
  49. data/test/unit/multi_search_test.rb +304 -0
  50. data/test/unit/results_collection_test.rb +42 -2
  51. data/test/unit/results_item_test.rb +4 -0
  52. data/test/unit/search_facet_test.rb +35 -11
  53. data/test/unit/search_query_test.rb +96 -0
  54. data/test/unit/search_test.rb +60 -3
  55. data/test/unit/tire_test.rb +14 -0
  56. data/tire.gemspec +0 -1
  57. metadata +75 -44
@@ -10,7 +10,8 @@ module Tire
10
10
  Configuration.reset
11
11
  @default_response = { 'hits' => { 'hits' => [{'_id' => 1, '_score' => 1, '_source' => {:title => 'Test'}},
12
12
  {'_id' => 2},
13
- {'_id' => 3}] } }
13
+ {'_id' => 3}],
14
+ 'max_score' => 1.0 } }
14
15
  end
15
16
 
16
17
  should "be iterable" do
@@ -32,6 +33,11 @@ module Tire
32
33
  assert_equal 2, Results::Collection.new(@default_response)[1][:id]
33
34
  end
34
35
 
36
+ should "allow slicing" do
37
+ assert_equal [2,3], Results::Collection.new(@default_response)[1,2].map {|res| res[:id]}
38
+ assert_equal [3], Results::Collection.new(@default_response)[-1,1].map {|res| res[:id]}
39
+ end
40
+
35
41
  should "be initialized with parsed json" do
36
42
  assert_nothing_raised do
37
43
  collection = Results::Collection.new( @default_response )
@@ -39,6 +45,10 @@ module Tire
39
45
  end
40
46
  end
41
47
 
48
+ should "return success/failure state" do
49
+ assert Results::Collection.new( @default_response ).success?
50
+ end
51
+
42
52
  should "be populated lazily" do
43
53
  collection = Results::Collection.new(@default_response)
44
54
  assert_nil collection.instance_variable_get(:@results)
@@ -59,11 +69,34 @@ module Tire
59
69
 
60
70
  should "be kaminari compatible" do
61
71
  collection = Results::Collection.new(@default_response)
62
- %w(limit_value total_count num_pages offset_value).each do |method|
72
+ %w(limit_value total_count num_pages offset_value first_page? last_page?).each do |method|
63
73
  assert_respond_to collection, method
64
74
  end
65
75
  end
66
76
 
77
+ should "have max_score" do
78
+ collection = Results::Collection.new(@default_response)
79
+ assert_equal 1.0, collection.max_score
80
+ end
81
+
82
+ context "with error response" do
83
+ setup do
84
+ @collection = Results::Collection.new({'error' => 'SearchPhaseExecutionException...'})
85
+ end
86
+
87
+ should "return the error" do
88
+ assert_equal 'SearchPhaseExecutionException...', @collection.error
89
+ end
90
+
91
+ should "return the success/failure state" do
92
+ assert @collection.failure?
93
+ end
94
+
95
+ should "return empty results" do
96
+ assert @collection.empty?
97
+ end
98
+ end
99
+
67
100
  context "wrapping results" do
68
101
 
69
102
  setup do
@@ -212,6 +245,13 @@ module Tire
212
245
  assert_equal 3, @collection.next_page
213
246
  end
214
247
 
248
+ should "have default per_page" do
249
+ assert_equal 10, Tire::Results::Pagination::default_per_page
250
+
251
+ collection = Results::Collection.new @default_response
252
+ assert_equal 10, collection.per_page
253
+ end
254
+
215
255
  end
216
256
 
217
257
  context "with eager loading" do
@@ -65,6 +65,10 @@ module Tire
65
65
  assert_equal 'Test', @document.title
66
66
  end
67
67
 
68
+ should "implement respond_to? for proxied methods" do
69
+ assert @document.respond_to?(:title)
70
+ end
71
+
68
72
  should "return nil for non-existing keys/methods" do
69
73
  assert_nothing_raised { @document.whatever }
70
74
  assert_nil @document.whatever
@@ -13,13 +13,13 @@ module Tire::Search
13
13
  context "generally" do
14
14
 
15
15
  should "encode facets with defaults for current query" do
16
- assert_equal( { :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json,
17
- Facet.new('foo').terms(:bar).to_json )
16
+ assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json),
17
+ MultiJson.load(Facet.new('foo').terms(:bar).to_json) )
18
18
  end
19
19
 
20
20
  should "encode facets as global" do
21
- assert_equal( { :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false}, :global => true } }.to_json,
22
- Facet.new('foo', :global => true).terms(:bar).to_json )
21
+ assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false}, :global => true } }.to_json),
22
+ MultiJson.load(Facet.new('foo', :global => true).terms(:bar).to_json) )
23
23
  end
24
24
 
25
25
  should "pass options to facets" do
@@ -31,15 +31,16 @@ module Tire::Search
31
31
  end
32
32
 
33
33
  should "encode facet options" do
34
- assert_equal( { :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false} } }.to_json,
35
- Facet.new('foo').terms(:bar, :size => 5).to_json )
34
+ assert_equal( MultiJson.load( { :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false} } }.to_json ),
35
+ MultiJson.load( Facet.new('foo').terms(:bar, :size => 5).to_json ) )
36
36
  end
37
37
 
38
38
  should "encode facets when passed as a block" do
39
39
  f = Facet.new('foo') do
40
40
  terms :bar
41
41
  end
42
- assert_equal( { :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json, f.to_json )
42
+ assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json),
43
+ MultiJson.load(f.to_json) )
43
44
  end
44
45
 
45
46
  should "encode facets when passed as a block, using variables from outer scope" do
@@ -48,7 +49,28 @@ module Tire::Search
48
49
  f = Facet.new('foo') do |facet|
49
50
  facet.terms foo, :size => 20
50
51
  end
51
- assert_equal( { :foo => { :terms => {:field=>'bar',:size=>20,:all_terms=>false} } }.to_json, f.to_json )
52
+ assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>20,:all_terms=>false} } }.to_json),
53
+ MultiJson.load(f.to_json) )
54
+ end
55
+
56
+ should "encode facet_filter option with DSL" do
57
+ f = Facet.new('foo'){
58
+ terms :published_on
59
+ facet_filter :terms, :tags => ['ruby']
60
+ }.to_hash
61
+
62
+ assert_equal( { :terms => {:tags => ['ruby'] }}.to_json, f['foo'][:facet_filter].to_json)
63
+ end
64
+
65
+ should "encode multiple facet_filter options with DSL" do
66
+ f = Facet.new('foo'){
67
+ terms :published_on
68
+ facet_filter :and, { :tags => ['ruby'] },
69
+ { :words => 250 }
70
+ }.to_hash
71
+
72
+ assert_equal( { :and => [{:tags => ['ruby']}, {:words => 250 }] }.to_json,
73
+ f['foo'][:facet_filter].to_json )
52
74
  end
53
75
 
54
76
  end
@@ -64,8 +86,8 @@ module Tire::Search
64
86
  end
65
87
 
66
88
  should "encode custom options" do
67
- assert_equal( { :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false,:exclude=>['moo']} } }.to_json,
68
- Facet.new('foo').terms(:bar, :size => 5, :exclude => ['moo']).to_json )
89
+ assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false,:exclude=>['moo']} } }.to_json),
90
+ MultiJson.load(Facet.new('foo').terms(:bar, :size => 5, :exclude => ['moo']).to_json) )
69
91
  end
70
92
 
71
93
  end
@@ -138,12 +160,14 @@ module Tire::Search
138
160
  end
139
161
 
140
162
  context "filter facet" do
163
+
141
164
  should "encode facet options" do
142
165
  f = Facet.new('filter_facet') do
143
- filter :tags, 'ruby'
166
+ filter :term, :tags => 'ruby'
144
167
  end
145
168
  assert_equal({ :filter_facet => { :filter => { :term => { :tags => 'ruby' } } } }.to_json, f.to_json)
146
169
  end
170
+
147
171
  end
148
172
 
149
173
  end
@@ -19,6 +19,10 @@ module Tire::Search
19
19
  term(:foo, 'bar')
20
20
  end.to_json)
21
21
  end
22
+
23
+ should "have accessor for value" do
24
+ assert_equal( {}, Query.new.value )
25
+ end
22
26
  end
23
27
 
24
28
  context "Term query" do
@@ -29,6 +33,17 @@ module Tire::Search
29
33
  should "allow search for single term passing an options hash" do
30
34
  assert_equal( { :term => { :foo => { :term => 'bar', :boost => 2.0 } } }, Query.new.term(:foo, 'bar', :boost => 2.0) )
31
35
  end
36
+
37
+ should "allow complex term queries" do
38
+ assert_equal( { :term => { :foo => { :field => 'bar', :boost => 2.0 } } }, Query.new.term(:foo, {:field => 'bar', :boost => 2.0}) )
39
+ end
40
+
41
+ should "allow complex term queries with Hash-like objects" do
42
+ assert_equal(
43
+ { :term => { :foo => { :field => 'bar', :boost => 2.0 } } },
44
+ Query.new.term(:foo, Hashr.new( :field => 'bar', :boost => 2.0 ))
45
+ )
46
+ end
32
47
  end
33
48
 
34
49
  context "Terms query" do
@@ -105,6 +120,10 @@ module Tire::Search
105
120
  should "search for all documents" do
106
121
  assert_equal( { :match_all => { } }, Query.new.all )
107
122
  end
123
+
124
+ should "allow passing arguments" do
125
+ assert_equal( { :match_all => {:boost => 1.2} }, Query.new.all(:boost => 1.2) )
126
+ end
108
127
  end
109
128
 
110
129
  context "IDs query" do
@@ -297,5 +316,82 @@ module Tire::Search
297
316
 
298
317
  end
299
318
 
319
+ context "BoostingQuery" do
320
+
321
+ should "not raise an error when no block is given" do
322
+ assert_nothing_raised { Query.new.boosting }
323
+ end
324
+
325
+ should "encode options" do
326
+ query = Query.new.boosting(:negative_boost => 0.2) do
327
+ positive { string 'foo' }
328
+ end
329
+
330
+ assert_equal 0.2, query[:boosting][:negative_boost]
331
+ end
332
+
333
+ should "wrap positive query" do
334
+ assert_equal( { :boosting => {:positive => [{ :query_string => { :query => 'foo' } }] }},
335
+ Query.new.boosting { positive { string 'foo' } } )
336
+ end
337
+
338
+ should "wrap negative query" do
339
+ assert_equal( { :boosting => {:negative => [{ :query_string => { :query => 'foo' } }] }},
340
+ Query.new.boosting { negative { string 'foo' } } )
341
+ end
342
+
343
+ should "wrap multiple queries for the same condition" do
344
+ query = Query.new.boosting do
345
+ positive { string 'foo' }
346
+ positive { term('bar', 'baz') }
347
+ end
348
+
349
+ assert_equal( 2, query[:boosting][:positive].size, query[:boosting][:positive].inspect )
350
+ assert_equal( { :query_string => {:query => 'foo'} }, query[:boosting][:positive].first )
351
+ assert_equal( { :term => { "bar" => { :term => "baz" } } }, query[:boosting][:positive].last )
352
+ end
353
+
354
+ should "allow passing variables from outer scope" do
355
+ @q1 = 'foo'
356
+ @q2 = 'bar'
357
+ query = Query.new.boosting do |boosting|
358
+ boosting.positive { |query| query.string @q1 }
359
+ boosting.negative { |query| query.string @q2 }
360
+ end
361
+
362
+ assert_equal( { :query_string => {:query => 'foo'} }, query[:boosting][:positive].first )
363
+ assert_equal( { :query_string => {:query => 'bar'} }, query[:boosting][:negative].last )
364
+ end
365
+
366
+ end
367
+
368
+ context "MatchQuery" do
369
+
370
+ should "allow searching in single field" do
371
+ assert_equal( { :match => { :foo => { :query => 'bar' } } },
372
+ Query.new.match(:foo, 'bar') )
373
+ end
374
+
375
+ should "allow searching in multiple fields with multi_match" do
376
+ assert_equal( { :multi_match => { :query => 'bar', :fields => [:foo, :moo] } },
377
+ Query.new.match([:foo, :moo], 'bar') )
378
+ end
379
+
380
+ should "encode options" do
381
+ query = Query.new.match(:foo, 'bar', :type => 'phrase_prefix')
382
+ assert_equal 'phrase_prefix', query[:match][:foo][:type]
383
+ end
384
+
385
+ should "automatically construct a boolean query" do
386
+ query = Query.new
387
+ query.match(:foo, 'bar')
388
+ query.match(:moo, 'bar')
389
+
390
+ assert_not_nil query.to_hash[:bool]
391
+ assert_equal 2, query.to_hash[:bool][:must].size
392
+ end
393
+
394
+ end
395
+
300
396
  end
301
397
  end
@@ -117,9 +117,8 @@ module Tire
117
117
  s = Search::Search.new('index') do
118
118
  query { string 'title:foo' }
119
119
  end
120
- assert_equal %q|curl -X GET "http://localhost:9200/index/_search?pretty=true" -d | +
121
- %q|'{"query":{"query_string":{"query":"title:foo"}}}'|,
122
- s.to_curl
120
+ assert_match %r|curl \-X GET 'http://localhost:9200/index/_search\?pretty' -d |, s.to_curl
121
+ assert_match %r|\s*{\s*"query"\s*:\s*"title:foo"\s*}\s*|, s.to_curl
123
122
  end
124
123
 
125
124
  should "return curl snippet with multiple indices for debugging" do
@@ -233,6 +232,15 @@ module Tire
233
232
  assert_equal [{'title' => 'desc'}, '_score'], hash['sort']
234
233
  end
235
234
 
235
+ should "allow to track scores" do
236
+ s = Search::Search.new('index') do
237
+ sort { by :title }
238
+ track_scores true
239
+ end
240
+
241
+ assert_equal 'true', s.to_hash[:track_scores].to_json
242
+ end
243
+
236
244
  end
237
245
 
238
246
  context "facets" do
@@ -395,6 +403,30 @@ module Tire
395
403
 
396
404
  end
397
405
 
406
+ context "with min_score" do
407
+ should "allow to specify minimum score for returned documents" do
408
+ s = Search::Search.new('index') do
409
+ query { string 'foo' }
410
+ min_score 0.5
411
+ end
412
+
413
+ assert_equal( '0.5', s.to_hash[:min_score].to_json )
414
+ end
415
+ end
416
+
417
+ context "with partial fields" do
418
+
419
+ should "add partial_fields config" do
420
+ s = Search::Search.new('index') do
421
+ partial_field 'name', :include => 'name_*'
422
+ end
423
+
424
+ hash = MultiJson.decode( s.to_json )
425
+ assert_equal({'name' => { 'include' => 'name_*'} }, hash['partial_fields'])
426
+ end
427
+
428
+ end
429
+
398
430
  context "explain" do
399
431
 
400
432
  should "default to false" do
@@ -458,6 +490,31 @@ module Tire
458
490
 
459
491
  end
460
492
 
493
+ context "boosting queries" do
494
+
495
+ should "wrap other queries" do
496
+ s = Search::Search.new('index') do
497
+ query do
498
+ boosting do
499
+ positive { string 'foo' }
500
+ positive { term('bar', 'baz') }
501
+ negative { term('bar', 'moo') }
502
+ end
503
+ end
504
+ end
505
+
506
+ hash = MultiJson.decode(s.to_json)
507
+ query = hash['query']['boosting']
508
+
509
+ assert_equal 2, query['positive'].size
510
+ assert_equal 1, query['negative'].size
511
+
512
+ assert_equal( { 'query_string' => { 'query' => 'foo' } }, query['positive'].first)
513
+ assert_equal( { 'term' => { 'bar' => {'term' => 'moo' } } }, query['negative'].first)
514
+ end
515
+
516
+ end
517
+
461
518
  end
462
519
 
463
520
  context "script field" do
@@ -49,6 +49,19 @@ module Tire
49
49
  end
50
50
  end
51
51
 
52
+ should "allow to perform multiple searches" do
53
+ Tire::Search::Multi::Search.expects(:new).returns( stub(:perform => true) )
54
+
55
+ Tire.multi_search 'dummy' do
56
+ search 'foo'
57
+ end
58
+ end
59
+
60
+ should "allow to call multi_search" do
61
+ assert_respond_to Tire, :multi_search
62
+ assert_respond_to Tire, :msearch
63
+ end
64
+
52
65
  context "when retrieving results" do
53
66
 
54
67
  should "not call the #perform method immediately" do
@@ -119,6 +132,7 @@ module Tire
119
132
  end
120
133
 
121
134
  end
135
+
122
136
  end
123
137
 
124
138
  end
data/tire.gemspec CHANGED
@@ -31,7 +31,6 @@ Gem::Specification.new do |s|
31
31
  s.add_dependency "multi_json", "~> 1.0"
32
32
  s.add_dependency "activemodel", ">= 3.0"
33
33
  s.add_dependency "hashr", "~> 0.0.19"
34
- s.add_dependency "rack", ">= 1.4" if defined?(RUBY_VERSION) && RUBY_VERSION < '1.9'
35
34
 
36
35
  # = Development dependencies
37
36
  #
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tire
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-21 00:00:00.000000000 Z
12
+ date: 2012-11-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70101223876780 !ruby/object:Gem::Requirement
16
+ requirement: &70223214921740 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70101223876780
24
+ version_requirements: *70223214921740
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rest-client
27
- requirement: &70101223875800 !ruby/object:Gem::Requirement
27
+ requirement: &70223214920520 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '1.6'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70101223875800
35
+ version_requirements: *70223214920520
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: multi_json
38
- requirement: &70101223874160 !ruby/object:Gem::Requirement
38
+ requirement: &70223214919080 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '1.0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70101223874160
46
+ version_requirements: *70223214919080
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: activemodel
49
- requirement: &70101223873120 !ruby/object:Gem::Requirement
49
+ requirement: &70223214918580 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '3.0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70101223873120
57
+ version_requirements: *70223214918580
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: hashr
60
- requirement: &70101223871460 !ruby/object:Gem::Requirement
60
+ requirement: &70223214917880 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.0.19
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70101223871460
68
+ version_requirements: *70223214917880
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
- requirement: &70101223892960 !ruby/object:Gem::Requirement
71
+ requirement: &70223214917060 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '1.0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70101223892960
79
+ version_requirements: *70223214917060
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: yajl-ruby
82
- requirement: &70101223891900 !ruby/object:Gem::Requirement
82
+ requirement: &70223214915540 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '1.0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70101223891900
90
+ version_requirements: *70223214915540
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: shoulda
93
- requirement: &70101223891340 !ruby/object:Gem::Requirement
93
+ requirement: &70223214914780 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70101223891340
101
+ version_requirements: *70223214914780
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: mocha
104
- requirement: &70101223890580 !ruby/object:Gem::Requirement
104
+ requirement: &70223214930040 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70101223890580
112
+ version_requirements: *70223214930040
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: activerecord
115
- requirement: &70101223889780 !ruby/object:Gem::Requirement
115
+ requirement: &70223214928700 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '3.0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *70101223889780
123
+ version_requirements: *70223214928700
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: sqlite3
126
- requirement: &70101223889140 !ruby/object:Gem::Requirement
126
+ requirement: &70223214927400 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *70101223889140
134
+ version_requirements: *70223214927400
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: mongoid
137
- requirement: &70101223888360 !ruby/object:Gem::Requirement
137
+ requirement: &70223214926580 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '2.2'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *70101223888360
145
+ version_requirements: *70223214926580
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: bson_ext
148
- requirement: &70101223887740 !ruby/object:Gem::Requirement
148
+ requirement: &70223214925540 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: '0'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *70101223887740
156
+ version_requirements: *70223214925540
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: redis-persistence
159
- requirement: &70101223887020 !ruby/object:Gem::Requirement
159
+ requirement: &70223214924920 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: '0'
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *70101223887020
167
+ version_requirements: *70223214924920
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: curb
170
- requirement: &70101223886480 !ruby/object:Gem::Requirement
170
+ requirement: &70223214923980 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ! '>='
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: '0'
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *70101223886480
178
+ version_requirements: *70223214923980
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: minitest
181
- requirement: &70101223885880 !ruby/object:Gem::Requirement
181
+ requirement: &70223214923120 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ! '>='
@@ -186,10 +186,10 @@ dependencies:
186
186
  version: '0'
187
187
  type: :development
188
188
  prerelease: false
189
- version_requirements: *70101223885880
189
+ version_requirements: *70223214923120
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: turn
192
- requirement: &70101223907180 !ruby/object:Gem::Requirement
192
+ requirement: &70223214922420 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
195
  - - ~>
@@ -197,10 +197,10 @@ dependencies:
197
197
  version: '0.9'
198
198
  type: :development
199
199
  prerelease: false
200
- version_requirements: *70101223907180
200
+ version_requirements: *70223214922420
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: rdoc
203
- requirement: &70101223906080 !ruby/object:Gem::Requirement
203
+ requirement: &70223215704680 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
206
  - - ! '>='
@@ -208,7 +208,7 @@ dependencies:
208
208
  version: '0'
209
209
  type: :development
210
210
  prerelease: false
211
- version_requirements: *70101223906080
211
+ version_requirements: *70223215704680
212
212
  description: ! " Tire is a Ruby client for the ElasticSearch search engine/database.\n\n
213
213
  \ It provides Ruby-like API for fluent communication with the ElasticSearch server\n
214
214
  \ and blends with ActiveModel class for convenient usage in Rails applications.\n\n
@@ -226,6 +226,7 @@ extra_rdoc_files:
226
226
  files:
227
227
  - .gitignore
228
228
  - .travis.yml
229
+ - .yardopts
229
230
  - Gemfile
230
231
  - MIT-LICENSE
231
232
  - README.markdown
@@ -252,16 +253,19 @@ files:
252
253
  - lib/tire/model/persistence/finders.rb
253
254
  - lib/tire/model/persistence/storage.rb
254
255
  - lib/tire/model/search.rb
256
+ - lib/tire/multi_search.rb
255
257
  - lib/tire/results/collection.rb
256
258
  - lib/tire/results/item.rb
257
259
  - lib/tire/results/pagination.rb
258
260
  - lib/tire/rubyext/hash.rb
259
261
  - lib/tire/rubyext/ruby_1_8.rb
260
262
  - lib/tire/rubyext/symbol.rb
263
+ - lib/tire/rubyext/uri_escape.rb
261
264
  - lib/tire/search.rb
262
265
  - lib/tire/search/facet.rb
263
266
  - lib/tire/search/filter.rb
264
267
  - lib/tire/search/highlight.rb
268
+ - lib/tire/search/queries/match.rb
265
269
  - lib/tire/search/query.rb
266
270
  - lib/tire/search/scan.rb
267
271
  - lib/tire/search/script_field.rb
@@ -278,6 +282,7 @@ files:
278
282
  - test/integration/active_model_searchable_test.rb
279
283
  - test/integration/active_record_searchable_test.rb
280
284
  - test/integration/boolean_queries_test.rb
285
+ - test/integration/boosting_queries_test.rb
281
286
  - test/integration/count_test.rb
282
287
  - test/integration/custom_score_queries_test.rb
283
288
  - test/integration/dis_max_queries_test.rb
@@ -292,7 +297,9 @@ files:
292
297
  - test/integration/index_mapping_test.rb
293
298
  - test/integration/index_store_test.rb
294
299
  - test/integration/index_update_document_test.rb
300
+ - test/integration/match_query_test.rb
295
301
  - test/integration/mongoid_searchable_test.rb
302
+ - test/integration/multi_search_test.rb
296
303
  - test/integration/percolator_test.rb
297
304
  - test/integration/persistent_model_test.rb
298
305
  - test/integration/prefix_query_test.rb
@@ -313,6 +320,7 @@ files:
313
320
  - test/models/article.rb
314
321
  - test/models/mongoid_models.rb
315
322
  - test/models/persistent_article.rb
323
+ - test/models/persistent_article_in_index.rb
316
324
  - test/models/persistent_article_in_namespace.rb
317
325
  - test/models/persistent_article_with_casting.rb
318
326
  - test/models/persistent_article_with_defaults.rb
@@ -329,8 +337,10 @@ files:
329
337
  - test/unit/logger_test.rb
330
338
  - test/unit/model_callbacks_test.rb
331
339
  - test/unit/model_import_test.rb
340
+ - test/unit/model_initialization_test.rb
332
341
  - test/unit/model_persistence_test.rb
333
342
  - test/unit/model_search_test.rb
343
+ - test/unit/multi_search_test.rb
334
344
  - test/unit/results_collection_test.rb
335
345
  - test/unit/results_item_test.rb
336
346
  - test/unit/rubyext_test.rb
@@ -348,12 +358,27 @@ homepage: http://github.com/karmi/tire
348
358
  licenses: []
349
359
  post_install_message: ! "================================================================================\n\n
350
360
  \ Please check the documentation at <http://karmi.github.com/tire/>.\n\n--------------------------------------------------------------------------------\n\n
351
- \ IMPORTANT CHANGES LATELY:\n\n * Added a prefix query\n * Added support for \"script
352
- fields\" (return a script evaluation for each hit)\n * Added support for the Update
353
- API in Tire::Index\n * [FIX] Fixed incorrect `Results::Item#to_hash` serialization\n
354
- \ * 730813f Added support for aggregating over multiple fields in the \"terms\"
355
- facet\n * Added the \"Dis Max Query\"\n * Added the ability to transform documents
356
- when reindexing\n\n See the full changelog at <http://github.com/karmi/tire/commits/v0.4.3>.\n\n--------------------------------------------------------------------------------\n"
361
+ \ IMPORTANT CHANGES LATELY:\n\n * [!BREAKING!] Change format of sort/order in simple
362
+ model searches to <field>:<direction>\n * [FIX] Remove `page` and `per_page` from
363
+ parameters sent to elasticsearch\n * [FIX] Remove the `wrapper` options from URL
364
+ params sent to elasticsearch\n * [FIX] Use `options.delete(:sort)` in model search
365
+ to halt bubbling of `sort` into URL parameters [#334]\n * Added prettified JSON
366
+ output for logging requests and responses at the `debug` level\n * Improved the
367
+ Rake import task\n * Allow passing of arbitrary objects in the `:as` mapping option
368
+ [#446]\n * Allow to define default values for Tire::Model::Persistence `:as` lambdas\n
369
+ \ * Added `@search.results.max_score`\n * Changed the URI escape/unescape compatibility
370
+ patch to not require Rack\n * Allow using the full DSL in filter facets\n * Allow
371
+ complex hash options for the `term` query\n * Allow passing Hash-like objects to
372
+ `terms` query as well\n * Implemented `respond_to?` for `Item`\n * Improved support
373
+ for Kaminari pagination\n * Added support for the `parent` URL parameter in `Index#store`\n
374
+ \ * Added the `min_score` and `track_scores` DSL methods\n * Added support for
375
+ loading partial fields\n * Added support for boosting query\n * Added the `facet_filter`
376
+ DSL method\n * Allow passing `routing`, `fields` and `preference` URL parameter
377
+ to Index#retrieve\n * Allow building the search request step-by-step in Tire's
378
+ DSL [#496]\n * Added a `match` query type\n * Added support for multisearch (_msearch)
379
+ and the `Tire.multi_search` DSL method\n * Added support for multi-search in the
380
+ ActiveModel integration and in Tire::Model::Persistence\n\n See the full changelog
381
+ at <http://github.com/karmi/tire/commits/v0.5.0>.\n\n--------------------------------------------------------------------------------\n"
357
382
  rdoc_options:
358
383
  - --charset=UTF-8
359
384
  require_paths:
@@ -386,6 +411,7 @@ test_files:
386
411
  - test/integration/active_model_searchable_test.rb
387
412
  - test/integration/active_record_searchable_test.rb
388
413
  - test/integration/boolean_queries_test.rb
414
+ - test/integration/boosting_queries_test.rb
389
415
  - test/integration/count_test.rb
390
416
  - test/integration/custom_score_queries_test.rb
391
417
  - test/integration/dis_max_queries_test.rb
@@ -400,7 +426,9 @@ test_files:
400
426
  - test/integration/index_mapping_test.rb
401
427
  - test/integration/index_store_test.rb
402
428
  - test/integration/index_update_document_test.rb
429
+ - test/integration/match_query_test.rb
403
430
  - test/integration/mongoid_searchable_test.rb
431
+ - test/integration/multi_search_test.rb
404
432
  - test/integration/percolator_test.rb
405
433
  - test/integration/persistent_model_test.rb
406
434
  - test/integration/prefix_query_test.rb
@@ -421,6 +449,7 @@ test_files:
421
449
  - test/models/article.rb
422
450
  - test/models/mongoid_models.rb
423
451
  - test/models/persistent_article.rb
452
+ - test/models/persistent_article_in_index.rb
424
453
  - test/models/persistent_article_in_namespace.rb
425
454
  - test/models/persistent_article_with_casting.rb
426
455
  - test/models/persistent_article_with_defaults.rb
@@ -437,8 +466,10 @@ test_files:
437
466
  - test/unit/logger_test.rb
438
467
  - test/unit/model_callbacks_test.rb
439
468
  - test/unit/model_import_test.rb
469
+ - test/unit/model_initialization_test.rb
440
470
  - test/unit/model_persistence_test.rb
441
471
  - test/unit/model_search_test.rb
472
+ - test/unit/multi_search_test.rb
442
473
  - test/unit/results_collection_test.rb
443
474
  - test/unit/results_item_test.rb
444
475
  - test/unit/rubyext_test.rb