|
1 | 1 | class MessagesController < ApplicationController |
2 | 2 | PER_PAGE = 50 |
3 | 3 |
|
4 | | - # GET /ruby-dev or /q=searchterm |
5 | | - def index(list_name: nil, yyyymm: nil, q: nil, page: nil) |
| 4 | + # GET /ruby-dev |
| 5 | + def index(list_name: nil, yyyymm: nil, q: nil) |
6 | 6 | if list_name |
7 | 7 | @list = List.find_by_name list_name |
8 | 8 |
|
9 | | - render_threads yyyymm: yyyymm |
10 | | - elsif q |
11 | | - search q, page |
| 9 | + render_threads yyyymm: yyyymm, q: q |
| 10 | + else |
| 11 | + redirect_to List.find_by_name('ruby-core') |
| 12 | + end |
| 13 | + end |
12 | 14 |
|
13 | | - render :search |
| 15 | + # GET /messages/search_all |
| 16 | + def search_all(q: nil, page: nil) |
| 17 | + if q |
| 18 | + search q, page |
14 | 19 | else |
15 | 20 | @messages = [] |
16 | | - |
17 | | - render :search |
18 | 21 | end |
19 | 22 | end |
20 | 23 |
|
@@ -59,38 +62,37 @@ def calculate_navigation_links |
59 | 62 | @next_message_in_thread = thread_messages[current_index + 1] if current_index |
60 | 63 | end |
61 | 64 |
|
62 | | - def render_threads(yyyymm: nil) |
63 | | - @yyyymms = Message.where(list_id: @list).order('yyyymm').pluck(Arel.sql "distinct to_char(published_at, 'YYYYMM') as yyyymm") |
64 | | - @yyyymm = yyyymm || @yyyymms.last |
| 65 | + def render_threads(yyyymm: nil, q: nil) |
| 66 | + root_query = Message.where(list_id: @list, parent_id: nil).order(:id) |
| 67 | + |
| 68 | + if q |
| 69 | + root_query.where!('body %> ?', q) |
| 70 | + else |
| 71 | + @yyyymms = Message.where(list_id: @list, parent_id: nil).order('yyyymm').pluck(Arel.sql "distinct to_char(published_at, 'YYYYMM') as yyyymm") |
| 72 | + @yyyymm = yyyymm || @yyyymms.last |
| 73 | + root_query.where!("to_char(published_at, 'YYYYMM') = ?", @yyyymm) |
| 74 | + end |
65 | 75 |
|
66 | | - root_query = Message.where(list_id: @list, parent_id: nil).where("to_char(published_at, 'YYYYMM') = ?", @yyyymm).order(:id) |
67 | 76 | messages = Message.with_recursive(parent_and_children: [root_query, Message.joins('inner join parent_and_children on messages.parent_id = parent_and_children.id')]) |
68 | 77 | .joins('inner join parent_and_children on parent_and_children.id = messages.id') |
69 | 78 |
|
70 | 79 | @messages = compose_tree(messages) |
71 | 80 |
|
72 | | - render :index |
73 | | - end |
74 | | - |
75 | | - def get_list_ids(params) |
76 | | - list_ids = [] |
77 | | - ['ruby-talk', 'ruby-core', 'ruby-list', 'ruby-dev'].each do |name| |
78 | | - if params[name.tr('-', '_').to_sym] != '0' |
79 | | - list_ids << List.find_by_name(name).id |
80 | | - end |
| 81 | + if q |
| 82 | + @yyyymms = @messages.map { it.published_at.strftime('%Y%m') }.uniq |
| 83 | + @yyyymm = @yyyymms.last |
81 | 84 | end |
82 | | - list_ids |
| 85 | + |
| 86 | + render :index |
83 | 87 | end |
84 | 88 |
|
85 | 89 | def search(query, page) |
86 | | - list_ids = get_list_ids(params) |
87 | | - if list_ids.empty? |
88 | | - raise "Need to select at least one list" |
89 | | - end |
| 90 | + lists = List.all.select { params[it.name] != '0' } |
| 91 | + raise "Need to select at least one list" if lists.empty? |
90 | 92 |
|
91 | 93 | # %> and <-> are defined by pg_trgm. |
92 | 94 | # https://www.postgresql.org/docs/17/pgtrgm.html |
93 | | - message_where = Message.where('body %> ? AND list_id IN (?)', query, list_ids).order(Arel.sql('body <-> ?', query)) |
| 95 | + message_where = Message.where('body %> ? AND list_id IN (?)', query, lists.map(&:id)).order(Arel.sql('body <-> ?', query)) |
94 | 96 | @messages = message_where.offset(page.to_i * PER_PAGE).limit(PER_PAGE) |
95 | 97 | end |
96 | 98 |
|
|
0 commit comments