Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit c015766

Browse files
committed
add support for order
1 parent 2fab739 commit c015766

File tree

3 files changed

+51
-7
lines changed

3 files changed

+51
-7
lines changed

lib/personas/tools/researcher.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ def filter_description
3939
- groups (group:group1,group2).
4040
- status (status:open, status:closed, status:archived, status:noreplies, status:single_user)
4141
- keywords (keywords:keyword1,keyword2) - specific words to search for in posts
42+
- max_results (max_results:10) the maximum number of results to return (optional)
43+
- order (order:latest, order:oldest, order:latest_topic, order:oldest_topic) - the order of the results (optional)
4244
4345
If multiple tags or categories are specified, they are treated as OR conditions.
4446

lib/utils/research/filter.rb

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,51 @@ def self.word_to_date(str)
163163
end
164164
end
165165

166+
register_filter(/\Amax_results:(\d+)\z/i) do |relation, limit_str, filter|
167+
filter.limit_by_user!(limit_str.to_i)
168+
relation
169+
end
170+
171+
register_filter(/\Aorder:latest\z/i) do |relation, order_str, filter|
172+
filter.set_order!(:latest_post)
173+
relation
174+
end
175+
176+
register_filter(/\Aorder:oldest\z/i) do |relation, order_str, filter|
177+
filter.set_order!(:oldest_post)
178+
relation
179+
end
180+
181+
register_filter(/\Aorder:latest_topic\z/i) do |relation, order_str, filter|
182+
filter.set_order!(:latest_topic)
183+
relation
184+
end
185+
186+
register_filter(/\Aorder:oldest_topic\z/i) do |relation, order_str, filter|
187+
filter.set_order!(:oldest_topic)
188+
relation
189+
end
190+
166191
def initialize(term, guardian: nil, limit: nil, offset: nil)
167192
@term = term.to_s
168193
@guardian = guardian || Guardian.new
169194
@limit = limit
170195
@offset = offset
171196
@filters = []
172197
@valid = true
198+
@order = :latest_post
173199

174200
@term = process_filters(@term)
175201
end
176202

203+
def set_order!(order)
204+
@order = order
205+
end
206+
207+
def limit_by_user!(limit)
208+
@limit = limit if limit.to_i < @limit.to_i || @limit.nil?
209+
end
210+
177211
def search
178212
filtered = Post.secured(@guardian).joins(:topic).merge(Topic.secured(@guardian))
179213

@@ -184,6 +218,16 @@ def search
184218
filtered = filtered.limit(@limit) if @limit.to_i > 0
185219
filtered = filtered.offset(@offset) if @offset.to_i > 0
186220

221+
if @order == :latest_post
222+
filtered = filtered.order("posts.created_at DESC")
223+
elsif @order == :oldest_post
224+
filtered = filtered.order("posts.created_at ASC")
225+
elsif @order == :latest_topic
226+
filtered = filtered.order("topics.created_at DESC, posts.post_number DESC")
227+
elsif @order == :oldest_topic
228+
filtered = filtered.order("topics.created_at ASC, posts.post_number ASC")
229+
end
230+
187231
filtered
188232
end
189233

@@ -199,13 +243,6 @@ def process_filters(term)
199243
.map do |(word, _)|
200244
next if word.blank?
201245

202-
# Check for order:xxx syntax
203-
if word =~ /\Aorder:(\w+)\z/i
204-
@order = $1.downcase.to_sym
205-
next nil
206-
end
207-
208-
# Check registered filters
209246
found = false
210247
self.class.registered_filters.each do |matcher, block|
211248
if word =~ matcher

spec/lib/utils/research/filter_spec.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@
9292
end
9393
end
9494

95+
it "can limit number of results" do
96+
filter = described_class.new("category:Feedback max_results:1", limit: 5)
97+
expect(filter.search.pluck(:id).length).to eq(1)
98+
end
99+
95100
describe "full text keyword searching" do
96101
before_all { SearchIndexer.enable }
97102
fab!(:post_with_apples) do

0 commit comments

Comments
 (0)