better tsquery support:

1. report query syntax errors properly
2. fall back to implicit &-joining only if no joiners are detected in user query, otherwise permit full tsquery syntax
This commit is contained in:
Andrew Dolgov 2019-04-30 14:39:08 +03:00
parent 1cd9b3c866
commit ccc0315ef0
2 changed files with 40 additions and 21 deletions

View File

@ -210,6 +210,8 @@ class Feeds extends Handler_Protected {
$highlight_words = $qfh_ret[5];
$reply['first_id'] = $qfh_ret[6];
$reply['is_vfeed'] = $qfh_ret[7];
$query_error_override = $qfh_ret[8];
$reply['search_query'] = [$search, $search_language];
$reply['vfeed_group_enabled'] = $vfeed_group_enabled;
@ -387,6 +389,9 @@ class Feeds extends Handler_Protected {
if (is_object($result)) {
if ($query_error_override) {
$message = $query_error_override;
} else {
switch ($view_mode) {
case "unread":
$message = __("No unread articles found to display.");
@ -404,6 +409,7 @@ class Feeds extends Handler_Protected {
$message = __("No articles found to display.");
}
}
}
if (!$offset && $message) {
$reply['content'] = "<div class='whiteBox'>$message";
@ -1421,10 +1427,13 @@ class Feeds extends Handler_Protected {
$ext_tables_part = "";
$limit_query_part = "";
$query_error_override = "";
$search_words = array();
$search_words = [];
if ($search) {
$search_query_part = "";
foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH) as $plugin) {
list($search_query_part, $search_words) = $plugin->hook_search($search);
break;
@ -1442,6 +1451,8 @@ class Feeds extends Handler_Protected {
} catch (PDOException $e) {
// looks like tsquery syntax is invalid
$search_query_part = "false";
$query_error_override = T_sprintf("Incorrect search syntax: %s.", implode(" ", $search_words));
}
}
@ -1736,7 +1747,7 @@ class Feeds extends Handler_Protected {
$first_id = (int)$row["id"];
if ($offset > 0 && $first_id && $check_first_id && $first_id != $check_first_id) {
return array(-1, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id, $vfeed_query_part != "");
return array(-1, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id, $vfeed_query_part != "", $query_error_override);
}
}
}
@ -1825,7 +1836,7 @@ class Feeds extends Handler_Protected {
$res = $pdo->query($query);
}
return array($res, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id, $vfeed_query_part != "");
return array($res, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id, $vfeed_query_part != "", $query_error_override);
}

View File

@ -1486,11 +1486,19 @@
}
if (count($search_query_leftover) > 0) {
$search_query_leftover = $pdo->quote(implode(" & ", $search_query_leftover));
if (DB_TYPE == "pgsql") {
// if there's no joiners consider this a "simple" search and
// concatenate everything with &, otherwise don't try to mess with tsquery syntax
if (preg_match("/[&|]/", implode(" " , $search_query_leftover))) {
$tsquery = $pdo->quote(implode(" ", $search_query_leftover));
} else {
$tsquery = $pdo->quote(implode(" & ", $search_query_leftover));
}
array_push($query_keywords,
"(tsvector_combined @@ to_tsquery($search_language, $search_query_leftover))");
"(tsvector_combined @@ to_tsquery($search_language, $tsquery))");
}
}