[aur-dev] [PATCH v2] Add search for keywords only

Marcel Korpel marcel.korpel at gmail.com
Tue Sep 22 20:02:37 UTC 2015


Implements FS#45619.

Signed-off-by: Marcel Korpel <marcel.korpel at 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


More information about the aur-dev mailing list