Merge branch 'feature/search-to-sql-tweaks' into 'master'

Some improvements in 'Feeds::_search_to_sql()'.

See merge request tt-rss/tt-rss!108
This commit is contained in:
Andrew Dolgov
2025-03-17 17:28:44 +00:00

View File

@@ -750,7 +750,7 @@ class Feeds extends Handler_Protected {
// fall back in case of no plugins // fall back in case of no plugins
if (empty($search_qpart)) { if (empty($search_qpart)) {
list($search_qpart, $search_words) = self::_search_to_sql($search[0], $search[1], $owner_uid); list($search_qpart, $search_words) = self::_search_to_sql($search[0], $search[1], $owner_uid, $profile);
} }
} else { } else {
$search_qpart = "true"; $search_qpart = "true";
@@ -1394,7 +1394,7 @@ class Feeds extends Handler_Protected {
// fall back in case of no plugins // fall back in case of no plugins
if (!$search_query_part) { if (!$search_query_part) {
list($search_query_part, $search_words) = self::_search_to_sql($search, $search_language, $owner_uid); list($search_query_part, $search_words) = self::_search_to_sql($search, $search_language, $owner_uid, $profile);
} }
if (Config::get(Config::DB_TYPE) == "pgsql") { if (Config::get(Config::DB_TYPE) == "pgsql") {
@@ -2137,9 +2137,8 @@ class Feeds extends Handler_Protected {
/** /**
* @return array{0: string, 1: array<int, string>} [$search_query_part, $search_words] * @return array{0: string, 1: array<int, string>} [$search_query_part, $search_words]
* @todo $owner_uid and $_SESSION['uid'] are being used interchangeably-- maybe also pass in the profile so prefs can be correct
*/ */
private static function _search_to_sql(string $search, string $search_language, int $owner_uid): array { private static function _search_to_sql(string $search, string $search_language, int $owner_uid, ?int $profile): array {
// Modify the search string so that 'keyword:"foo bar"' becomes '"keyword:foo bar"'. // Modify the search string so that 'keyword:"foo bar"' becomes '"keyword:foo bar"'.
// This is needed so potential command pairs are grouped correctly. // This is needed so potential command pairs are grouped correctly.
$search_csv_str = preg_replace('/(-?\w+)\:"(\w+)/', '"$1:$2', trim($search)); $search_csv_str = preg_replace('/(-?\w+)\:"(\w+)/', '"$1:$2', trim($search));
@@ -2153,9 +2152,6 @@ class Feeds extends Handler_Protected {
$pdo = Db::pdo(); $pdo = Db::pdo();
// TODO: profile should be used here or DEFAULT_SEARCH_LANGUAGE added to Prefs::_PROFILE_BLACKLIST
$search_language = $pdo->quote(mb_strtolower($search_language ?: Prefs::get(Prefs::DEFAULT_SEARCH_LANGUAGE, $owner_uid)));
/** @var string $k a keyword pair (not yet split) or standalone value */ /** @var string $k a keyword pair (not yet split) or standalone value */
foreach ($keywords as $k) { foreach ($keywords as $k) {
if (str_starts_with($k, "-")) { if (str_starts_with($k, "-")) {
@@ -2233,7 +2229,7 @@ class Feeds extends Handler_Protected {
break; break;
case "label": case "label":
if ($keyword_value) { if ($keyword_value) {
$label_id = Labels::find_id($keyword_value, $_SESSION["uid"]); $label_id = Labels::find_id($keyword_value, $owner_uid);
if ($label_id) { if ($label_id) {
array_push($query_keywords, "($not array_push($query_keywords, "($not
@@ -2265,7 +2261,7 @@ class Feeds extends Handler_Protected {
default: default:
// @{date} handling // @{date} handling
if (str_starts_with($k, "@")) { if (str_starts_with($k, "@")) {
$user_tz_string = Prefs::get(Prefs::USER_TIMEZONE, $_SESSION['uid']); $user_tz_string = Prefs::get(Prefs::USER_TIMEZONE, $owner_uid);
$orig_ts = strtotime(substr($k, 1)); $orig_ts = strtotime(substr($k, 1));
$k = date("Y-m-d", TimeHelper::convert_timestamp($orig_ts, $user_tz_string, 'UTC')); $k = date("Y-m-d", TimeHelper::convert_timestamp($orig_ts, $user_tz_string, 'UTC'));
@@ -2304,6 +2300,8 @@ class Feeds extends Handler_Protected {
$tsquery = $pdo->quote(implode(" & ", $search_query_leftover)); $tsquery = $pdo->quote(implode(" & ", $search_query_leftover));
} }
$search_language = $pdo->quote(mb_strtolower($search_language ?: Prefs::get(Prefs::DEFAULT_SEARCH_LANGUAGE, $owner_uid, $profile)));
array_push($query_keywords, array_push($query_keywords,
"(tsvector_combined @@ to_tsquery($search_language, $tsquery))"); "(tsvector_combined @@ to_tsquery($search_language, $tsquery))");
} else { } else {