sunspot 2.3.0 → 2.6.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +4 -4
  3. data/lib/sunspot/adapters.rb +15 -1
  4. data/lib/sunspot/data_extractor.rb +36 -6
  5. data/lib/sunspot/dsl/fields.rb +16 -0
  6. data/lib/sunspot/dsl/fulltext.rb +1 -1
  7. data/lib/sunspot/dsl/group.rb +10 -0
  8. data/lib/sunspot/dsl/scope.rb +17 -17
  9. data/lib/sunspot/dsl/standard_query.rb +29 -1
  10. data/lib/sunspot/dsl.rb +2 -2
  11. data/lib/sunspot/field.rb +15 -4
  12. data/lib/sunspot/indexer.rb +37 -8
  13. data/lib/sunspot/query/abstract_fulltext.rb +7 -3
  14. data/lib/sunspot/query/abstract_json_field_facet.rb +3 -0
  15. data/lib/sunspot/query/composite_fulltext.rb +21 -2
  16. data/lib/sunspot/query/date_field_json_facet.rb +2 -16
  17. data/lib/sunspot/query/dismax.rb +10 -4
  18. data/lib/sunspot/query/function_query.rb +25 -1
  19. data/lib/sunspot/query/group.rb +4 -5
  20. data/lib/sunspot/query/join.rb +3 -5
  21. data/lib/sunspot/query/range_json_facet.rb +5 -2
  22. data/lib/sunspot/query/restriction.rb +18 -13
  23. data/lib/sunspot/query/standard_query.rb +12 -0
  24. data/lib/sunspot/search/abstract_search.rb +1 -1
  25. data/lib/sunspot/search/field_json_facet.rb +14 -3
  26. data/lib/sunspot/search/hit.rb +6 -1
  27. data/lib/sunspot/session.rb +9 -1
  28. data/lib/sunspot/setup.rb +69 -0
  29. data/lib/sunspot/util.rb +4 -11
  30. data/lib/sunspot/version.rb +1 -1
  31. data/lib/sunspot.rb +9 -1
  32. data/spec/api/adapters_spec.rb +13 -0
  33. data/spec/api/data_extractor_spec.rb +39 -0
  34. data/spec/api/indexer/removal_spec.rb +87 -0
  35. data/spec/api/query/connective_boost_examples.rb +85 -0
  36. data/spec/api/query/fulltext_examples.rb +6 -12
  37. data/spec/api/query/join_spec.rb +2 -2
  38. data/spec/api/query/standard_spec.rb +10 -0
  39. data/spec/api/search/hits_spec.rb +14 -0
  40. data/spec/api/setup_spec.rb +99 -0
  41. data/spec/api/sunspot_spec.rb +3 -0
  42. data/spec/helpers/indexer_helper.rb +22 -0
  43. data/spec/integration/atomic_updates_spec.rb +169 -5
  44. data/spec/integration/faceting_spec.rb +68 -34
  45. data/spec/integration/field_grouping_spec.rb +19 -0
  46. data/spec/integration/field_lists_spec.rb +16 -0
  47. data/spec/integration/geospatial_spec.rb +15 -0
  48. data/spec/integration/join_spec.rb +64 -0
  49. data/spec/integration/scoped_search_spec.rb +78 -0
  50. data/spec/mocks/adapters.rb +33 -0
  51. data/spec/mocks/connection.rb +6 -0
  52. data/spec/mocks/photo.rb +19 -5
  53. data/spec/mocks/post.rb +35 -1
  54. data/sunspot.gemspec +0 -2
  55. metadata +14 -8
  56. data/gemfiles/.gitkeep +0 -0
@@ -538,4 +538,82 @@ describe 'scoped_search' do
538
538
  expect(search.results.first).to eq(@p1)
539
539
  end
540
540
  end
