sunspot 2.0.0 → 2.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 (165) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +2 -0
  4. data/Appraisals +7 -0
  5. data/Gemfile +0 -2
  6. data/History.txt +10 -0
  7. data/lib/sunspot.rb +55 -17
  8. data/lib/sunspot/adapters.rb +68 -18
  9. data/lib/sunspot/batcher.rb +1 -1
  10. data/lib/sunspot/configuration.rb +4 -2
  11. data/lib/sunspot/data_extractor.rb +36 -6
  12. data/lib/sunspot/dsl.rb +4 -3
  13. data/lib/sunspot/dsl/adjustable.rb +2 -2
  14. data/lib/sunspot/dsl/field_query.rb +69 -16
  15. data/lib/sunspot/dsl/field_stats.rb +25 -0
  16. data/lib/sunspot/dsl/fields.rb +28 -8
  17. data/lib/sunspot/dsl/fulltext.rb +9 -1
  18. data/lib/sunspot/dsl/group.rb +118 -0
  19. data/lib/sunspot/dsl/paginatable.rb +4 -1
  20. data/lib/sunspot/dsl/scope.rb +19 -10
  21. data/lib/sunspot/dsl/search.rb +1 -1
  22. data/lib/sunspot/dsl/spellcheckable.rb +14 -0
  23. data/lib/sunspot/dsl/standard_query.rb +63 -35
  24. data/lib/sunspot/field.rb +76 -4
  25. data/lib/sunspot/field_factory.rb +60 -11
  26. data/lib/sunspot/indexer.rb +70 -18
  27. data/lib/sunspot/query.rb +5 -4
  28. data/lib/sunspot/query/abstract_field_facet.rb +0 -2
  29. data/lib/sunspot/query/abstract_fulltext.rb +76 -0
  30. data/lib/sunspot/query/abstract_json_field_facet.rb +70 -0
  31. data/lib/sunspot/query/bbox.rb +5 -1
  32. data/lib/sunspot/query/common_query.rb +31 -6
  33. data/lib/sunspot/query/composite_fulltext.rb +58 -8
  34. data/lib/sunspot/query/date_field_json_facet.rb +25 -0
  35. data/lib/sunspot/query/dismax.rb +25 -71
  36. data/lib/sunspot/query/field_json_facet.rb +19 -0
  37. data/lib/sunspot/query/field_list.rb +15 -0
  38. data/lib/sunspot/query/field_stats.rb +61 -0
  39. data/lib/sunspot/query/function_query.rb +1 -2
  40. data/lib/sunspot/query/geo.rb +1 -1
  41. data/lib/sunspot/query/geofilt.rb +8 -3
  42. data/lib/sunspot/query/group.rb +46 -0
  43. data/lib/sunspot/query/group_query.rb +17 -0
  44. data/lib/sunspot/query/join.rb +88 -0
  45. data/lib/sunspot/query/more_like_this.rb +1 -1
  46. data/lib/sunspot/query/pagination.rb +12 -4
  47. data/lib/sunspot/query/range_json_facet.rb +28 -0
  48. data/lib/sunspot/query/restriction.rb +99 -13
  49. data/lib/sunspot/query/sort.rb +41 -0
  50. data/lib/sunspot/query/sort_composite.rb +7 -0
  51. data/lib/sunspot/query/spellcheck.rb +19 -0
  52. data/lib/sunspot/query/standard_query.rb +24 -2
  53. data/lib/sunspot/query/text_field_boost.rb +1 -3
  54. data/lib/sunspot/schema.rb +12 -3
  55. data/lib/sunspot/search.rb +4 -2
  56. data/lib/sunspot/search/abstract_search.rb +93 -43
  57. data/lib/sunspot/search/cursor_paginated_collection.rb +32 -0
  58. data/lib/sunspot/search/field_facet.rb +4 -4
  59. data/lib/sunspot/search/field_json_facet.rb +33 -0
  60. data/lib/sunspot/search/field_stats.rb +21 -0
  61. data/lib/sunspot/search/hit.rb +6 -1
  62. data/lib/sunspot/search/hit_enumerable.rb +4 -1
  63. data/lib/sunspot/search/json_facet_row.rb +40 -0
  64. data/lib/sunspot/search/json_facet_stats.rb +23 -0
  65. data/lib/sunspot/search/paginated_collection.rb +1 -0
  66. data/lib/sunspot/search/query_group.rb +74 -0
  67. data/lib/sunspot/search/standard_search.rb +70 -3
  68. data/lib/sunspot/search/stats_facet.rb +25 -0
  69. data/lib/sunspot/search/stats_json_row.rb +82 -0
  70. data/lib/sunspot/search/stats_row.rb +68 -0
  71. data/lib/sunspot/session.rb +62 -37
  72. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +6 -4
  73. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +16 -8
  74. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +2 -2
  75. data/lib/sunspot/session_proxy/retry_5xx_session_proxy.rb +1 -1
  76. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +4 -2
  77. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +1 -1
  78. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +6 -4
  79. data/lib/sunspot/setup.rb +42 -0
  80. data/lib/sunspot/type.rb +20 -0
  81. data/lib/sunspot/util.rb +78 -14
  82. data/lib/sunspot/version.rb +1 -1
  83. data/spec/api/adapters_spec.rb +40 -15
  84. data/spec/api/batcher_spec.rb +15 -15
  85. data/spec/api/binding_spec.rb +3 -3
  86. data/spec/api/class_set_spec.rb +6 -6
  87. data/spec/api/data_extractor_spec.rb +39 -0
  88. data/spec/api/hit_enumerable_spec.rb +32 -9
  89. data/spec/api/indexer/attributes_spec.rb +35 -30
  90. data/spec/api/indexer/batch_spec.rb +8 -7
  91. data/spec/api/indexer/dynamic_fields_spec.rb +8 -8
  92. data/spec/api/indexer/fixed_fields_spec.rb +16 -11
  93. data/spec/api/indexer/fulltext_spec.rb +8 -8
  94. data/spec/api/indexer/removal_spec.rb +24 -14
  95. data/spec/api/indexer_spec.rb +2 -2
  96. data/spec/api/query/advanced_manipulation_examples.rb +3 -3
  97. data/spec/api/query/connectives_examples.rb +26 -14
  98. data/spec/api/query/dsl_spec.rb +24 -6
  99. data/spec/api/query/dynamic_fields_examples.rb +18 -18
  100. data/spec/api/query/faceting_examples.rb +80 -61
  101. data/spec/api/query/fulltext_examples.rb +194 -40
  102. data/spec/api/query/function_spec.rb +116 -13
  103. data/spec/api/query/geo_examples.rb +8 -12
  104. data/spec/api/query/group_spec.rb +27 -5
  105. data/spec/api/query/highlighting_examples.rb +26 -26
  106. data/spec/api/query/join_spec.rb +19 -0
  107. data/spec/api/query/more_like_this_spec.rb +40 -27
  108. data/spec/api/query/ordering_pagination_examples.rb +37 -23
  109. data/spec/api/query/scope_examples.rb +39 -39
  110. data/spec/api/query/spatial_examples.rb +3 -3
  111. data/spec/api/query/spellcheck_examples.rb +20 -0
  112. data/spec/api/query/standard_spec.rb +3 -1
  113. data/spec/api/query/stats_examples.rb +66 -0
  114. data/spec/api/query/text_field_scoping_examples.rb +5 -5
  115. data/spec/api/query/types_spec.rb +4 -4
  116. data/spec/api/search/cursor_paginated_collection_spec.rb +35 -0
  117. data/spec/api/search/dynamic_fields_spec.rb +4 -4
  118. data/spec/api/search/faceting_spec.rb +55 -52
  119. data/spec/api/search/highlighting_spec.rb +7 -7
  120. data/spec/api/search/hits_spec.rb +43 -29
  121. data/spec/api/search/paginated_collection_spec.rb +19 -18
  122. data/spec/api/search/results_spec.rb +13 -13
  123. data/spec/api/search/search_spec.rb +3 -3
  124. data/spec/api/search/stats_spec.rb +94 -0
  125. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +23 -16
  126. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +16 -4
  127. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +10 -6
  128. data/spec/api/session_proxy/retry_5xx_session_proxy_spec.rb +11 -11
  129. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +15 -14
  130. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +3 -3
  131. data/spec/api/session_proxy/spec_helper.rb +1 -1
  132. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +40 -26
  133. data/spec/api/session_spec.rb +78 -38
  134. data/spec/api/sunspot_spec.rb +7 -4
  135. data/spec/helpers/integration_helper.rb +11 -1
  136. data/spec/helpers/query_helper.rb +1 -1
  137. data/spec/helpers/search_helper.rb +30 -0
  138. data/spec/integration/atomic_updates_spec.rb +58 -0
  139. data/spec/integration/dynamic_fields_spec.rb +31 -20
  140. data/spec/integration/faceting_spec.rb +252 -39
  141. data/spec/integration/field_grouping_spec.rb +47 -15
  142. data/spec/integration/field_lists_spec.rb +57 -0
  143. data/spec/integration/geospatial_spec.rb +34 -8
  144. data/spec/integration/highlighting_spec.rb +8 -8
  145. data/spec/integration/indexing_spec.rb +7 -6
  146. data/spec/integration/join_spec.rb +45 -0
  147. data/spec/integration/keyword_search_spec.rb +68 -38
  148. data/spec/integration/local_search_spec.rb +4 -4
  149. data/spec/integration/more_like_this_spec.rb +7 -7
  150. data/spec/integration/scoped_search_spec.rb +193 -74
  151. data/spec/integration/spellcheck_spec.rb +119 -0
  152. data/spec/integration/stats_spec.rb +88 -0
  153. data/spec/integration/stored_fields_spec.rb +1 -1
  154. data/spec/integration/test_pagination.rb +4 -4
  155. data/spec/integration/unicode_spec.rb +1 -1
  156. data/spec/mocks/adapters.rb +36 -0
  157. data/spec/mocks/connection.rb +5 -3
  158. data/spec/mocks/photo.rb +32 -1
  159. data/spec/mocks/post.rb +18 -3
  160. data/spec/spec_helper.rb +13 -8
  161. data/sunspot.gemspec +6 -4
  162. data/tasks/rdoc.rake +22 -14
  163. metadata +101 -44
  164. data/lib/sunspot/dsl/field_group.rb +0 -57
  165. data/lib/sunspot/query/field_group.rb +0 -37
