ansr_blacklight 0.0.3
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.
- checksums.yaml +15 -0
- data/Gemfile +3 -0
- data/README.md +37 -0
- data/ansr_blacklight.gemspec +28 -0
- data/lib/ansr_blacklight.rb +57 -0
- data/lib/ansr_blacklight/arel.rb +6 -0
- data/lib/ansr_blacklight/arel/big_table.rb +57 -0
- data/lib/ansr_blacklight/arel/visitors.rb +6 -0
- data/lib/ansr_blacklight/arel/visitors/query_builder.rb +217 -0
- data/lib/ansr_blacklight/arel/visitors/to_no_sql.rb +14 -0
- data/lib/ansr_blacklight/base.rb +21 -0
- data/lib/ansr_blacklight/connection_adapters/no_sql_adapter.rb +38 -0
- data/lib/ansr_blacklight/model/querying.rb +29 -0
- data/lib/ansr_blacklight/relation.rb +50 -0
- data/lib/ansr_blacklight/relation/solr_projection_methods.rb +55 -0
- data/lib/ansr_blacklight/request_builders.rb +141 -0
- data/lib/ansr_blacklight/solr.rb +4 -0
- data/lib/ansr_blacklight/solr/request.rb +46 -0
- data/lib/ansr_blacklight/solr/response.rb +94 -0
- data/lib/ansr_blacklight/solr/response/group.rb +32 -0
- data/lib/ansr_blacklight/solr/response/group_response.rb +50 -0
- data/lib/ansr_blacklight/solr/response/more_like_this.rb +14 -0
- data/lib/ansr_blacklight/solr/response/pagination_methods.rb +35 -0
- data/lib/ansr_blacklight/solr/response/spelling.rb +92 -0
- data/spec/fixtures/config.yml +0 -0
- data/spec/lib/loaded_relation_spec.rb +223 -0
- data/spec/lib/queryable_relation_spec.rb +133 -0
- data/spec/lib/relation/faceting_spec.rb +475 -0
- data/spec/lib/relation/grouping_spec.rb +159 -0
- data/spec/spec_helper.rb +72 -0
- metadata +225 -0
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ansr::Blacklight::Relation do
|
4
|
+
|
5
|
+
class ConfiguredTable < Ansr::Arel::BigTable
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
class OtherTable < ConfiguredTable
|
10
|
+
def name
|
11
|
+
'outside'
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
context "a bunch of query stuff" do
|
17
|
+
|
18
|
+
before(:each) do
|
19
|
+
Object.const_set('QueryTestModel', Class.new(TestModel))
|
20
|
+
QueryTestModel.configure do |config|
|
21
|
+
config[:table_class] = ConfiguredTable
|
22
|
+
end
|
23
|
+
QueryTestModel.solr = stub_solr
|
24
|
+
other_table.configure_fields do |config|
|
25
|
+
hash = (config[:configured] ||= {})
|
26
|
+
hash[:local] = {:property => 'test', :escape => 'tes"t'}
|
27
|
+
end
|
28
|
+
@visitor = Ansr::Blacklight::Arel::Visitors::ToNoSql.new(QueryTestModel.table)
|
29
|
+
|
30
|
+
## COMMON AREL CONCEPTS ##
|
31
|
+
# from() indicates the big table name for the relation; in BL/Solr this maps to the request path
|
32
|
+
@relation = QueryTestModel.from(ConfiguredTable.new(QueryTestModel))
|
33
|
+
# as() indicates an alias for the big table; in BL/Solr this maps to the :qt param
|
34
|
+
@relation.as!('hey')
|
35
|
+
# constraints map directly
|
36
|
+
@relation.where!(:configured=> "what's")
|
37
|
+
|
38
|
+
# as do offsets and limits
|
39
|
+
@relation.offset!(21)
|
40
|
+
@relation.limit!(12)
|
41
|
+
@relation.group!("I")
|
42
|
+
## COMMON NO-SQL CONCEPTS ##
|
43
|
+
# facets are a kind of projection with attributes (attribute support is optional)
|
44
|
+
@relation.facet!("title_facet", limit: "vest")
|
45
|
+
# filters are a type of constraint
|
46
|
+
@relation.filter!({"name_facet" => "Fedo"})
|
47
|
+
@relation.facet!("name_facet", limit: 10)
|
48
|
+
@relation.facet!(limit: 20)
|
49
|
+
@relation.highlight!("I", 'fl' => "wish")
|
50
|
+
@relation.spellcheck!("a", q: "fleece")
|
51
|
+
## SOLR ECCENTRICITIES ##
|
52
|
+
# these are present for compatibility, but not expected to be used generically
|
53
|
+
@relation.wt!("going")
|
54
|
+
@relation.defType!("had")
|
55
|
+
end
|
56
|
+
|
57
|
+
after(:each) do
|
58
|
+
@relation = nil
|
59
|
+
Object.send(:remove_const, :QueryTestModel)
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:table) { QueryTestModel.table }
|
63
|
+
let(:other_table) { OtherTable.new(QueryTestModel) }
|
64
|
+
describe "#from" do
|
65
|
+
|
66
|
+
let(:visitor) { @visitor }
|
67
|
+
subject {@relation.from(other_table)}
|
68
|
+
|
69
|
+
it "should set the path to the table name" do
|
70
|
+
query = visitor.accept subject.build_arel.ast
|
71
|
+
expect(query.path).to eql('outside')
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should change the table" do
|
75
|
+
expect(subject.from_value.first).to be_a ConfiguredTable
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#as" do
|
80
|
+
|
81
|
+
subject {@relation.as('hey')}
|
82
|
+
let(:visitor) { @visitor }
|
83
|
+
|
84
|
+
it "should set the :qt parameter" do
|
85
|
+
query = visitor.accept subject.build_arel.ast
|
86
|
+
expect(query.to_hash[:qt]).to eql 'hey'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#facet" do
|
91
|
+
|
92
|
+
subject { @relation.facet(limit: 20)}
|
93
|
+
let(:visitor) { @visitor }
|
94
|
+
|
95
|
+
it "should set default facet parms when no field expr is given" do
|
96
|
+
rel = subject.facet(limit: 20)
|
97
|
+
query = visitor.accept rel.build_arel.ast
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should set facet field params" do
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "a mix of queryable relations" do
|
105
|
+
subject { @relation.from(other_table) }
|
106
|
+
let(:visitor) { @visitor }
|
107
|
+
|
108
|
+
it "should accept valid parameters" do
|
109
|
+
config = Blacklight::Configuration.new
|
110
|
+
query = visitor.accept subject.build_arel.ast
|
111
|
+
expect(query.path).to eq('outside')
|
112
|
+
expect(query.to_hash).to eq({"defType" => "had",
|
113
|
+
"f.name_facet.facet.limit" => "10",
|
114
|
+
"f.title_facet.facet.limit" => "vest",
|
115
|
+
"facet" => true,
|
116
|
+
"facet.field" => [:title_facet,:name_facet],
|
117
|
+
"facet.limit" => "20",
|
118
|
+
"fq" => ["{!raw f=name_facet}Fedo"],
|
119
|
+
"group" => "I",
|
120
|
+
"hl" => "I",
|
121
|
+
"hl.fl" => "wish",
|
122
|
+
"q" => "{!property=test escape='tes\\\"t'}what's",
|
123
|
+
"qt" => "hey",
|
124
|
+
"rows" => "13",
|
125
|
+
"spellcheck" => "a",
|
126
|
+
"spellcheck.q" => "fleece",
|
127
|
+
"start" => "21",
|
128
|
+
"wt" => "going"
|
129
|
+
})
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,475 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
# check the methods that do solr requests. Note that we are not testing if
|
5
|
+
# solr gives "correct" responses, as that's out of scope (it's a part of
|
6
|
+
# testing the solr code itself). We *are* testing if blacklight code sends
|
7
|
+
# queries to solr such that it gets appropriate results. When a user does a search,
|
8
|
+
# do we get data back from solr (i.e. did we properly configure blacklight code
|
9
|
+
# to talk with solr and get results)? when we do a document request, does
|
10
|
+
# blacklight code get a single document returned?)
|
11
|
+
#
|
12
|
+
describe Ansr::Blacklight do
|
13
|
+
|
14
|
+
class TestTable < Ansr::Arel::BigTable
|
15
|
+
def name
|
16
|
+
'outside'
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](val)
|
20
|
+
key = (Arel::Attributes::Attribute === val) ? val.name.to_sym : val.to_sym
|
21
|
+
key == :configured ? Ansr::Arel::ConfiguredField.new(key, {:property => 'test', :escape => 'tes"t'}) : super(val)
|
22
|
+
end
|
23
|
+
|
24
|
+
def fields
|
25
|
+
[:id]
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
before do
|
31
|
+
Object.const_set('FacetModel', Class.new(TestModel))
|
32
|
+
FacetModel.solr = stub_solr
|
33
|
+
FacetModel.configure do |config|
|
34
|
+
config[:table_class] = TestTable
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
after do
|
39
|
+
Object.send(:remove_const, :FacetModel)
|
40
|
+
end
|
41
|
+
|
42
|
+
subject {
|
43
|
+
Ansr::Blacklight::Arel::Visitors::ToNoSql.new(TestTable.new(FacetModel)).query_builder
|
44
|
+
}
|
45
|
+
|
46
|
+
let(:blacklight_solr) { subject.solr }
|
47
|
+
let(:copy_of_catalog_config) { ::CatalogController.blacklight_config.deep_copy }
|
48
|
+
let(:blacklight_config) { copy_of_catalog_config }
|
49
|
+
|
50
|
+
before(:each) do
|
51
|
+
@all_docs_query = ''
|
52
|
+
@no_docs_query = 'zzzzzzzzzzzz'
|
53
|
+
@single_word_query = 'include'
|
54
|
+
@mult_word_query = 'tibetan history'
|
55
|
+
# f[format][]=Book&f[language_facet][]=English
|
56
|
+
@single_facet = {:format=>'Book'}
|
57
|
+
@multi_facets = {:format=>'Book', :language_facet=>'Tibetan'}
|
58
|
+
@bad_facet = {:format=>'666'}
|
59
|
+
@subject_search_params = {:commit=>"search", :search_field=>"subject", :action=>"index", :"controller"=>"catalog", :"rows"=>"10", :"q"=>"wome"}
|
60
|
+
@abc_resp = {'response' =>{ 'docs' => [id: 'abc']}}.to_json
|
61
|
+
@no_docs_resp = {'response' =>{'docs' => []}}.to_json
|
62
|
+
end
|
63
|
+
|
64
|
+
def subject_search_params(rel)
|
65
|
+
rel.limit(10).where!(q: 'wome')
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "http_method configuration", :integration => true do
|
69
|
+
subject { FacetModel }
|
70
|
+
|
71
|
+
it "should send a post request to solr and get a response back" do
|
72
|
+
rel = subject.where(:q => @all_docs_query)
|
73
|
+
subject.solr= stub_solr(JSON.parse(@abc_resp).inspect)
|
74
|
+
expect(rel.length).to be >= 1
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# SPECS for actual search parameter generation
|
79
|
+
describe "solr_search_params" do
|
80
|
+
|
81
|
+
subject { FacetModel }
|
82
|
+
|
83
|
+
it "allows customization of solr_search_params_logic" do
|
84
|
+
# Normally you'd include a new module into (eg) your CatalogController
|
85
|
+
# but a sub-class defininig it directly is simpler for test.
|
86
|
+
subject.stub(:add_foo_to_solr_params) do |rel|
|
87
|
+
rel.wt!("TESTING")
|
88
|
+
end
|
89
|
+
|
90
|
+
subject.solr_search_params_logic += [:add_foo_to_solr_params]
|
91
|
+
|
92
|
+
expect(subject.build_default_scope.wt_value).to eql("TESTING")
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "for an empty string search" do
|
96
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(FacetModel.table) }
|
97
|
+
it "should return empty string q in solr parameters" do
|
98
|
+
rel = TestModel.where(q: "")
|
99
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
100
|
+
expect(solr_params[:q]).to eq ""
|
101
|
+
expect(solr_params["spellcheck.q"]).to eq ""
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "for request params also passed in as argument" do
|
106
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(FacetModel.table) }
|
107
|
+
it "should only have one value for the key 'q' regardless if a symbol or string" do
|
108
|
+
rel = FacetModel.where(q: "some query").where('q' => 'another value')
|
109
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
110
|
+
expect(solr_params[:q]).to eq 'another value'
|
111
|
+
expect(solr_params['q']).to eq 'another value'
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
describe "for one facet, no query" do
|
117
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(FacetModel.table) }
|
118
|
+
it "should have proper solr parameters" do
|
119
|
+
rel = FacetModel.filter(@single_facet)
|
120
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
121
|
+
|
122
|
+
expect(solr_params[:q]).to be_blank
|
123
|
+
expect(solr_params["spellcheck.q"]).to be_blank
|
124
|
+
|
125
|
+
@single_facet.each_value do |value|
|
126
|
+
expect(solr_params[:fq]).to include("{!raw f=#{@single_facet.keys[0]}}#{value}")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "with Multi Facets, No Query" do
|
132
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(FacetModel.table) }
|
133
|
+
it 'should have fq set properly' do
|
134
|
+
rel = FacetModel.filter(@multi_facets)
|
135
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
136
|
+
|
137
|
+
@multi_facets.each_pair do |facet_field, value_list|
|
138
|
+
value_list ||= []
|
139
|
+
value_list = [value_list] unless value_list.respond_to? :each
|
140
|
+
value_list.each do |value|
|
141
|
+
expect(solr_params[:fq]).to include("{!raw f=#{facet_field}}#{value}" )
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "with Multi Facets, Multi Word Query" do
|
149
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(FacetModel.table) }
|
150
|
+
it 'should have fq and q set properly' do
|
151
|
+
rel = FacetModel.filter(@multi_facets).where(q: @mult_word_query)
|
152
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
153
|
+
|
154
|
+
@multi_facets.each_pair do |facet_field, value_list|
|
155
|
+
value_list ||= []
|
156
|
+
value_list = [value_list] unless value_list.respond_to? :each
|
157
|
+
value_list.each do |value|
|
158
|
+
expect(solr_params[:fq]).to include("{!raw f=#{facet_field}}#{value}" )
|
159
|
+
end
|
160
|
+
end
|
161
|
+
expect(solr_params[:q]).to eq @mult_word_query
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "facet_value_to_fq_string" do
|
166
|
+
let(:table) { FacetModel.table }
|
167
|
+
subject { Ansr::Blacklight::Arel::Visitors::QueryBuilder.new(table) }
|
168
|
+
it "should use the raw handler for strings" do
|
169
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", "my value")).to eq "{!raw f=facet_name}my value"
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should pass booleans through" do
|
173
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", true)).to eq "facet_name:true"
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should pass boolean-like strings through" do
|
177
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", "true")).to eq "facet_name:true"
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should pass integers through" do
|
181
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", 1)).to eq "facet_name:1"
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should pass integer-like strings through" do
|
185
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", "1")).to eq "facet_name:1"
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should pass floats through" do
|
189
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", 1.11)).to eq "facet_name:1.11"
|
190
|
+
end
|
191
|
+
|
192
|
+
it "should pass floats through" do
|
193
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", "1.11")).to eq "facet_name:1.11"
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should pass date-type fields through" do
|
197
|
+
table.configure_fields do |config|
|
198
|
+
config[:facet_name] = {date: true}
|
199
|
+
end
|
200
|
+
|
201
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", "2012-01-01")).to eq "facet_name:2012-01-01"
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should handle range requests" do
|
205
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", 1..5)).to eq "facet_name:[1 TO 5]"
|
206
|
+
end
|
207
|
+
|
208
|
+
it "should add tag local parameters" do
|
209
|
+
table.configure_fields do |config|
|
210
|
+
config[:facet_name] = {local: {tag: 'asdf'}}
|
211
|
+
end
|
212
|
+
|
213
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", true)).to eq "{!tag=asdf}facet_name:true"
|
214
|
+
expect(subject.send(:filter_value_to_fq_string, "facet_name", "my value")).to eq "{!raw f=facet_name tag=asdf}my value"
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe "solr parameters for a field search from config (subject)" do
|
219
|
+
let(:table) { FacetModel.table }
|
220
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(table) }
|
221
|
+
let(:rel) { FacetModel.build_default_scope.spawn }
|
222
|
+
let(:blacklight_config) { copy_of_catalog_config }
|
223
|
+
before do
|
224
|
+
#@subject_search_params = {:commit=>"search", :search_field=>"subject", :action=>"index", :"controller"=>"catalog", :"rows"=>"10", :"q"=>"wome"}
|
225
|
+
table.configure_fields do |config|
|
226
|
+
hash = (config[:subject] ||= {local: {}, query: {}})
|
227
|
+
hash[:query][:'spellcheck.dictionary'] = 'subject'
|
228
|
+
hash[:query][:qt] = 'search'
|
229
|
+
hash[:local][:pf] = '$subject_pf'
|
230
|
+
hash[:local][:qf] = '$subject_qf'
|
231
|
+
end
|
232
|
+
rel.where!(subject: 'wome')
|
233
|
+
end
|
234
|
+
after do
|
235
|
+
table.configure_fields { |config| config.clear }
|
236
|
+
end
|
237
|
+
it "should look up qt from field definition" do
|
238
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
239
|
+
expect(solr_params[:qt]).to eq "search"
|
240
|
+
end
|
241
|
+
it "should not include weird keys not in field definition" do
|
242
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
243
|
+
solr_params.to_hash.tap do |h|
|
244
|
+
expect(h[:phrase_filters]).to be_nil
|
245
|
+
expect(h[:fq]).to be_nil
|
246
|
+
expect(h[:commit]).to be_nil
|
247
|
+
expect(h[:action]).to be_nil
|
248
|
+
expect(h[:controller]).to be_nil
|
249
|
+
end
|
250
|
+
end
|
251
|
+
it "should include proper 'q', possibly with LocalParams" do
|
252
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
253
|
+
expect(solr_params[:q]).to match(/(\{[^}]+\})?wome/)
|
254
|
+
end
|
255
|
+
it "should include proper 'q' when LocalParams are used" do
|
256
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
257
|
+
if solr_params[:q] =~ /\{[^}]+\}/
|
258
|
+
expect(solr_params[:q]).to match(/\{[^}]+\}wome/)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
it "should include spellcheck.q, without LocalParams" do
|
262
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
263
|
+
expect(solr_params["spellcheck.q"]).to eq "wome"
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should include spellcheck.dictionary from field def solr_parameters" do
|
267
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
268
|
+
expect(solr_params[:"spellcheck.dictionary"]).to eq "subject"
|
269
|
+
end
|
270
|
+
it "should add on :solr_local_parameters using Solr LocalParams style" do
|
271
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
272
|
+
|
273
|
+
#q == "{!pf=$subject_pf $qf=subject_qf} wome", make sure
|
274
|
+
#the LocalParams are really there
|
275
|
+
solr_params[:q] =~ /^\{!([^}]+)\}/
|
276
|
+
key_value_pairs = $1.split(" ")
|
277
|
+
expect(key_value_pairs).to include("pf=$subject_pf")
|
278
|
+
expect(key_value_pairs).to include("qf=$subject_qf")
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
describe "overriding of qt parameter" do
|
283
|
+
let(:table) { FacetModel.table }
|
284
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(table) }
|
285
|
+
let(:rel) { FacetModel.build_default_scope.as('overriden') }
|
286
|
+
let(:blacklight_config) { copy_of_catalog_config }
|
287
|
+
it "should return the correct overriden parameter" do
|
288
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
289
|
+
expect(solr_params[:qt]).to eq "overriden"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
describe "converts a String fq into an Array" do
|
294
|
+
let(:table) { FacetModel.table }
|
295
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(table) }
|
296
|
+
let(:rel) { FacetModel.build_default_scope }
|
297
|
+
it "should return the correct overriden parameter" do
|
298
|
+
solr_params = subject.accept(rel.facet('a string').build_arel.ast)
|
299
|
+
expect(solr_params[:fq]).to be_a_kind_of Array
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
describe "#add_solr_fields_to_query" do
|
304
|
+
let(:table) { FacetModel.table }
|
305
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(table) }
|
306
|
+
let(:rel) { FacetModel.build_default_scope}
|
307
|
+
before do
|
308
|
+
FacetModel.table.configure_fields do |config|
|
309
|
+
config[:an_index_field] = {select: { 'hl.alternativeField' => 'field_x'}}
|
310
|
+
config[:a_show_field] = {select: { 'hl.alternativeField' => 'field_y'}}
|
311
|
+
end
|
312
|
+
end
|
313
|
+
after do
|
314
|
+
FacetModel.table.configure_fields.clear
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should add any extra solr parameters from index and show fields" do
|
318
|
+
solr_params = subject.accept(rel.select(:an_index_field, :a_show_field).build_arel.ast)
|
319
|
+
expect(solr_params[:'f.an_index_field.hl.alternativeField']).to eq "field_x"
|
320
|
+
expect(solr_params[:'f.a_show_field.hl.alternativeField']).to eq "field_y"
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
describe "#add_facetting_to_solr" do
|
325
|
+
|
326
|
+
let(:table) { FacetModel.table }
|
327
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(table) }
|
328
|
+
let(:rel) {
|
329
|
+
FacetModel.build_default_scope.spawn
|
330
|
+
.facet('test_field', :sort => 'count')
|
331
|
+
.facet('some-query', :query => {'x' => {:fq => 'some:query'}} , :ex => 'xyz')
|
332
|
+
.facet('some-pivot', :pivot => ['a','b'], :ex => 'xyz')
|
333
|
+
.facet('some-field', mincount: 15 )
|
334
|
+
}
|
335
|
+
|
336
|
+
it "should add sort parameters" do
|
337
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
338
|
+
expect(solr_params[:facet]).to be_true
|
339
|
+
|
340
|
+
expect(solr_params[:'facet.field']).to include(:'test_field')
|
341
|
+
expect(solr_params[:'f.test_field.facet.sort']).to eq 'count'
|
342
|
+
end
|
343
|
+
|
344
|
+
it "should add facet exclusions" do
|
345
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
346
|
+
expect(solr_params[:'facet.query']).to include('{!ex=xyz}some:query')
|
347
|
+
expect(solr_params[:'facet.pivot']).to include('{!ex=xyz}a,b')
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should add any additional solr_params" do
|
351
|
+
solr_params = subject.accept(rel.build_arel.ast)
|
352
|
+
expect(solr_params[:'f.some-field.facet.mincount']).to eq '15'
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
describe "for :solr_local_parameters config" do
|
357
|
+
let(:table) { FacetModel.table }
|
358
|
+
subject { Ansr::Blacklight::Arel::Visitors::ToNoSql.new(table) }
|
359
|
+
let(:rel) { FacetModel.build_default_scope.spawn }
|
360
|
+
let(:result) { subject.accept rel.where(:custom_author_key => "query").build_arel.ast }
|
361
|
+
before do
|
362
|
+
#@subject_search_params = {:commit=>"search", :search_field=>"subject", :action=>"index", :"controller"=>"catalog", :"rows"=>"10", :"q"=>"wome"}
|
363
|
+
table.configure_fields do |config|
|
364
|
+
hash = (config[:custom_author_key] ||= {local: {}, query: {}, select: {}})
|
365
|
+
hash[:query][:'spellcheck.dictionary'] = 'subject'
|
366
|
+
hash[:query][:qt] = 'author_qt'
|
367
|
+
hash[:query][:qf] = 'someField^1000'
|
368
|
+
hash[:query][:ps] = '2'
|
369
|
+
hash[:local][:pf] = "you'll have \" to escape this"
|
370
|
+
hash[:local][:pf2] = '$pf2_do_not_escape_or_quote'
|
371
|
+
hash[:local][:qf] = '$author_qf'
|
372
|
+
end
|
373
|
+
rel.where!(subject: 'wome')
|
374
|
+
end
|
375
|
+
after do
|
376
|
+
table.configure_fields { |config| config.clear }
|
377
|
+
end
|
378
|
+
|
379
|
+
it "should pass through ordinary params" do
|
380
|
+
expect(result[:qt]).to eq "author_qt"
|
381
|
+
expect(result[:ps]).to eq "2"
|
382
|
+
expect(result[:qf]).to eq "someField^1000"
|
383
|
+
end
|
384
|
+
|
385
|
+
it "should include include local params with escaping" do
|
386
|
+
expect(result[:q]).to include('qf=$author_qf')
|
387
|
+
expect(result[:q]).to include('pf=\'you\\\'ll have \\" to escape this\'')
|
388
|
+
expect(result[:q]).to include('pf2=$pf2_do_not_escape_or_quote')
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
describe "solr_facet_params" do
|
394
|
+
before do
|
395
|
+
@facet_field = 'format'
|
396
|
+
@generated_solr_facet_params = subject.solr_facet_params(@facet_field)
|
397
|
+
|
398
|
+
@sort_key = Blacklight::Solr::FacetPaginator.request_keys[:sort]
|
399
|
+
@page_key = Blacklight::Solr::FacetPaginator.request_keys[:page]
|
400
|
+
end
|
401
|
+
|
402
|
+
let(:blacklight_config) do
|
403
|
+
Blacklight::Configuration.new do |config|
|
404
|
+
config.add_facet_fields_to_solr_request!
|
405
|
+
config.add_facet_field 'format'
|
406
|
+
config.add_facet_field 'format_ordered', :sort => :count
|
407
|
+
config.add_facet_field 'format_limited', :limit => 5
|
408
|
+
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
pending 'sets rows to 0' do
|
413
|
+
expect(@generated_solr_facet_params[:rows]).to eq 0
|
414
|
+
end
|
415
|
+
pending 'sets facets requested to facet_field argument' do
|
416
|
+
expect(@generated_solr_facet_params["facet.field".to_sym]).to eq @facet_field
|
417
|
+
end
|
418
|
+
pending 'defaults offset to 0' do
|
419
|
+
expect(@generated_solr_facet_params[:"f.#{@facet_field}.facet.offset"]).to eq 0
|
420
|
+
end
|
421
|
+
pending 'uses offset manually set, and converts it to an integer' do
|
422
|
+
solr_params = subject.solr_facet_params(@facet_field, @page_key => 2)
|
423
|
+
expect(solr_params[:"f.#{@facet_field}.facet.offset"]).to eq 20
|
424
|
+
end
|
425
|
+
pending 'defaults limit to 20' do
|
426
|
+
solr_params = subject.solr_facet_params(@facet_field)
|
427
|
+
expect(solr_params[:"f.#{@facet_field}.facet.limit"]).to eq 21
|
428
|
+
end
|
429
|
+
|
430
|
+
describe 'if facet_list_limit is defined in controller' do
|
431
|
+
before do
|
432
|
+
subject.stub facet_list_limit: 1000
|
433
|
+
end
|
434
|
+
pending 'uses controller method for limit' do
|
435
|
+
solr_params = subject.solr_facet_params(@facet_field)
|
436
|
+
expect(solr_params[:"f.#{@facet_field}.facet.limit"]).to eq 1001
|
437
|
+
end
|
438
|
+
|
439
|
+
pending 'uses controller method for limit when a ordinary limit is set' do
|
440
|
+
solr_params = subject.solr_facet_params(@facet_field)
|
441
|
+
expect(solr_params[:"f.#{@facet_field}.facet.limit"]).to eq 1001
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
445
|
+
pending 'uses the default sort' do
|
446
|
+
solr_params = subject.solr_facet_params(@facet_field)
|
447
|
+
expect(solr_params[:"f.#{@facet_field}.facet.sort"]).to be_blank
|
448
|
+
end
|
449
|
+
|
450
|
+
pending "uses the field-specific sort" do
|
451
|
+
solr_params = subject.solr_facet_params('format_ordered')
|
452
|
+
expect(solr_params[:"f.format_ordered.facet.sort"]).to eq :count
|
453
|
+
end
|
454
|
+
|
455
|
+
pending 'uses sort provided in the parameters' do
|
456
|
+
solr_params = subject.solr_facet_params(@facet_field, @sort_key => "index")
|
457
|
+
expect(solr_params[:"f.#{@facet_field}.facet.sort"]).to eq 'index'
|
458
|
+
end
|
459
|
+
pending "comes up with the same params as #solr_search_params to constrain context for facet list" do
|
460
|
+
search_params = {:q => 'tibetan history', :f=> {:format=>'Book', :language_facet=>'Tibetan'}}
|
461
|
+
solr_search_params = subject.solr_search_params( search_params )
|
462
|
+
solr_facet_params = subject.solr_facet_params('format', search_params)
|
463
|
+
|
464
|
+
solr_search_params.each_pair do |key, value|
|
465
|
+
# The specific params used for fetching the facet list we
|
466
|
+
# don't care about.
|
467
|
+
next if ['facets', "facet.field", 'rows', 'facet.limit', 'facet.offset', 'facet.sort'].include?(key)
|
468
|
+
# Everything else should match
|
469
|
+
expect(solr_facet_params[key]).to eq value
|
470
|
+
end
|
471
|
+
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
end
|