From 0ca37e8ce57f098cbb45c4311b5ffd3351070ebb Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Mon, 13 Mar 2017 02:45:18 +0100
Subject: [PATCH] Expanded backend to allow for selecting by date range,
 network, or buffer

---
 api/search/index.php        |  2 +-
 api/searchbuffer/index.php  |  2 +-
 api/searchbuffers/index.php |  2 +-
 backend/Database.php        | 60 ++++++++++++++++++++++++++++++++-----
 web/search/index.php        |  2 +-
 web/searchbuffer/index.php  |  2 +-
 6 files changed, 58 insertions(+), 12 deletions(-)

diff --git a/api/search/index.php b/api/search/index.php
index 8b977f0..bd99651 100644
--- a/api/search/index.php
+++ b/api/search/index.php
@@ -13,7 +13,7 @@ $backend = Backend::createFromConfig($config);
 
 try {
     $backend->authenticateFromHeader($_SERVER['HTTP_AUTHORIZATION'] ?: "");
-    $renderer->renderJson($backend->findBuffers($_GET['q'] ?: ""));
+    $renderer->renderJson($backend->findBuffers($_GET['q'] ?: "", $_GET['since'] ?: null, $_GET['before'] ?: null, $_GET['buffer'] ?: null, $_GET['network'] ?: null));
 } catch (\Exception $e) {
     $renderer->renderJson(["error" => $e->getMessage()]);
 }
\ No newline at end of file
diff --git a/api/searchbuffer/index.php b/api/searchbuffer/index.php
index af96e4b..6fefe5e 100644
--- a/api/searchbuffer/index.php
+++ b/api/searchbuffer/index.php
@@ -13,7 +13,7 @@ $backend = Backend::createFromConfig($config);
 
 try {
     $backend->authenticateFromHeader($_SERVER['HTTP_AUTHORIZATION'] ?: "");
-    $renderer->renderJson($backend->findInBuffer($_GET['q'] ?: "", $_GET['buffer'] ?: 0, $_GET['offset'] ?: 0, $_GET['limit'] ?: 0));
+    $renderer->renderJson($backend->findInBuffer($_GET['query'] ?: "", $_GET['since'] ?: null, $_GET['before'] ?: null, $_GET['buffer'] ?: 0, $_GET['offset'] ?: 0, $_GET['limit'] ?: 20));
 } catch (\Exception $e) {
     $renderer->renderJson(["error" => $e->getMessage()]);
 }
\ No newline at end of file
diff --git a/api/searchbuffers/index.php b/api/searchbuffers/index.php
index ed64ceb..ef0727a 100644
--- a/api/searchbuffers/index.php
+++ b/api/searchbuffers/index.php
@@ -13,7 +13,7 @@ $backend = Backend::createFromConfig($config);
 
 try {
     $backend->authenticateFromHeader($_SERVER['HTTP_AUTHORIZATION'] ?: "");
-    $renderer->renderJson($backend->findInBufferMultiple($_GET['q'] ?: "", $_GET['limit'] ?: 4));
+    $renderer->renderJson($backend->findInBufferMultiple($_GET['q'] ?: "", $_GET['since'] ?: null, $_GET['before'] ?: null, $_GET['limit'] ?: 4));
 } catch (\Exception $e) {
     $renderer->renderJson(["error" => $e->getMessage()]);
 }
\ No newline at end of file
diff --git a/backend/Database.php b/backend/Database.php
index aed4c60..34ca513 100644
--- a/backend/Database.php
+++ b/backend/Database.php
@@ -2,6 +2,8 @@
 
 namespace QuasselRestSearch;
 
+use PDO;
+
 require_once 'User.php';
 require_once 'Config.php';
 require_once 'helper/AuthHelper.php';
