Added option to choose results per page

This commit is contained in:
Simon 2018-06-07 13:19:41 -04:00
parent ab25d821c6
commit 306b0ed0fe
3 changed files with 29 additions and 9 deletions

14
app.py
View File

@ -95,20 +95,28 @@ def websites():
@app.route("/search") @app.route("/search")
def search(): def search():
RESULTS_PER_PAGE = (25, 50, 100, 250, 1000)
q = request.args.get("q") if "q" in request.args else "" q = request.args.get("q") if "q" in request.args else ""
sort_order = request.args.get("sort_order") if "sort_order" in request.args else "score" sort_order = request.args.get("sort_order") if "sort_order" in request.args else "score"
page = int(request.args.get("p")) if "p" in request.args else 0
page = request.args.get("p") if "p" in request.args else "0"
page = int(page) if page.isdigit() else 0
per_page = request.args.get("per_page") if "per_page" in request.args else "50"
per_page = int(per_page) if per_page.isdigit() else "50"
per_page = per_page if per_page in RESULTS_PER_PAGE else 50
if q: if q:
try: try:
hits = db.search(q, 100, page, sort_order) hits = db.search(q, per_page, page, sort_order)
except InvalidQueryException as e: except InvalidQueryException as e:
flash("<strong>Invalid query:</strong> " + str(e), "warning") flash("<strong>Invalid query:</strong> " + str(e), "warning")
return redirect("/search") return redirect("/search")
else: else:
hits = None hits = None
return render_template("search.html", results=hits, q=q, p=page, sort_order=sort_order) return render_template("search.html", results=hits, q=q, p=page, sort_order=sort_order, per_page=per_page)
@app.route("/contribute") @app.route("/contribute")

View File

@ -207,14 +207,13 @@ class Database:
return stats return stats
def search(self, q, limit: int = 25, offset: int = 0, sort_order="score"): def search(self, q, limit: int = 50, offset: int = 0, sort_order="score"):
with sqlite3.connect(self.db_path) as conn: with sqlite3.connect(self.db_path) as conn:
cursor = conn.cursor() cursor = conn.cursor()
try: try:
order_by = Database.SORT_ORDERS.get(sort_order, "") order_by = Database.SORT_ORDERS.get(sort_order, "")
print(order_by)
cursor.execute("SELECT size, Website.url, WebsitePath.path, File.name, Website.id FROM File_index " cursor.execute("SELECT size, Website.url, WebsitePath.path, File.name, Website.id FROM File_index "
"INNER JOIN File ON File.id = File_index.rowid " "INNER JOIN File ON File.id = File_index.rowid "
"INNER JOIN WebsitePath ON File.path_id = WebsitePath.id " "INNER JOIN WebsitePath ON File.path_id = WebsitePath.id "

View File

@ -15,14 +15,25 @@
<div class="form-group col-md-8"> <div class="form-group col-md-8">
<input class="form-control" name="q" id="q" placeholder="Full-text Query" value="{{ q }}"> <input class="form-control" name="q" id="q" placeholder="Full-text Query" value="{{ q }}">
</div> </div>
<div class="form-group col-md-4"> <div class="form-group col-md-2">
<select class="form-control" name="sort_order" title="Sort order"> <select class="form-control" name="sort_order" title="Sort order">
<option disabled>Select sort order</option>
<option value="score" {{ "selected" if sort_order == "score" else "" }}>Relevance</option> <option value="score" {{ "selected" if sort_order == "score" else "" }}>Relevance</option>
<option value="size_asc" {{ "selected" if sort_order == "size_asc" else "" }}>Size ascending</option> <option value="size_asc" {{ "selected" if sort_order == "size_asc" else "" }}>Size ascending</option>
<option value="size_dsc" {{ "selected" if sort_order == "size_dsc" else "" }}>Size descending</option> <option value="size_dsc" {{ "selected" if sort_order == "size_dsc" else "" }}>Size descending</option>
<option value="none" {{ "selected" if sort_order == "none" else "" }}>No order (faster)</option> <option value="none" {{ "selected" if sort_order == "none" else "" }}>No order (faster)</option>
</select> </select>
</div> </div>
<div class="form-group col-md-2">
<select class="form-control" name="per_page" title="Results per page">
<option disabled>Results per page</option>
<option{{ " selected" if per_page == 25 }}>25</option>
<option{{ " selected" if per_page == 50 }}>50</option>
<option{{ " selected" if per_page == 100 }}>100</option>
<option{{ " selected" if per_page == 250 }}>250</option>
<option{{ " selected" if per_page == 1000 }}>1000</option>
</select>
</div>
</div> </div>
<input class="btn btn-primary btn-shadow" type="submit" value="Search"> <input class="btn btn-primary btn-shadow" type="submit" value="Search">
@ -62,7 +73,7 @@
</td> </td>
{# File size #} {# File size #}
<td style="white-space: nowrap; vertical-align: top; text-align: right; font-size: 14px"> <td style="white-space: nowrap; vertical-align: top; text-align: right; font-size: 14px">
{{ hit[0] | filesizeformat }} {{ hit[0] | filesizeformat if hit[0] >= 0 else "?"}}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
@ -70,9 +81,11 @@
</table> </table>
</div> </div>
<a href="/search?q={{ q }}&p={{ p + 1 }}" class="btn btn-primary" style="float: right">Next</a> <a href="/search?q={{ q }}&p={{ p + 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}"
class="btn btn-primary" style="float: right">Next</a>
{% if p > 0 %} {% if p > 0 %}
<a href="/search?q={{ q }}&p={{ p - 1 }}" class="btn btn-primary">Previous</a> <a href="/search?q={{ q }}&p={{ p - 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}"
class="btn btn-primary">Previous</a>
{% endif %} {% endif %}
</div> </div>