Merge pull request #2273 from paully21/development-branch

Add blurb of post to search results via API
This commit is contained in:
Régis Hanol 2014-04-17 21:06:03 +02:00
commit b2cb4b27a1
6 changed files with 45 additions and 14 deletions

View File

@ -11,6 +11,9 @@ class SearchController < ApplicationController
search_args = {guardian: guardian} search_args = {guardian: guardian}
search_args[:type_filter] = params[:type_filter] if params[:type_filter].present? search_args[:type_filter] = params[:type_filter] if params[:type_filter].present?
if params[:include_blurbs].present?
search_args[:include_blurbs] = params[:include_blurbs] == "true"
end
search_context = params[:search_context] search_context = params[:search_context]
if search_context.present? if search_context.present?

View File

@ -44,6 +44,7 @@ class Search
@opts = opts || {} @opts = opts || {}
@guardian = @opts[:guardian] || Guardian.new @guardian = @opts[:guardian] || Guardian.new
@search_context = @opts[:search_context] @search_context = @opts[:search_context]
@include_blurbs = @opts[:include_blurbs] || false
@limit = Search.per_facet * Search.facets.size @limit = Search.per_facet * Search.facets.size
@results = GroupedSearchResults.new(@opts[:type_filter]) @results = GroupedSearchResults.new(@opts[:type_filter])
@ -101,7 +102,7 @@ class Search
extra_posts = posts_query(expected_topics * Search.burst_factor) extra_posts = posts_query(expected_topics * Search.burst_factor)
extra_posts = extra_posts.where("posts.topic_id NOT in (?)", @results.topic_ids) if @results.topic_ids.present? extra_posts = extra_posts.where("posts.topic_id NOT in (?)", @results.topic_ids) if @results.topic_ids.present?
extra_posts.each do |p| extra_posts.each do |p|
@results.add_result(SearchResult.from_post(p, @search_context, @term)) @results.add_result(SearchResult.from_post(p, @search_context, @term, @include_blurbs))
end end
end end
end end
@ -213,7 +214,7 @@ class Search
posts.each do |p| posts.each do |p|
@results.add_result(SearchResult.from_post(p, @search_context, @term)) @results.add_result(SearchResult.from_post(p, @search_context, @term, @include_blurbs))
end end
end end

View File

@ -5,7 +5,7 @@ class Search
extend ActionView::Helpers::TextHelper extend ActionView::Helpers::TextHelper
end end
attr_accessor :type, :id, :topic_id attr_accessor :type, :id, :topic_id, :blurb
# Category attributes # Category attributes
attr_accessor :color, :text_color attr_accessor :color, :text_color
@ -16,7 +16,7 @@ class Search
def initialize(row) def initialize(row)
row.symbolize_keys! row.symbolize_keys!
@type = row[:type].to_sym @type = row[:type].to_sym
@url, @id, @title, @topic_id = row[:url], row[:id], row[:title], row[:topic_id] @url, @id, @title, @topic_id, @blurb = row[:url], row[:id], row[:title], row[:topic_id], row[:blurb]
end end
def as_json(options = nil) def as_json(options = nil)
@ -24,6 +24,7 @@ class Search
json[:avatar_template] = @avatar_template if @avatar_template.present? json[:avatar_template] = @avatar_template if @avatar_template.present?
json[:color] = @color if @color.present? json[:color] = @color if @color.present?
json[:text_color] = @text_color if @text_color.present? json[:text_color] = @text_color if @text_color.present?
json[:blurb] = @blurb if @blurb.present?
json json
end end
@ -40,11 +41,11 @@ class Search
end end
end end
def self.from_topic(t, custom_title=nil) def self.from_topic(t, options = {})
SearchResult.new(type: :topic, topic_id: t.id, id: t.id, title: custom_title || t.title, url: t.relative_url) SearchResult.new(type: :topic, topic_id: t.id, id: t.id, title: options[:custom_title] || t.title, url: t.relative_url, blurb: options[:custom_blurb])
end end
def self.from_post(p, context, term) def self.from_post(p, context, term, include_blurbs=false)
custom_title = custom_title =
if context && context.id == p.topic_id if context && context.id == p.topic_id
# TODO: rewrite this # TODO: rewrite this
@ -58,14 +59,18 @@ class Search
excerpt: excerpt excerpt: excerpt
) )
end end
if include_blurbs
#add a blurb from the post to the search results
custom_blurb = TextHelper.excerpt(p.raw, term.split(/\s+/)[0], radius: 100)
custom_blurb = TextHelper.truncate(p.raw, length: 200) if custom_blurb.blank?
end
if p.post_number == 1 if p.post_number == 1
# we want the topic link when it's the OP # we want the topic link when it's the OP
SearchResult.from_topic(p.topic, custom_title) SearchResult.from_topic(p.topic, {custom_title: custom_title, custom_blurb: custom_blurb})
elsif context && context.id == p.topic_id elsif context && context.id == p.topic_id
SearchResult.new(type: :topic, topic_id: p.topic_id, id: "_#{p.id}", title: custom_title, url: p.url) SearchResult.new(type: :topic, topic_id: p.topic_id, id: "_#{p.id}", title: custom_title, url: p.url, blurb: custom_blurb)
else else
SearchResult.new(type: :topic, topic_id: p.topic_id, id: p.topic.id, title: p.topic.title, url: p.url) SearchResult.new(type: :topic, topic_id: p.topic_id, id: p.topic.id, title: p.topic.title, url: p.url, blurb: custom_blurb)
end end
end end

