bento_search 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +6 -5
- data/app/assets/javascripts/bento_search/ajax_load.js +42 -16
- data/app/assets/stylesheets/bento_search/suggested_styles.css +9 -0
- data/app/controllers/bento_search/search_controller.rb +15 -6
- data/app/helpers/bento_search_helper.rb +24 -8
- data/app/item_decorators/bento_search/no_links.rb +13 -0
- data/app/models/bento_search/openurl_creator.rb +18 -8
- data/app/models/bento_search/registrar.rb +2 -6
- data/app/models/bento_search/result_item.rb +43 -3
- data/app/models/bento_search/results.rb +4 -0
- data/app/models/bento_search/search_engine.rb +25 -23
- data/app/search_engines/bento_search/ebsco_host_engine.rb +42 -17
- data/app/search_engines/bento_search/google_books_engine.rb +2 -0
- data/app/search_engines/bento_search/google_site_search_engine.rb +177 -0
- data/app/search_engines/bento_search/mock_engine.rb +5 -0
- data/app/search_engines/bento_search/primo_engine.rb +23 -2
- data/app/search_engines/bento_search/scopus_engine.rb +4 -1
- data/app/search_engines/bento_search/summon_engine.rb +4 -14
- data/app/search_engines/bento_search/worldcat_sru_dc_engine.rb +293 -0
- data/app/views/bento_search/_std_item.html.erb +4 -5
- data/app/views/bento_search/_wrap_with_count.html.erb +20 -0
- data/app/views/bento_search/search/search.html.erb +15 -1
- data/config/locales/en.yml +6 -4
- data/lib/bento_search/util.rb +13 -0
- data/lib/bento_search/version.rb +1 -1
- data/test/dummy/log/development.log +1 -0
- data/test/dummy/log/test.log +24357 -0
- data/test/functional/bento_search/search_controller_test.rb +39 -0
- data/test/helper/bento_search_helper_test.rb +47 -5
- data/test/unit/ebsco_host_engine_test.rb +15 -0
- data/test/unit/google_books_engine_test.rb +1 -0
- data/test/unit/google_site_search_test.rb +122 -0
- data/test/unit/item_decorators_test.rb +12 -1
- data/test/unit/openurl_creator_test.rb +19 -3
- data/test/unit/primo_engine_test.rb +5 -3
- data/test/unit/result_item_test.rb +36 -1
- data/test/unit/search_engine_test.rb +27 -4
- data/test/unit/worldcat_sru_dc_engine_test.rb +120 -0
- data/test/vcr_cassettes/google_site/basic_smoke_test.yml +254 -0
- data/test/vcr_cassettes/google_site/empty_result_set.yml +53 -0
- data/test/vcr_cassettes/google_site/pagination_object_is_correct_for_actual_page_when_you_ask_for_too_far.yml +260 -0
- data/test/vcr_cassettes/google_site/with_highlighting.yml +265 -0
- data/test/vcr_cassettes/google_site/without_highlighting.yml +267 -0
- data/test/vcr_cassettes/primo/proper_tags_for_snippets.yml +517 -502
- data/test/vcr_cassettes/primo/search_smoke_test.yml +1 -1
- data/test/vcr_cassettes/worldcat_sru_dc/smoke_test.yml +628 -0
- metadata +40 -4
data/README.md
CHANGED
@@ -13,7 +13,7 @@ Rails3 and tested only under ruby 1.9.3.
|
|
13
13
|
* It is focused on use cases for academic libraries, but may be useful in generic
|
14
14
|
cases too. Initially, engine adapters are planned to be provided for:
|
15
15
|
Google Books, Scopus, SerialSolutions Summon, Ex Libris Primo,
|
16
|
-
EBSCO Discovery Service,
|
16
|
+
EBSCO Discovery Service, EBSCO traditional 'EIT' api, Google Site Search. Most
|
17
17
|
of these search engines require a vendor license to use.
|
18
18
|
|
19
19
|
* bento_search could be considered building blocks for a type of 'federated
|
@@ -42,6 +42,7 @@ BentoSearch::SearchEngine. http://rubydoc.info/gems/bento_search/frames/
|
|
42
42
|
|
43
43
|
An example app using BentoSearch and showing it's features is
|
44
44
|
available at http://github.com/jrochkind/sample_megasearch
|
45
|
+
There is a short screencast showing that sample app in action here: http://screencast.com/t/JLS0lclrBZU
|
45
46
|
|
46
47
|
## Usage Examples
|
47
48
|
|
@@ -104,8 +105,8 @@ field type names:
|
|
104
105
|
This will raise if an engine doesn't support that semantic search field.
|
105
106
|
You can find out what fields a particular engine supports.
|
106
107
|
|
107
|
-
|
108
|
-
|
108
|
+
google_books_engine.search_keys # => internal keys
|
109
|
+
google_books_engine.semantic_search_keys
|
109
110
|
|
110
111
|
You can also provide all arguments in a single hash when it's convenient
|
111
112
|
to do so:
|
@@ -116,9 +117,9 @@ to do so:
|
|
116
117
|
|
117
118
|
An engine advertises what sort types it supports:
|
118
119
|
|
119
|
-
|
120
|
+
google_books_engine.sort_keys
|
120
121
|
|
121
|
-
|
122
|
+
An array of sort identifiers, where possible
|
122
123
|
chosen from a standard list of semantics. (See list in config/i18n/en.yml,
|
123
124
|
bento_search.sort_keys).
|
124
125
|
|
@@ -1,22 +1,48 @@
|
|
1
|
+
var BentoSearch = BentoSearch || {}
|
2
|
+
|
3
|
+
// Pass in a DOM node that has a data-ajax-url attribute.
|
4
|
+
// Will AJAX load bento search results inside that node.
|
5
|
+
// optional second arg success callback function.
|
6
|
+
BentoSearch.ajax_load = function(node, success_callback) {
|
7
|
+
div = $(node);
|
8
|
+
|
9
|
+
if (div.length == 0) {
|
10
|
+
//we've got nothing
|
11
|
+
return
|
12
|
+
}
|
13
|
+
|
14
|
+
|
15
|
+
// We find the "waiting"/spinner section already rendered,
|
16
|
+
// and show it. We experimented with generating the spinner/waiting
|
17
|
+
// purely in JS, instead of rendering a hidden one server-side. But
|
18
|
+
// it was too weird and unreliable to do that, sorry.
|
19
|
+
div.find(".bento_search_ajax_loading").show();
|
20
|
+
|
21
|
+
|
22
|
+
// Now load the actual external content from html5 data-bento-ajax-url
|
23
|
+
$.ajax({
|
24
|
+
url: div.data("bentoAjaxUrl"),
|
25
|
+
success: function(response, status, xhr) {
|
26
|
+
if (success_callback) {
|
27
|
+
success_callback.apply(div, response);
|
28
|
+
}
|
29
|
+
div.replaceWith(response);
|
30
|
+
},
|
31
|
+
error: function(xhr, status, errorThrown) {
|
32
|
+
var msg = "Sorry but there was an error: ";
|
33
|
+
div.html(msg + xhr.status + " " + xhr.statusText + ", " + status);
|
34
|
+
}
|
35
|
+
});
|
36
|
+
|
37
|
+
|
38
|
+
}
|
39
|
+
|
1
40
|
jQuery(document).ready(function($) {
|
2
41
|
//Intentionally wait for window.load, not just onready, to
|
3
42
|
//prevent interfering with rest of page load.
|
4
43
|
$(window).bind("load", function() {
|
5
|
-
|
6
|
-
|
7
|
-
// from html5 data-bento-ajax-url
|
8
|
-
$.ajax({
|
9
|
-
url: div.data("bentoAjaxUrl"),
|
10
|
-
success: function(response, status, xhr) {
|
11
|
-
div.replaceWith(response);
|
12
|
-
},
|
13
|
-
error: function(xhr, status, errorThrown) {
|
14
|
-
var msg = "Sorry but there was an error: ";
|
15
|
-
div.html(msg + xhr.status + " " + xhr.statusText + ", " + status);
|
16
|
-
}
|
17
|
-
});
|
18
|
-
|
44
|
+
$("*[data-bento-search-load=ajax_auto]").each(function(i, div) {
|
45
|
+
BentoSearch.ajax_load(div);
|
19
46
|
});
|
20
|
-
});
|
21
|
-
|
47
|
+
});
|
22
48
|
});
|
@@ -20,3 +20,12 @@
|
|
20
20
|
margin: 2em;
|
21
21
|
}
|
22
22
|
|
23
|
+
/* we put title in an h4, but if it's a link too, it
|
24
|
+
doesn't really need to be bold, link style is already
|
25
|
+
visible enough. */
|
26
|
+
.bento_item_title a {
|
27
|
+
font-weight: normal;
|
28
|
+
}
|
29
|
+
.bento_item_title a .bento_search_highlight {
|
30
|
+
font-style: inherit;
|
31
|
+
}
|
@@ -40,25 +40,34 @@ module BentoSearch
|
|
40
40
|
|
41
41
|
# returns partial HTML results, suitable for
|
42
42
|
# AJAX to insert into DOM.
|
43
|
-
# arguments for engine.search are taken from URI request params
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
# arguments for engine.search are taken from URI request params, whitelisted
|
44
|
+
def search
|
45
|
+
engine = BentoSearch.get_engine(params[:engine_id])
|
46
|
+
# put it in an iVar mainly for testing purposes.
|
47
|
+
@engine = engine
|
47
48
|
|
48
49
|
|
49
50
|
unless engine.configuration.allow_routable_results == true
|
50
51
|
raise AccessDenied.new("engine needs to be registered with :allow_routable_results => true")
|
51
52
|
end
|
52
53
|
|
53
|
-
@results
|
54
|
+
@results = engine.search safe_search_args(engine, params)
|
55
|
+
# template name of a partial with 'yield' to use to wrap the results
|
56
|
+
@partial_wrapper = @results.display_configuration.lookup!("ajax.wrapper_template")
|
54
57
|
|
55
|
-
|
58
|
+
# partial HTML results
|
59
|
+
render "bento_search/search/search", :layout => false
|
60
|
+
|
56
61
|
end
|
57
62
|
|
58
63
|
|
59
64
|
|
60
65
|
protected
|
61
66
|
|
67
|
+
def safe_search_args(engine, params)
|
68
|
+
params.to_hash.symbolize_keys.slice( *engine.public_settable_search_args )
|
69
|
+
end
|
70
|
+
|
62
71
|
def deny_access(exception)
|
63
72
|
render :text => exception.message, :status => 403
|
64
73
|
end
|
@@ -40,13 +40,26 @@ module BentoSearchHelper
|
|
40
40
|
|
41
41
|
end
|
42
42
|
|
43
|
-
if (!results &&
|
43
|
+
if (!results && [:ajax_auto, :ajax_triggered].include?(load_mode))
|
44
44
|
raise ArgumentError.new("`:load => :ajax` requires a registered engine with an id") unless engine.configuration.id
|
45
|
-
content_tag(:div,
|
46
|
-
:
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
content_tag(:div,
|
46
|
+
:class => "bento_search_ajax_wait",
|
47
|
+
:"data-bento-search-load" => load_mode.to_s,
|
48
|
+
:"data-bento-ajax-url" => to_bento_search_url( {:engine_id => engine.configuration.id}.merge(options) )) do
|
49
|
+
|
50
|
+
# An initially hidden div with loading msg/spinner that will be shown
|
51
|
+
# by js on ajax load
|
52
|
+
content_tag("noscript") do
|
53
|
+
I18n.t("bento_search.ajax_noscript")
|
54
|
+
end +
|
55
|
+
content_tag(:div,
|
56
|
+
:class => "bento_search_ajax_loading",
|
57
|
+
:style => "display:none") do
|
58
|
+
|
59
|
+
image_tag("bento_search/large_loader.gif",
|
60
|
+
:alt => I18n.translate("bento_search.ajax_loading"),
|
61
|
+
)
|
62
|
+
|
50
63
|
end
|
51
64
|
end
|
52
65
|
else
|
@@ -55,7 +68,7 @@ module BentoSearchHelper
|
|
55
68
|
if results.failed?
|
56
69
|
render :partial => "bento_search/search_error", :locals => {:results => results}
|
57
70
|
elsif results.length > 0
|
58
|
-
render :partial => "bento_search/std_item", :collection => results
|
71
|
+
render :partial => "bento_search/std_item", :collection => results, :as => :item
|
59
72
|
else
|
60
73
|
content_tag(:div, :class=> "bento_search_no_results") do
|
61
74
|
I18n.translate("bento_search.no_results")
|
@@ -126,10 +139,13 @@ module BentoSearchHelper
|
|
126
139
|
# returns a hash of label => key suitable for passing to rails
|
127
140
|
# options_for_select. (Yes, it works backwards from how you'd expect).
|
128
141
|
# Label is looked up using I18n, at bento_search.sort_keys.*
|
142
|
+
#
|
143
|
+
# If no i18n is found, titleized version of key itself is used as somewhat
|
144
|
+
# reasonable default.
|
129
145
|
def bento_sort_hash_for(engine)
|
130
146
|
Hash[
|
131
147
|
engine.sort_definitions.keys.collect do |key|
|
132
|
-
[I18n.translate(key, :scope => "bento_search.sort_keys"), key]
|
148
|
+
[I18n.translate(key.to_s, :scope => "bento_search.sort_keys", :default => key.to_s.titleize), key.to_s]
|
133
149
|
end
|
134
150
|
]
|
135
151
|
end
|
@@ -16,6 +16,8 @@ module BentoSearch
|
|
16
16
|
# In some cases nil can be returned, if no reasonable OpenURL can
|
17
17
|
# be created from the ResultItem.
|
18
18
|
class OpenurlCreator
|
19
|
+
include ActionView::Helpers::SanitizeHelper # for strip_tags
|
20
|
+
|
19
21
|
attr_accessor :result_item
|
20
22
|
|
21
23
|
def initialize(ri)
|
@@ -42,9 +44,9 @@ module BentoSearch
|
|
42
44
|
r.set_metadata("genre", self.genre)
|
43
45
|
|
44
46
|
if result_item.authors.length > 0
|
45
|
-
r.set_metadata("aufirst", result_item.authors.first.first)
|
46
|
-
r.set_metadata("aulast", result_item.authors.first.last)
|
47
|
-
r.set_metadata("au", result_item.author_display(result_item.authors.first))
|
47
|
+
r.set_metadata("aufirst", ensure_no_tags(result_item.authors.first.first))
|
48
|
+
r.set_metadata("aulast", ensure_no_tags(result_item.authors.first.last))
|
49
|
+
r.set_metadata("au", result_item.author_display(ensure_no_tags result_item.authors.first))
|
48
50
|
end
|
49
51
|
|
50
52
|
r.set_metadata("date", result_item.year.to_s)
|
@@ -52,18 +54,18 @@ module BentoSearch
|
|
52
54
|
r.set_metadata("issue", result_item.issue.to_s)
|
53
55
|
r.set_metadata("spage", result_item.start_page.to_s)
|
54
56
|
r.set_metadata("epage", result_item.end_page.to_s)
|
55
|
-
r.set_metadata("jtitle", result_item.
|
57
|
+
r.set_metadata("jtitle", ensure_no_tags(result_item.source_title))
|
56
58
|
r.set_metadata("issn", result_item.issn)
|
57
59
|
r.set_metadata("isbn", result_item.isbn)
|
58
|
-
r.set_metadata("pub", result_item.publisher)
|
60
|
+
r.set_metadata("pub", ensure_no_tags(result_item.publisher))
|
59
61
|
|
60
62
|
case result_item.format
|
61
63
|
when "Book"
|
62
|
-
r.set_metadata("btitle", result_item.complete_title)
|
64
|
+
r.set_metadata("btitle", ensure_no_tags(result_item.complete_title))
|
63
65
|
when "Article", :conference_paper
|
64
|
-
r.set_metadata("atitle", result_item.complete_title)
|
66
|
+
r.set_metadata("atitle", ensure_no_tags(result_item.complete_title))
|
65
67
|
else
|
66
|
-
r.set_metadata("title", result_item.complete_title)
|
68
|
+
r.set_metadata("title", ensure_no_tags(result_item.complete_title))
|
67
69
|
end
|
68
70
|
|
69
71
|
return context_object
|
@@ -124,5 +126,13 @@ module BentoSearch
|
|
124
126
|
end
|
125
127
|
|
126
128
|
|
129
|
+
# If the input is not marked html_safe?, just return it. Otherwise
|
130
|
+
# strip html tags from it.
|
131
|
+
def ensure_no_tags(str)
|
132
|
+
return str unless str.html_safe?
|
133
|
+
|
134
|
+
strip_tags(str)
|
135
|
+
end
|
136
|
+
|
127
137
|
end
|
128
138
|
end
|
@@ -57,12 +57,8 @@ class BentoSearch::Registrar
|
|
57
57
|
# Turn a string into a constant/class object, lexical lookup
|
58
58
|
# within BentoSearch module. Can use whatever would be legal
|
59
59
|
# in ruby, "A", "A::B", "::A::B" (force top-level lookup), etc.
|
60
|
-
def constantize(klass_string)
|
61
|
-
|
62
|
-
raise NameError, "#{klass_string.inspect} is not a valid constant name!"
|
63
|
-
end
|
64
|
-
|
65
|
-
BentoSearch.module_eval(klass_string, __FILE__, __LINE__)
|
60
|
+
def constantize(klass_string)
|
61
|
+
BentoSearch::Util.constantize(klass_string)
|
66
62
|
end
|
67
63
|
|
68
64
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'language_list'
|
2
|
+
|
1
3
|
module BentoSearch
|
2
4
|
# Data object representing a single hit from a search, normalized
|
3
5
|
# with common data fields. Usually held in a BentoSearch::Results object.
|
@@ -24,6 +26,10 @@ module BentoSearch
|
|
24
26
|
self.custom_data ||= {}
|
25
27
|
end
|
26
28
|
|
29
|
+
# If set to true, item will refuse to generate an openurl,
|
30
|
+
# returning nil from #to_openurl or #openurl_kev
|
31
|
+
attr_accessor :openurl_disabled
|
32
|
+
|
27
33
|
# Array (possibly empty) of BentoSearch::Link objects
|
28
34
|
# representing additional links. Often SearchEngine's themselves
|
29
35
|
# won't include any of these, but Decorators will be used
|
@@ -81,6 +87,29 @@ module BentoSearch
|
|
81
87
|
# format.
|
82
88
|
attr_accessor :format_str
|
83
89
|
|
90
|
+
# Language of materials. Producer can set language_code to an ISO 639-1 (two
|
91
|
+
# letter) or 639-3 (three letter) language code. If you do this, you don't
|
92
|
+
# need to set language_str, it'll be automatically looked up. (Providing
|
93
|
+
# language name in English at present, i18n later maybe).
|
94
|
+
#
|
95
|
+
# Or, if you don't know the language code (or there isn't one?), you can set
|
96
|
+
# language_str manually to a presumably english user-displayable string.
|
97
|
+
# Manually set language_str will over-ride display string calculated from
|
98
|
+
# language_code.
|
99
|
+
#
|
100
|
+
# Consumers can look at language_code or language_str regardless (although
|
101
|
+
# either or both may be nil). You can use language_list gem to normalize to a
|
102
|
+
# 2- or 3-letter from language_code that could be either.
|
103
|
+
attr_accessor :language_code
|
104
|
+
attr_writer :language_str
|
105
|
+
def language_str
|
106
|
+
@language_str || language_code.try do |code|
|
107
|
+
LanguageList::LanguageInfo.find(code).try do |lang_obj|
|
108
|
+
lang_obj.name
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
84
113
|
# year published. a ruby int
|
85
114
|
# PART of:.
|
86
115
|
# * schema.org CreativeWork "datePublished", year portion
|
@@ -93,9 +122,18 @@ module BentoSearch
|
|
93
122
|
attr_accessor :start_page
|
94
123
|
attr_accessor :end_page
|
95
124
|
|
96
|
-
|
125
|
+
# source_title is often used for journal_title (and aliased
|
126
|
+
# as #journal_title, although that may go away), but can
|
127
|
+
# also be used for other 'container' titles. Book title for
|
128
|
+
# a book chapter. Even web site or URL for a web page.
|
129
|
+
attr_accessor :source_title
|
130
|
+
alias_method :journal_title, :source_title
|
131
|
+
alias_method :'journal_title=', :'source_title='
|
132
|
+
|
133
|
+
|
97
134
|
attr_accessor :issn
|
98
135
|
attr_accessor :isbn
|
136
|
+
attr_accessor :oclcnum # OCLC accession number, WorldCat.
|
99
137
|
|
100
138
|
attr_accessor :doi
|
101
139
|
|
@@ -125,6 +163,8 @@ module BentoSearch
|
|
125
163
|
|
126
164
|
# Returns a ruby OpenURL::ContextObject (NISO Z39.88).
|
127
165
|
def to_openurl
|
166
|
+
return nil if openurl_disabled
|
167
|
+
|
128
168
|
BentoSearch::OpenurlCreator.new(self).to_openurl
|
129
169
|
end
|
130
170
|
|
@@ -180,9 +220,9 @@ module BentoSearch
|
|
180
220
|
result_elements.push "<span class='year'>#{year}</span>"
|
181
221
|
end
|
182
222
|
|
183
|
-
result_elements.push(
|
223
|
+
result_elements.push(source_title) unless source_title.blank?
|
184
224
|
|
185
|
-
if
|
225
|
+
if source_title.blank? && ! publisher.blank?
|
186
226
|
result_elements.push html_escape publisher
|
187
227
|
end
|
188
228
|
|
@@ -11,6 +11,10 @@ module BentoSearch
|
|
11
11
|
attr_accessor :start
|
12
12
|
# per_page setting, can be used for pagination.
|
13
13
|
attr_accessor :per_page
|
14
|
+
|
15
|
+
# simply copied over from search engine configuration :display key,
|
16
|
+
# useful for making config available at display time in a DRY way.
|
17
|
+
attr_accessor :display_configuration
|
14
18
|
|
15
19
|
# If error is non-nil, it's an error condition with no real results.
|
16
20
|
# error should be a hash with these (and possibly other) keys, although
|
@@ -50,7 +50,8 @@ module BentoSearch
|
|
50
50
|
# framework:
|
51
51
|
#
|
52
52
|
# [item_decorators]
|
53
|
-
# Array of Modules
|
53
|
+
# Array of Modules (or strings specifying modules, helpful to keep
|
54
|
+
# config serializable) that will be decorated on to each individual search
|
54
55
|
# BentoSearch::ResultItem. These can be used to, via configuration, change
|
55
56
|
# the links associated with items, change certain item behaviors, or massage
|
56
57
|
# item metadata. (Needs more documentation).
|
@@ -125,6 +126,14 @@ module BentoSearch
|
|
125
126
|
# handles configuration loading, mostly. Argument is a
|
126
127
|
# Confstruct::Configuration or Hash.
|
127
128
|
def initialize(aConfiguration = Confstruct::Configuration.new)
|
129
|
+
# To work around weird confstruct bug, we need to change
|
130
|
+
# a hash to a Confstruct ourselves.
|
131
|
+
# https://github.com/mbklein/confstruct/issues/14
|
132
|
+
unless aConfiguration.kind_of? Confstruct::Configuration
|
133
|
+
aConfiguration = Confstruct::Configuration.new aConfiguration
|
134
|
+
end
|
135
|
+
|
136
|
+
|
128
137
|
# init, from copy of default, or new
|
129
138
|
if self.class.default_configuration
|
130
139
|
self.configuration = Confstruct::Configuration.new(self.class.default_configuration)
|
@@ -136,6 +145,7 @@ module BentoSearch
|
|
136
145
|
|
137
146
|
# global defaults?
|
138
147
|
self.configuration[:item_decorators] ||= []
|
148
|
+
self.configuration[:for_display] ||= {}
|
139
149
|
|
140
150
|
# check for required keys -- have to be present, and not nil
|
141
151
|
if self.class.required_configuration
|
@@ -208,6 +218,8 @@ module BentoSearch
|
|
208
218
|
results.engine_id = configuration.id
|
209
219
|
|
210
220
|
results.timing = (Time.now - start_t)
|
221
|
+
|
222
|
+
results.display_configuration = configuration.for_display
|
211
223
|
|
212
224
|
return results
|
213
225
|
rescue *auto_rescue_exceptions => e
|
@@ -303,15 +315,26 @@ module BentoSearch
|
|
303
315
|
alias_method :parse_search_arguments, :normalized_search_arguments
|
304
316
|
|
305
317
|
|
306
|
-
|
318
|
+
# Used mainly/only by the AJAX results loading.
|
319
|
+
# an array WHITELIST of attributes that can be sent as non-verified
|
320
|
+
# request params and used to execute a search. For instance, 'auth' is
|
321
|
+
# NOT on there, you can't trust a web request as to 'auth' status.
|
322
|
+
# individual engines may over-ride, call super, and add additional
|
323
|
+
# engine-specific attributes.
|
324
|
+
def public_settable_search_args
|
325
|
+
[:query, :search_field, :semantic_search_field, :sort, :page, :start, :per_page]
|
326
|
+
end
|
307
327
|
|
308
328
|
|
309
329
|
protected
|
310
330
|
|
311
331
|
# Extend each result with each specified decorator module
|
332
|
+
# configuration.item_decorators is an array of either Module constants,
|
333
|
+
# or strings specifying module constants.
|
312
334
|
def decorate(results)
|
313
335
|
results.each do |result|
|
314
336
|
configuration.item_decorators.each do |decorator|
|
337
|
+
decorator = (decorator.kind_of? Module) ? decorator : BentoSearch::Util.constantize(decorator)
|
315
338
|
result.extend decorator
|
316
339
|
end
|
317
340
|
end
|
@@ -337,27 +360,6 @@ module BentoSearch
|
|
337
360
|
|
338
361
|
module ClassMethods
|
339
362
|
|
340
|
-
# If support fielded search, over-ride to specify fields
|
341
|
-
# supported. Returns a hash, key is engine-specific internal
|
342
|
-
# search field, value is nil or a hash of metadata about
|
343
|
-
# the search field, including semantic mapping.
|
344
|
-
#
|
345
|
-
# def search_field_definitions
|
346
|
-
# { "intitle" => {:semantic => :title}}
|
347
|
-
# end
|
348
|
-
def search_field_definitions
|
349
|
-
{}
|
350
|
-
end
|
351
|
-
|
352
|
-
|
353
|
-
# Returns list of string internal search_field's that can
|
354
|
-
# be supplied to search(:search_field => x)
|
355
|
-
def search_keys
|
356
|
-
return search_field_definitions.keys
|
357
|
-
end
|
358
|
-
|
359
|
-
|
360
|
-
|
361
363
|
# Over-ride returning a hash or Confstruct with
|
362
364
|
# any configuration values you want by default.
|
363
365
|
# actual user-specified config values will be deep-merged
|