mirror of
https://github.com/discourse/discourse.git
synced 2025-06-07 12:26:01 +08:00
FEATURE: allow searching for oldest topics (#21715)
In some cases reverse chronological can be very important. - Oldest post by sam - Oldest topic by sam Prior to these new filters we had no way of searching for them. Now the 2 new orders `order:oldest` and `order:oldest_topic` can be used to find oldest topics and posts * Update spec/lib/search_spec.rb Co-authored-by: Alan Guo Xiang Tan <gxtan1990@gmail.com> * Update spec/lib/search_spec.rb Co-authored-by: Alan Guo Xiang Tan <gxtan1990@gmail.com> --------- Co-authored-by: Alan Guo Xiang Tan <gxtan1990@gmail.com>
This commit is contained in:
@ -1124,12 +1124,24 @@ class Search
|
|||||||
else
|
else
|
||||||
posts = posts.reorder("posts.created_at DESC")
|
posts = posts.reorder("posts.created_at DESC")
|
||||||
end
|
end
|
||||||
|
elsif @order == :oldest
|
||||||
|
if aggregate_search
|
||||||
|
posts = posts.order("MAX(posts.created_at) ASC")
|
||||||
|
else
|
||||||
|
posts = posts.reorder("posts.created_at ASC")
|
||||||
|
end
|
||||||
elsif @order == :latest_topic
|
elsif @order == :latest_topic
|
||||||
if aggregate_search
|
if aggregate_search
|
||||||
posts = posts.order("MAX(topics.created_at) DESC")
|
posts = posts.order("MAX(topics.created_at) DESC")
|
||||||
else
|
else
|
||||||
posts = posts.order("topics.created_at DESC")
|
posts = posts.order("topics.created_at DESC")
|
||||||
end
|
end
|
||||||
|
elsif @order == :oldest_topic
|
||||||
|
if aggregate_search
|
||||||
|
posts = posts.order("MAX(topics.created_at) ASC")
|
||||||
|
else
|
||||||
|
posts = posts.order("topics.created_at ASC")
|
||||||
|
end
|
||||||
elsif @order == :views
|
elsif @order == :views
|
||||||
if aggregate_search
|
if aggregate_search
|
||||||
posts = posts.order("MAX(topics.views) DESC")
|
posts = posts.order("MAX(topics.views) DESC")
|
||||||
|
@ -2002,6 +2002,17 @@ RSpec.describe Search do
|
|||||||
expect(Search.execute("l sam").posts.map(&:id)).to eq([post2.id, post1.id])
|
expect(Search.execute("l sam").posts.map(&:id)).to eq([post2.id, post1.id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "can find by oldest" do
|
||||||
|
topic1 = Fabricate(:topic, title: "I do not like that Sam I am")
|
||||||
|
post1 = Fabricate(:post, topic: topic1, raw: "sam is a sam sam sam") # score higher
|
||||||
|
|
||||||
|
topic2 = Fabricate(:topic, title: "I do not like that Sam I am 2", created_at: 5.minutes.ago)
|
||||||
|
post2 = Fabricate(:post, topic: topic2, created_at: 5.minutes.ago)
|
||||||
|
|
||||||
|
expect(Search.execute("sam").posts.map(&:id)).to eq([post1.id, post2.id])
|
||||||
|
expect(Search.execute("sam ORDER:oldest").posts.map(&:id)).to eq([post2.id, post1.id])
|
||||||
|
end
|
||||||
|
|
||||||
it "can order by topic creation" do
|
it "can order by topic creation" do
|
||||||
today = Date.today
|
today = Date.today
|
||||||
yesterday = 1.day.ago
|
yesterday = 1.day.ago
|
||||||
@ -2039,6 +2050,13 @@ RSpec.describe Search do
|
|||||||
expect(Search.execute("Topic order:latest_topic").posts.map(&:id)).to eq(
|
expect(Search.execute("Topic order:latest_topic").posts.map(&:id)).to eq(
|
||||||
[category.topic.first_post.id, latest_irrelevant_topic_post.id, old_relevant_topic_post.id],
|
[category.topic.first_post.id, latest_irrelevant_topic_post.id, old_relevant_topic_post.id],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# push weight to the front to ensure test is correct and is not just a coincidence
|
||||||
|
latest_irrelevant_topic_post.update!(raw: "Topic Topic Topic")
|
||||||
|
|
||||||
|
expect(Search.execute("Topic order:oldest_topic").posts.map(&:id)).to eq(
|
||||||
|
[old_relevant_topic_post.id, latest_irrelevant_topic_post.id, category.topic.first_post.id],
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "can order by topic views" do
|
it "can order by topic views" do
|
||||||
|
Reference in New Issue
Block a user