View File

@ -5,6 +5,10 @@ require_dependency 'search'
describe Search do describe Search do
class TextHelper
extend ActionView::Helpers::TextHelper
end
before do before do
ActiveRecord::Base.observers.enable :search_observer ActiveRecord::Base.observers.enable :search_observer
end end
@ -175,13 +179,14 @@ describe Search do
end end
context 'searching the OP' do context 'searching the OP' do
let!(:post) { Fabricate(:post, topic: topic, user: topic.user) } let!(:post) { Fabricate(:post_with_long_raw_content, topic: topic, user: topic.user) }
let(:result) { first_of_type(Search.new('hello', type_filter: 'topic').execute, 'topic') } let(:result) { first_of_type(Search.new('hundred', type_filter: 'topic', include_blurbs: true).execute, 'topic') }
it 'returns a result correctly' do it 'returns a result correctly' do
result.should be_present result.should be_present
result[:title].should == topic.title result[:title].should == topic.title
result[:url].should == topic.relative_url result[:url].should == topic.relative_url
result[:blurb].should == TextHelper.excerpt(post.raw, 'hundred', radius: 100)
end end
end end

View File

@ -26,6 +26,17 @@ describe SearchController do
xhr :get, :query, term: 'test', type_filter: 'topic' xhr :get, :query, term: 'test', type_filter: 'topic'
end end
it "performs the query and returns results including blurbs" do
guardian = Guardian.new
Guardian.stubs(:new).returns(guardian)
search = mock()
Search.expects(:new).with('test', guardian: guardian, include_blurbs: true).returns(search)
search.expects(:execute)
xhr :get, :query, term: 'test', include_blurbs: 'true'
end
context "search context" do context "search context" do
it "raises an error with an invalid context type" do it "raises an error with an invalid context type" do

View File

@ -4,6 +4,12 @@ Fabricator(:post) do
raw "Hello world" raw "Hello world"
end end
Fabricator(:post_with_long_raw_content, from: :post) do
raw 'This is a sample post with semi-long raw content. The raw content is also more than
two hundred characters to satisfy any test conditions that require content longer
than the typical test post raw content.'
end
Fabricator(:post_with_youtube, from: :post) do Fabricator(:post_with_youtube, from: :post) do
cooked '<p><a href="http://www.youtube.com/watch?v=9bZkp7q19f0" class="onebox" target="_blank">http://www.youtube.com/watch?v=9bZkp7q19f0</a></p>' cooked '<p><a href="http://www.youtube.com/watch?v=9bZkp7q19f0" class="onebox" target="_blank">http://www.youtube.com/watch?v=9bZkp7q19f0</a></p>'
end end