@@ -0,0 +1,119 @@
1
+ require File.expand_path('../spec_helper', File.dirname(__FILE__))
2
+ include SearchHelper
3
+
4
+ describe 'spellcheck' do
5
+ before :each do
6
+ Sunspot.remove_all
7
+
8
+ @posts = [
9
+ Post.new(:title => 'Clojure Developer'),
10
+ Post.new(:title => 'Conjure Flow'),
11
+ Post.new(:title => 'Clojure Analyst'),
12
+ Post.new(:title => 'C++ Developer'),
13
+ Post.new(:title => 'C++ Developing')
14
+ ]
15
+
16
+ Sunspot.index!(*@posts)
17
+ Sunspot.commit
18
+ end
19
+
20
+ it 'has no spellchecking by default' do
21
+ search = Sunspot.search(Post) do
22
+ keywords 'Closure'
23
+ end
24
+ expect(search.spellcheck_suggestions).to eq({})
25
+ end
26
+
27
+ it 'returns the list of suggestions' do
28
+ search = Sunspot.search(Post) do
29
+ keywords 'Closure'
30
+ spellcheck :count => 3
31
+ end
32
+ expect(search.spellcheck_suggestions['closure']['suggestion']).to eq([
33
+ {'word'=>'clojure', 'freq'=>2}, {'word'=>'conjure', 'freq'=>1}
34
+ ])
35
+ end
36
+
37
+ it 'returns suggestion with highest frequency' do
38
+ search = Sunspot.search(Post) do
39
+ keywords 'Closure'
40
+ spellcheck :count => 3
41
+ end
42
+ expect(search.spellcheck_suggestion_for('closure')).to eq('clojure')
43
+ end
44
+
45
+ it 'returns suggestion without collation when only more popular is true' do
46
+ search = Sunspot.search(Post) do
47
+ keywords 'Closure'
48
+ spellcheck :count => 3, :only_more_popular => true, :collate => false
49
+ end
50
+
51
+ expect(search.spellcheck_suggestion_for('closure')).to eq('clojure')
52
+ end
53
+
54
+ context 'spellcheck collation' do
55
+ it 'replaces terms that are not in the index if terms are provided' do
56
+
57
+ search = Sunspot.search(Post) do
58
+ keywords 'lojure developing'
59
+ spellcheck :count => 3, :only_more_popular => true
60
+ end
61
+ expect(search.spellcheck_collation('lojure', 'developing')).to eq('clojure developing')
62
+ end
63
+
64
+ it 'returns Solr collation if terms are not provided' do
65
+
66
+ search = Sunspot.search(Post) do
67
+ keywords 'lojure developing'
68
+ spellcheck :count => 3, :only_more_popular => true
69
+ end
70
+ expect(search.spellcheck_collation).to eq('clojure developer')
71
+ end
72
+
73
+ it 'returns Solr collation if terms are not provided even for single word' do
74
+
75
+ search = Sunspot.search(Post) do
76
+ keywords 'lojure'
77
+ spellcheck :count => 3, :only_more_popular => true
78
+ end
79
+ expect(search.spellcheck_collation).to eq('clojure')
80
+ end
81
+
82
+ it 'returns Solr collation if terms are provided even for single word' do
83
+
84
+ search = Sunspot.search(Post) do
85
+ keywords 'lojure'
86
+ spellcheck :count => 3
87
+ end
88
+ expect(search.spellcheck_collation).to eq('clojure')
89
+ end
90
+
91
+ it 'returns Solr collation if terms are provided even for single word' do
92
+
93
+ search = Sunspot.search(Post) do
94
+ keywords 'lojure'
95
+ spellcheck :count => 3
96
+ end
97
+ expect(search.spellcheck_collation('lojure')).to eq('clojure')
98
+ end
99
+
100
+ it 'returns Solr collation if terms are provided even if single keyword is word' do
101
+
102
+ search = Sunspot.search(Post) do
103
+ keywords 'C++, lojure Developer'
104
+ spellcheck :count => 3
105
+ end
106
+ expect(search.spellcheck_collation).to eq('C++, clojure Developer')
107
+ end
108
+
109
+ it 'returns nil if terms are provided which varies from actual keywords' do
110
+
111
+ search = Sunspot.search(Post) do
112
+ keywords 'clojure'
113
+ spellcheck :count => 3
114
+ end
115
+ expect(search.spellcheck_collation('lojure')).to eq(nil)
116
+ end
117
+ end
118
+
119
+ end
@@ -0,0 +1,88 @@
1
+ require File.expand_path('../spec_helper', File.dirname(__FILE__))
2
+
3
+ describe 'search stats' do
4
+ before :each do
5
+ Sunspot.remove_all
6
+ @posts = Post.new(:ratings_average => 4.0, :author_name => 'plinio', :blog_id => 2),
7
+ Post.new(:ratings_average => 4.0, :author_name => 'caio', :blog_id => 1),
8
+ Post.new(:ratings_average => 3.0, :author_name => 'sempronio', :blog_id => 2)
9
+ Sunspot.index!(@posts)
10
+ end
11
+
12
+ it 'returns minimum stats' do
13
+ expect(Sunspot.search(Post) do
14
+ stats :average_rating
15
+ end.stats(:average_rating).min).to eq(3.0)
16
+ end
17
+
18
+ it 'returns maximum stats' do
19
+ expect(Sunspot.search(Post) do
20
+ stats :average_rating
21
+ end.stats(:average_rating).max).to eq(4.0)
22
+ end
23
+
24
+ it 'returns count stats' do
25
+ expect(Sunspot.search(Post) do
26
+ stats :average_rating
27
+ end.stats(:average_rating).count).to eq(3)
28
+ end
29
+
30
+ describe 'facets' do
31
+ it 'returns minimum on facet row with two blog ids' do
32
+ expect(Sunspot.search(Post) do
33
+ stats :average_rating do
34
+ facet :blog_id
35
+ end
36
+ end.stats(:average_rating).facet(:blog_id).rows[1].min).to eq(3.0)
37
+ end
38
+
39
+ it 'returns maximum on facet row with two blog ids' do
40
+ expect(Sunspot.search(Post) do
41
+ stats :average_rating do
42
+ facet :blog_id
43
+ end
44
+ end.stats(:average_rating).facet(:blog_id).rows[1].max).to eq(4.0)
45
+ end
46
+ end
47
+
48
+ describe 'json facets' do
49
+ it 'returns minimum on facet row with two blog ids' do
50
+ expect(Sunspot.search(Post) do
51
+ stats :average_rating, sort: :min do
52
+ json_facet :blog_id
53
+ end
54
+ end.json_facet_stats(:blog_id).rows[1].min).to eq(3.0)
55
+ end
56
+
57
+ it 'returns maximum on facet row with two blog ids' do
58
+ expect(Sunspot.search(Post) do
59
+ stats :average_rating, sort: :max do
60
+ json_facet :blog_id
61
+ end
62
+ end.json_facet_stats(:blog_id).rows[1].max).to eq(4.0)
63
+ end
64
+
65
+ it 'returns only sum' do
66
+ search = Sunspot.search(Post) do
67
+ stats :average_rating, stats: [:sum] do
68
+ json_facet :blog_id
69
+ end
70
+ end
71
+ expect(search.json_facet_stats(:blog_id).rows[1].max).to eq(nil)
72
+ expect(search.json_facet_stats(:blog_id).rows[1].min).to eq(nil)
73
+ expect(search.json_facet_stats(:blog_id).rows[1].avg).to eq(nil)
74
+ expect(search.json_facet_stats(:blog_id).rows[1].sumsq).to eq(nil)
75
+ expect(search.json_facet_stats(:blog_id).rows[1].sum).to eq(4.0)
76
+ end
77
+
78
+ it 'works with nested facets' do
79
+ search = Sunspot.search(Post) do
80
+ stats :average_rating, sort: :min do
81
+ json_facet(:blog_id, nested: { field: :author_name, limit: 3, nested: { field: :average_rating } } )
82
+ end
83
+ end
84
+ expect(search.json_facet_stats(:blog_id).rows[1].nested.first.nested.first.min).to eq(4.0)
85
+ end
86
+
87
+ end
88
+ end
@@ -7,6 +7,6 @@ describe 'stored fields' do
7
7
  end
