summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Korpel <marcel.korpel@gmail.com>2015-09-22 22:02:37 +0200
committerLukas Fleischer <lfleischer@archlinux.org>2015-09-23 21:45:47 +0200
commit4516f07d9c135f32dc1341d289606cd0c4801d82 (patch)
treedabb0cde20033bbb31bfb75df85c1e6e5cef77e9
parentd5d08b8f926e8882864afbfd7446440acc1005d0 (diff)
downloadaur-4516f07d9c135f32dc1341d289606cd0c4801d82.tar.gz
aur-4516f07d9c135f32dc1341d289606cd0c4801d82.tar.xz
Add search for keywords only
Implements FS#45619. Signed-off-by: Marcel Korpel <marcel.korpel@gmail.com> Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
-rw-r--r--web/lib/pkgfuncs.inc.php103
-rw-r--r--web/template/pkg_search_form.php1
2 files changed, 65 insertions, 39 deletions
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 600e5905..edc747b8 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -575,7 +575,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
@@ -667,6 +670,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']) . ") ";
@@ -677,44 +684,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);
}
}
@@ -834,6 +804,61 @@ function pkg_search_page($SID="") {
}
/**
+ * Construct the WHERE part of the sophisticated keyword search
+ *
+ * @param handle $dbh Database handle
+ * @param boolean $namedesc Search name and description fields
+ *
+ * @return string WHERE part of the 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 1cc5fb26..795a796e 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')
);