summaryrefslogtreecommitdiff
path: root/modules/search/helpers
diff options
context:
space:
mode:
authorNathan Kinkade <nath@nkinka.de>2011-09-28 20:39:05 +0000
committerNathan Kinkade <nath@nkinka.de>2011-09-28 20:39:05 +0000
commit47456c0de8a408bca9b5a02a0fbc835ff1c01a68 (patch)
treedca2ead5e7159b28aa323465a363f81813f75acd /modules/search/helpers
parentd8dffba94277c2179a59eb72d6927a5bdb879648 (diff)
parentdfbfe090168ee4ed44e2c8208e79d3fe40f90437 (diff)
Manually fixed a merge conflict after pulling.
Diffstat (limited to 'modules/search/helpers')
-rw-r--r--modules/search/helpers/search.php45
1 files changed, 36 insertions, 9 deletions
diff --git a/modules/search/helpers/search.php b/modules/search/helpers/search.php
index a3fd795a..a77a2433 100644
--- a/modules/search/helpers/search.php
+++ b/modules/search/helpers/search.php
@@ -36,8 +36,19 @@ class search_Core {
static function search($q, $limit, $offset) {
$db = Database::instance();
- $q = $db->escape($q);
+ $query = self::_build_query_base($q) .
+ "ORDER BY `score` DESC " .
+ "LIMIT $limit OFFSET " . (int)$offset;
+
+ $data = $db->query($query);
+ $count = $db->query("SELECT FOUND_ROWS() as c")->current()->c;
+
+ return array($count, new ORM_Iterator(ORM::factory("item"), $data));
+ }
+
+ private static function _build_query_base($q, $where=array()) {
+ $q = Database::instance()->escape($q);
if (!identity::active_user()->admin) {
foreach (identity::group_ids_for_active_user() as $id) {
$fields[] = "`view_$id` = TRUE"; // access::ALLOW
@@ -47,18 +58,13 @@ class search_Core {
$access_sql = "";
}
- $query =
+ return
"SELECT SQL_CALC_FOUND_ROWS {items}.*, " .
" MATCH({search_records}.`data`) AGAINST ('$q') AS `score` " .
"FROM {items} JOIN {search_records} ON ({items}.`id` = {search_records}.`item_id`) " .
"WHERE MATCH({search_records}.`data`) AGAINST ('$q' IN BOOLEAN MODE) " .
- $access_sql .
- "ORDER BY `score` DESC " .
- "LIMIT $limit OFFSET " . (int)$offset;
- $data = $db->query($query);
- $count = $db->query("SELECT FOUND_ROWS() as c")->current()->c;
-
- return array($count, new ORM_Iterator(ORM::factory("item"), $data));
+ (empty($where) ? "" : " AND " . join(" AND ", $where)) .
+ $access_sql;
}
/**
@@ -103,4 +109,25 @@ class search_Core {
return array($remaining, $total, $percent);
}
+
+ static function get_position($item, $q) {
+ $page_size = module::get_var("gallery", "page_size", 9);
+
+ $query = self::_build_query_base($q, array("{items}.id = " . $item->id));
+
+ $db = Database::instance();
+
+ // Truncate the score by two decimal places as this resolves the issues
+ // that arise due to in exact numeric conversions.
+ $score = $db->query($query)->current()->score;
+ $score = substr($score, 0, strlen($score) - 2);
+
+ $data = $db->query(self::_build_query_base($q) . "having `score` >= " . $score);
+
+ $data->seek($data->count() - 1);
+
+ while ($data->get("id") != $item->id && $data->prev()->valid());
+
+ return $data->key() + 1;
+ }
}