gojee-sunspot 2.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. metadata +3 -261
  2. data/.gitignore +0 -12
  3. data/Gemfile +0 -5
  4. data/History.txt +0 -252
  5. data/LICENSE +0 -18
  6. data/Rakefile +0 -13
  7. data/TODO +0 -13
  8. data/lib/light_config.rb +0 -40
  9. data/lib/sunspot.rb +0 -579
  10. data/lib/sunspot/adapters.rb +0 -265
  11. data/lib/sunspot/batcher.rb +0 -62
  12. data/lib/sunspot/class_set.rb +0 -23
  13. data/lib/sunspot/composite_setup.rb +0 -202
  14. data/lib/sunspot/configuration.rb +0 -53
  15. data/lib/sunspot/data_extractor.rb +0 -50
  16. data/lib/sunspot/dsl.rb +0 -5
  17. data/lib/sunspot/dsl/adjustable.rb +0 -47
  18. data/lib/sunspot/dsl/field_group.rb +0 -57
  19. data/lib/sunspot/dsl/field_query.rb +0 -327
  20. data/lib/sunspot/dsl/fields.rb +0 -103
  21. data/lib/sunspot/dsl/fulltext.rb +0 -243
  22. data/lib/sunspot/dsl/function.rb +0 -27
  23. data/lib/sunspot/dsl/functional.rb +0 -44
  24. data/lib/sunspot/dsl/more_like_this_query.rb +0 -56
  25. data/lib/sunspot/dsl/paginatable.rb +0 -32
  26. data/lib/sunspot/dsl/query_facet.rb +0 -36
  27. data/lib/sunspot/dsl/restriction.rb +0 -25
  28. data/lib/sunspot/dsl/restriction_with_near.rb +0 -160
  29. data/lib/sunspot/dsl/scope.rb +0 -217
  30. data/lib/sunspot/dsl/search.rb +0 -30
  31. data/lib/sunspot/dsl/standard_query.rb +0 -123
  32. data/lib/sunspot/field.rb +0 -193
  33. data/lib/sunspot/field_factory.rb +0 -129
  34. data/lib/sunspot/indexer.rb +0 -136
  35. data/lib/sunspot/query.rb +0 -11
  36. data/lib/sunspot/query/abstract_field_facet.rb +0 -52
  37. data/lib/sunspot/query/bbox.rb +0 -15
  38. data/lib/sunspot/query/boost_query.rb +0 -24
  39. data/lib/sunspot/query/common_query.rb +0 -96
  40. data/lib/sunspot/query/composite_fulltext.rb +0 -36
  41. data/lib/sunspot/query/connective.rb +0 -206
  42. data/lib/sunspot/query/date_field_facet.rb +0 -14
  43. data/lib/sunspot/query/dismax.rb +0 -132
  44. data/lib/sunspot/query/field_facet.rb +0 -41
  45. data/lib/sunspot/query/field_group.rb +0 -36
  46. data/lib/sunspot/query/filter.rb +0 -38
  47. data/lib/sunspot/query/function_query.rb +0 -52
  48. data/lib/sunspot/query/geo.rb +0 -53
  49. data/lib/sunspot/query/geofilt.rb +0 -16
  50. data/lib/sunspot/query/highlighting.rb +0 -62
  51. data/lib/sunspot/query/more_like_this.rb +0 -61
  52. data/lib/sunspot/query/more_like_this_query.rb +0 -12
  53. data/lib/sunspot/query/pagination.rb +0 -42
  54. data/lib/sunspot/query/query_facet.rb +0 -16
  55. data/lib/sunspot/query/restriction.rb +0 -262
  56. data/lib/sunspot/query/scope.rb +0 -9
  57. data/lib/sunspot/query/sort.rb +0 -109
  58. data/lib/sunspot/query/sort_composite.rb +0 -34
  59. data/lib/sunspot/query/standard_query.rb +0 -16
  60. data/lib/sunspot/query/text_field_boost.rb +0 -17
  61. data/lib/sunspot/schema.rb +0 -151
  62. data/lib/sunspot/search.rb +0 -9
  63. data/lib/sunspot/search/abstract_search.rb +0 -281
  64. data/lib/sunspot/search/date_facet.rb +0 -35
  65. data/lib/sunspot/search/facet_row.rb +0 -27
  66. data/lib/sunspot/search/field_facet.rb +0 -88
  67. data/lib/sunspot/search/field_group.rb +0 -32
  68. data/lib/sunspot/search/group.rb +0 -50
  69. data/lib/sunspot/search/highlight.rb +0 -38
  70. data/lib/sunspot/search/hit.rb +0 -150
  71. data/lib/sunspot/search/hit_enumerable.rb +0 -72
  72. data/lib/sunspot/search/more_like_this_search.rb +0 -31
  73. data/lib/sunspot/search/paginated_collection.rb +0 -57
  74. data/lib/sunspot/search/query_facet.rb +0 -67
  75. data/lib/sunspot/search/standard_search.rb +0 -21
  76. data/lib/sunspot/session.rb +0 -262
  77. data/lib/sunspot/session_proxy.rb +0 -95
  78. data/lib/sunspot/session_proxy/abstract_session_proxy.rb +0 -29
  79. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +0 -66
  80. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +0 -89
  81. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +0 -43
  82. data/lib/sunspot/session_proxy/multicore_session_proxy.rb +0 -67
  83. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +0 -222
  84. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +0 -42
  85. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +0 -37
  86. data/lib/sunspot/setup.rb +0 -350
  87. data/lib/sunspot/text_field_setup.rb +0 -29
  88. data/lib/sunspot/type.rb +0 -393
  89. data/lib/sunspot/util.rb +0 -252
  90. data/lib/sunspot/version.rb +0 -3
  91. data/log/.gitignore +0 -1
  92. data/pkg/.gitignore +0 -1
  93. data/script/console +0 -10
  94. data/spec/api/adapters_spec.rb +0 -33
  95. data/spec/api/batcher_spec.rb +0 -112
  96. data/spec/api/binding_spec.rb +0 -50
  97. data/spec/api/class_set_spec.rb +0 -24
  98. data/spec/api/hit_enumerable_spec.rb +0 -47
  99. data/spec/api/indexer/attributes_spec.rb +0 -149
  100. data/spec/api/indexer/batch_spec.rb +0 -72
  101. data/spec/api/indexer/dynamic_fields_spec.rb +0 -42
  102. data/spec/api/indexer/fixed_fields_spec.rb +0 -57
  103. data/spec/api/indexer/fulltext_spec.rb +0 -43
  104. data/spec/api/indexer/removal_spec.rb +0 -53
  105. data/spec/api/indexer/spec_helper.rb +0 -1
  106. data/spec/api/indexer_spec.rb +0 -14
  107. data/spec/api/query/advanced_manipulation_examples.rb +0 -35
  108. data/spec/api/query/connectives_examples.rb +0 -189
  109. data/spec/api/query/dsl_spec.rb +0 -18
  110. data/spec/api/query/dynamic_fields_examples.rb +0 -165
  111. data/spec/api/query/faceting_examples.rb +0 -397
  112. data/spec/api/query/fulltext_examples.rb +0 -313
  113. data/spec/api/query/function_spec.rb +0 -79
  114. data/spec/api/query/geo_examples.rb +0 -68
  115. data/spec/api/query/group_spec.rb +0 -32
  116. data/spec/api/query/highlighting_examples.rb +0 -245
  117. data/spec/api/query/more_like_this_spec.rb +0 -140
  118. data/spec/api/query/ordering_pagination_examples.rb +0 -116
  119. data/spec/api/query/scope_examples.rb +0 -275
  120. data/spec/api/query/spatial_examples.rb +0 -27
  121. data/spec/api/query/spec_helper.rb +0 -1
  122. data/spec/api/query/standard_spec.rb +0 -29
  123. data/spec/api/query/text_field_scoping_examples.rb +0 -30
  124. data/spec/api/query/types_spec.rb +0 -20
  125. data/spec/api/search/dynamic_fields_spec.rb +0 -33
  126. data/spec/api/search/faceting_spec.rb +0 -360
  127. data/spec/api/search/highlighting_spec.rb +0 -69
  128. data/spec/api/search/hits_spec.rb +0 -131
  129. data/spec/api/search/paginated_collection_spec.rb +0 -36
  130. data/spec/api/search/results_spec.rb +0 -72
  131. data/spec/api/search/search_spec.rb +0 -23
  132. data/spec/api/search/spec_helper.rb +0 -1
  133. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +0 -85
  134. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +0 -30
  135. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +0 -41
  136. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +0 -77
  137. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +0 -24
  138. data/spec/api/session_proxy/spec_helper.rb +0 -9
  139. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +0 -39
  140. data/spec/api/session_spec.rb +0 -232
  141. data/spec/api/spec_helper.rb +0 -3
  142. data/spec/api/sunspot_spec.rb +0 -29
  143. data/spec/ext.rb +0 -11
  144. data/spec/helpers/indexer_helper.rb +0 -17
  145. data/spec/helpers/integration_helper.rb +0 -8
  146. data/spec/helpers/mock_session_helper.rb +0 -13
  147. data/spec/helpers/query_helper.rb +0 -26
  148. data/spec/helpers/search_helper.rb +0 -68
  149. data/spec/integration/dynamic_fields_spec.rb +0 -57
  150. data/spec/integration/faceting_spec.rb +0 -251
  151. data/spec/integration/field_grouping_spec.rb +0 -66
  152. data/spec/integration/geospatial_spec.rb +0 -85
  153. data/spec/integration/highlighting_spec.rb +0 -44
  154. data/spec/integration/indexing_spec.rb +0 -55
  155. data/spec/integration/keyword_search_spec.rb +0 -317
  156. data/spec/integration/local_search_spec.rb +0 -64
  157. data/spec/integration/more_like_this_spec.rb +0 -43
  158. data/spec/integration/scoped_search_spec.rb +0 -354
  159. data/spec/integration/stored_fields_spec.rb +0 -12
  160. data/spec/integration/test_pagination.rb +0 -43
  161. data/spec/integration/unicode_spec.rb +0 -15
  162. data/spec/mocks/adapters.rb +0 -32
  163. data/spec/mocks/blog.rb +0 -3
  164. data/spec/mocks/comment.rb +0 -21
  165. data/spec/mocks/connection.rb +0 -126
  166. data/spec/mocks/mock_adapter.rb +0 -30
  167. data/spec/mocks/mock_class_sharding_session_proxy.rb +0 -24
  168. data/spec/mocks/mock_record.rb +0 -52
  169. data/spec/mocks/mock_sharding_session_proxy.rb +0 -15
  170. data/spec/mocks/photo.rb +0 -11
  171. data/spec/mocks/post.rb +0 -86
  172. data/spec/mocks/super_class.rb +0 -2
  173. data/spec/mocks/user.rb +0 -13
  174. data/spec/spec_helper.rb +0 -40
  175. data/sunspot.gemspec +0 -42
  176. data/tasks/rdoc.rake +0 -27
  177. data/tasks/schema.rake +0 -19
  178. data/tasks/todo.rake +0 -4
