bento_search 1.7.0 → 2.0.0.rc1
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 +5 -5
- data/README.md +2 -6
- data/app/assets/javascripts/bento_search/ajax_load.js +17 -1
- data/app/controllers/bento_search/search_controller.rb +2 -2
- data/app/models/bento_search/concurrent_searcher.rb +2 -2
- data/app/models/bento_search/result_item.rb +5 -2
- data/app/views/bento_search/_item_title.html.erb +2 -4
- data/lib/bento_search/version.rb +1 -1
- data/lib/generators/bento_search/install/ajax_load_js_generator.rb +15 -0
- data/test/decorator/standard_decorator_test.rb +30 -30
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/config/application.rb +7 -0
- data/test/dummy/config/environments/development.rb +2 -0
- data/test/dummy/config/environments/production.rb +7 -1
- data/test/dummy/config/environments/test.rb +10 -3
- data/test/functional/bento_search/search_controller_test.rb +5 -1
- data/test/search_engines/google_site_search_test.rb +48 -48
- data/test/search_engines/scopus_engine_test.rb +51 -51
- data/test/support/atom.xsd.xml +3 -3
- data/test/support/xml.xsd +117 -0
- data/test/view/atom_results_test.rb +94 -94
- metadata +27 -49
- data/app/assets/javascripts/bento_search.js +0 -3
- data/app/item_decorators/bento_search/ebscohost/conditional_openurl_main_link.rb +0 -36
- data/app/item_decorators/bento_search/only_premade_openurl.rb +0 -20
- data/app/item_decorators/bento_search/openurl_add_other_link.rb +0 -39
- data/app/item_decorators/bento_search/openurl_main_link.rb +0 -34
- data/app/models/bento_search/multi_searcher.rb +0 -132
- data/test/dummy/config/initializers/secret_token.rb +0 -8
- data/test/dummy/db/schema.rb +0 -15
- data/test/unit/multi_searcher_test.rb +0 -46
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bento_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Rochkind
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '5.2'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '7'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: '5.2'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '7'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: confstruct
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -166,44 +166,30 @@ dependencies:
|
|
166
166
|
requirements:
|
167
167
|
- - "~>"
|
168
168
|
- !ruby/object:Gem::Version
|
169
|
-
version: '
|
169
|
+
version: '6.0'
|
170
170
|
type: :development
|
171
171
|
prerelease: false
|
172
172
|
version_requirements: !ruby/object:Gem::Requirement
|
173
173
|
requirements:
|
174
174
|
- - "~>"
|
175
175
|
- !ruby/object:Gem::Version
|
176
|
-
version: '
|
176
|
+
version: '6.0'
|
177
177
|
- !ruby/object:Gem::Dependency
|
178
178
|
name: webmock
|
179
179
|
requirement: !ruby/object:Gem::Requirement
|
180
180
|
requirements:
|
181
181
|
- - "~>"
|
182
182
|
- !ruby/object:Gem::Version
|
183
|
-
version:
|
183
|
+
version: '3.0'
|
184
184
|
type: :development
|
185
185
|
prerelease: false
|
186
186
|
version_requirements: !ruby/object:Gem::Requirement
|
187
187
|
requirements:
|
188
188
|
- - "~>"
|
189
189
|
- !ruby/object:Gem::Version
|
190
|
-
version:
|
191
|
-
|
192
|
-
|
193
|
-
requirement: !ruby/object:Gem::Requirement
|
194
|
-
requirements:
|
195
|
-
- - ">="
|
196
|
-
- !ruby/object:Gem::Version
|
197
|
-
version: '0'
|
198
|
-
type: :development
|
199
|
-
prerelease: false
|
200
|
-
version_requirements: !ruby/object:Gem::Requirement
|
201
|
-
requirements:
|
202
|
-
- - ">="
|
203
|
-
- !ruby/object:Gem::Version
|
204
|
-
version: '0'
|
205
|
-
description:
|
206
|
-
email:
|
190
|
+
version: '3.0'
|
191
|
+
description:
|
192
|
+
email:
|
207
193
|
executables: []
|
208
194
|
extensions: []
|
209
195
|
extra_rdoc_files: []
|
@@ -212,23 +198,17 @@ files:
|
|
212
198
|
- README.md
|
213
199
|
- Rakefile
|
214
200
|
- app/assets/images/bento_search/large_loader.gif
|
215
|
-
- app/assets/javascripts/bento_search.js
|
216
201
|
- app/assets/javascripts/bento_search/ajax_load.js
|
217
202
|
- app/assets/stylesheets/bento_search/suggested_styles.css
|
218
203
|
- app/controllers/bento_search/bento_search_controller.rb
|
219
204
|
- app/controllers/bento_search/search_controller.rb
|
220
205
|
- app/helpers/bento_search_helper.rb
|
221
206
|
- app/item_decorators/bento_search/decorator_base.rb
|
222
|
-
- app/item_decorators/bento_search/ebscohost/conditional_openurl_main_link.rb
|
223
207
|
- app/item_decorators/bento_search/no_links.rb
|
224
|
-
- app/item_decorators/bento_search/only_premade_openurl.rb
|
225
|
-
- app/item_decorators/bento_search/openurl_add_other_link.rb
|
226
|
-
- app/item_decorators/bento_search/openurl_main_link.rb
|
227
208
|
- app/item_decorators/bento_search/standard_decorator.rb
|
228
209
|
- app/models/bento_search/author.rb
|
229
210
|
- app/models/bento_search/concurrent_searcher.rb
|
230
211
|
- app/models/bento_search/link.rb
|
231
|
-
- app/models/bento_search/multi_searcher.rb
|
232
212
|
- app/models/bento_search/openurl_creator.rb
|
233
213
|
- app/models/bento_search/registrar.rb
|
234
214
|
- app/models/bento_search/result_item.rb
|
@@ -266,6 +246,7 @@ files:
|
|
266
246
|
- lib/bento_search/routes.rb
|
267
247
|
- lib/bento_search/util.rb
|
268
248
|
- lib/bento_search/version.rb
|
249
|
+
- lib/generators/bento_search/install/ajax_load_js_generator.rb
|
269
250
|
- lib/generators/bento_search/pull_ebsco_dbs_generator.rb
|
270
251
|
- lib/generators/bento_search/templates/ebsco_global_var.erb
|
271
252
|
- lib/http_client_patch/include_client.rb
|
@@ -274,6 +255,7 @@ files:
|
|
274
255
|
- test/decorator/standard_decorator_test.rb
|
275
256
|
- test/dummy/README.rdoc
|
276
257
|
- test/dummy/Rakefile
|
258
|
+
- test/dummy/app/assets/config/manifest.js
|
277
259
|
- test/dummy/app/assets/javascripts/application.js
|
278
260
|
- test/dummy/app/assets/stylesheets/application.css
|
279
261
|
- test/dummy/app/controllers/application_controller.rb
|
@@ -291,12 +273,10 @@ files:
|
|
291
273
|
- test/dummy/config/initializers/backtrace_silencers.rb
|
292
274
|
- test/dummy/config/initializers/inflections.rb
|
293
275
|
- test/dummy/config/initializers/mime_types.rb
|
294
|
-
- test/dummy/config/initializers/secret_token.rb
|
295
276
|
- test/dummy/config/initializers/session_store.rb
|
296
277
|
- test/dummy/config/initializers/wrap_parameters.rb
|
297
278
|
- test/dummy/config/locales/en.yml
|
298
279
|
- test/dummy/config/routes.rb
|
299
|
-
- test/dummy/db/schema.rb
|
300
280
|
- test/dummy/public/404.html
|
301
281
|
- test/dummy/public/422.html
|
302
282
|
- test/dummy/public/500.html
|
@@ -320,11 +300,11 @@ files:
|
|
320
300
|
- test/search_engines/xerxes_engine_test.rb
|
321
301
|
- test/support/atom.xsd.xml
|
322
302
|
- test/support/test_with_cassette.rb
|
303
|
+
- test/support/xml.xsd
|
323
304
|
- test/test_helper.rb
|
324
305
|
- test/unit/concurrent_searcher_test.rb
|
325
306
|
- test/unit/handle_highlight_tags_test.rb
|
326
307
|
- test/unit/item_decorators_test.rb
|
327
|
-
- test/unit/multi_searcher_test.rb
|
328
308
|
- test/unit/openurl_creator_test.rb
|
329
309
|
- test/unit/pagination_test.rb
|
330
310
|
- test/unit/register_engine_test.rb
|
@@ -410,7 +390,7 @@ files:
|
|
410
390
|
homepage: http://github.com/jrochkind/bento_search
|
411
391
|
licenses: []
|
412
392
|
metadata: {}
|
413
|
-
post_install_message:
|
393
|
+
post_install_message:
|
414
394
|
rdoc_options: []
|
415
395
|
require_paths:
|
416
396
|
- lib
|
@@ -421,19 +401,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
421
401
|
version: '0'
|
422
402
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
423
403
|
requirements:
|
424
|
-
- - "
|
404
|
+
- - ">"
|
425
405
|
- !ruby/object:Gem::Version
|
426
|
-
version:
|
406
|
+
version: 1.3.1
|
427
407
|
requirements: []
|
428
|
-
|
429
|
-
|
430
|
-
signing_key:
|
408
|
+
rubygems_version: 3.2.22
|
409
|
+
signing_key:
|
431
410
|
specification_version: 4
|
432
411
|
summary: An abstraction/normalization layer for querying and displaying results for
|
433
412
|
external search engines, in Ruby on Rails.
|
434
413
|
test_files:
|
435
414
|
- test/decorator/decorator_base_test.rb
|
436
415
|
- test/decorator/standard_decorator_test.rb
|
416
|
+
- test/dummy/README.rdoc
|
417
|
+
- test/dummy/Rakefile
|
418
|
+
- test/dummy/app/assets/config/manifest.js
|
437
419
|
- test/dummy/app/assets/javascripts/application.js
|
438
420
|
- test/dummy/app/assets/stylesheets/application.css
|
439
421
|
- test/dummy/app/controllers/application_controller.rb
|
@@ -450,19 +432,15 @@ test_files:
|
|
450
432
|
- test/dummy/config/initializers/backtrace_silencers.rb
|
451
433
|
- test/dummy/config/initializers/inflections.rb
|
452
434
|
- test/dummy/config/initializers/mime_types.rb
|
453
|
-
- test/dummy/config/initializers/secret_token.rb
|
454
435
|
- test/dummy/config/initializers/session_store.rb
|
455
436
|
- test/dummy/config/initializers/wrap_parameters.rb
|
456
437
|
- test/dummy/config/locales/en.yml
|
457
438
|
- test/dummy/config/routes.rb
|
458
439
|
- test/dummy/config.ru
|
459
|
-
- test/dummy/db/schema.rb
|
460
440
|
- test/dummy/public/404.html
|
461
441
|
- test/dummy/public/422.html
|
462
442
|
- test/dummy/public/500.html
|
463
443
|
- test/dummy/public/favicon.ico
|
464
|
-
- test/dummy/Rakefile
|
465
|
-
- test/dummy/README.rdoc
|
466
444
|
- test/dummy/script/rails
|
467
445
|
- test/functional/bento_search/search_controller_test.rb
|
468
446
|
- test/helper/bento_search_helper_test.rb
|
@@ -482,11 +460,11 @@ test_files:
|
|
482
460
|
- test/search_engines/xerxes_engine_test.rb
|
483
461
|
- test/support/atom.xsd.xml
|
484
462
|
- test/support/test_with_cassette.rb
|
463
|
+
- test/support/xml.xsd
|
485
464
|
- test/test_helper.rb
|
486
465
|
- test/unit/concurrent_searcher_test.rb
|
487
466
|
- test/unit/handle_highlight_tags_test.rb
|
488
467
|
- test/unit/item_decorators_test.rb
|
489
|
-
- test/unit/multi_searcher_test.rb
|
490
468
|
- test/unit/openurl_creator_test.rb
|
491
469
|
- test/unit/pagination_test.rb
|
492
470
|
- test/unit/register_engine_test.rb
|
@@ -500,6 +478,7 @@ test_files:
|
|
500
478
|
- test/vcr_cassettes/doaj_articles/live_get_identifier__raises_on_no_results.yml
|
501
479
|
- test/vcr_cassettes/doaj_articles/multifield_author-title.yml
|
502
480
|
- test/vcr_cassettes/doaj_articles/pagination.yml
|
481
|
+
- test/vcr_cassettes/ebscohost/RILM_record_with_ISSN_in__jid__element.yml
|
503
482
|
- test/vcr_cassettes/ebscohost/affiliation_search.yml
|
504
483
|
- test/vcr_cassettes/ebscohost/another_dissertation.yml
|
505
484
|
- test/vcr_cassettes/ebscohost/dissertation_example.yml
|
@@ -517,11 +496,10 @@ test_files:
|
|
517
496
|
- test/vcr_cassettes/ebscohost/live_search_smoke_test.yml
|
518
497
|
- test/vcr_cassettes/ebscohost/multi-field_author_title.yml
|
519
498
|
- test/vcr_cassettes/ebscohost/multi-field_citation_numbers.yml
|
520
|
-
- test/vcr_cassettes/
|
499
|
+
- test/vcr_cassettes/eds/FullText_CustomLink.yml
|
521
500
|
- test/vcr_cassettes/eds/basic_search_smoke_test.yml
|
522
501
|
- test/vcr_cassettes/eds/catalog_ebook_query.yml
|
523
502
|
- test/vcr_cassettes/eds/catalog_query.yml
|
524
|
-
- test/vcr_cassettes/eds/FullText_CustomLink.yml
|
525
503
|
- test/vcr_cassettes/eds/get_auth_token.yml
|
526
504
|
- test/vcr_cassettes/eds/get_auth_token_failure.yml
|
527
505
|
- test/vcr_cassettes/eds/get_with_auth.yml
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# DEPRECATED. Just write the logic into a custom Decorator yourself.
|
2
|
-
# See wiki on decorators.
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# For ebscohost connector, example of an Item Decorator that replaces the main
|
6
|
-
# 'link' with an openurl ONLY if there is NOT fulltext avail from EBSCO.
|
7
|
-
#
|
8
|
-
# This example uses crazy metaprogramming to dynamically create
|
9
|
-
# a module configured with your base url etc. You don't need to use
|
10
|
-
# crazy method like that; just define your own local decorator doing
|
11
|
-
# exactly what you need, it's meant to be simple.
|
12
|
-
#
|
13
|
-
# config.item_decorators = [ BentoSearch::Ebscohost::ConditionalOpenurlMainLink[:base_url => "http://resolve.somewhere.edu/foo", :extra_query => "&foo=bar"] ]
|
14
|
-
#
|
15
|
-
module BentoSearch::Ebscohost::ConditionalOpenurlMainLink
|
16
|
-
def self.[](options)
|
17
|
-
base_url = options[:base_url]
|
18
|
-
extra_query = options[:extra_query] || ""
|
19
|
-
Module.new do
|
20
|
-
|
21
|
-
define_method :link do
|
22
|
-
if custom_data["fulltext_formats"]
|
23
|
-
super()
|
24
|
-
elsif (ou = to_openurl)
|
25
|
-
"#{base_url}?#{ou.kev}#{extra_query}"
|
26
|
-
else
|
27
|
-
nil
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# DEPRECATED. Just write the logic into a custom Decorator yourself.
|
2
|
-
# See wiki on decorators.
|
3
|
-
|
4
|
-
|
5
|
-
require 'openurl'
|
6
|
-
|
7
|
-
# A Decorator that will make #to_openurl refuse to construct
|
8
|
-
# an openurl from individual elements, it'll use the #openurl_kev_co
|
9
|
-
# or nothing.
|
10
|
-
module BentoSearch::OnlyPremadeOpenurl
|
11
|
-
|
12
|
-
def to_openurl
|
13
|
-
if self.openurl_kev_co
|
14
|
-
return OpenURL::ContextObject.new_from_kev( self.openurl_kev_co )
|
15
|
-
else
|
16
|
-
return nil
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# DEPRECATED. Just write the logic into a custom Decorator yourself.
|
2
|
-
# See wiki on decorators.
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Example of an Item Decorator that ADDs an 'other link' with an openurl.
|
6
|
-
#
|
7
|
-
# This example uses crazy metaprogramming to dynamically create
|
8
|
-
# a module configured with your base url etc. You don't need to use
|
9
|
-
# crazy method like that; just define your own local decorator doing
|
10
|
-
# exactly what you need, it's meant to be simple.
|
11
|
-
#
|
12
|
-
# config.item_decorators = [ BentoSearch::OpenurlAddOtherLink[:base_url => "http://resolve.somewhere.edu/foo", :extra_query => "&foo=bar"] ]
|
13
|
-
#
|
14
|
-
module BentoSearch::OpenurlAddOtherLink
|
15
|
-
def self.[](options)
|
16
|
-
base_url = options[:base_url]
|
17
|
-
extra_query = options[:extra_query] || ""
|
18
|
-
link_name = options[:link_name] || "Find It"
|
19
|
-
# overwrite: if true, overwrite previously existing other_links, if
|
20
|
-
# false add on to previously existing.
|
21
|
-
overwrite = options.has_key?(:overwrite) ? options[:overwrite] : false
|
22
|
-
|
23
|
-
Module.new do
|
24
|
-
|
25
|
-
define_method :other_links do
|
26
|
-
start = overwrite ? [] : super()
|
27
|
-
if (ou = to_openurl)
|
28
|
-
start + [BentoSearch::Link.new(:url => "#{base_url}?#{ou.kev}#{extra_query}", :label => link_name)]
|
29
|
-
else
|
30
|
-
start
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# DEPRECATED. Just write the logic into a custom Decorator yourself.
|
2
|
-
# See wiki on decorators.
|
3
|
-
|
4
|
-
|
5
|
-
# Example of an Item Decorator that replaces the main 'link'
|
6
|
-
# with an openurl.
|
7
|
-
#
|
8
|
-
# This example uses crazy metaprogramming to dynamically create
|
9
|
-
# a module configured with your base url etc. You don't need to use
|
10
|
-
# crazy method like that; just define your own local decorator doing
|
11
|
-
# exactly what you need, it's meant to be simple.
|
12
|
-
#
|
13
|
-
# config.item_decorators = [ BentoSearch::OpenurlMainLink[:base_url => "http://resolve.somewhere.edu/foo", :extra_query => "&foo=bar"] ]
|
14
|
-
#
|
15
|
-
module BentoSearch::OpenurlMainLink
|
16
|
-
def self.[](options)
|
17
|
-
base_url = options[:base_url]
|
18
|
-
extra_query = options[:extra_query] || ""
|
19
|
-
Module.new do
|
20
|
-
|
21
|
-
define_method :link do
|
22
|
-
if (ou = to_openurl)
|
23
|
-
"#{base_url}?#{ou.kev}#{extra_query}"
|
24
|
-
else
|
25
|
-
nil
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
@@ -1,132 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'celluloid'
|
3
|
-
|
4
|
-
# Based on Celluloid, concurrently runs multiple searches in
|
5
|
-
# seperate threads. You must include 'celluloid' gem dependency
|
6
|
-
# into your local app to use this class. Requires celluloid 0.12.0
|
7
|
-
# or above (for new preferred async syntax).
|
8
|
-
#
|
9
|
-
# Warning, if you don't have celluloid in your app, this class simply
|
10
|
-
# won't load. TODO: We should put this file in a different directory
|
11
|
-
# so it's never auto-loaded, and requires a "require 'bento_search/multi_searcher'",
|
12
|
-
# such that it will raise without celluloid only then, and we don't need this
|
13
|
-
# rescue LoadError stuff.
|
14
|
-
#
|
15
|
-
# I am not an expert at use of Celluloid, it's possible there's a better
|
16
|
-
# way to do this all, but seems to work.
|
17
|
-
#
|
18
|
-
# ## Usage
|
19
|
-
#
|
20
|
-
# initialize with id's of registered engines:
|
21
|
-
# searcher = BentoBox::MultiSearcher.new(:gbs, :scopus)
|
22
|
-
#
|
23
|
-
# start the concurrent searches, params same as engine.search
|
24
|
-
# searcher.search( query_params )
|
25
|
-
#
|
26
|
-
# retrieve results, blocking until each is completed:
|
27
|
-
# searcher.results
|
28
|
-
#
|
29
|
-
# returns a Hash keyed by engine id, values BentoSearch::Results objects.
|
30
|
-
#
|
31
|
-
# Can only call #results once per #start, after that it'll return empty hash.
|
32
|
-
# (should we make it actually raise instead?). .
|
33
|
-
#
|
34
|
-
# important to call results at some point after calling start, in order
|
35
|
-
# to make sure Celluloid::Actors are properly terminated to avoid
|
36
|
-
# resource leakage. May want to do it in an ensure block.
|
37
|
-
#
|
38
|
-
# Note that celluloid uses multi-threading in such a way that you
|
39
|
-
# may have to set config.cache_classes=true even in development
|
40
|
-
# to avoid problems. Rails class reloading is not thread-safe.
|
41
|
-
#
|
42
|
-
#
|
43
|
-
# TODO: have a method that returns Futures instead of only supplying the blocking
|
44
|
-
# results method? Several tricks, including making sure to properly terminate actors.
|
45
|
-
class BentoSearch::MultiSearcher
|
46
|
-
|
47
|
-
def initialize(*engine_ids)
|
48
|
-
ActiveSupport::Deprecation.warn('BentoSearch::MultiSearcher is deprecated and will be removed in bento_search 2.0. Please use BentoSearch::ConcurrentSearcher instead.', caller.slice(1..-1))
|
49
|
-
|
50
|
-
@engines = []
|
51
|
-
@actors = []
|
52
|
-
engine_ids.each do |id|
|
53
|
-
add_engine( BentoSearch.get_engine id )
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
# Adds an instantiated engine directly, rather than by id from global
|
58
|
-
# registry.
|
59
|
-
def add_engine(engine)
|
60
|
-
@engines << engine
|
61
|
-
end
|
62
|
-
|
63
|
-
# Starts all searches, returns self so you can chain method calls if you like.
|
64
|
-
def search(*search_args)
|
65
|
-
@engines.each do |engine|
|
66
|
-
a = Actor.new(engine)
|
67
|
-
@actors << a
|
68
|
-
a.async.start *search_args
|
69
|
-
end
|
70
|
-
return self
|
71
|
-
end
|
72
|
-
alias_method :start, :search # backwards compat
|
73
|
-
|
74
|
-
# Call after #start. Blocks until each included engine is finished
|
75
|
-
# then returns a Hash keyed by engine registered id, value is a
|
76
|
-
# BentoSearch::Results object.
|
77
|
-
#
|
78
|
-
# Can only call _once_ per invocation of #start, after that it'll return
|
79
|
-
# an empty hash.
|
80
|
-
def results
|
81
|
-
results = {}
|
82
|
-
|
83
|
-
# we use #delete_if to get an iterator that deletes
|
84
|
-
# each item after iteration.
|
85
|
-
@actors.delete_if do |actor|
|
86
|
-
result_key = (actor.engine.configuration.id || actor.engine.class.name)
|
87
|
-
results[result_key] = actor.results
|
88
|
-
actor.terminate
|
89
|
-
|
90
|
-
true
|
91
|
-
end
|
92
|
-
|
93
|
-
return results
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
class Actor
|
98
|
-
include Celluloid
|
99
|
-
|
100
|
-
attr_accessor :engine
|
101
|
-
|
102
|
-
def initialize(a_engine)
|
103
|
-
self.engine = a_engine
|
104
|
-
end
|
105
|
-
|
106
|
-
# call as .async.start, to invoke async.
|
107
|
-
def start(*search_args)
|
108
|
-
begin
|
109
|
-
@results = self.engine.search(*search_args)
|
110
|
-
rescue StandardError => e
|
111
|
-
Rails.logger.error("\nBentoSearch:MultiSearcher caught exception: #{e}\n#{e.backtrace.join(" \n")}")
|
112
|
-
# Make a fake results with caught exception.
|
113
|
-
@results = BentoSearch::Results.new
|
114
|
-
self.engine.fill_in_search_metadata_for(@results, self.engine.normalized_search_arguments(search_args))
|
115
|
-
|
116
|
-
@results.error ||= {}
|
117
|
-
@results.error["exception"] = e
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def results
|
122
|
-
@results
|
123
|
-
end
|
124
|
-
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
rescue LoadError
|
129
|
-
# you can use bento_search without celluloid, just not
|
130
|
-
# this class.
|
131
|
-
end
|
132
|
-
|