aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Czygan <martin@archive.org>2019-11-15 22:51:20 +0000
committerMartin Czygan <martin@archive.org>2019-11-15 22:51:20 +0000
commita8d352ff76226bafeecebde6aaaad5d98dc3102a (patch)
tree9e5cbd44dad2f309c316119e5971acf240919ca1
parenta6bcbac233e27652913668ca63c102e4d071d437 (diff)
parent0e4d65c773f586cc5cdafe8049e344a26688f710 (diff)
downloadfatcat-a8d352ff76226bafeecebde6aaaad5d98dc3102a.tar.gz
fatcat-a8d352ff76226bafeecebde6aaaad5d98dc3102a.zip
Merge branch 'martin-search-results-pagination' into 'master'
Add basic pagination to search results See merge request webgroup/fatcat!4
-rw-r--r--python/fatcat_web/routes.py9
-rw-r--r--python/fatcat_web/search.py27
-rw-r--r--python/fatcat_web/templates/container_search.html10
-rw-r--r--python/fatcat_web/templates/entity_macros.html40
-rw-r--r--python/fatcat_web/templates/release_search.html11
-rw-r--r--python/tests/web_search.py5
6 files changed, 82 insertions, 20 deletions
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py
index 79b594e3..a41f388d 100644
--- a/python/fatcat_web/routes.py
+++ b/python/fatcat_web/routes.py
@@ -673,9 +673,12 @@ def release_search():
if container_id and query:
query += ' container_id:"{}"'.format(container_id)
+ offset = request.args.get('offset', '0')
+ offset = max(0, int(offset)) if offset.isnumeric() else 0
+
if 'q' in request.args.keys():
# always do files for HTML
- found = do_release_search(query, fulltext_only=fulltext_only)
+ found = do_release_search(query, fulltext_only=fulltext_only, offset=offset)
return render_template('release_search.html', found=found, query=query, fulltext_only=fulltext_only)
else:
return render_template('release_search.html', query=query, fulltext_only=fulltext_only)
@@ -684,10 +687,12 @@ def release_search():
def container_search():
query = request.args.get('q')
+ offset = request.args.get('offset', '0')
+ offset = max(0, int(offset)) if offset.isnumeric() else 0
if 'q' in request.args.keys():
# always do files for HTML
- found = do_container_search(query)
+ found = do_container_search(query, offset=offset)
return render_template('container_search.html', found=found, query=query)
else:
return render_template('container_search.html', query=query)
diff --git a/python/fatcat_web/search.py b/python/fatcat_web/search.py
index 52f05f71..7c60a6dd 100644
--- a/python/fatcat_web/search.py
+++ b/python/fatcat_web/search.py
@@ -11,15 +11,20 @@ import requests
from flask import abort, flash
from fatcat_web import app
+def do_search(index, request, limit=30, offset=0, deep_page_limit=2000):
-def do_search(index, request, limit=30):
-
+ # Sanity checks
if limit > 100:
- # Sanity check
limit = 100
+ if offset < 0:
+ offset = 0
+ if offset > deep_page_limit:
+ # Avoid deep paging problem.
+ offset = deep_page_limit
request["size"] = int(limit)
- #print(request)
+ request["from"] = int(offset)
+ # print(request)
resp = requests.get("%s/%s/_search" %
(app.config['ELASTICSEARCH_BACKEND'], index),
json=request)
@@ -45,10 +50,12 @@ def do_search(index, request, limit=30):
return {"count_returned": len(results),
"count_found": content['hits']['total'],
- "results": results }
+ "results": results,
+ "offset": offset,
+ "deep_page_limit": deep_page_limit}
-def do_release_search(q, limit=30, fulltext_only=True):
+def do_release_search(q, limit=30, fulltext_only=True, offset=0):
#print("Search hit: " + q)
if limit > 100:
@@ -75,17 +82,18 @@ def do_release_search(q, limit=30, fulltext_only=True):
},
}
- resp = do_search(app.config['ELASTICSEARCH_RELEASE_INDEX'], search_request)
+ resp = do_search(app.config['ELASTICSEARCH_RELEASE_INDEX'], search_request, offset=offset)
for h in resp['results']:
# Ensure 'contrib_names' is a list, not a single string
if type(h['contrib_names']) is not list:
h['contrib_names'] = [h['contrib_names'], ]
h['contrib_names'] = [name.encode('utf8', 'ignore').decode('utf8') for name in h['contrib_names']]
resp["query"] = { "q": q }
+ resp["limit"] = limit
return resp
-def do_container_search(q, limit=30):
+def do_container_search(q, limit=30, offset=0):
# Convert raw ISSN-L to ISSN-L query
if len(q.split()) == 1 and len(q) == 9 and q[0:4].isdigit() and q[4] == '-':
@@ -103,8 +111,9 @@ def do_container_search(q, limit=30):
},
}
- resp = do_search(app.config['ELASTICSEARCH_CONTAINER_INDEX'], search_request, limit=limit)
+ resp = do_search(app.config['ELASTICSEARCH_CONTAINER_INDEX'], search_request, limit=limit, offset=offset)
resp["query"] = { "q": q }
+ resp["limit"] = limit
return resp
def get_elastic_entity_stats():
diff --git a/python/fatcat_web/templates/container_search.html b/python/fatcat_web/templates/container_search.html
index 7f6799dd..48c613f8 100644
--- a/python/fatcat_web/templates/container_search.html
+++ b/python/fatcat_web/templates/container_search.html
@@ -1,3 +1,4 @@
+{% import "entity_macros.html" as entity_macros %}
{% extends "base.html" %}
{% block title %}
@@ -30,7 +31,8 @@
{% if found %}
{% if found.results %}
- <i>Showing top {{ found.count_returned }} out of {{ found.count_found }} results for: <code>{{ found.query.q }}</code></i>
+ {{ entity_macros.top_results(found) }}
+
{% for entity in found.results %}
<div>
<h4 style="margin-top: 1em; margin-bottom: 4px; font-size: 1.1em;">
@@ -49,8 +51,10 @@
</div>
{% endfor %}
{% if found.results|length > 8 %}
- <br>
- <i>Showing top {{ found.count_returned }} out of {{ found.count_found }} results for: <code>{{ found.query.q }}</code></i>
+ <div class="ui divider"></div>
+ <div style="text-align: center">
+ {{ entity_macros.bottom_results(found)}}
+ </div>
{% endif %}
{% else %}
diff --git a/python/fatcat_web/templates/entity_macros.html b/python/fatcat_web/templates/entity_macros.html
index fc199c21..390327bc 100644
--- a/python/fatcat_web/templates/entity_macros.html
+++ b/python/fatcat_web/templates/entity_macros.html
@@ -234,3 +234,43 @@ yellow
{% endif %}
{%- endmacro %}
+{% macro top_results(found) -%}
+
+<i>Showing
+ {% if found.offset == 0 %}
+ first
+ {% else %}
+ results {{ found.offset }} &mdash;
+ {% endif %}
+
+ {{ found.offset + found.count_returned }}
+ out of {{ found.count_found }} results
+</i>
+
+{%- endmacro %}
+
+
+{% macro bottom_results(found) -%}
+
+{% if found.offset > 0 %}
+ {% if found.offset - found.limit < 0 %}
+ <a href="{{ url_for('release_search', q=found.query.q, offset=0) }}">&#xab; Previous</a>
+ {% else %}
+ <a href="{{ url_for('release_search', q=found.query.q, offset=found.offset - found.limit) }}">&#xab; Previous</a>
+ {% endif %}
+{% else %}
+ <span style="color:gray">&#xab; Previous</span>
+{% endif %}
+
+&nbsp;&nbsp;<i>Showing results {{ found.offset }} &mdash; {{ found.offset +
+found.count_returned }} out of {{ found.count_found }} results</i>&nbsp;&nbsp;
+
+{% if found.offset + found.limit < found.count_found and found.offset + found.limit < found.deep_page_limit %}
+ <a href="{{ url_for('release_search', q=found.query.q, offset=found.offset + found.limit) }}">Next &#xbb;</a>
+ {% else %}
+ <span style="color:gray">Next &#xbb;</span>
+{% endif %}
+
+</div>
+
+{%- endmacro %} \ No newline at end of file
diff --git a/python/fatcat_web/templates/release_search.html b/python/fatcat_web/templates/release_search.html
index 7d6b0443..47f4330a 100644
--- a/python/fatcat_web/templates/release_search.html
+++ b/python/fatcat_web/templates/release_search.html
@@ -36,13 +36,16 @@
{% if found %}
{% if found.results %}
- <i>Showing top {{ found.count_returned }} out of {{ found.count_found }} results for: <code>{{ found.query.q }}</code></i>
-{% for paper in found.results %}
+ {{ entity_macros.top_results(found) }}
+
+ {% for paper in found.results %}
{{ entity_macros.release_search_result_row(paper) }}
{% endfor %}
{% if found.results|length > 8 %}
- <br>
- <i>Showing top {{ found.count_returned }} out of {{ found.count_found }} results for: <code>{{ found.query.q }}</code></i>
+ <div class="ui divider"></div>
+ <div style="text-align: center">
+ {{ entity_macros.bottom_results(found)}}
+ </div>
{% endif %}
{% else %}
diff --git a/python/tests/web_search.py b/python/tests/web_search.py
index bdd858d0..19e2c29f 100644
--- a/python/tests/web_search.py
+++ b/python/tests/web_search.py
@@ -16,7 +16,8 @@ def test_release_search(app):
rv = app.get('/release/search?q=blood')
assert rv.status_code == 200
- assert b"Showing top " in rv.data
+ assert b"Showing" in rv.data
+ assert b"Quantum Studies of Acetylene Adsorption on Ice Surface" in rv.data
@responses.activate
def test_container_search(app):
@@ -29,7 +30,7 @@ def test_container_search(app):
rv = app.get('/container/search?q=blood')
assert rv.status_code == 200
- assert b"Showing top " in rv.data
+ assert b"Showing" in rv.data
assert b"European Instructional Course Lectures" in rv.data
assert b"British Editorial Society of Bone and Joint Surger" in rv.data