541
+
542
+ describe 'boosting' do
543
+ before :all do
544
+ Sunspot.remove_all
545
+ @p1 = Post.new(:title => 'Post', :body => 'Lorem', :blog_id => 1, :category_ids => [3], :ratings_average => 30)
546
+ @p2 = Post.new(:title => 'Post', :body => 'Ipsum', :blog_id => 2, :category_ids => [2], :ratings_average => 60)
547
+ @p3 = Post.new(:title => 'Post', :body => 'Dolor', :blog_id => 3, :category_ids => [1], :ratings_average => 90)
548
+ Sunspot.index([@p1, @p2, @p3])
549
+ Sunspot.commit
550
+ end
551
+
552
+ it 'without boost should returns post in default order' do
553
+ search = Sunspot.search(Post) {}
554
+
555
+ expect(search.results[0]).to eq(@p1)
556
+ expect(search.results[1]).to eq(@p2)
557
+ expect(search.results[2]).to eq(@p3)
558
+ end
559
+
560
+ it 'should apply boost function' do
561
+ search = Sunspot.search(Post) do
562
+ boost(function() { field(:average_rating) })
563
+ end
564
+
565
+ expect(search.results[0]).to eq(@p3)
566
+ expect(search.results[1]).to eq(@p2)
567
+ expect(search.results[2]).to eq(@p1)
568
+ end
569
+
570
+ it 'should apply multilicative boost function' do
571
+ search = Sunspot.search(Post) do
572
+ boost_multiplicative(function() { field(:average_rating) })
573
+ end
574
+
575
+ expect(search.results[0]).to eq(@p3)
576
+ expect(search.results[1]).to eq(@p2)
577
+ expect(search.results[2]).to eq(@p1)
578
+ end
579
+
580
+ it 'should apply boost query' do
581
+ search = Sunspot.search(Post) do
582
+ boost(5) do
583
+ with(:blog_id, 1)
584
+ end
585
+
586
+ boost(10) do
587
+ with(:blog_id, 3)
588
+ end
589
+ end
590
+
591
+ expect(search.results[0]).to eq(@p3)
592
+ expect(search.results[1]).to eq(@p1)
593
+ expect(search.results[2]).to eq(@p2)
594
+ end
595
+
596
+ it 'should work properly when combined with fulltext' do
597
+ search = Sunspot.search(Post) do
598
+ fulltext('Post Ipsum') do
599
+ boost_fields :body => 0.2
600
+ minimum_match 1
601
+ end
602
+
603
+ boost(0.9) do
604
+ with(:blog_id, 1)
605
+ end
606
+
607
+ boost(function() { div(field(:average_rating), 100) })
608
+
609
+ fulltext('Post') do
610
+ minimum_match 1
611
+ end
612
+ end
613
+
614
+ expect(search.results[0]).to eq(@p2)
615
+ expect(search.results[1]).to eq(@p3)
616
+ expect(search.results[2]).to eq(@p1)
617
+ end
618
+ end
541
619
  end
@@ -7,7 +7,40 @@ end
7
7
  class UnseenModel < AbstractModel
8
8
  end
9
9
 
10
+ class ModelWithPrefixId < AbstractModel
11
+ def id
12
+ 1
13
+ end
14
+ end
15
+
16
+ Sunspot.setup(ModelWithPrefixId) do
17
+ id_prefix { "USERDATA!" }
18
+ end
19
+
20
+ class ModelWithNestedPrefixId < AbstractModel
21
+ def id
22
+ 1
23
+ end
24
+ end
25
+
26
+ Sunspot.setup(ModelWithNestedPrefixId) do
27
+ id_prefix { "USER!USERDATA!" }
28
+ end
29
+
30
+ class ModelWithoutPrefixId < AbstractModel
31
+ def id
32
+ 1
33
+ end
34
+ end
35
+
36
+ Sunspot.setup(ModelWithoutPrefixId) do
37
+ end
38
+
39
+
10
40
  class AbstractModelInstanceAdapter < Sunspot::Adapters::InstanceAdapter
41
+ def id
42
+ @instance.id
43
+ end
11
44
  end
12
45
 
13
46
  class AbstractModelDataAccessor < Sunspot::Adapters::DataAccessor
@@ -92,6 +92,12 @@ module Mock
92
92
  end
93
93
  end
94
94
 
95
+ def has_no_delete?(*ids)
96
+ @deletes.none? do |delete|
97
+ delete & ids == ids
98
+ end
99
+ end
100
+
95
101
  def has_delete_by_query?(query)
96
102
  @deletes_by_query.include?(query)
97
103
  end
data/spec/mocks/photo.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  class Photo < MockRecord
2
- attr_accessor :caption, :description, :lat, :lng, :size, :average_rating, :created_at, :post_id, :photo_container_id
2
+ attr_accessor :caption, :description, :lat, :lng, :size, :average_rating, :created_at, :post_id, :photo_container_id, :published
3
3
  end
4
4
 
5
5
  Sunspot.setup(Photo) do
@@ -7,12 +7,23 @@ Sunspot.setup(Photo) do
7
7
  text :description
8
8
  string :caption
9
9
  integer :photo_container_id
10
+ boolean :published
10
11
  boost 0.75
11
12
  integer :size, :trie => true
12
13
  float :average_rating, :trie => true
13
14
  time :created_at, :trie => true
14
15
  end
15
16
 
