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

allow turning of the coverage based ranking

parent ef9c8bc7
No related branches found
No related tags found
No related merge requests found
...@@ -11,17 +11,19 @@ class Config ...@@ -11,17 +11,19 @@ class Config
public $database_options; public $database_options;
public $backend; public $backend;
public $enable_ranking;
public $path_prefix; public $path_prefix;
public function __construct(string $path_prefix, string $database_connector, string $username, string $password, string $backend, array $options) public function __construct(string $path_prefix, string $database_connector, string $username, string $password, string $backend, array $options, bool $enable_ranking)
{ {
$this->database_connector = $database_connector; $this->database_connector = $database_connector;
$this->username = $username; $this->username = $username;
$this->password = $password; $this->password = $password;
$this->database_options = $options;
$this->path_prefix = $path_prefix; $this->path_prefix = $path_prefix;
$this->backend = $backend; $this->backend = $backend;
$this->database_options = $options;
$this->enable_ranking = $enable_ranking;
} }
public static function createFromGlobals() public static function createFromGlobals()
...@@ -34,8 +36,8 @@ class Config ...@@ -34,8 +36,8 @@ class Config
$options['timeout'] = (defined('qrs_db_option_timeout') && (null !== qrs_db_option_timeout)) ? qrs_db_option_timeout : 5000; $options['timeout'] = (defined('qrs_db_option_timeout') && (null !== qrs_db_option_timeout)) ? qrs_db_option_timeout : 5000;
if (defined('qrs_db_connector') && null !== qrs_db_connector) if (defined('qrs_db_connector') && null !== qrs_db_connector)
return new Config(qrs_path_prefix, qrs_db_connector, qrs_db_user, qrs_db_pass, qrs_backend, $options); return new Config(qrs_path_prefix, qrs_db_connector, qrs_db_user, qrs_db_pass, qrs_backend, $options, qrs_enable_ranking);
else else
return new Config(qrs_path_prefix, 'pgsql:host=' . qrs_db_host . ';port=' . qrs_db_port . ';dbname=' . qrs_db_name . '', qrs_db_user, qrs_db_pass, qrs_backend, $options); return new Config(qrs_path_prefix, 'pgsql:host=' . qrs_db_host . ';port=' . qrs_db_port . ';dbname=' . qrs_db_name . '', qrs_db_user, qrs_db_pass, qrs_backend, $options, qrs_enable_ranking);
} }
} }
...@@ -14,20 +14,22 @@ class Database ...@@ -14,20 +14,22 @@ class Database
private $user; private $user;
private $backend; private $backend;
private $enable_ranking;
private function __construct(string $database_connector, string $username, string $password, string $type, array $options) private function __construct(string $database_connector, string $username, string $password, string $type, array $options, bool $enable_ranking)
{ {
$this->backend = BackendFactory::create($type, new \PDO($database_connector, $username, $password), $options); $this->backend = BackendFactory::create($type, new \PDO($database_connector, $username, $password), $options, $enable_ranking);
$this->enable_ranking = $enable_ranking;
} }
public static function createFromConfig(Config $config): Database public static function createFromConfig(Config $config): Database
{ {
return Database::createFromOptions($config->database_connector, $config->username, $config->password, $config->backend, $config->database_options); return Database::createFromOptions($config->database_connector, $config->username, $config->password, $config->backend, $config->database_options, $config->enable_ranking);
} }
public static function createFromOptions(string $database_connector, string $username, string $password, string $type, array $options): Database public static function createFromOptions(string $database_connector, string $username, string $password, string $type, array $options, bool $enable_ranking): Database
{ {
return new Database($database_connector, $username, $password, $type, $options); return new Database($database_connector, $username, $password, $type, $options, $enable_ranking);
} }
public function authenticateFromHeader(string $header): bool public function authenticateFromHeader(string $header): bool
...@@ -67,10 +69,12 @@ class Database ...@@ -67,10 +69,12 @@ class Database
private function apply_config(\PDOStatement $stmt) private function apply_config(\PDOStatement $stmt)
{ {
$stmt->bindValue(':config_normalization', 4, PDO::PARAM_INT); if ($this->enable_ranking) {
$stmt->bindValue(':config_normalization', 4, PDO::PARAM_INT);
$stmt->bindValue(':weight_content', 14, PDO::PARAM_INT);
}
$stmt->bindValue(':weight_content', 14, PDO::PARAM_INT); $stmt->bindValue(':weight_type', 32, PDO::PARAM_INT);
$stmt->bindValue(':weight_type', 16, PDO::PARAM_INT);
$stmt->bindValue(':weight_time', 1, PDO::PARAM_INT); $stmt->bindValue(':weight_time', 1, PDO::PARAM_INT);
} }
......
...@@ -8,13 +8,13 @@ require_once 'SQLiteSmartBackend.php'; ...@@ -8,13 +8,13 @@ require_once 'SQLiteSmartBackend.php';
class BackendFactory class BackendFactory
{ {
public static function create(string $type, \PDO $db, array $options): Backend public static function create(string $type, \PDO $db, array $options, $enable_ranking): Backend
{ {
switch ($type) { switch ($type) {
case 'pgsql-smart': case 'pgsql-smart':
return new PostgresSmartBackend($db, $options); return new PostgresSmartBackend($db, $options, $enable_ranking);
case 'sqlite-smart': case 'sqlite-smart':
return new SQLiteSmartBackend($db, $options); return new SQLiteSmartBackend($db, $options, $enable_ranking);
default: default:
return null; return null;
} }
......
...@@ -8,13 +8,15 @@ class PostgresSmartBackend implements Backend ...@@ -8,13 +8,15 @@ class PostgresSmartBackend implements Backend
{ {
private $db; private $db;
private $options; private $options;
private $enable_ranking;
function __construct(\PDO $db, array $options) function __construct(\PDO $db, array $options, bool $enable_ranking)
{ {
$this->db = $db; $this->db = $db;
$timeout = $options["timeout"]; $timeout = $options["timeout"];
$this->db->exec("SET statement_timeout = $timeout;"); $this->db->exec("SET statement_timeout = $timeout;");
$this->options = $options; $this->options = $options;
$this->enable_ranking = $enable_ranking;
} }
public function findUser(): \PDOStatement public function findUser(): \PDOStatement
...@@ -31,9 +33,36 @@ class PostgresSmartBackend implements Backend ...@@ -31,9 +33,36 @@ class PostgresSmartBackend implements Backend
return array_key_exists('tsqueryfunction', $this->options) ? $this->options['tsqueryfunction'] : "plainto_tsquery('english', :query)"; return array_key_exists('tsqueryfunction', $this->options) ? $this->options['tsqueryfunction'] : "plainto_tsquery('english', :query)";
} }
private function rankingFunction(): string
{
if ($this->enable_ranking) {
return "(
(ts_rank_cd(tsv, query, :config_normalization) ^ :weight_content) *
((CASE
WHEN TYPE IN (1, 4) THEN 1.0
WHEN TYPE IN (2, 1024, 2048, 4096, 16384) THEN 0.8
WHEN TYPE IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.6
WHEN TYPE IN (8, 16, 8192, 131072) THEN 0.4
ELSE 0.2 END) ^ :weight_type) *
((1 / (EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) - EXTRACT(EPOCH FROM time))) ^ :weight_time)
)";
} else {
return "(
((CASE
WHEN TYPE IN (1, 4) THEN 1.0
WHEN TYPE IN (2, 1024, 2048, 4096, 16384) THEN 0.8
WHEN TYPE IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.6
WHEN TYPE IN (8, 16, 8192, 131072) THEN 0.4
ELSE 0.2 END) ^ :weight_type) *
((1 / (EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) - EXTRACT(EPOCH FROM time))) ^ :weight_time)
)";
}
}
public function findInBuffers(): \PDOStatement public function findInBuffers(): \PDOStatement
{ {
$tsQueryFunction = $this->tsQueryFunction(); $tsQueryFunction = $this->tsQueryFunction();
$rankingFunction = $this->rankingFunction();
return $this->db->prepare(" return $this->db->prepare("
SELECT SELECT
ranked_messages.bufferid, ranked_messages.bufferid,
...@@ -70,16 +99,7 @@ class PostgresSmartBackend implements Backend ...@@ -70,16 +99,7 @@ class PostgresSmartBackend implements Backend
backlog.time, backlog.time,
backlog.message, backlog.message,
query, query,
( $rankingFunction AS rank_value
(ts_rank_cd(tsv, query, :config_normalization) ^ :weight_content) *
((CASE
WHEN TYPE IN (1, 4) THEN 1.0
WHEN TYPE IN (2, 1024, 2048, 4096, 16384) THEN 0.8
WHEN TYPE IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.6
WHEN TYPE IN (8, 16, 8192, 131072) THEN 0.4
ELSE 0.2 END) ^ :weight_type) *
((1 / (EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) - EXTRACT(EPOCH FROM TIME))) ^ :weight_time)
) AS rank_value
FROM FROM
backlog backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
...@@ -128,6 +148,7 @@ class PostgresSmartBackend implements Backend ...@@ -128,6 +148,7 @@ class PostgresSmartBackend implements Backend
public function findInBuffer(): \PDOStatement public function findInBuffer(): \PDOStatement
{ {
$tsQueryFunction = $this->tsQueryFunction(); $tsQueryFunction = $this->tsQueryFunction();
$rankingFunction = $this->rankingFunction();
return $this->db->prepare(" return $this->db->prepare("
SELECT SELECT
matching_messages.messageid, matching_messages.messageid,
...@@ -145,16 +166,7 @@ class PostgresSmartBackend implements Backend ...@@ -145,16 +166,7 @@ class PostgresSmartBackend implements Backend
backlog.time, backlog.time,
backlog.message, backlog.message,
query, query,
( $rankingFunction AS rank_value
(ts_rank_cd(tsv, query, :config_normalization) ^ :weight_content) *
((CASE
WHEN TYPE IN (1, 4) THEN 1.0
WHEN TYPE IN (2, 1024, 2048, 4096, 16384) THEN 0.8
WHEN TYPE IN (32, 64, 128, 256, 512, 32768, 65536) THEN 0.6
WHEN TYPE IN (8, 16, 8192, 131072) THEN 0.4
ELSE 0.2 END) ^ :weight_type) *
((1 / (EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) - EXTRACT(EPOCH FROM TIME))) ^ :weight_time)
) AS rank_value
FROM FROM
backlog backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
......
...@@ -9,7 +9,7 @@ class SQLiteSmartBackend implements Backend ...@@ -9,7 +9,7 @@ class SQLiteSmartBackend implements Backend
private $db; private $db;
private $options; private $options;
function __construct(\PDO $db, array $options) function __construct(\PDO $db, array $options, $enable_ranking)
{ {
$this->db = $db; $this->db = $db;
$this->options = $options; $this->options = $options;
......
...@@ -14,5 +14,6 @@ define('qrs_db_option_tsqueryfunction', "plainto_tsquery('english', :query)"); ...@@ -14,5 +14,6 @@ define('qrs_db_option_tsqueryfunction', "plainto_tsquery('english', :query)");
define('qrs_db_option_timeout', 5000); define('qrs_db_option_timeout', 5000);
define('qrs_backend', 'pgsql-smart'); define('qrs_backend', 'pgsql-smart');
define('qrs_enable_ranking', false);
define('qrs_path_prefix', ''); define('qrs_path_prefix', '');
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment