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
public $database_options;
public $backend;
public $enable_ranking;
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->username = $username;
$this->password = $password;
$this->database_options = $options;
$this->path_prefix = $path_prefix;
$this->backend = $backend;
$this->database_options = $options;
$this->enable_ranking = $enable_ranking;
}
public static function createFromGlobals()
......@@ -34,8 +36,8 @@ class Config
$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)
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
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
private $user;
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
{
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
......@@ -67,10 +69,12 @@ class Database
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', 16, PDO::PARAM_INT);
$stmt->bindValue(':weight_type', 32, PDO::PARAM_INT);
$stmt->bindValue(':weight_time', 1, PDO::PARAM_INT);
}
......
......@@ -8,13 +8,13 @@ require_once 'SQLiteSmartBackend.php';
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) {
case 'pgsql-smart':
return new PostgresSmartBackend($db, $options);
return new PostgresSmartBackend($db, $options, $enable_ranking);
case 'sqlite-smart':
return new SQLiteSmartBackend($db, $options);
return new SQLiteSmartBackend($db, $options, $enable_ranking);
default:
return null;
}
......
......@@ -8,13 +8,15 @@ class PostgresSmartBackend implements Backend
{
private $db;
private $options;
private $enable_ranking;
function __construct(\PDO $db, array $options)
function __construct(\PDO $db, array $options, bool $enable_ranking)
{
$this->db = $db;
$timeout = $options["timeout"];
$this->db->exec("SET statement_timeout = $timeout;");
$this->options = $options;
$this->enable_ranking = $enable_ranking;
}
public function findUser(): \PDOStatement
......@@ -31,9 +33,36 @@ class PostgresSmartBackend implements Backend
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
{
$tsQueryFunction = $this->tsQueryFunction();
$rankingFunction = $this->rankingFunction();
return $this->db->prepare("
SELECT
ranked_messages.bufferid,
......@@ -70,16 +99,7 @@ class PostgresSmartBackend implements Backend
backlog.time,
backlog.message,
query,
(
(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
$rankingFunction AS rank_value
FROM
backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid
......@@ -128,6 +148,7 @@ class PostgresSmartBackend implements Backend
public function findInBuffer(): \PDOStatement
{
$tsQueryFunction = $this->tsQueryFunction();
$rankingFunction = $this->rankingFunction();
return $this->db->prepare("
SELECT
matching_messages.messageid,
......@@ -145,16 +166,7 @@ class PostgresSmartBackend implements Backend
backlog.time,
backlog.message,
query,
(
(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
$rankingFunction AS rank_value
FROM
backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid
......
......@@ -9,7 +9,7 @@ class SQLiteSmartBackend implements Backend
private $db;
private $options;
function __construct(\PDO $db, array $options)
function __construct(\PDO $db, array $options, $enable_ranking)
{
$this->db = $db;
$this->options = $options;
......
......@@ -14,5 +14,6 @@ define('qrs_db_option_tsqueryfunction', "plainto_tsquery('english', :query)");
define('qrs_db_option_timeout', 5000);
define('qrs_backend', 'pgsql-smart');
define('qrs_enable_ranking', false);
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