@@ -1,53 +0,0 @@
1
- module Sunspot
2
- # The Sunspot::Configuration module provides a factory method for Sunspot
3
- # configuration objects. Available properties are:
4
- #
5
- # Sunspot.config.solr.url::
6
- # The URL at which to connect to Solr
7
- # (default: 'http://localhost:8983/solr')
8
- # Sunspot.config.pagination.default_per_page::
9
- # Solr always paginates its results. This sets Sunspot's default result
10
- # count per page if it is not explicitly specified in the query.
11
- # Sunspot.config.indexing.default_batch_size::
12
- # This sets the batch size for indexing, default is 50
13
- #
14
- module Configuration
15
- class <<self
16
- # Factory method to build configuration instances.
17
- #
18
- # ==== Returns
19
- #
20
- # LightConfig::Configuration:: new configuration instance with defaults
21
- #
22
- def build #:nodoc:
23
- LightConfig.build do
24
- solr do
25
- url 'http://127.0.0.1:8983/solr'
26
- read_timeout nil
27
- open_timeout nil
28
- end
29
- master_solr do
30
- url nil
31
- end
32
- pagination do
33
- default_per_page 30
34
- end
35
- indexing do
36
- default_batch_size 50
37
- end
38
- end
39
- end
40
-
41
- # Location for the default solr configuration files,
42
- # required for bootstrapping a new solr installation
43
- #
44
- # ==== Returns
45
- #
46
- # String:: Directory with default solr config files
47
- #
48
- def solr_default_configuration_location
49
- File.join( File.dirname(__FILE__), '../../solr/solr/conf' )
50
- end
51
- end
52
- end
53
- end
@@ -1,50 +0,0 @@
1
- module Sunspot
2
- #
3
- # DataExtractors present an internal API for the indexer to use to extract
4
- # field values from models for indexing. They must implement the #value_for
5
- # method, which takes an object and returns the value extracted from it.
6
- #
7
- module DataExtractor #:nodoc: all
8
- #
9
- # AttributeExtractors extract data by simply calling a method on the block.
10
- #
11
- class AttributeExtractor
12
- def initialize(attribute_name)
13
- @attribute_name = attribute_name
14
- end
15
-
16
- def value_for(object)
17
- object.send(@attribute_name)
18
- end
19
- end
20
-
21
- #
22
- # BlockExtractors extract data by evaluating a block in the context of the
23
- # object instance, or if the block takes an argument, by passing the object
24
- # as the argument to the block. Either way, the return value of the block is
25
- # the value returned by the extractor.
26
- #
27
- class BlockExtractor
28
- def initialize(&block)
29
- @block = block
30
- end
31
-
32
- def value_for(object)
33
- Util.instance_eval_or_call(object, &@block)
34
- end
35
- end
36
-
37
- #
38
- # Constant data extractors simply return the same value for every object.
39
- #
40
- class Constant
41
- def initialize(value)
42
- @value = value
43
- end
44
-
45
- def value_for(object)
46
- @value
47
- end
48
- end
49
- end
50
- end
data/lib/sunspot/dsl.rb DELETED
@@ -1,5 +0,0 @@
1
- %w(fields scope paginatable adjustable field_query standard_query query_facet
2
- functional fulltext restriction restriction_with_near search
3
- more_like_this_query function field_group).each do |file|
4
- require File.join(File.dirname(__FILE__), 'dsl', file)
5
- end
@@ -1,47 +0,0 @@
1
- module Sunspot
2
- module DSL #:nodoc:
3
- module Adjustable #:nodoc
4
- # <strong>Expert:</strong> Adjust or reset the parameters passed to Solr.
5
- # The adjustment will take place just before sending the params to solr,
6
- # after Sunspot builds the Solr params based on the methods called in the
7
- # DSL.
8
- #
9
- # Under normal circumstances, using this method should not be necessary;
10
- # if you find that it is, please consider submitting a feature request.
11
- # Using this method requires knowledge of Sunspot's internal Solr schema
12
- # and Solr query representations, which are not part of Sunspot's public
13
- # API; they could change at any time. <strong>This method is unsupported
14
- # and your mileage may vary.</strong>
15
- #
16
- # ==== Examples
17
- #
18
- # Sunspot.search(Post) do
19
- # adjust_solr_params do |params|
20
- # params[:q] += ' AND something_s:more'
21
- # end
22
- # end
23
- #
24
- # Sunspot.more_like_this(my_post) do
25
- # adjust_solr_params do |params|
26
- # params["mlt.match.include"] = true
27
- # end
28
- # end
29
- #
30
- def adjust_solr_params( &block )
31
- @query.solr_parameter_adjustment = block
32
- end
33
-
34
- #
35
- # <strong>Expert:</strong> Use a custom request handler for this search.
36
- # The general use case for this would be a request handler configuration
37
- # you've defined in solrconfig that has different search components,
38
- # defaults, etc. Using this to point at an entirely different type of
39
- # request handler that Sunspot doesn't support probably won't get you very
40
- # far.
41
- #
42
- def request_handler(request_handler)
43
- @search.request_handler = request_handler
44
- end
45
- end
46
- end
47
- end
@@ -1,57 +0,0 @@
1
- module Sunspot
2
- module DSL
3
- class FieldGroup
4
- def initialize(query, setup, group)
5
- @query, @setup, @group = query, setup, group
6
- end
7
-
8
- #
9
- # Sets the number of results (documents) to return for each group.
10
- # Defaults to 1.
11
- #
12
- def limit(num)
13
- @group.limit = num
14
- end
15
-
16
- #
17
- # If set, facet counts are based on the most relevant document of
18
- # each group matching the query.
19
- #
20
- # Supported in Solr 3.4 and above.
21
- #
22
- # ==== Example
23
- #
24
- # Sunspot.search(Post) do
25
- # group :title do
26
- # truncate
27
- # end
28
- #
29
- # facet :title, :extra => :any
30
- # end
31
- #
32
- def truncate
33
- @group.truncate = true
34
- end
35
-
36
- # Specify the order that results should be returned in. This method can
37
- # be called multiple times; precedence will be in the order given.
38
- #
39
- # ==== Parameters
40
- #
41
- # field_name<Symbol>:: the field to use for ordering
42
- # direction<Symbol>:: :asc or :desc (default :asc)
43
- #
44
- def order_by(field_name, direction = nil)
45
- sort =
46
- if special = Sunspot::Query::Sort.special(field_name)
47
- special.new(direction)
48
- else
49
- Sunspot::Query::Sort::FieldSort.new(
50
- @setup.field(field_name), direction
51
- )
52
- end
53
- @group.add_sort(sort)
54
- end
55
- end
56
- end
57
- end
@@ -1,327 +0,0 @@
1
- module Sunspot
2
- module DSL
3
- #
4
- # Provides an API for areas of the query DSL that operate on specific
5
- # fields. This functionality is provided by the query DSL and the dynamic
6
- # query DSL.
7
- #
8
- class FieldQuery < Scope
9
- def initialize(search, query, setup) #:nodoc:
10
- @search, @query = search, query
11
- super(query.scope, setup)
12
- end
13
-
14
- # Specify the order that results should be returned in. This method can
15
- # be called multiple times; precedence will be in the order given.
16
- #
17
- # ==== Parameters
18
- #
19
- # field_name<Symbol>:: the field to use for ordering
20
- # direction<Symbol>:: :asc or :desc (default :asc)
21
- #
22
- def order_by(field_name, direction = nil)
23
- sort =
24
- if special = Sunspot::Query::Sort.special(field_name)
25
- special.new(direction)
26
- else
27
- Sunspot::Query::Sort::FieldSort.new(
28
- @setup.field(field_name), direction
29
- )
30
- end
31
- @query.add_sort(sort)
32
- end
33
-
34
- #
35
- # Specify that the results should be ordered based on their
36
- # distance from a given point.
37
- #
38
- # ==== Parameters
39
- #
40
- # field_name<Symbol>::
41
- # the field that stores the location (declared as `latlon`)
42
- # lat<Numeric>::
43
- # the reference latitude
44
- # lon<Numeric>::
45
- # the reference longitude
46
- # direction<Symbol>::
47
- # :asc or :desc (default :asc)
48
- #
49
- def order_by_geodist(field_name, lat, lon, direction = nil)
50
- @query.add_sort(
51
- Sunspot::Query::Sort::GeodistSort.new(@setup.field(field_name), lat, lon, direction)
52
- )
53
- end
54
-
55
- #
56
- # DEPRECATED Use <code>order_by(:random)</code>
57
- #
58
- def order_by_random
59
- order_by(:random)
60
- end
61
-
62
- # Specify a field for result grouping. Grouping groups documents
63
- # with a common field value, return only the top document per
64
- # group.
65
- #
66
- # More information in the Solr documentation:
67
- # <http://wiki.apache.org/solr/FieldCollapsing>
68
- #
69
- # ==== Parameters
70
- #
71
- # field_name<Symbol>:: the field to use for grouping
72
- def group(*field_names, &block)
73
- options = Sunspot::Util.extract_options_from(field_names)
74
-
75
- field_names.each do |field_name|
76
- field = @setup.field(field_name)
77
- group = @query.add_group(Sunspot::Query::FieldGroup.new(field))
78
- @search.add_field_group(field)
79
-
80
- if block
81
- Sunspot::Util.instance_eval_or_call(
82
- FieldGroup.new(@query, @setup, group),
83
- &block
84
- )
85
- end
86
- end
87
- end
88
-
89
- #
90
- # Request a facet on the search query. A facet is a feature of Solr that
91
- # determines the number of documents that match the existing search *and*
92
- # an additional criterion. This allows you to build powerful drill-down
93
- # interfaces for search, at each step presenting the searcher with a set
94
- # of refinements that are known to return results.
95
- #
96
- # In Sunspot, each facet returns zero or more rows, each of which
97
- # represents a particular criterion conjoined with the actual query being
98
- # performed. For _field_ _facets_, each row represents a particular value
99
- # for a given field. For _query_ _facets_, each row represents an
100
- # arbitrary scope; the facet itself is just a means of logically grouping
101
- # the scopes.
102
- #
103
- # === Examples
104
- #
105
- # ==== Field Facets
106
- #
107
- # A field facet is specified by passing one or more Symbol arguments to
108
- # this method:
109
- #
110
- # Sunspot.search(Post) do
111
- # with(:blog_id, 1)
112
- # facet(:category_id)
113
- # end
114
- #
115
- # The facet specified above will have a row for each category_id that is
116
- # present in a document which also has a blog_id of 1.
117
- #
118
- # ==== Multiselect Facets
119
- #
120
- # In certain circumstances, it is beneficial to exclude certain query
121
- # scopes from a facet; the most common example is multi-select faceting,
122
- # where the user has selected a certain value, but the facet should still
123
- # show all options that would be available if they had not:
124
- #
125
- # Sunspot.search(Post) do
126
- # with(:blog_id, 1)
127
- # category_filter = with(:category_id, 2)
128
- # facet(:category_id, :exclude => category_filter)
129
- # end
130
- #
131
- # Although the results of the above search will be restricted to those
132
- # with a category_id of 2, the category_id facet will operate as if a
133
- # category had not been selected, allowing the user to select additional
134
- # categories (which will presumably be ORed together).
135
- #
136
- # It possible to exclude multiple filters by passing an array:
137
- #
138
- # Sunspot.search(Post) do
139
- # with(:blog_id, 1)
140
- # category_filter = with(:category_id, 2)
141
- # author_filter = with(:author_id, 3)
142
- # facet(:category_id,
143
- # :exclude => [category_filter, author_filter].compact)
144
- # end
145
- #
146
- # You should consider using +.compact+ to ensure that the array does not
147
- # contain any nil values.
148
- #
149
- # <strong>As far as I can tell, Solr only supports multi-select with
150
- # field facets; if +:exclude+ is passed to a query facet, this method will
151
- # raise an error. Also, the +:only+ and +:extra+ options use query
152
- # faceting under the hood, so these can't be used with +:extra+ either.
153
- # </strong>
154
- #
155
- # ==== Query Facets
156
- #
157
- # A query facet is a collection of arbitrary scopes, each of which
158
- # represents a row. This is specified by passing a block into the #facet
159
- # method; the block then contains one or more +row+ blocks, each of which
160
- # creates a query facet row. The +row+ blocks follow the usual Sunspot
161
- # scope DSL.
162
- #
163
- # For example, a query facet can be used to facet over a set of ranges:
164
- #
165
- # Sunspot.search(Post) do
166
- # facet(:average_rating) do
167
- # row(1.0..2.0) do
168
- # with(:average_rating, 1.0..2.0)
169
- # end
170
- # row(2.0..3.0) do
171
- # with(:average_rating, 2.0..3.0)
172
- # end
173
- # row(3.0..4.0) do
174
- # with(:average_rating, 3.0..4.0)
175
- # end
176
- # row(4.0..5.0) do
177
- # with(:average_rating, 4.0..5.0)
178
- # end
179
- # end
180
- # end
181
- #
182
- # Note that the arguments to the +facet+ and +row+ methods simply provide
183
- # labels for the facet and its rows, so that they can be retrieved and
184
- # identified from the Search object. They are not passed to Solr and no
185
- # semantic meaning is attached to them. The label for +facet+ should be
186
- # a symbol; the label for +row+ can be whatever you'd like.
187
- #
188
- # ==== Parameters
189
- #
190
- # field_names...<Symbol>:: fields for which to return field facets
191
- #
192
- # ==== Options
193
- #
194
- # :sort<Symbol>::
195
- # Either :count (values matching the most terms first) or :index (lexical)
196
- # :limit<Integer>::
197
- # The maximum number of facet rows to return
198
- # :minimum_count<Integer>::
199
- # The minimum count a facet row must have to be returned
200
- # :zeros<Boolean>::
201
- # Return facet rows for which there are no matches (equivalent to
202
- # :minimum_count => 0). Default is false.
203
- # :exclude<Object,Array>::
204
- # Exclude one or more filters when performing the faceting (see
205
- # Multiselect Faceting above). The object given for this argument should
206
- # be the return value(s) of a scoping method (+with+, +any_of+,
207
- # +all_of+, etc.). <strong>Only can be used for field facets that do not
208
- # use the +:extra+ or +:only+ options.</strong>
209
- # :name<Symbol>::
210
- # Give a custom name to a field facet. The main use case for this option
211
- # is for requesting the same field facet multiple times, using different
212
- # filter exclusions (see Multiselect Faceting above). If you pass this
213
- # option, it is also the argument that should be passed to Search#facet
214
- # when retrieving the facet result.
215
- # :only<Array>::
216
- # Only return facet rows for the given values. Useful if you are only
217
- # interested in faceting on a subset of values for a given field.
218
- # <strong>Only applies to field facets.</strong>
219
- # :extra<Symbol,Array>::
220
- # One or more of :any and :none. :any returns a facet row with a count
221
- # of all matching documents that have some value for this field. :none
222
- # returns a facet row with a count of all matching documents that have
223
- # no value for this field. The facet row(s) corresponding to the extras
224
- # have a value of the symbol passed. <strong>Only applies to field
225
- # facets.</strong>
226
- #
227
- def facet(*field_names, &block)
228
- options = Sunspot::Util.extract_options_from(field_names)
229
-
230
- if block
231
- if field_names.length != 1
232
- raise(
233
- ArgumentError,
234
- "wrong number of arguments (#{field_names.length} for 1)"
235
- )
236
- end
237
- if options.has_key?(:exclude)
238
- raise(
239
- ArgumentError,
240
- "can't use :exclude with query facets"
241
- )
242
- end
243
- search_facet = @search.add_query_facet(field_names.first, options)
244
- Sunspot::Util.instance_eval_or_call(
245
- QueryFacet.new(@query, @setup, search_facet),
246
- &block
247
- )
248
- elsif options[:only]
249
- if options.has_key?(:exclude)
250
- raise(
251
- ArgumentError,
252
- "can't use :exclude with :only (see documentation)"
253
- )
254
- end
255
- field_names.each do |field_name|
256
- field = @setup.field(field_name)
257
- search_facet = @search.add_field_facet(field, options)
258
- Util.Array(options[:only]).each do |value|
259
- facet = Sunspot::Query::QueryFacet.new
260
- facet.add_positive_restriction(field, Sunspot::Query::Restriction::EqualTo, value)
261
- @query.add_query_facet(facet)
262
- search_facet.add_row(value, facet.to_boolean_phrase)
263
- end
264
- end
265
- else
266
- field_names.each do |field_name|
267
- search_facet = nil
268
- field = @setup.field(field_name)
269
- facet =
270
- if options[:time_range]
271
- unless field.type.is_a?(Sunspot::Type::TimeType)
272
- raise(
273
- ArgumentError,
274
- ':time_range can only be specified for Date or Time fields'
275
- )
276
- end
277
- search_facet = @search.add_date_facet(field, options)
278
- Sunspot::Query::DateFieldFacet.new(field, options)
279
- else
280
- search_facet = @search.add_field_facet(field, options)
281
- Sunspot::Query::FieldFacet.new(field, options)
282
- end
283
- @query.add_field_facet(facet)
284
- Util.Array(options[:extra]).each do |extra|
285
- if options.has_key?(:exclude)
286
- raise(
287
- ArgumentError,
288
- "can't use :exclude with :extra (see documentation)"
289
- )
290
- end
291
- extra_facet = Sunspot::Query::QueryFacet.new
292
- case extra
293
- when :any
294
- extra_facet.add_negated_restriction(
295
- field,
296
- Sunspot::Query::Restriction::EqualTo,
297
- nil
298
- )
299
- when :none
300
- extra_facet.add_positive_restriction(
301
- field,
302
- Sunspot::Query::Restriction::EqualTo,
303
- nil
304
- )
305
- else
306
- raise(
307
- ArgumentError,
308
- "Allowed values for :extra are :any and :none"
309
- )
310
- end
311
- search_facet.add_row(extra, extra_facet.to_boolean_phrase)
312
- @query.add_query_facet(extra_facet)
313
- end
314
- end
315
- end
316
- end
317
-
318
- def dynamic(base_name, &block)
319
- dynamic_field_factory = @setup.dynamic_field_factory(base_name)
320
- Sunspot::Util.instance_eval_or_call(
321
- FieldQuery.new(@search, @query, dynamic_field_factory),
322
- &block
323
- )
324
- end
325
- end
326
- end
327
- end