From 5f6e0135e15184b0aa53d6814a8246bff6dc56f7 Mon Sep 17 00:00:00 2001
From: Masahiro Ikeda <ikedamsh@oss.nttdata.com>
Date: Sat, 6 Feb 2021 17:26:58 +0900
Subject: [PATCH] [wip] add an search option to aggregate into threads

---
 media/css/main.css               |  5 +++++
 pgweb/search/views.py            | 10 ++++++++--
 templates/search/listsearch.html | 13 ++++++++++++-
 3 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/media/css/main.css b/media/css/main.css
index cb74f211..33e5c6c8 100644
--- a/media/css/main.css
+++ b/media/css/main.css
@@ -1218,6 +1218,11 @@ input#allsites {
   margin-left: 0;
 }
 
+input#aggregate {
+  margin-top: 10px;
+  margin-left: 0;
+}
+
 input.form-control {
   height: 2.5em;
   margin: auto 0;
diff --git a/pgweb/search/views.py b/pgweb/search/views.py
index 5f0df75b..adbeb612 100644
--- a/pgweb/search/views.py
+++ b/pgweb/search/views.py
@@ -105,6 +105,8 @@ def search(request):
         if not dateval:
             dateval = 365
 
+        aggregate = request.GET.get('t', None) == "1"
+
         sortoptions = (
             {'val': 'r', 'text': 'Rank', 'selected': request.GET.get('s', '') not in ('d', 'i')},
             {'val': 'd', 'text': 'Date', 'selected': request.GET.get('s', '') == 'd'},
@@ -133,6 +135,7 @@ def search(request):
                 'listid': listid,
                 'dates': dateoptions,
                 'dateval': dateval,
+                'aggregate': aggregate,
             })
         else:
             return render(request, 'search/sitesearch.html', {
@@ -165,6 +168,7 @@ def search(request):
         p = {
             'q': query.encode('utf-8'),
             's': listsort,
+            't': aggregate and "1" or "0"
         }
         if listid:
             if listid < 0:
@@ -224,11 +228,12 @@ def search(request):
                 return HttpResponseRedirect("/message-id/%s" % query)
 
         totalhits = len(hits)
-        querystr = "?m=1&q=%s&l=%s&d=%s&s=%s" % (
+        querystr = "?m=1&q=%s&l=%s&d=%s&s=%s&t=%s" % (
             urllib.parse.quote_plus(query.encode('utf-8')),
             listid or '',
             dateval,
-            listsort
+            listsort,
+            aggregate and "1" or "0"
         )
 
         return render(request, 'search/listsearch.html', {
@@ -253,6 +258,7 @@ def search(request):
             'listid': listid,
             'dates': dateoptions,
             'dateval': dateval,
+            'aggregate': aggregate,
         })
 
     else:
diff --git a/templates/search/listsearch.html b/templates/search/listsearch.html
index 4d07ded3..e1b7d219 100644
--- a/templates/search/listsearch.html
+++ b/templates/search/listsearch.html
@@ -39,6 +39,12 @@
           <option value="{{s.val}}"{%if s.selected%} SELECTED{%endif%}>{{s.text}}</option>{%endfor%}
          </select>
       </div>
+      <div class="form-check search">
+        <input class="form-check-input" type="checkbox" value="1" {%if aggregate%}checked="checked"{%endif%} name="t" id="aggregate">
+        <label class="form-check-label" for="aggregate">
+          Aggregate into threads
+        </label>
+      </div>
     </div><!-- /.col-lg-6 -->
   </div><!-- /.row -->
 </form>
@@ -53,7 +59,12 @@
     <h2>Results {{firsthit}}-{{lasthit}} of {%if hitcount == 1000%}more than 1000{%else%}{{hitcount}}{%endif%}.</h2>
     {%if pagelinks %}Result pages: {{pagelinks|safe}}<br/><br/>{%endif%}
     {%for hit in hits %}
-      {{forloop.counter0|add:firsthit}}. <a href="https://www.postgresql.org/message-id/{{hit.messageid}}">{{hit.subject}}</a> [{{hit.rank|floatformat:2}}]<br/>
+      {{forloop.counter0|add:firsthit}}. 
+        {%if aggregate%}
+          <a href="https://www.postgresql.org/message-id/flat/{{hit.messageid}}">{{hit.subject}}</a> [{{hit.rank|floatformat:2}}]<br/>
+        {%else%}
+          <a href="https://www.postgresql.org/message-id/{{hit.messageid}}">{{hit.subject}}</a> [{{hit.rank|floatformat:2}}]<br/>
+        {%endif%}
       From {{hit.author}} on {{hit.date}}.<br/>
       {{hit.abstract|safe}}<br/>
       <a href="https://www.postgresql.org/message-id/{{hit.messageid}}">https://www.postgresql.org/message-id/{{hit.messageid}}</a><br/>
-- 
2.25.1