@@ -29,6 +31,10 @@ class Backend {
                             plainto_tsquery('english'::REGCONFIG, :query) query
             WHERE (backlog.type & 23559) > 0
               AND buffer.userid = :userid
+              AND (NOT(:_since) OR backlog.time > to_timestamp(:since))
+              AND (NOT(:_before) OR backlog.time < to_timestamp(:before))
+              AND (NOT(:_network) OR network.networkname ILIKE :network)
+              AND (NOT(:_buffer) OR buffer.buffername ILIKE :buffer)
               AND backlog.tsv @@ query
             GROUP BY backlog.bufferid,
                      buffer.buffername,
@@ -56,6 +62,8 @@ class Backend {
                JOIN buffer ON backlog.bufferid = buffer.bufferid,
                               plainto_tsquery('english'::REGCONFIG, :query) query
                WHERE (backlog.type & 23559) > 0
+                 AND (NOT(:_since) OR backlog.time > to_timestamp(:since))
+                 AND (NOT(:_before) OR backlog.time < to_timestamp(:before))
                  AND buffer.userid = :userid
                  AND backlog.tsv @@ query
                ORDER BY (1 + log(GREATEST(1, EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - TIME))))) * (1 - ts_rank(tsv, query, 32)) * (1 + ln(backlog.type)) ASC
