-
Notifications
You must be signed in to change notification settings - Fork 256
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add autocomplete feature for Blacklight using Solr suggestor
- Loading branch information
1 parent
ccab1a1
commit 7338c1a
Showing
15 changed files
with
269 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/*global Bloodhound */ | ||
|
||
Blacklight.onLoad(function() { | ||
'use strict'; | ||
|
||
$('[data-autocomplete-enabled="true"]').each(function() { | ||
var $el = $(this); | ||
var suggestUrl = $el.data().autocompletePath; | ||
|
||
var terms = new Bloodhound({ | ||
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), | ||
queryTokenizer: Bloodhound.tokenizers.whitespace, | ||
remote: { | ||
url: suggestUrl + '?q=%QUERY' | ||
} | ||
}); | ||
|
||
terms.initialize(); | ||
|
||
$el.typeahead({ | ||
hint: true, | ||
highlight: true, | ||
minLength: 2 | ||
}, | ||
{ | ||
name: 'terms', | ||
displayKey: 'term', | ||
source: terms.ttAdapter() | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
module Blacklight | ||
module Suggest | ||
extend ActiveSupport::Concern | ||
include Blacklight::Suggest::SuggestHelper | ||
|
||
def index | ||
response = suggestions params | ||
respond_to do |format| | ||
format.json do | ||
render json: response.suggestions | ||
end | ||
end | ||
end | ||
end | ||
end |
32 changes: 32 additions & 0 deletions
32
app/controllers/concerns/blacklight/suggest/suggest_helper.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
module Blacklight | ||
module Suggest | ||
module SuggestHelper | ||
extend ActiveSupport::Concern | ||
include Blacklight::SearchHelper | ||
|
||
## | ||
# For now, only use the q parameter to create a | ||
# Blacklight::Suggest::Response | ||
# @param [Hash] params | ||
# @return [Blacklight::Suggest::Response] | ||
def suggestions(params) | ||
request_params = { q: params[:q] } | ||
Blacklight::Suggest::Response.new suggest_results(request_params), request_params, suggest_handler_path | ||
end | ||
|
||
## | ||
# Query the suggest handler using RSolr::Client::send_and_receive | ||
# @param [Hash] request_params | ||
# @return [RSolr::HashWithResponse] | ||
def suggest_results(request_params) | ||
repository.connection.send_and_receive(suggest_handler_path, params: request_params) | ||
end | ||
|
||
## | ||
# @param [String] | ||
def suggest_handler_path | ||
repository.blacklight_config.autocomplete_path | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
class SuggestController < ApplicationController | ||
include Blacklight::Suggest | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
module Blacklight | ||
module SuggestHelperBehavior | ||
## | ||
# @return [Boolean] should autocomplete be enabled in the UI | ||
def autocomplete_enabled? | ||
blacklight_config.autocomplete_enabled.present? && | ||
blacklight_config.autocomplete_path.present? | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
module SuggestHelper | ||
include Blacklight::SuggestHelperBehavior | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
module Blacklight | ||
module Suggest | ||
class Response | ||
attr_reader :response, :request_params, :suggest_path | ||
|
||
## | ||
# Creates a suggest response | ||
# @param [RSolr::HashWithResponse] response | ||
# @param [Hash] request_params | ||
# @param [String] suggest_path | ||
def initialize(response, request_params, suggest_path) | ||
@response = response | ||
@request_params = request_params | ||
@suggest_path = suggest_path | ||
end | ||
|
||
## | ||
# Trys the suggestor response to return suggestions if they are | ||
# present | ||
# @return [Array] | ||
def suggestions | ||
response.try(:[], suggest_path).try(:[], 'mySuggester').try(:[], request_params[:q]).try(:[], 'suggestions') || [] | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
spec/controllers/blacklight/suggest/suggest_helper_spec.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
require 'spec_helper' | ||
|
||
describe Blacklight::Suggest::SuggestHelper do | ||
let(:controller) { (Class.new(ApplicationController) { include Blacklight::Suggest::SuggestHelper }).new } | ||
subject { controller} | ||
|
||
let(:blacklight_config) { Blacklight::Configuration.new } | ||
let(:blacklight_solr) { RSolr.connect(Blacklight.connection_config) } | ||
|
||
before do | ||
blacklight_config.autocomplete_path = 'suggest' | ||
end | ||
|
||
describe '#suggestions' do | ||
it 'returns a Blacklight::Suggest::Response' do | ||
expect(subject).to receive(:suggest_results).with(q: 'test') | ||
expect(subject.suggestions q: 'test').to be_an Blacklight::Suggest::Response | ||
end | ||
end | ||
describe '#suggest_results' do | ||
it 'queries the suggest handler with params' do | ||
allow(blacklight_solr).to receive(:get) do |path, params| | ||
expect(path).to eq 'suggest' | ||
expect(params).to eq params: { q: 'test' } | ||
end | ||
subject.suggest_results q: 'test' | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
require 'spec_helper' | ||
|
||
describe SuggestController do | ||
routes { Blacklight::Engine.routes } | ||
describe 'GET index' do | ||
it 'returns JSON' do | ||
get :index, format: 'json' | ||
expect(response.body).to eq [].to_json | ||
end | ||
it 'returns suggestions' do | ||
get :index, format: 'json', q: 'new' | ||
json = JSON.parse(response.body) | ||
expect(json.count).to eq 3 | ||
expect(json.first['term']).to eq 'new jersey' | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
require 'spec_helper' | ||
|
||
describe SuggestHelper do | ||
before do | ||
allow(helper).to receive(:blacklight_config).and_return(blacklight_config) | ||
end | ||
describe '#autocomplete_enabled?' do | ||
describe 'with autocomplete config' do | ||
let(:blacklight_config) do | ||
Blacklight::Configuration.new.configure do |config| | ||
config.autocomplete_enabled = true | ||
config.autocomplete_path = 'suggest' | ||
end | ||
end | ||
it 'is enabled' do | ||
expect(helper.autocomplete_enabled?).to be true | ||
end | ||
end | ||
describe 'without disabled config' do | ||
let(:blacklight_config) do | ||
Blacklight::Configuration.new.configure do |config| | ||
config.autocomplete_enabled = false | ||
config.autocomplete_path = 'suggest' | ||
end | ||
end | ||
it 'is disabled' do | ||
expect(helper.autocomplete_enabled?).to be false | ||
end | ||
end | ||
describe 'without path config' do | ||
let(:blacklight_config) do | ||
Blacklight::Configuration.new.configure do |config| | ||
config.autocomplete_enabled = true | ||
end | ||
end | ||
it 'is disabled' do | ||
expect(helper.autocomplete_enabled?).to be false | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
require 'spec_helper' | ||
|
||
describe Blacklight::Suggest::Response do | ||
let(:empty_response) { described_class.new({}, { q: 'hello' }, 'suggest') } | ||
let(:full_response) do | ||
described_class.new( | ||
{ | ||
'responseHeader' => { | ||
'status' => 200 | ||
}, | ||
'suggest' => { | ||
'mySuggester' => { | ||
'new' => { | ||
'numFound' => 3, | ||
'suggestions' => [ | ||
{ | ||
'term' => 'new jersey', | ||
'weight' => 3, | ||
'payload' => '' | ||
}, | ||
{ | ||
'term' => 'new jersey bridgeton biography', | ||
'weight' => 3, | ||
'payload' => '' | ||
}, | ||
{ | ||
'term' => 'new jersey bridgeton history', | ||
'weight' => 3, | ||
'payload' => '' | ||
} | ||
] | ||
} | ||
} | ||
} | ||
}, | ||
{ | ||
q: 'new' | ||
}, | ||
'suggest' | ||
) | ||
end | ||
|
||
describe '#initialize' do | ||
it 'creates a Blacklight::Suggest::Response' do | ||
expect(empty_response).to be_an Blacklight::Suggest::Response | ||
end | ||
end | ||
describe '#suggestions' do | ||
it 'returns an array of suggestions' do | ||
expect(full_response.suggestions).to be_an Array | ||
expect(full_response.suggestions.count).to eq 3 | ||
expect(full_response.suggestions.first['term']).to eq 'new jersey' | ||
end | ||
end | ||
end |