X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=blobdiff_plain;f=application%2Fmodels%2Fvideos_model.php;h=46efd1097fe6f414c4f72193b7247e1ef0609c29;hb=3177ec9aa46ca4feeb9eda48d9b6bce66a722f42;hp=69e7328ef694db03907f3a5585e103c42e1f5000;hpb=aaa8b077bac73addd05114fd2b2ef0829412fac7;p=living-lab-site.git
diff --git a/application/models/videos_model.php b/application/models/videos_model.php
index 69e7328..46efd10 100644
--- a/application/models/videos_model.php
+++ b/application/models/videos_model.php
@@ -22,10 +22,18 @@ class Videos_model extends CI_Model {
* Retrieves information about a set of videos which are going to be
* displayed in the catalog.
*
- * TODO: filter, limit, ordering parameters
* @param int $category_id DB category ID
* @param int $offset
* @param int $count
+ * @param string $ordering control videos ording by these
+ * possibilities:
+ *
+ * - 'hottest': newest most appreciated first. An
+ * appreciated video is one which has a bigger
+ * score = views + likes - dislikes.
+ * - 'newest': newest first.
+ * - 'alphabetically': sort alphabetically.
+ *
* @return array a list of videos, each one being an assoc array with:
*
* - id, name, title, duration, thumbs_count, default_thumb, views => from DB
@@ -35,17 +43,34 @@ class Videos_model extends CI_Model {
* - thumbs => thumbnail images' URLs
*
*/
- public function get_videos_summary($category_id, $offset, $count)
+ public function get_videos_summary($category_id, $offset, $count, $ordering = 'hottest')
{
$this->load->helper('text');
+ // Ordering
+ switch ($ordering)
+ {
+ case 'hottest':
+ $order_statement = "ORDER BY date DESC, score DESC, RAND()";
+ break;
+ case 'newest':
+ $order_statement = "ORDER BY date DESC";
+ break;
+ case 'alphabetically':
+ $order_statement = "ORDER BY title";
+ break;
+
+ default:
+ $order_statement = "";
+ }
+
$query = $this->db->query(
- 'SELECT id, name, title, duration, user_id, views, thumbs_count,
- default_thumb
+ "SELECT id, name, title, duration, user_id, views, thumbs_count,
+ default_thumb, (views + likes - dislikes) AS score
FROM `videos`
WHERE category_id = ?
- ORDER BY name
- LIMIT ?, ?', // TODO summary order
+ $order_statement
+ LIMIT ?, ?",
array(intval($category_id), $offset, $count));
if ($query->num_rows() > 0)
@@ -214,14 +239,66 @@ class Videos_model extends CI_Model {
public function search_videos($search_query, $offset = 0, $count = 0,
$category_id = NULL)
{
+ $search_query = trim($search_query);
+ $search_query = str_replace("'", " ", $search_query);
+
+ // Search word fragments.
+ // sfc = search fragment condition
+ $sfc = "( ";
+ // sfr = serach fragment relevation
+ $sfr = "( ";
+ $sep = ' +-*<>()~"';
+ $fragm = strtok($search_query, $sep);
+ while ($fragm !== FALSE)
+ {
+ $sfc .= "(title LIKE '%$fragm%'
+ OR description LIKE '%$fragm%'
+ OR tags LIKE '%$fragm%') OR ";
+
+ // Frament relevations are half of boolean relevations such
+ // that they will appear at the end of the results.
+ $sfr .= "0.25 * (title LIKE '%$fragm%')
+ + 0.1 * (description LIKE '%$fragm%')
+ + 0.15 * (tags LIKE '%$fragm%') + ";
+
+ $fragm = strtok($sep);
+ }
+ $sfc = substr($sfc, 0, -4) . " )";
+ $sfr = substr($sfr, 0, -3) . " )";
+
+ if (! $this->is_advanced_search_query($search_query))
+ {
+ $search_cond = "MATCH (title, description, tags)
+ AGAINST ('$search_query') OR $sfc";
+ $relevance = "( MATCH (title, description, tags)
+ AGAINST ('$search_query') + $sfr ) AS relevance";
+ }
+ // boolean mode
+ else
+ {
+ $against = "AGAINST ('$search_query' IN BOOLEAN MODE)";
+ $search_cond = "( MATCH (title, description, tags)
+ $against) OR $sfc";
+ $relevance = "( 0.5 * (MATCH(title) $against)
+ + 0.3 * (MATCH(tags) $against)
+ + 0.2 * (MATCH(description) $against)
+ + $sfr) AS relevance";
+ }
+
if ($count === 0)
{
$selected_columns = "COUNT(*) count";
+ $order = "";
$limit = "";
}
else
- {
- $selected_columns = "id, name, title, duration, user_id, views, thumbs_count, default_thumb, date, description";
+ {
+ // TODO select data, description if details are needed
+ $selected_columns = "id, name, title, duration, user_id, views,
+ thumbs_count, default_thumb,
+ (views + likes - dislikes) AS score,
+ $relevance";
+ $order = "ORDER BY relevance DESC, score DESC";
$limit = "LIMIT $offset, $count";
}
@@ -230,14 +307,13 @@ class Videos_model extends CI_Model {
else
$category_cond = "";
- $search_query = trim($search_query);
-
- $query = $this->db->query(
- "SELECT $selected_columns
+ $str_query = "SELECT $selected_columns
FROM `videos`
- WHERE $category_cond MATCH (title, description, tags) AGAINST (?)
- $limit",
- array($search_query));
+ WHERE $category_cond $search_cond
+ $order
+ $limit";
+ //echo "$str_query
";
+ $query = $this->db->query($str_query);
if ($query->num_rows() > 0)
{
@@ -271,6 +347,34 @@ class Videos_model extends CI_Model {
return $videos;
}
+
+ public function decode_search_query($search_query)
+ {
+ $search_query = urldecode($search_query);
+
+ $search_query = str_replace('_AST_', '*', $search_query);
+ $search_query = str_replace('_AND_', '+', $search_query);
+ $search_query = str_replace('_GT_', '>', $search_query);
+ $search_query = str_replace('_LT_', '<', $search_query);
+ $search_query = str_replace('_PO_', '(', $search_query);
+ $search_query = str_replace('_PC_', ')', $search_query);
+ $search_query = str_replace('_LOW_', '~', $search_query);
+ $search_query = str_replace('_QUO_', '"', $search_query);
+
+ return $search_query;
+ }
+
+ /**
+ * Return TRUE if it contains any special caracter from an advanced search
+ * query.
+ * @param string $search_query
+ * @return boolean
+ */
+ public function is_advanced_search_query($search_query)
+ {
+ return (preg_match('/\*|\+|\-|>|\<|\(|\)|~|"/', $search_query) == 0
+ ? FALSE : TRUE);
+ }
}
/* End of file videos_model.php */