FIX: Apply category priority for empty query (#9516)
This commit is contained in:
parent
ec84b00aff
commit
6e01acb3cb
|
@ -904,13 +904,37 @@ class Search
|
||||||
posts = categories_ignored(posts) unless @category_filter_matched
|
posts = categories_ignored(posts) unless @category_filter_matched
|
||||||
posts
|
posts
|
||||||
end
|
end
|
||||||
|
if @order == :latest
|
||||||
if @order == :latest || (@term.blank? && !@order)
|
|
||||||
if opts[:aggregate_search]
|
if opts[:aggregate_search]
|
||||||
posts = posts.order("MAX(posts.created_at) DESC")
|
posts = posts.order("MAX(posts.created_at) DESC")
|
||||||
else
|
else
|
||||||
posts = posts.reorder("posts.created_at DESC")
|
posts = posts.reorder("posts.created_at DESC")
|
||||||
end
|
end
|
||||||
|
elsif @term.blank? && !@order
|
||||||
|
data_ranking = <<~SQL
|
||||||
|
(
|
||||||
|
CASE categories.search_priority
|
||||||
|
WHEN #{Searchable::PRIORITIES[:very_low]}
|
||||||
|
THEN #{SiteSetting.category_search_priority_very_low_weight}
|
||||||
|
WHEN #{Searchable::PRIORITIES[:low]}
|
||||||
|
THEN #{SiteSetting.category_search_priority_low_weight}
|
||||||
|
WHEN #{Searchable::PRIORITIES[:high]}
|
||||||
|
THEN #{SiteSetting.category_search_priority_high_weight}
|
||||||
|
WHEN #{Searchable::PRIORITIES[:very_high]}
|
||||||
|
THEN #{SiteSetting.category_search_priority_very_high_weight}
|
||||||
|
ELSE
|
||||||
|
CASE WHEN topics.closed
|
||||||
|
THEN 0.9
|
||||||
|
ELSE 1
|
||||||
|
END
|
||||||
|
END
|
||||||
|
)
|
||||||
|
SQL
|
||||||
|
if opts[:aggregate_search]
|
||||||
|
posts = posts.order("MAX(#{data_ranking}) DESC").order("MAX(posts.created_at) DESC")
|
||||||
|
else
|
||||||
|
posts = posts.order("#{data_ranking} DESC").order("posts.created_at DESC")
|
||||||
|
end
|
||||||
elsif @order == :latest_topic
|
elsif @order == :latest_topic
|
||||||
if opts[:aggregate_search]
|
if opts[:aggregate_search]
|
||||||
posts = posts.order("MAX(topics.created_at) DESC")
|
posts = posts.order("MAX(topics.created_at) DESC")
|
||||||
|
|
|
@ -219,6 +219,70 @@ describe SearchController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "search priority" do
|
||||||
|
fab!(:low_priority_category) do
|
||||||
|
Fabricate(
|
||||||
|
:category,
|
||||||
|
search_priority: Searchable::PRIORITIES[:very_low]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
fab!(:high_priority_category) do
|
||||||
|
Fabricate(
|
||||||
|
:category,
|
||||||
|
search_priority: Searchable::PRIORITIES[:high]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
fab!(:very_high_priority_category) do
|
||||||
|
Fabricate(
|
||||||
|
:category,
|
||||||
|
search_priority: Searchable::PRIORITIES[:very_high]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
fab!(:low_priority_topic) { Fabricate(:topic, category: low_priority_category) }
|
||||||
|
fab!(:high_priority_topic) { Fabricate(:topic, category: high_priority_category) }
|
||||||
|
fab!(:very_high_priority_topic) { Fabricate(:topic, category: very_high_priority_category) }
|
||||||
|
fab!(:low_priority_post) do
|
||||||
|
SearchIndexer.enable
|
||||||
|
Fabricate(:post, topic: low_priority_topic, raw: "This is a Low Priority Post")
|
||||||
|
end
|
||||||
|
fab!(:hight_priority_post) do
|
||||||
|
SearchIndexer.enable
|
||||||
|
Fabricate(:post, topic: high_priority_topic, raw: "This is a High Priority Post")
|
||||||
|
end
|
||||||
|
fab!(:old_very_hight_priority_post) do
|
||||||
|
SearchIndexer.enable
|
||||||
|
Fabricate(:old_post, topic: very_high_priority_topic, raw: "This is a Old but Very High Priority Post")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "sort posts with search priority when search term is empty" do
|
||||||
|
get "/search.json", params: { q: 'status:open' }
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
data = JSON.parse(response.body)
|
||||||
|
post1 = data["posts"].find { |e| e["id"] == old_very_hight_priority_post.id }
|
||||||
|
post2 = data["posts"].find { |e| e["id"] == low_priority_post.id }
|
||||||
|
expect(data["posts"][0]["id"]).to eq(old_very_hight_priority_post.id)
|
||||||
|
expect(post1["id"]).to be > post2["id"]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "sort posts with search priority when no order query" do
|
||||||
|
get "/search.json", params: { q: 'status:open Priority Post' }
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
data = JSON.parse(response.body)
|
||||||
|
expect(data["posts"][0]["id"]).to eq(old_very_hight_priority_post.id)
|
||||||
|
expect(data["posts"][1]["id"]).to eq(hight_priority_post.id)
|
||||||
|
expect(data["posts"][2]["id"]).to eq(low_priority_post.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't sort posts with search piority when query with order" do
|
||||||
|
get "/search.json", params: { q: 'status:open order:latest Priority Post' }
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
data = JSON.parse(response.body)
|
||||||
|
expect(data["posts"][0]["id"]).to eq(hight_priority_post.id)
|
||||||
|
expect(data["posts"][1]["id"]).to eq(low_priority_post.id)
|
||||||
|
expect(data["posts"][2]["id"]).to eq(old_very_hight_priority_post.id)
|
||||||
|
end
|
||||||
|
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
|
||||||
get "/search/query.json", params: {
|
get "/search/query.json", params: {
|
||||||
|
|
Loading…
Reference in New Issue