@@ -163,17 +163,51 @@ def self.word_to_date(str)
163163 end
164164 end
165165
166+ register_filter ( /\A max_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 ( /\A order:latest\z /i ) do |relation , order_str , filter |
172+ filter . set_order! ( :latest_post )
173+ relation
174+ end
175+
176+ register_filter ( /\A order:oldest\z /i ) do |relation , order_str , filter |
177+ filter . set_order! ( :oldest_post )
178+ relation
179+ end
180+
181+ register_filter ( /\A order:latest_topic\z /i ) do |relation , order_str , filter |
182+ filter . set_order! ( :latest_topic )
183+ relation
184+ end
185+
186+ register_filter ( /\A order: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 =~ /\A order:(\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
0 commit comments