From 2bf62cc7559df8ba9b8e198994c217114bd61c62 Mon Sep 17 00:00:00 2001
From: Simon Will <will@cl.uni-heidelberg.de>
Date: Sun, 28 Mar 2021 19:19:10 +0200
Subject: [PATCH] Allow querying feedback with limit and offset

---
 joeynmt_server/views/feedback.py | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/joeynmt_server/views/feedback.py b/joeynmt_server/views/feedback.py
index fd09fb7..e07a535 100644
--- a/joeynmt_server/views/feedback.py
+++ b/joeynmt_server/views/feedback.py
@@ -5,6 +5,7 @@ import traceback
 
 from flask import current_app, jsonify, request
 from sqlalchemy import or_
+from sqlalchemy.orm import aliased
 
 from joeynmt_server.app import create_app, db
 from joeynmt_server.models import Feedback, Parse
@@ -75,18 +76,26 @@ def list_feedback():
 @current_app.route('/query_feedback', methods=['POST'])
 def query_feedback():
     filters = request.json
-    query = db.session.query(Feedback, Parse).outerjoin(
-        Parse, Feedback.nl == Parse.nl)
+    fb_query = Feedback.query
     if 'user_id' in filters:
-        query = query.filter(Feedback.user_id == filters['user_id'])
+        fb_query = fb_query.filter_by(user_id=filters['user_id'])
+    if 'limit' in filters or 'offset' in filters:
+        fb_query = fb_query.order_by(Feedback.id)
+        if 'limit' in filters:
+            fb_query = fb_query.limit(filters['limit'])
+        if 'offset' in filters:
+            fb_query = fb_query.offset(filters['offset'])
+
+    limited_feedback = aliased(Feedback, fb_query.subquery())
+
     if 'model' in filters:
-        by_id = {}
-        for piece, parse in query:
-            if parse and parse.model == filters['model']:
-                by_id[piece.id] = (piece, parse)
-            elif piece.id not in by_id:
-                by_id[piece.id] = (piece, None)
-        query = by_id.values()
+        parses_for_model = Parse.query.filter_by(model=filters['model'])
+        parses = aliased(Parse, parses_for_model.subquery())
+    else:
+        parses = Parse
+
+    query = db.session.query(limited_feedback, parses).outerjoin(
+        parses, limited_feedback.nl == parses.nl)
 
     joined_feedback = []
     for piece, parse in query:
-- 
GitLab