17
+ class Picture < MockRecord
18
+ attr_accessor :description, :photo_container_id, :published
19
+ end
20
+
21
+ Sunspot.setup(Picture) do
22
+ text :description
23
+ integer :photo_container_id
24
+ boolean :published
25
+ end
26
+
16
27
  class PhotoContainer < MockRecord
17
28
  attr_accessor :description
18
29
 
@@ -25,8 +36,11 @@ Sunspot.setup(PhotoContainer) do
25
36
  integer :id
26
37
  text :description, :default_boost => 1.2
27
38
 
28
- join(:caption, :target => Photo, :type => :string, :join => { :from => :photo_container_id, :to => :id })
29
- join(:photo_rating, :target => Photo, :type => :trie_float, :join => { :from => :photo_container_id, :to => :id }, :as => 'average_rating_ft')
30
- join(:caption, :target => Photo, :type => :text, :join => { :from => :photo_container_id, :to => :id })
31
- join(:description, :prefix => "photo", :target => Photo, :type => :text, :join => { :from => :photo_container_id, :to => :id })
39
+ join(:caption, :target => 'Photo', :type => :string, :join => { :from => :photo_container_id, :to => :id })
40
+ join(:photo_rating, :target => 'Photo', :type => :trie_float, :join => { :from => :photo_container_id, :to => :id }, :as => 'average_rating_ft')
41
+ join(:caption, :target => 'Photo', :type => :text, :join => { :from => :photo_container_id, :to => :id })
42
+ join(:description, :target => 'Photo', :type => :text, :join => { :from => :photo_container_id, :to => :id }, :prefix => "photo")
43
+ join(:published, :target => 'Photo', :type => :boolean, :join => { :from => :photo_container_id, :to => :id }, :prefix => "photo")
44
+ join(:description, :target => 'Picture', :type => :text, :join => { :from => :photo_container_id, :to => :id }, :prefix => "picture")
45
+ join(:published, :target => 'Picture', :type => :boolean, :join => { :from => :photo_container_id, :to => :id }, :prefix => "picture")
32
46
  end
data/spec/mocks/post.rb CHANGED
@@ -37,7 +37,7 @@ end
37
37
 
38
38
  Sunspot.setup(Post) do
39
39
  text :title, :boost => 2
40
- text :text_array, :boost => 3 do
40
+ text :text_array do
41
41
  [title, title]
42
42
  end
43
43
  text :body, :stored => true, :more_like_this => true
@@ -99,3 +99,37 @@ end
99
99
  class PhotoPost < Post
100
100
  end
101
101
 
102
+ class PostWithProcPrefixId < Post
103
+ end
104
+
105
+ Sunspot.setup(PostWithProcPrefixId) do
106
+ id_prefix { "USERDATA-#{id}!" }
107
+ string :title, :stored => true
108
+ boolean :featured, :using => :featured?, :stored => true
109
+ end
110
+
111
+ class PostWithSymbolPrefixId < Post
112
+ end
113
+
114
+ Sunspot.setup(PostWithSymbolPrefixId) do
115
+ id_prefix :title
116
+ string :title, :stored => true
117
+ boolean :featured, :using => :featured?, :stored => true
118
+ end
119
+
120
+ class PostWithStringPrefixId < Post
121
+ end
122
+
123
+ Sunspot.setup(PostWithStringPrefixId) do
124
+ id_prefix 'USERDATA!'
125
+ string :title, :stored => true
126
+ boolean :featured, :using => :featured?, :stored => true
127
+ end
128
+
129
+ class PostWithoutPrefixId < Post
130
+ end
131
+
132
+ Sunspot.setup(PostWithoutPrefixId) do
133
+ string :title, :stored => true
134
+ boolean :featured, :using => :featured?, :stored => true
135
+ end
data/sunspot.gemspec CHANGED
@@ -20,8 +20,6 @@ Gem::Specification.new do |s|
20
20
  can be performed without hand-writing any boolean queries or building Solr parameters by hand.
21
21
  TEXT
22
22
 
23
- s.rubyforge_project = "sunspot"
24
-
25
23
  s.files = `git ls-files`.split("\n")
26
24
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
27
25
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunspot
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mat Brown
@@ -27,10 +27,10 @@ authors:
27
27
  - Nicholas Jakobsen
28
28
  - Bragadeesh J
29
29
  - Ethiraj Srinivasan
30
- autorequire:
30
+ autorequire:
31
31
  bindir: bin
32
32
  cert_chain: []
33
- date: 2018-04-08 00:00:00.000000000 Z
33
+ date: 2022-05-30 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: rsolr
@@ -126,7 +126,6 @@ files:
126
126
  - LICENSE
127
127
  - Rakefile
128
128
  - TODO
129
- - gemfiles/.gitkeep
130
129
  - lib/light_config.rb