8
8
 
9
9
  it 'should return stored fields' do
10
- Sunspot.search(Post).hits.first.stored(:title).should == 'A Title'
10
+ expect(Sunspot.search(Post).hits.first.stored(:title)).to eq('A Title')
11
11
  end
12
12
  end
@@ -11,7 +11,7 @@ describe 'pagination' do
11
11
 
12
12
  it 'should return all by default' do
13
13
  results = Sunspot.search(Post) { order_by :blog_id }.results
14
- results.should == @posts
14
+ expect(results).to eq(@posts)
15
15
  end
16
16
 
17
17
  it 'should return first page of 10' do
@@ -19,7 +19,7 @@ describe 'pagination' do
19
19
  order_by :blog_id
20
20
  paginate :page => 1, :per_page => 10
21
21
  end.results
22
- results.should == @posts[0,10]
22
+ expect(results).to eq(@posts[0,10])
23
23
  end
24
24
 
25
25
  it 'should return second page of 10' do
@@ -27,7 +27,7 @@ describe 'pagination' do
27
27
  order_by :blog_id
28
28
  paginate :page => 2, :per_page => 10
29
29
  end.results
30
- results.should == @posts[10,10]
30
+ expect(results).to eq(@posts[10,10])
31
31
  end
32
32
 
33
33
  it 'should return pages with offsets' do
@@ -38,6 +38,6 @@ describe 'pagination' do
38
38
 
39
39
  # page 1 is 3, 4, 5, 6, 7
40
40
  # page 2 is 8, 9, 10, 11, 12
41
- results.should == @posts[8,5]
41
+ expect(results).to eq(@posts[8,5])
42
42
  end
43
43
  end
@@ -10,6 +10,6 @@ describe "unicode characters" do
10
10
  end
11
11
 
12
12
  it "correctly retrieves the string as UTF-8" do
13
- Sunspot.search(Post).hits.first.stored(:title).should == "Híghgrøøvé"
13
+ expect(Sunspot.search(Post).hits.first.stored(:title)).to eq("Híghgrøøvé")
14
14
  end
15
15
  end
@@ -4,7 +4,43 @@ end
4
4
  class Model < AbstractModel
5
5
  end
6
6
 
7
+ class UnseenModel < AbstractModel
8
+ end
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
+
7
40
  class AbstractModelInstanceAdapter < Sunspot::Adapters::InstanceAdapter
41
+ def id
42
+ @instance.id
43
+ end
8
44
  end
9
45
 
10
46
  class AbstractModelDataAccessor < Sunspot::Adapters::DataAccessor
@@ -22,7 +22,7 @@ module Mock
22
22
  end
23
23
 
24
24
  class Connection
25
- attr_reader :adds, :commits, :optims, :searches, :message, :opts, :deletes_by_query
25
+ attr_reader :adds, :commits, :soft_commits, :optims, :searches, :message, :opts, :deletes_by_query
26
26
  attr_accessor :response
27
27
  attr_writer :expected_handler
28
28
  undef_method :select # annoyingly defined on Object
@@ -30,7 +30,7 @@ module Mock
30
30
  def initialize(opts = {})
31
31
  @opts = opts
32
32
  @message = OpenStruct.new
33
- @adds, @deletes, @deletes_by_query, @commits, @optims, @searches = Array.new(6) { [] }
33
+ @adds, @deletes, @deletes_by_query, @commits, @soft_commits, @optims, @searches = Array.new(7) { [] }
34
34
  @expected_handler = :select
35
35
  end
36
36
 
@@ -46,8 +46,10 @@ module Mock
46
46
  @deletes_by_query << query
47
47
  end
48
48
 
49
- def commit
49
+ def commit(opts = {})
50
+ commit_attrs = opts.delete(:commit_attributes) || {}
50
51
  @commits << Time.now
52
+ @soft_commits << Time.now if commit_attrs[:softCommit]
51
53
  end
52
54
 
53
55
  def optimize
