solrb 0.1.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 (77) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +69 -0
  3. data/.circleci/run-with-local-config.sh +7 -0
  4. data/.gitignore +11 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +30 -0
  7. data/.ruby-version +1 -0
  8. data/Gemfile +6 -0
  9. data/Gemfile.lock +83 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +259 -0
  12. data/Rakefile +6 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/lib/solr/commit/request.rb +15 -0
  16. data/lib/solr/configuration.rb +66 -0
  17. data/lib/solr/connection.rb +33 -0
  18. data/lib/solr/core_configuration/core_config.rb +44 -0
  19. data/lib/solr/core_configuration/core_config_builder.rb +51 -0
  20. data/lib/solr/core_configuration/dynamic_field.rb +17 -0
  21. data/lib/solr/core_configuration/field.rb +20 -0
  22. data/lib/solr/delete/request.rb +34 -0
  23. data/lib/solr/document.rb +26 -0
  24. data/lib/solr/document_collection.rb +55 -0
  25. data/lib/solr/errors/ambiguous_core_error.rb +9 -0
  26. data/lib/solr/errors/solr_query_error.rb +4 -0
  27. data/lib/solr/errors/solr_url_not_defined_error.rb +16 -0
  28. data/lib/solr/grouped_document_collection.rb +38 -0
  29. data/lib/solr/indexing/document.rb +25 -0
  30. data/lib/solr/indexing/request.rb +22 -0
  31. data/lib/solr/query/request/boost_magnitude.rb +9 -0
  32. data/lib/solr/query/request/boosting/dictionary_boost_function.rb +36 -0
  33. data/lib/solr/query/request/boosting/exists_boost_function.rb +27 -0
  34. data/lib/solr/query/request/boosting/field_value_less_than_boost_function.rb +25 -0
  35. data/lib/solr/query/request/boosting/field_value_match_boost_function.rb +24 -0
  36. data/lib/solr/query/request/boosting/geodist_function.rb +37 -0
  37. data/lib/solr/query/request/boosting/ln_function_boost.rb +28 -0
  38. data/lib/solr/query/request/boosting/numeric_field_value_match_boost_function.rb +13 -0
  39. data/lib/solr/query/request/boosting/phrase_proximity_boost.rb +27 -0
  40. data/lib/solr/query/request/boosting/ranking_field_boost_function.rb +20 -0
  41. data/lib/solr/query/request/boosting/recent_field_value_boost_function.rb +26 -0
  42. data/lib/solr/query/request/boosting/scale_function_boost.rb +28 -0
  43. data/lib/solr/query/request/boosting/textual_field_value_match_boost_function.rb +13 -0
  44. data/lib/solr/query/request/boosting.rb +46 -0
  45. data/lib/solr/query/request/edismax_adapter.rb +163 -0
  46. data/lib/solr/query/request/facet.rb +68 -0
  47. data/lib/solr/query/request/field_with_boost.rb +18 -0
  48. data/lib/solr/query/request/filter.rb +73 -0
  49. data/lib/solr/query/request/geo_filter.rb +26 -0
  50. data/lib/solr/query/request/grouping.rb +37 -0
  51. data/lib/solr/query/request/or_filter.rb +16 -0
  52. data/lib/solr/query/request/runner.rb +46 -0
  53. data/lib/solr/query/request/sorting/field.rb +16 -0
  54. data/lib/solr/query/request/sorting.rb +34 -0
  55. data/lib/solr/query/request/spellcheck.rb +74 -0
  56. data/lib/solr/query/request.rb +49 -0
  57. data/lib/solr/query/response/facet_value.rb +16 -0
  58. data/lib/solr/query/response/field_facets.rb +25 -0
  59. data/lib/solr/query/response/parser.rb +154 -0
  60. data/lib/solr/query/response/spellcheck.rb +42 -0
  61. data/lib/solr/query/response.rb +48 -0
  62. data/lib/solr/response/header.rb +25 -0
  63. data/lib/solr/response/http_status.rb +27 -0
  64. data/lib/solr/response/parser.rb +47 -0
  65. data/lib/solr/response/solr_error.rb +31 -0
  66. data/lib/solr/response.rb +52 -0
  67. data/lib/solr/support/connection_helper.rb +12 -0
  68. data/lib/solr/support/hash_extensions.rb +29 -0
  69. data/lib/solr/support/schema_helper.rb +11 -0
  70. data/lib/solr/support/string_extensions.rb +12 -0
  71. data/lib/solr/support/url_helper.rb +12 -0
  72. data/lib/solr/support.rb +5 -0
  73. data/lib/solr/testing.rb +19 -0
  74. data/lib/solr/version.rb +3 -0
  75. data/lib/solr.rb +65 -0
  76. data/solrb.gemspec +36 -0
  77. metadata +261 -0
@@ -0,0 +1,13 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class Boosting
5
+ class TextualFieldValueMatchBoostFunction < FieldValueMatchBoostFunction
6
+ def to_solr_s
7
+ "if(termfreq(#{solr_field},'#{value}'),#{boost_magnitude},1)"
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ require 'solr/query/request/boosting/scale_function_boost'
2
+ require 'solr/query/request/boosting/geodist_function'
3
+ require 'solr/query/request/boosting/recent_field_value_boost_function'
4
+ require 'solr/query/request/boosting/ranking_field_boost_function'
5
+ require 'solr/query/request/boosting/field_value_match_boost_function'
6
+ require 'solr/query/request/boosting/numeric_field_value_match_boost_function'
7
+ require 'solr/query/request/boosting/textual_field_value_match_boost_function'
8
+ require 'solr/query/request/boosting/dictionary_boost_function'
9
+ require 'solr/query/request/boosting/exists_boost_function'
10
+ require 'solr/query/request/boosting/field_value_less_than_boost_function'
11
+ require 'solr/query/request/boosting/ln_function_boost'
12
+ require 'solr/query/request/boosting/phrase_proximity_boost'
13
+
14
+ module Solr
15
+ module Query
16
+ class Request
17
+ class Boosting
18
+ class << self
19
+ def empty
20
+ @empty ||= new
21
+ end
22
+ end
23
+
24
+ attr_reader :additive_boost_functions, :multiplicative_boost_functions, :phrase_boosts, :spatial_boost
25
+
26
+ def initialize(additive_boost_functions: [], multiplicative_boost_functions: [], phrase_boosts: [])
27
+ @additive_boost_functions = additive_boost_functions
28
+ @multiplicative_boost_functions = multiplicative_boost_functions
29
+ @phrase_boosts = phrase_boosts
30
+ @spatial_boost = find_spatial_boost
31
+ freeze
32
+ end
33
+
34
+ def empty?
35
+ [multiplicative_boost_functions, additive_boost_functions, phrase_boosts].all(&:empty?)
36
+ end
37
+
38
+ private
39
+
40
+ def find_spatial_boost
41
+ multiplicative_boost_functions.find { |mbf| mbf.is_a? ::Solr::Query::Request::Boosting::GeodistFunction }
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,163 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class EdismaxAdapter
5
+ SOLR_INFINITY = '*'.freeze # for cases like [100000 TO *]
6
+ include Solr::Support::SchemaHelper
7
+
8
+ EDISMAX_QUERY_FIELDS = :qf
9
+ EDISMAX_FILTER_QUERY = :fq
10
+ EDISMAX_ADDITIVE_BOOST_FUNCTION = :bf
11
+ EDISMAX_MULTIPLICATIVE_BOOST_FUNCTION = :boost
12
+ EDISMAX_PHRASE_BOOST = :pf
13
+ EDISMAX_PHRASE_SLOP = :ps
14
+ RESPONSE_FIELDS = :fl
15
+ RERANK_QUERY = :rq
16
+ QUERY_OPERATOR = :'q.op'
17
+
18
+ attr_reader :request
19
+
20
+ def initialize(request)
21
+ @request = request
22
+ end
23
+
24
+ def to_h
25
+ solr_params = { q: request.search_term, defType: :edismax }
26
+ solr_params = add_query_fields(solr_params)
27
+ solr_params = add_response_fields(solr_params)
28
+ solr_params = add_filters(solr_params)
29
+ solr_params = add_facets(solr_params)
30
+ solr_params = add_boosting(solr_params)
31
+ solr_params = add_grouping(solr_params)
32
+ solr_params = add_sorting(solr_params)
33
+ solr_params = add_debug(solr_params)
34
+ solr_params = add_spellcheck(solr_params)
35
+ solr_params = add_rerank_query(solr_params)
36
+ solr_params = add_phrase_slop(solr_params)
37
+ solr_params = add_query_operator(solr_params)
38
+ solr_params
39
+ end
40
+
41
+ private
42
+
43
+ def add_query_fields(solr_params)
44
+ fields = request.fields.map(&:to_solr_s)
45
+ solr_params.merge(EDISMAX_QUERY_FIELDS => fields)
46
+ end
47
+
48
+ def add_filters(solr_params)
49
+ filters = request.filters.map(&:to_solr_s)
50
+ solr_params.merge(EDISMAX_FILTER_QUERY => filters)
51
+ end
52
+
53
+ def add_facets(solr_params)
54
+ return solr_params if Array(request.facets).empty?
55
+
56
+ solr_params['json.facet'] = request.facets.map(&:to_solr_h).reduce(&:merge).to_json
57
+
58
+ solr_params
59
+ end
60
+
61
+ def add_boosting(solr_params)
62
+ return solr_params unless request.boosting
63
+ solr_params = add_additive_boost_functions(solr_params)
64
+ solr_params = add_multiplicative_boost_functions(solr_params)
65
+ add_phrase_boosts(solr_params)
66
+ end
67
+
68
+ def add_additive_boost_functions(solr_params)
69
+ additive_boosts = request.boosting.additive_boost_functions.map(&:to_solr_s)
70
+ if additive_boosts.any?
71
+ solr_params.merge(EDISMAX_ADDITIVE_BOOST_FUNCTION => additive_boosts)
72
+ else
73
+ solr_params
74
+ end
75
+ end
76
+
77
+ def add_multiplicative_boost_functions(solr_params)
78
+ multiplicative_boosts = request.boosting.multiplicative_boost_functions.map(&:to_solr_s)
79
+ if multiplicative_boosts.any?
80
+ solr_params = solr_params.merge(EDISMAX_MULTIPLICATIVE_BOOST_FUNCTION => multiplicative_boosts)
81
+ # https://stackoverflow.com/questions/47025453/
82
+ maybe_add_spatial_fields(solr_params, request.boosting.spatial_boost)
83
+ else
84
+ solr_params
85
+ end
86
+ end
87
+
88
+ def add_phrase_boosts(solr_params)
89
+ solr_phrase_boosts = request.boosting.phrase_boosts.map(&:to_solr_s)
90
+ if solr_phrase_boosts.any?
91
+ solr_params.merge(EDISMAX_PHRASE_BOOST => solr_phrase_boosts)
92
+ else
93
+ solr_params
94
+ end
95
+ end
96
+
97
+ def maybe_add_spatial_fields(solr_params, geodist_function)
98
+ if geodist_function
99
+ solr_params.merge(pt: geodist_function.latlng, sfield: geodist_function.sfield)
100
+ else
101
+ solr_params
102
+ end
103
+ end
104
+
105
+ def add_grouping(solr_params)
106
+ return solr_params if request.grouping.empty?
107
+ group_info = {
108
+ 'group' => true,
109
+ 'group.format' => 'grouped',
110
+ 'group.limit' => request.grouping.limit,
111
+ 'group.field' => solarize_field(request.grouping.field)
112
+ }
113
+ solr_params.merge(group_info)
114
+ end
115
+
116
+ def add_sorting(solr_params)
117
+ return solr_params if request.sorting.empty?
118
+ # sorting nulls last, not-nulls first
119
+ solr_sorting = request.sorting.fields.map do |sort_field|
120
+ solr_field = solarize_field(sort_field.name)
121
+ "exists(#{solr_field}) desc, #{solr_field} #{sort_field.direction}"
122
+ end
123
+ solr_params.merge(sort: solr_sorting)
124
+ end
125
+
126
+ def add_response_fields(solr_params)
127
+ response_fields = 'id'
128
+ response_fields += ',score' if debug_mode?
129
+ response_fields += request.response_fields if request.response_fields
130
+ solr_params.merge(RESPONSE_FIELDS => response_fields)
131
+ end
132
+
133
+ def add_debug(solr_params)
134
+ solr_params.merge(debug: debug_mode?)
135
+ end
136
+
137
+ def debug_mode?
138
+ request.debug_mode
139
+ end
140
+
141
+ def add_spellcheck(solr_params)
142
+ solr_params.merge(request.spellcheck.to_h)
143
+ end
144
+
145
+ def add_rerank_query(solr_params)
146
+ return solr_params unless request.limit_docs_by_field
147
+ rerank_query = request.limit_docs_by_field.to_solr_s
148
+ solr_params.merge(RERANK_QUERY => rerank_query)
149
+ end
150
+
151
+ def add_phrase_slop(solr_params)
152
+ return solr_params unless request.phrase_slop
153
+ solr_params.merge(EDISMAX_PHRASE_SLOP => request.phrase_slop)
154
+ end
155
+
156
+ def add_query_operator(solr_params)
157
+ return solr_params unless request.query_operator
158
+ solr_params.merge(QUERY_OPERATOR => request.query_operator)
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,68 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class Facet
5
+ include Solr::Support::SchemaHelper
6
+
7
+ TERMS_TYPE = :terms
8
+ QUERY_TYPE = :query
9
+ RANGE_TYPE = :range
10
+
11
+ attr_reader :field,
12
+ :type,
13
+ :name,
14
+ :value,
15
+ :limit,
16
+ :filters,
17
+ :subfacets,
18
+ :gap,
19
+ :lower_bound,
20
+ :upper_bound
21
+
22
+ def initialize(field:, type:, name: nil, value: nil, filters: [], subfacets: [], options: {})
23
+ if options[:limit].nil? && type == TERMS_TYPE
24
+ raise ArgumentError, "Need to specify :limit option value for 'terms' facet type"
25
+ end
26
+
27
+ if options.values_at(:gap, :lower_bound, :upper_bound).any?(&:nil?) && type == RANGE_TYPE
28
+ raise ArgumentError, "Need to specify :lower_bound, :upper_bound, :gap option values for 'range' facet type"
29
+ end
30
+
31
+ @field = field
32
+ @name = name || field
33
+ @type = type
34
+ @value = value
35
+ @filters = filters
36
+ @subfacets = subfacets
37
+ @limit = options[:limit].to_i
38
+ @gap = options[:gap]
39
+ @lower_bound = options[:lower_bound]
40
+ @upper_bound = options[:upper_bound]
41
+ end
42
+
43
+ def to_solr_h
44
+ return { name.to_s => value } if type == QUERY_TYPE && value
45
+
46
+ default_solr_h
47
+ end
48
+
49
+ protected
50
+
51
+ def default_solr_h
52
+ {
53
+ "#{name}": {
54
+ type: type,
55
+ field: solarize_field(field),
56
+ limit: limit,
57
+ q: filters.any? ? filters.map(&:to_solr_s).join(' AND ') : nil,
58
+ facet: subfacets.map(&:to_solr_h).reduce(&:merge),
59
+ gap: gap,
60
+ start: lower_bound,
61
+ end: upper_bound
62
+ }.compact
63
+ }
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,18 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class FieldWithBoost
5
+ attr_reader :field, :boost_magnitude
6
+
7
+ def initialize(field:, boost_magnitude: Solr::Query::Request::BoostMagnitude::DEFAULT)
8
+ @field = field
9
+ @boost_magnitude = boost_magnitude
10
+ end
11
+
12
+ def to_solr_s
13
+ "#{field}^#{boost_magnitude}"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,73 @@
1
+ require 'date'
2
+
3
+ module Solr
4
+ module Query
5
+ class Request
6
+ class Filter
7
+ include Solr::Support::SchemaHelper
8
+ using Solr::Support::StringExtensions
9
+
10
+ EQUAL_TYPE = :equal
11
+ NOT_EQUAL_TYPE = :not_equal
12
+ attr_reader :type, :field, :value
13
+
14
+ def initialize(type:, field:, value:)
15
+ @type = type
16
+ @field = field
17
+ @value = value
18
+ end
19
+
20
+ def to_solr_s
21
+ "#{solr_prefix}#{solr_field}:(#{solr_value})"
22
+ end
23
+
24
+ def solr_field
25
+ solarize_field(@field)
26
+ end
27
+
28
+ def solr_value
29
+ if value.is_a?(::Array)
30
+ value.map { |v| to_primitive_solr_value(v) }.join(' OR ')
31
+ elsif value.is_a?(::Range)
32
+ to_interval_solr_value(value)
33
+ else
34
+ to_primitive_solr_value(value)
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def solr_prefix
41
+ '-' if NOT_EQUAL_TYPE == @type
42
+ end
43
+
44
+ def to_interval_solr_value(range)
45
+ solr_min = to_primitive_solr_value(range.min)
46
+ solr_max = if date_infinity?(range.max) || range.max.to_f.infinite?
47
+ '*'
48
+ else
49
+ to_primitive_solr_value(range.max)
50
+ end
51
+ "[#{solr_min} TO #{solr_max}]"
52
+ end
53
+
54
+ def to_primitive_solr_value(value)
55
+ if date_or_time?(value)
56
+ value.strftime('%Y-%m-%dT%H:%M:%SZ')
57
+ else
58
+ %("#{value.to_s.solr_escape}")
59
+ end
60
+ end
61
+
62
+ def date_infinity?(value)
63
+ value.is_a?(DateTime::Infinity)
64
+ end
65
+
66
+ def date_or_time?(value)
67
+ return false unless value
68
+ value.is_a?(::Date) || value.is_a?(::Time)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,26 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class GeoFilter
5
+ SPATIAL_RADIUS = 161 # roughly 100mi
6
+
7
+ include Solr::Support::SchemaHelper
8
+
9
+ attr_reader :field, :latitude, :longitude, :spatial_radius
10
+
11
+ def initialize(field:, latitude:, longitude:, spatial_radius: SPATIAL_RADIUS)
12
+ @field = field
13
+ @latitude = latitude
14
+ @longitude = longitude
15
+ @spatial_radius = spatial_radius
16
+ freeze
17
+ end
18
+
19
+ def to_solr_s
20
+ solr_field = solarize_field(@field)
21
+ "{!geofilt sfield=#{solr_field} pt=#{@latitude},#{@longitude} d=#{spatial_radius}}"
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class Grouping
5
+ class None
6
+ def initialize
7
+ freeze
8
+ end
9
+
10
+ def empty?
11
+ true
12
+ end
13
+
14
+ def inspect
15
+ 'No Grouping'
16
+ end
17
+ end
18
+
19
+ attr_reader :field, :limit
20
+
21
+ def self.none
22
+ None.new
23
+ end
24
+
25
+ def initialize(field:, limit:)
26
+ @field = field
27
+ @limit = limit
28
+ freeze
29
+ end
30
+
31
+ def empty?
32
+ false
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,16 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class OrFilter
5
+ def initialize(*filters)
6
+ @filters = filters
7
+ end
8
+
9
+ def to_solr_s
10
+ subexpressions = @filters.map { |f| "#{f.solr_field}:(#{f.solr_value})" }
11
+ "(#{subexpressions.join(' OR ')})"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,46 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class Runner
5
+ PATH = '/select'.freeze
6
+
7
+ include Solr::Support::ConnectionHelper
8
+
9
+ attr_reader :page, :page_size, :solr_params
10
+
11
+ class << self
12
+ def run(opts)
13
+ new(opts).run
14
+ end
15
+ end
16
+
17
+ def initialize(page:, page_size:, solr_params: {})
18
+ @page = page
19
+ @page_size = page_size
20
+ @solr_params = solr_params
21
+ end
22
+
23
+ def run
24
+ raw_response = connection(PATH).post_as_json(request_params)
25
+ response = Solr::Response.from_raw_response(raw_response)
26
+ Solr.instrument(name: 'solrb.request_response_cycle',
27
+ data: { request: request_params, response: raw_response })
28
+ response
29
+ end
30
+
31
+ private
32
+
33
+ def start
34
+ start_page = @page.to_i - 1
35
+ start_page = start_page < 1 ? 0 : start_page
36
+ start_page * page_size
37
+ end
38
+
39
+ def request_params
40
+ # https://lucene.apache.org/solr/guide/7_1/json-request-api.html#passing-parameters-via-json
41
+ @request_params ||= { params: solr_params.merge(wt: :json, rows: page_size.to_i, start: start) }
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,16 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class Sorting
5
+ class Field
6
+ attr_reader :name, :direction
7
+ def initialize(name:, direction:)
8
+ @name = name
9
+ @direction = direction
10
+ freeze
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,34 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class Sorting
5
+ ASC = :asc
6
+ DESC = :desc
7
+ class None
8
+ def initialize
9
+ freeze
10
+ end
11
+
12
+ def empty?
13
+ true
14
+ end
15
+ end
16
+
17
+ attr_reader :fields
18
+
19
+ def self.none
20
+ None.new
21
+ end
22
+
23
+ def initialize(fields: [])
24
+ @fields = fields
25
+ freeze
26
+ end
27
+
28
+ def empty?
29
+ fields.empty?
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,74 @@
1
+ module Solr
2
+ module Query
3
+ class Request
4
+ class Spellcheck
5
+ class Disabled
6
+ attr_reader :previous_search_term, :collated_search_term
7
+
8
+ def initialize(previous_search_term: nil, collated_search_term: nil)
9
+ @previous_search_term = previous_search_term
10
+ @collated_search_term = collated_search_term
11
+ end
12
+
13
+ def to_h
14
+ {}
15
+ end
16
+
17
+ def collated?
18
+ collated_search_term.present?
19
+ end
20
+
21
+ def disabled?
22
+ true
23
+ end
24
+
25
+ def inspect
26
+ 'Disabled'
27
+ end
28
+ end
29
+
30
+ class Default
31
+ def to_h
32
+ {
33
+ spellcheck: true,
34
+ 'spellcheck.dictionary': 'spellcheck',
35
+ 'spellcheck.count': 1,
36
+ 'spellcheck.collate': true,
37
+ 'spellcheck.maxCollations': 1,
38
+ 'spellcheck.collateExtendedResults': true,
39
+ 'spellcheck.maxCollationTries': 1,
40
+ 'spellcheck.onlyMorePopular': true
41
+ }
42
+ end
43
+
44
+ def previous_search_term; end
45
+
46
+ def collated_search_term; end
47
+
48
+ def collated?
49
+ false
50
+ end
51
+
52
+ def disabled?
53
+ false
54
+ end
55
+ end
56
+
57
+ def self.collated(previous:, collated:)
58
+ Disabled.new(
59
+ previous_search_term: previous,
60
+ collated_search_term: collated
61
+ )
62
+ end
63
+
64
+ def self.disabled
65
+ Disabled.new
66
+ end
67
+
68
+ def self.default
69
+ Default.new
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,49 @@
1
+ require 'solr/query/request/facet'
2
+ require 'solr/query/request/filter'
3
+ require 'solr/query/request/boost_magnitude'
4
+ require 'solr/query/request/geo_filter'
5
+ require 'solr/query/request/sorting'
6
+ require 'solr/query/request/edismax_adapter'
7
+ require 'solr/query/request/grouping'
8
+ require 'solr/query/request/boosting'
9
+ require 'solr/query/request/spellcheck'
10
+ require 'solr/query/request/sorting/field'
11
+ require 'solr/query/request/field_with_boost'
12
+ require 'solr/query/request/or_filter'
13
+ require 'solr/query/request/runner'
14
+ require 'solr/query/response'
15
+ require 'solr/errors/solr_query_error'
16
+
17
+ module Solr
18
+ module Query
19
+ class Request
20
+ attr_reader :search_term
21
+ attr_accessor :filters, :fields, :facets, :boosting, :debug_mode, :spellcheck,
22
+ :limit_docs_by_field, :phrase_slop, :response_fields, :query_operator
23
+ attr_writer :grouping, :sorting
24
+
25
+ def initialize(search_term:, fields: [], filters: [])
26
+ @search_term = search_term
27
+ @fields = fields
28
+ @filters = filters
29
+ end
30
+
31
+ # Runs this Solr::Request against Solr and
32
+ # returns [Solr::Response]
33
+ def run(page: 1, page_size: 10)
34
+ solr_params = Solr::Query::Request::EdismaxAdapter.new(self).to_h
35
+ solr_response = Solr::Query::Request::Runner.run(page: page, page_size: page_size, solr_params: solr_params)
36
+ raise Errors::SolrQueryError, solr_response.error_message unless solr_response.ok?
37
+ Solr::Query::Response::Parser.new(request: self, solr_response: solr_response.body).to_response
38
+ end
39
+
40
+ def grouping
41
+ @grouping ||= Solr::Query::Request::Grouping.none
42
+ end
43
+
44
+ def sorting
45
+ @sorting ||= Solr::Query::Request::Sorting.none
46
+ end
47
+ end
48
+ end
49
+ end