Skip to content
Snippets Groups Projects
Commit 4c05a024 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Further performance and UI improvements

parent 26208750
Branches
No related tags found
No related merge requests found
...@@ -77,7 +77,6 @@ class Database ...@@ -77,7 +77,6 @@ class Database
public function find(string $query, int $since = null, int $before = null, string $buffer = null, string $network = null, string $sender = null, int $limitPerBuffer = 4): array public function find(string $query, int $since = null, int $before = null, string $buffer = null, string $network = null, string $sender = null, int $limitPerBuffer = 4): array
{ {
$truncatedLimit = max(min($limitPerBuffer, 10), 0); $truncatedLimit = max(min($limitPerBuffer, 10), 0);
$truncatedLimit = 20;
$messages = $this->findInBufferMultiple($query, $since, $before, $buffer, $network, $sender, $truncatedLimit); $messages = $this->findInBufferMultiple($query, $since, $before, $buffer, $network, $sender, $truncatedLimit);
$hasMore = $this->findInBufferMultipleCount($query, $since, $before, $buffer, $network, $sender, 0, $truncatedLimit); $hasMore = $this->findInBufferMultipleCount($query, $since, $before, $buffer, $network, $sender, 0, $truncatedLimit);
......
...@@ -27,13 +27,26 @@ class PostgresSmartBackend implements Backend ...@@ -27,13 +27,26 @@ class PostgresSmartBackend implements Backend
{ {
return $this->db->prepare(" return $this->db->prepare("
SELECT SELECT
tmp.bufferid, ranked_messages.bufferid,
tmp.buffername, ranked_messages.buffername,
network.networkname, network.networkname,
tmp.messageid, ranked_messages.messageid,
ranked_messages.time,
sender.sender, sender.sender,
tmp.time, ts_headline(replace(replace(ranked_messages.message, '<', '&lt;'), '>', '&gt;'), query, 'HighlightAll=TRUE') AS message
ts_headline(replace(replace(tmp.message, '<', '&lt;'), '>', '&gt;'), query, 'HighlightAll=TRUE') AS message FROM
(SELECT
matching_messages.*,
rank()
OVER (
PARTITION BY matching_messages.bufferid
ORDER BY matching_messages.rank_value DESC
) AS rank,
first_value(rank_value)
OVER (
PARTITION BY matching_messages.bufferid
ORDER BY matching_messages.rank_value DESC
) AS max_rank_value
FROM FROM
(SELECT (SELECT
backlog.messageid, backlog.messageid,
...@@ -43,45 +56,35 @@ class PostgresSmartBackend implements Backend ...@@ -43,45 +56,35 @@ class PostgresSmartBackend implements Backend
backlog.senderid, backlog.senderid,
backlog.time, backlog.time,
backlog.message, backlog.message,
query,
( (
(ts_rank(tsv, query, :config_normalization) ^ :weight_content) * (ts_rank(tsv, query, :config_normalization) ^ :weight_content) *
((CASE ((CASE
WHEN type IN (1, 4) THEN 1.0 WHEN TYPE IN (1, 4) THEN 1.0
WHEN type IN (2, 1024, 2048, 4096, 16384) THEN 0.75 WHEN TYPE IN (2, 1024, 2048, 4096, 16384) THEN 0.75
WHEN type IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.5 WHEN TYPE IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.5
WHEN type IN (8, 16, 8192, 131072) THEN 0.25 WHEN TYPE IN (8, 16, 8192, 131072) THEN 0.25
ELSE 0.1 END) ^ :weight_type) * ELSE 0.1 END) ^ :weight_type) *
((EXTRACT(EPOCH FROM time) / EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)) ^ :weight_time) ((EXTRACT(EPOCH FROM TIME) / EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)) ^ :weight_time)
) AS rank_value, ) AS rank_value
rank() OVER ( FROM
PARTITION BY backlog.bufferid backlog
ORDER BY ( JOIN buffer ON backlog.bufferid = buffer.bufferid
(ts_rank(tsv, query, :config_normalization) ^ :weight_content) * , phraseto_tsquery_multilang(:query) query
((CASE
WHEN type IN (1, 4) THEN 1.0
WHEN type IN (2, 1024, 2048, 4096, 16384) THEN 0.75
WHEN type IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.5
WHEN type IN (8, 16, 8192, 131072) THEN 0.25
ELSE 0.1 END) ^ :weight_type) *
((EXTRACT(EPOCH FROM time) / EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)) ^ :weight_time)
) DESC
) AS rank,
query
FROM backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid,
phraseto_tsquery_multilang(:query) query
WHERE buffer.userid = :userid WHERE buffer.userid = :userid
AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP)
AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP) AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP)
AND (:ignore_buffer::BOOLEAN OR buffer.buffername ~* :buffer) AND (:ignore_buffer::BOOLEAN OR buffer.buffername ~* :buffer)
AND backlog.tsv @@ query AND backlog.type & 23559 > 0 AND backlog.type & 23559 > 0
) tmp AND backlog.tsv @@ query
JOIN sender ON tmp.senderid = sender.senderid ) matching_messages
JOIN network ON tmp.networkid = network.networkid ) ranked_messages
WHERE tmp.rank <= :limit JOIN sender ON ranked_messages.senderid = sender.senderid
JOIN network ON ranked_messages.networkid = network.networkid
WHERE ranked_messages.rank <= :limit
AND (:ignore_network::BOOLEAN OR network.networkname ~* :network) AND (:ignore_network::BOOLEAN OR network.networkname ~* :network)
AND (:ignore_sender::BOOLEAN OR sender.sender ~* :sender) AND (:ignore_sender::BOOLEAN OR sender.sender ~* :sender)
ORDER BY tmp.rank_value DESC; ORDER BY ranked_messages.max_rank_value DESC, ranked_messages.rank_value DESC
"); ");
} }
...@@ -91,11 +94,12 @@ class PostgresSmartBackend implements Backend ...@@ -91,11 +94,12 @@ class PostgresSmartBackend implements Backend
SELECT SELECT
backlog.bufferid, backlog.bufferid,
COUNT(backlog.messageid) > (:limit::INT + :offset::INT) AS hasmore COUNT(backlog.messageid) > (:limit::INT + :offset::INT) AS hasmore
FROM backlog FROM
backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
JOIN sender ON backlog.senderid = sender.senderid JOIN sender ON backlog.senderid = sender.senderid
JOIN network ON buffer.networkid = network.networkid, JOIN network ON buffer.networkid = network.networkid
phraseto_tsquery_multilang(:query) query , phraseto_tsquery_multilang(:query) query
WHERE buffer.userid = :userid WHERE buffer.userid = :userid
AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP)
AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP) AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP)
...@@ -111,43 +115,52 @@ class PostgresSmartBackend implements Backend ...@@ -111,43 +115,52 @@ class PostgresSmartBackend implements Backend
{ {
return $this->db->prepare(" return $this->db->prepare("
SELECT SELECT
tmp.bufferid, matching_messages.bufferid,
tmp.messageid, matching_messages.buffername,
network.networkname,
matching_messages.messageid,
matching_messages.time,
sender.sender, sender.sender,
tmp.time, ts_headline(replace(replace(matching_messages.message, '<', '&lt;'), '>', '&gt;'), query, 'HighlightAll=TRUE') AS message
ts_headline(replace(replace(tmp.message, '<', '&lt;'), '>', '&gt;'), query, 'HighlightAll=TRUE') AS message
FROM FROM
(SELECT (SELECT
backlog.messageid, backlog.messageid,
backlog.bufferid, backlog.bufferid,
buffer.buffername,
buffer.networkid,
backlog.senderid, backlog.senderid,
backlog.time, backlog.time,
backlog.message, backlog.message,
query,
( (
(ts_rank(tsv, query, :config_normalization) ^ :weight_content) * (ts_rank(tsv, query, :config_normalization) ^ :weight_content) *
((CASE ((CASE
WHEN type IN (1, 4) THEN 1.0 WHEN TYPE IN (1, 4) THEN 1.0
WHEN type IN (2, 1024, 2048, 4096, 16384) THEN 0.75 WHEN TYPE IN (2, 1024, 2048, 4096, 16384) THEN 0.75
WHEN type IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.5 WHEN TYPE IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.5
WHEN type IN (8, 16, 8192, 131072) THEN 0.25 WHEN TYPE IN (8, 16, 8192, 131072) THEN 0.25
ELSE 0.1 END) ^ :weight_type) * ELSE 0.1 END) ^ :weight_type) *
((EXTRACT(EPOCH FROM time) / EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)) ^ :weight_time) ((EXTRACT(EPOCH FROM TIME) / EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)) ^ :weight_time)
) AS rank_value, ) AS rank_value
query FROM
FROM backlog backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid, JOIN buffer ON backlog.bufferid = buffer.bufferid
phraseto_tsquery_multilang(:query) query , phraseto_tsquery_multilang(:query) query
WHERE buffer.userid = :userid WHERE buffer.userid = :userid
AND backlog.bufferid = :bufferid AND buffer.bufferid = :bufferid
AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP)
AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP) AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP)
AND backlog.tsv @@ query AND backlog.type & 23559 > 0 AND (:ignore_buffer::BOOLEAN OR buffer.buffername ~* :buffer)
) tmp AND backlog.type & 23559 > 0
JOIN sender ON tmp.senderid = sender.senderid AND backlog.tsv @@ query
WHERE (:ignore_sender::BOOLEAN OR sender.sender ~* :sender) ) matching_messages
ORDER BY tmp.rank_value DESC JOIN sender ON matching_messages.senderid = sender.senderid
JOIN network ON matching_messages.networkid = network.networkid
WHERE (:ignore_network::BOOLEAN OR network.networkname ~* :network)
AND (:ignore_sender::BOOLEAN OR sender.sender ~* :sender)
ORDER BY matching_messages.rank_value DESC
LIMIT :limit LIMIT :limit
OFFSET :offset; OFFSET :offset
"); ");
} }
...@@ -157,10 +170,11 @@ class PostgresSmartBackend implements Backend ...@@ -157,10 +170,11 @@ class PostgresSmartBackend implements Backend
SELECT SELECT
backlog.bufferid, backlog.bufferid,
COUNT(backlog.messageid) > (:limit::INT + :offset::INT) AS hasmore COUNT(backlog.messageid) > (:limit::INT + :offset::INT) AS hasmore
FROM backlog FROM
backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
JOIN sender ON backlog.senderid = sender.senderid, JOIN sender ON backlog.senderid = sender.senderid
phraseto_tsquery_multilang(:query) query , phraseto_tsquery_multilang(:query) query
WHERE buffer.userid = :userid WHERE buffer.userid = :userid
AND backlog.bufferid = :bufferid AND backlog.bufferid = :bufferid
AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP)
...@@ -181,7 +195,8 @@ class PostgresSmartBackend implements Backend ...@@ -181,7 +195,8 @@ class PostgresSmartBackend implements Backend
backlog.time, backlog.time,
network.networkname, network.networkname,
replace(replace(replace(backlog.message, '&', '&amp;'), '<', '&lt;'), '>', '&gt;') AS message replace(replace(replace(backlog.message, '&', '&amp;'), '<', '&lt;'), '>', '&gt;') AS message
FROM backlog FROM
backlog
JOIN sender ON backlog.senderid = sender.senderid JOIN sender ON backlog.senderid = sender.senderid
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
JOIN network ON buffer.networkid = network.networkid JOIN network ON buffer.networkid = network.networkid
...@@ -203,7 +218,8 @@ class PostgresSmartBackend implements Backend ...@@ -203,7 +218,8 @@ class PostgresSmartBackend implements Backend
backlog.time, backlog.time,
network.networkname, network.networkname,
replace(replace(replace(backlog.message, '&', '&amp;'), '<', '&lt;'), '>', '&gt;') AS message replace(replace(replace(backlog.message, '&', '&amp;'), '<', '&lt;'), '>', '&gt;') AS message
FROM backlog FROM
backlog
JOIN sender ON backlog.senderid = sender.senderid JOIN sender ON backlog.senderid = sender.senderid
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
JOIN network ON buffer.networkid = network.networkid JOIN network ON buffer.networkid = network.networkid
......
...@@ -39,7 +39,7 @@ class App { ...@@ -39,7 +39,7 @@ class App {
this.loadingQuery++; this.loadingQuery++;
const queryId = this.loadingQuery; const queryId = this.loadingQuery;
load("web/search/", {query: query}).then((result) => { load("web/search/", {query: query}).then((result) => {
if (this.loadingQuery != queryId) if (this.loadingQuery !== queryId)
return; return;
this.buffers = result.map((buffer) => { this.buffers = result.map((buffer) => {
......
...@@ -24,7 +24,7 @@ class StateHandler extends Component { ...@@ -24,7 +24,7 @@ class StateHandler extends Component {
const oldState = this.state; const oldState = this.state;
this.state = decodeURIComponent(window.location.hash.substr(1)); this.state = decodeURIComponent(window.location.hash.substr(1));
if (this.state !== oldState && this.state !== "") if (this.state !== oldState && this.state.length > 0)
this.sendEvent("update", [this.state]); this.sendEvent("update", [this.state]);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment