Browse Source

Fix pagination

master
Dylan Baker 8 months ago
parent
commit
1ec97c1fc4
2 changed files with 38 additions and 7 deletions
  1. 33
    5
      lib/search.rb
  2. 5
    2
      web/server.rb

+ 33
- 5
lib/search.rb View File

11
   username = params[:username].strip
11
   username = params[:username].strip
12
   from_date = params[:from_date].strip
12
   from_date = params[:from_date].strip
13
   to_date = params[:to_date].strip
13
   to_date = params[:to_date].strip
14
-  sort = params[:sort].strip
14
+  sort = (params[:sort] || "").strip
15
   exact_match = params[:exact_match].strip == "yes"
15
   exact_match = params[:exact_match].strip == "yes"
16
 
16
 
17
   errors = Array.new
17
   errors = Array.new
65
     .limit(RESULTS_PER_PAGE)
65
     .limit(RESULTS_PER_PAGE)
66
     .offset(Sequel.lit('?', offset))
66
     .offset(Sequel.lit('?', offset))
67
 
67
 
68
+  count_query = VLV::Thread
69
+    .select(Sequel.lit('count(*) as full_count'))
70
+    .where(Sequel.lit("(LOWER(threads.creator) = LOWER(?) OR ? = '')", username, username))
71
+    .where(Sequel.lit("created_at >= ? OR ? IS NULL", from_date, from_date))
72
+    .where(Sequel.lit("created_at >= ? OR ? IS NULL", to_date, to_date))
73
+
68
   if exact_match
74
   if exact_match
69
-    query.where(Sequel.ilike(:title, "%#{q}%"))
75
+    filter = Sequel.ilike(:title, "%#{q}%")
76
+    result = query.where(filter)
77
+    full_count = count_query.where(filter).first.values[:full_count]
78
+    [full_count, result]
70
   else
79
   else
71
-    query.full_text_search(:title, Sequel.lit("websearch_to_tsquery(?)", q), tsquery: true, language: 'english')
80
+    result = query.full_text_search(:title, Sequel.lit("websearch_to_tsquery(?)", q), tsquery: true, language: 'english')
81
+    full_count = count_query.full_text_search(
82
+      :title, Sequel.lit("websearch_to_tsquery(?)", q), tsquery: true, language: 'english'
83
+    ).first.values[:full_count]
84
+    [full_count, result]
72
   end
85
   end
73
 end
86
 end
74
 
87
 
83
     .offset(Sequel.lit('?', offset))
96
     .offset(Sequel.lit('?', offset))
84
     .order(Sequel.desc(Sequel.lit('posts.created_at')))
97
     .order(Sequel.desc(Sequel.lit('posts.created_at')))
85
 
98
 
99
+  count_query = VLV::Post
100
+    .select(Sequel.lit('count(*) as full_count'))
101
+    .join(Sequel.lit('threads on posts.thread_id = threads.id'))
102
+    .where(Sequel.lit("(LOWER(posts.creator) = LOWER(?) OR (? = ''))", username, username))
103
+    .where(Sequel.lit("posts.created_at >= ? OR ? IS NULL", from_date, from_date))
104
+    .where(Sequel.lit("posts.created_at >= ? OR ? IS NULL", to_date, to_date))
105
+
86
   if exact_match
106
   if exact_match
87
-    query.where(Sequel.ilike(:body, "%#{q}%"))
107
+    result = query.where(Sequel.ilike(:body, "%#{q}%"))
108
+    full_count = count_query.where(Sequel.ilike(:body, "%#{q}%")).first.values[:full_count]
109
+    [full_count, result]
88
   else
110
   else
89
-    query.full_text_search(:tsv, Sequel.lit("websearch_to_tsquery(?)", q), {
111
+    result = query.full_text_search(:tsv, Sequel.lit("websearch_to_tsquery(?)", q), {
90
       tsquery: true,
112
       tsquery: true,
91
       tsvector: true,
113
       tsvector: true,
92
       language: 'english'
114
       language: 'english'
93
     })
115
     })
116
+    full_count = count_query.full_text_search(:tsv, Sequel.lit("websearch_to_tsquery(?)", q), {
117
+      tsquery: true,
118
+      tsvector: true,
119
+      language: 'english'
120
+    }).first.values[:full_count]
121
+    [full_count, result]
94
   end
122
   end
95
 end
123
 end

+ 5
- 2
web/server.rb View File

44
     unless results[:errors].empty?
44
     unless results[:errors].empty?
45
       erb :results, { locals: {errors: results[:errors]}, layout: :layout }
45
       erb :results, { locals: {errors: results[:errors]}, layout: :layout }
46
     else
46
     else
47
-      params[:current_count] = results[:results].to_a.size
47
+      full_count, records = results[:results]
48
+      params[:current_count] = records.to_a.size
49
+      params[:full_count] = full_count
48
       previous_url, next_url = build_urls(params)
50
       previous_url, next_url = build_urls(params)
49
 
51
 
50
       locals =
52
       locals =
51
         params.merge(
53
         params.merge(
52
-          results: results[:results],
54
+          results: records,
53
           previous_url: previous_url,
55
           previous_url: previous_url,
54
           next_url: next_url,
56
           next_url: next_url,
55
           errors: Array.new,
57
           errors: Array.new,
99
       url_params[:username] = params[:username] if params[:username]
101
       url_params[:username] = params[:username] if params[:username]
100
       url_params[:from_date] = params[:from_date] if params[:from_date]
102
       url_params[:from_date] = params[:from_date] if params[:from_date]
101
       url_params[:to_date] = params[:to_date] if params[:to_date]
103
       url_params[:to_date] = params[:to_date] if params[:to_date]
104
+      url_params[:exact_match] = params[:exact_match] if params[:exact_match]
102
 
105
 
103
       [
106
       [
104
         URI::Generic.build(
107
         URI::Generic.build(

Loading…
Cancel
Save