@@ -74,6 +82,8 @@ class Backend {
             JOIN buffer ON backlog.bufferid = buffer.bufferid,
                             plainto_tsquery('english'::REGCONFIG, :query) query
             WHERE (backlog.type & 23559) > 0
+              AND (NOT(:_since) OR backlog.time > to_timestamp(:since))
+              AND (NOT(:_before) OR backlog.time < to_timestamp(:before))
               AND buffer.userid = :userid
               AND backlog.bufferid = :bufferid
               AND backlog.tsv @@ query
@@ -162,11 +172,11 @@ class Backend {
         return true;
     }
 
-    public function find(string $query, int $limitPerBuffer = 4) : array {
+    public function find(string $query, int $since = null, int $before = null, string $buffer = null, string $network = null, int $limitPerBuffer = 4) : array {
         $truncatedLimit = max(min($limitPerBuffer, 10), 0);
 
-        $buffers = $this->findBuffers($query);
-        $messages = $this->findInBufferMultiple($query, $truncatedLimit);
+        $buffers = $this->findBuffers($query, $since, $before, $buffer, $network);
+        $messages = $this->findInBufferMultiple($query, $since, $before, $truncatedLimit);
 
         $buffermap = [];
         foreach ($buffers as &$buffer) {
@@ -175,34 +185,66 @@ class Backend {
         }
 
         foreach ($messages as $message) {
-            array_push($buffermap[$message['bufferid']]['messages'], $message);
+            if (!is_null($buffermap[$message['bufferid']]))
+                array_push($buffermap[$message['bufferid']]['messages'], $message);
         }
 
         return array_values($buffermap);
     }
 
-    public function findBuffers(string $query) : array {
+    public function findBuffers(string $query, int $since = null, int $before = null, string $buffer = null, string $network = null) : array {
+        $_since = $since!==null;
+        $_before = $before!==null;
+        $_buffer = $buffer!==null;
+        $_network = $network!==null;
+        
         $this->storedFindBuffers->bindParam(':userid', $this->user->userid);
         $this->storedFindBuffers->bindParam(':query', $query);
+
+        $this->storedFindBuffers->bindValue(':since', $_since ? (int) $since : 0, PDO::PARAM_INT);
+        $this->storedFindBuffers->bindValue(':before', $_before ? (int) $before : 0, PDO::PARAM_INT);
+        $this->storedFindBuffers->bindValue(':buffer', $_buffer ? (string) $buffer : "");
+        $this->storedFindBuffers->bindValue(':network', $_network ? (string) $network : "");
+        $this->storedFindBuffers->bindParam(':_since', $_since, PDO::PARAM_INT);
+        $this->storedFindBuffers->bindParam(':_before', $_before, PDO::PARAM_INT);
+        $this->storedFindBuffers->bindParam(':_buffer', $_buffer, PDO::PARAM_INT);
+        $this->storedFindBuffers->bindParam(':_network', $_network, PDO::PARAM_INT);
+
         $this->storedFindBuffers->execute();
         return $this->storedFindBuffers->fetchAll(\PDO::FETCH_ASSOC);
     }
 
-    public function findInBufferMultiple(string $query, int $limit = 4) : array {
+    public function findInBufferMultiple(string $query, int $since = null, int $before = null, int $limit = 4) : array {
+        $_since = $since!==null;
+        $_before = $before!==null;
+
         $this->storedFindInBufferMultiple->bindParam(':userid', $this->user->userid);
         $this->storedFindInBufferMultiple->bindParam(':query', $query);
         $this->storedFindInBufferMultiple->bindParam(':limit', $limit);
+
+        $this->storedFindInBufferMultiple->bindValue(':since', $_since ? (int) $since : 0, PDO::PARAM_INT);
+        $this->storedFindInBufferMultiple->bindValue(':before', $_before ? (int) $before : 0, PDO::PARAM_INT);
+        $this->storedFindInBufferMultiple->bindParam(':_since', $_since, PDO::PARAM_INT);
+        $this->storedFindInBufferMultiple->bindParam(':_before', $_before, PDO::PARAM_INT);
+
         $this->storedFindInBufferMultiple->execute();
         return $this->storedFindInBufferMultiple->fetchAll(\PDO::FETCH_ASSOC);
     }
 
-    public function findInBuffer(string $query, int $bufferid, int $offset = 0, int $limit = 20) : array {
+    public function findInBuffer(string $query, int $since = null, int $before = null, int $bufferid, int $offset = 0, int $limit = 20) : array {
         $truncatedLimit = max(min($limit, 50), 0);
+        $_since = $since!==null;
+        $_before = $before!==null;
 
         $this->storedFindInBuffer->bindParam(':userid', $this->user->userid);
         $this->storedFindInBuffer->bindParam(':bufferid', $bufferid);
         $this->storedFindInBuffer->bindParam(':query', $query);
 
+        $this->storedFindInBuffer->bindValue(':since', $_since ? (int) $since : 0, PDO::PARAM_INT);
+        $this->storedFindInBuffer->bindValue(':before', $_before ? (int) $before : 0, PDO::PARAM_INT);
+        $this->storedFindInBuffer->bindParam(':_since', $_since, PDO::PARAM_INT);
+        $this->storedFindInBuffer->bindParam(':_before', $_before, PDO::PARAM_INT);
+
         $this->storedFindInBuffer->bindParam(':limit', $truncatedLimit);
         $this->storedFindInBuffer->bindParam(':offset', $offset);
 
@@ -220,7 +262,9 @@ class Backend {
         $this->loadBefore->bindParam(":userid", $this->user->userid);
         $this->loadBefore->bindParam(":bufferid", $buffer);
         $this->loadBefore->bindParam(":anchor", $anchor);
+
         $this->loadBefore->bindParam(":limit", $truncatedLimit);
+
         $this->loadBefore->execute();
         return $this->loadBefore->fetchAll(\PDO::FETCH_ASSOC);
     }
@@ -231,7 +275,9 @@ class Backend {
         $this->loadAfter->bindParam(":userid", $this->user->userid);
         $this->loadAfter->bindParam(":bufferid", $buffer);
         $this->loadAfter->bindParam(":anchor", $anchor);
+
         $this->loadAfter->bindParam(":limit", $truncatedLimit);
+
         $this->loadAfter->execute();
         return $this->loadAfter->fetchAll(\PDO::FETCH_ASSOC);
     }
diff --git a/web/search/index.php b/web/search/index.php
index 8b4d840..6e8f950 100644
--- a/web/search/index.php
+++ b/web/search/index.php
@@ -16,5 +16,5 @@ if (!$backend->authenticate($session->username ?: '', $session->password ?: ''))
     $session->destroy();
     $renderer->renderJsonError(false);
 } else {
-    $renderer->renderJson($backend->find($_GET['query'] ?: "", 4));
+    $renderer->renderJson($backend->find($_GET['query'] ?: "", $_GET['since'] ?: null, $_GET['before'] ?: null, $_GET['buffer'] ?: null, $_GET['network'] ?: null, 4));
 }
\ No newline at end of file
diff --git a/web/searchbuffer/index.php b/web/searchbuffer/index.php
index 766ccff..54d2b52 100644
--- a/web/searchbuffer/index.php
+++ b/web/searchbuffer/index.php
@@ -16,5 +16,5 @@ if (!$backend->authenticate($session->username ?: '', $session->password ?: ''))
     $session->destroy();
     $renderer->renderJsonError(false);
 } else {
-    $renderer->renderJson($backend->findInBuffer($_GET['query'] ?: "", $_GET['buffer'] ?: 0, $_GET['offset'] ?: 0, $_GET['limit'] ?: 20));
+    $renderer->renderJson($backend->findInBuffer($_GET['query'] ?: "", $_GET['since'] ?: null, $_GET['before'] ?: null, $_GET['buffer'] ?: 0, $_GET['offset'] ?: 0, $_GET['limit'] ?: 20));
 }
\ No newline at end of file
-- 
GitLab