131
130
  - lib/sunspot.rb
132
131
  - lib/sunspot/adapters.rb
@@ -240,6 +239,7 @@ files:
240
239
  - spec/api/batcher_spec.rb
241
240
  - spec/api/binding_spec.rb
242
241
  - spec/api/class_set_spec.rb
242
+ - spec/api/data_extractor_spec.rb
243
243
  - spec/api/hit_enumerable_spec.rb
244
244
  - spec/api/indexer/attributes_spec.rb
245
245
  - spec/api/indexer/batch_spec.rb
@@ -250,6 +250,7 @@ files:
250
250
  - spec/api/indexer/spec_helper.rb
251
251
  - spec/api/indexer_spec.rb
252
252
  - spec/api/query/advanced_manipulation_examples.rb
253
+ - spec/api/query/connective_boost_examples.rb
253
254
  - spec/api/query/connectives_examples.rb
254
255
  - spec/api/query/dsl_spec.rb
255
256
  - spec/api/query/dynamic_fields_examples.rb
@@ -289,6 +290,7 @@ files:
289
290
  - spec/api/session_proxy/spec_helper.rb
290
291
  - spec/api/session_proxy/thread_local_session_proxy_spec.rb
291
292
  - spec/api/session_spec.rb
293
+ - spec/api/setup_spec.rb
292
294
  - spec/api/spec_helper.rb
293
295
  - spec/api/sunspot_spec.rb
294
296
  - spec/ext.rb
@@ -305,6 +307,7 @@ files:
305
307
  - spec/integration/geospatial_spec.rb
306
308
  - spec/integration/highlighting_spec.rb
307
309
  - spec/integration/indexing_spec.rb
310
+ - spec/integration/join_spec.rb
308
311
  - spec/integration/keyword_search_spec.rb
309
312
  - spec/integration/local_search_spec.rb
310
313
  - spec/integration/more_like_this_spec.rb
@@ -335,7 +338,7 @@ homepage: http://outoftime.github.com/sunspot
335
338
  licenses:
336
339
  - MIT
337
340
  metadata: {}
338
- post_install_message:
341
+ post_install_message:
339
342
  rdoc_options:
340
343
  - "--webcvs=http://github.com/outoftime/sunspot/tree/master/%s"
341
344
  - "--title"
@@ -355,9 +358,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
355
358
  - !ruby/object:Gem::Version
356
359
  version: '0'
357
360
  requirements: []
358
- rubyforge_project: sunspot
359
- rubygems_version: 2.7.6
360
- signing_key:
361
+ rubygems_version: 3.1.4
362
+ signing_key:
361
363
  specification_version: 4
362
364
  summary: Library for expressive, powerful interaction with the Solr search engine
363
365
  test_files:
@@ -365,6 +367,7 @@ test_files:
365
367
  - spec/api/batcher_spec.rb
366
368
  - spec/api/binding_spec.rb
367
369
  - spec/api/class_set_spec.rb
370
+ - spec/api/data_extractor_spec.rb
368
371
  - spec/api/hit_enumerable_spec.rb
369
372
  - spec/api/indexer/attributes_spec.rb
370
373
  - spec/api/indexer/batch_spec.rb
@@ -375,6 +378,7 @@ test_files:
375
378
  - spec/api/indexer/spec_helper.rb
376
379
  - spec/api/indexer_spec.rb
377
380
  - spec/api/query/advanced_manipulation_examples.rb
381
+ - spec/api/query/connective_boost_examples.rb
378
382
  - spec/api/query/connectives_examples.rb
379
383
  - spec/api/query/dsl_spec.rb
380
384
  - spec/api/query/dynamic_fields_examples.rb
@@ -414,6 +418,7 @@ test_files:
414
418
  - spec/api/session_proxy/spec_helper.rb
415
419
  - spec/api/session_proxy/thread_local_session_proxy_spec.rb
416
420
  - spec/api/session_spec.rb
421
+ - spec/api/setup_spec.rb
417
422
  - spec/api/spec_helper.rb
418
423
  - spec/api/sunspot_spec.rb
419
424
  - spec/ext.rb
@@ -430,6 +435,7 @@ test_files:
430
435
  - spec/integration/geospatial_spec.rb
431
436
  - spec/integration/highlighting_spec.rb
432
437
  - spec/integration/indexing_spec.rb
438
+ - spec/integration/join_spec.rb
433
439
  - spec/integration/keyword_search_spec.rb
434
440
  - spec/integration/local_search_spec.rb
435
441
  - spec/integration/more_like_this_spec.rb
data/gemfiles/.gitkeep DELETED
File without changes