[aur-dev] [PATCH v2] Add search for keywords only
Implements FS#45619. Signed-off-by: Marcel Korpel <marcel.korpel@gmail.com> --- Changes since v1: * refactor sophiticated keyword search functionality to function * use this function to search for package keywords * update PHPDoc web/lib/pkgfuncs.inc.php | 103 ++++++++++++++++++++++++--------------- web/template/pkg_search_form.php | 1 + 2 files changed, 65 insertions(+), 39 deletions(-) diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php index d760429..67cd10c 100644 --- a/web/lib/pkgfuncs.inc.php +++ b/web/lib/pkgfuncs.inc.php @@ -516,7 +516,10 @@ function pkg_display_details($id=0, $row, $SID="") { * SeB- property that search string (K) represents * values: n - package name * nd - package name & description - * x - package name (exact match) + * b - package base name + * N - package name (exact match) + * B - package base name (exact match) + * k - package keyword(s) * m - package maintainer's username * s - package submitter's username * do_Orphans - boolean. whether to search packages @@ -608,6 +611,10 @@ function pkg_search_page($SID="") { $K = "%" . addcslashes($_GET['K'], '%_') . "%"; $q_where .= "AND (PackageBases.Name LIKE " . $dbh->quote($K) . ") "; } + elseif (isset($_GET["SeB"]) && $_GET["SeB"] == "k") { + /* Search by keywords. */ + $q_where .= construct_keyword_search($dbh, false); + } elseif (isset($_GET["SeB"]) && $_GET["SeB"] == "N") { /* Search by name (exact match). */ $q_where .= "AND (Packages.Name = " . $dbh->quote($_GET['K']) . ") "; @@ -618,44 +625,7 @@ function pkg_search_page($SID="") { } else { /* Keyword search (default). */ - $count = 0; - $q_keywords = ""; - $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_keywords .= $op . " (Packages.Name LIKE " . $dbh->quote($term) . " OR "; - $q_keywords .= "Description LIKE " . $dbh->quote($term) . " OR "; - $q_keywords .= "EXISTS (SELECT * FROM PackageKeywords WHERE "; - $q_keywords .= "PackageKeywords.PackageBaseID = Packages.PackageBaseID AND "; - $q_keywords .= "PackageKeywords.Keyword LIKE " . $dbh->quote($term) . ")) "; - - $count++; - if ($count >= 20) { - break; - } - $op = "AND "; - } - - if (!empty($q_keywords)) { - $q_where .= "AND (" . $q_keywords . ") "; - } + $q_where .= construct_keyword_search($dbh, true); } } @@ -771,6 +741,61 @@ function pkg_search_page($SID="") { } /** + * Construct a WHERE part of sophiticated keyword search + * + * @param handle $dbh Database handle + * @param boolean $namedesc Search name and description fields? + * + * @return string WHERE part of SQL clause + */ +function construct_keyword_search($dbh, $namedesc) { + $count = 0; + $where_part = ""; + $q_keywords = ""; + $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_keywords .= $op . " ("; + if ($namedesc) { + $q_keywords .= "Packages.Name LIKE " . $dbh->quote($term) . " OR "; + $q_keywords .= "Description LIKE " . $dbh->quote($term) . " OR "; + } + $q_keywords .= "EXISTS (SELECT * FROM PackageKeywords WHERE "; + $q_keywords .= "PackageKeywords.PackageBaseID = Packages.PackageBaseID AND "; + $q_keywords .= "PackageKeywords.Keyword LIKE " . $dbh->quote($term) . ")) "; + + $count++; + if ($count >= 20) { + break; + } + $op = "AND "; + } + + if (!empty($q_keywords)) { + $where_part = "AND (" . $q_keywords . ") "; + } + + return $where_part; +} + +/** * Determine if a POST string has been sent by a visitor * * @param string $action String to check has been sent via POST diff --git a/web/template/pkg_search_form.php b/web/template/pkg_search_form.php index 404d16e..cce3b6a 100644 --- a/web/template/pkg_search_form.php +++ b/web/template/pkg_search_form.php @@ -7,6 +7,7 @@ $searchby = array( 'b' => __('Package Base'), 'N' => __('Exact Name'), 'B' => __('Exact Package Base'), + 'k' => __('Keywords'), 'm' => __('Maintainer'), 's' => __('Submitter') ); -- 2.5.3
On Tue, 22 Sep 2015 at 22:02:37, Marcel Korpel wrote:
Implements FS#45619.
Signed-off-by: Marcel Korpel <marcel.korpel@gmail.com> --- Changes since v1: * refactor sophiticated keyword search functionality to function * use this function to search for package keywords * update PHPDoc
web/lib/pkgfuncs.inc.php | 103 ++++++++++++++++++++++++--------------- web/template/pkg_search_form.php | 1 + 2 files changed, 65 insertions(+), 39 deletions(-) [...]
Awesome, this is exactly what I was thinking of. Applied, thanks!
* Lukas Fleischer <lfleischer@archlinux.org> (Wed, 23 Sep 2015 06:06:50 +0200):
* refactor sophiticated keyword search functionality to function
I mistyped 'sophisticated' twice. At this place it doesn't matter, but in the PHPDoc of construct_keyword_search (in pkgfuncs.inc.php) it is not so nice. Can you correct it? Thanks.
On Wed, 23 Sep 2015 at 17:16:48, Marcel Korpel wrote:
* Lukas Fleischer <lfleischer@archlinux.org> (Wed, 23 Sep 2015 06:06:50 +0200):
* refactor sophiticated keyword search functionality to function
I mistyped 'sophisticated' twice. At this place it doesn't matter, but in the PHPDoc of construct_keyword_search (in pkgfuncs.inc.php) it is not so nice. Can you correct it?
Thanks.
Done, and merged into master.
participants (2)
-
Lukas Fleischer
-
Marcel Korpel