From 2db1a559226b64c8c424b9ce8aaa17b4cac219ec Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Fri, 22 May 2015 13:19:53 +0200 Subject: Support boolean operators in search queries This adds very basic support for boolean search queries such as "video or movie" or "lin and not linux". However, nested queries such as "(video or movie) and editing" are not (yet) supported. Signed-off-by: Lukas Fleischer --- web/lib/pkgfuncs.inc.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'web/lib') diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php index 11ca591..2b5afaa 100644 --- a/web/lib/pkgfuncs.inc.php +++ b/web/lib/pkgfuncs.inc.php @@ -602,21 +602,38 @@ function pkg_search_page($SID="") { else { /* Search by name and description (default). */ $count = 0; + $q_where .= "AND ("; + $op = ""; foreach (str_getcsv($_GET['K'], ' ') as $term) { if ($term == "") { continue; } + if ($count > 0 && strtolower($term) == "and") { + $op = "AND "; + continue; + } + if ($count > 0 && strtolower($term) == "or") { + $op = "OR "; + continue; + } + if ($count > 0 && strtolower($term) == "not") { + $op .= "NOT "; + continue; + } $term = "%" . addcslashes($term, '%_') . "%"; - $q_where .= "AND (Packages.Name LIKE " . $dbh->quote($term) . " OR "; + $q_where .= $op . " (Packages.Name LIKE " . $dbh->quote($term) . " OR "; $q_where .= "Description LIKE " . $dbh->quote($term) . ") "; $count++; if ($count >= 20) { break; } + $op = "AND "; } + + $q_where .= ") "; } } -- cgit v1.2.3-70-g09d2