data/spec/mocks/photo.rb CHANGED
@@ -1,11 +1,42 @@
1
1
  class Photo < MockRecord
2
- attr_accessor :caption, :lat, :lng, :size, :average_rating, :created_at
2
+ attr_accessor :caption, :description, :lat, :lng, :size, :average_rating, :created_at, :post_id, :photo_container_id
3
3
  end
4
4
 
5
5
  Sunspot.setup(Photo) do
6
6
  text :caption, :default_boost => 1.5
7
+ text :description
8
+ string :caption
9
+ integer :photo_container_id
7
10
  boost 0.75
8
11
  integer :size, :trie => true
9
12
  float :average_rating, :trie => true
10
13
  time :created_at, :trie => true
11
14
  end
15
+
16
+ class Picture < MockRecord
17
+ attr_accessor :description, :photo_container_id
18
+ end
19
+
20
+ Sunspot.setup(Picture) do
21
+ text :description
22
+ integer :photo_container_id
23
+ end
24
+
25
+ class PhotoContainer < MockRecord
26
+ attr_accessor :description
27
+
28
+ def id
29
+ 1
30
+ end
31
+ end
32
+
33
+ Sunspot.setup(PhotoContainer) do
34
+ integer :id
35
+ text :description, :default_boost => 1.2
36
+
37
+ join(:caption, :target => Photo, :type => :string, :join => { :from => :photo_container_id, :to => :id })
38
+ join(:photo_rating, :target => Photo, :type => :trie_float, :join => { :from => :photo_container_id, :to => :id }, :as => 'average_rating_ft')
39
+ join(:caption, :target => Photo, :type => :text, :join => { :from => :photo_container_id, :to => :id })
40
+ join(:description, :target => Photo, :type => :text, :join => { :from => :photo_container_id, :to => :id }, :prefix => "photo")
41
+ join(:description, :target => Picture, :type => :text, :join => { :from => :photo_container_id, :to => :id }, :prefix => "picture")
42
+ end
data/spec/mocks/post.rb CHANGED
@@ -3,7 +3,8 @@ require File.join(File.dirname(__FILE__), 'super_class')
3
3
 
4
4
  class Post < SuperClass
5
5
  attr_accessor :title, :body, :blog_id, :published_at, :ratings_average,
6
- :author_name, :featured, :expire_date, :coordinates, :tags
6
+ :author_name, :featured, :expire_date, :coordinates, :tags,
7
+ :featured_for
7
8
  alias_method :featured?, :featured
8
9
 
9
10
  def category_ids
@@ -14,6 +15,10 @@ class Post < SuperClass
14
15
  @custom_string ||= {}
15
16
  end
16
17
 
18
+ def custom_underscored_string
19
+ @custom_underscored_string ||= {}
20
+ end
21
+
17
22
  def custom_fl
18
23
  @custom_fl ||= {}
19
24
  end
@@ -27,22 +32,27 @@ class Post < SuperClass
27
32
  end
28
33
 
29
34
  private
30
- attr_writer :category_ids, :custom_string, :custom_fl, :custom_time, :custom_boolean
35
+ attr_writer :category_ids, :custom_string, :custom_underscored_string, :custom_fl, :custom_time, :custom_boolean
31
36
  end
32
37
 
33
38
  Sunspot.setup(Post) do
34
39
  text :title, :boost => 2
40
+ text :text_array, :boost => 3 do
41
+ [title, title]
42
+ end
35
43
  text :body, :stored => true, :more_like_this => true
36
44
  text :backwards_title do
37
45
  title.reverse if title
38
46
  end
39
47
  text :tags, :more_like_this => true
40
48
  string :title, :stored => true
49
+ string :author_name
41
50
  integer :blog_id, :references => Blog
42
51
  integer :category_ids, :multiple => true
43
52
  float :average_rating, :using => :ratings_average, :trie => true
44
53
  time :published_at, :trie => true
45
54
  date :expire_date
55
+ date_range :featured_for
46
56
  boolean :featured, :using => :featured?, :stored => true
47
57
  string :sort_title do
48
58
  title.downcase.sub(/^(a|an|the)\W+/, '') if title
@@ -57,6 +67,7 @@ Sunspot.setup(Post) do
57
67
  latlon(:coordinates_new) { coordinates }
58
68
 
59
69
  dynamic_string :custom_string, :stored => true
70
+ dynamic_string :custom_underscored_string, separator: '__'
60
71
  dynamic_float :custom_float, :multiple => true, :using => :custom_fl
61
72
  dynamic_integer :custom_integer do
62
73
  category_ids.inject({}) do |hash, category_id|
@@ -78,7 +89,11 @@ Sunspot.setup(Post) do
78
89
 
79
90
  string :legacy_array, :as => :legacy_array_field_sm, :multiple => true do
80
91
  ['first string', 'second string']
81
- end
92
+ end
93
+
94
+ string :tag_list, :multiple => true, :stored => true do
95
+ tags
96
+ end
82
97
  end
83
98
 
84
99
  class PhotoPost < Post