aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorplegall <plg@piwigo.org>2006-01-20 14:34:37 +0000
committerplegall <plg@piwigo.org>2006-01-20 14:34:37 +0000
commit7b2ff328cb31b60e52ab90102d519966258917a1 (patch)
tree6af75e3709ce521ddd36c8bb6216a7363d3c9fa4 /include
parent9410522e9f7d077bb4830158b6f01276a55276b3 (diff)
Search engine redesign, first part :
- new table #search to store search rules associated to a search id. - search rules are not passed through GET anymore, the search array build in search.php is serialized in #search table, so no need to rebuild it in function include/functions_category.inc.php::category_initialize - search array build code is improved (efficiency and layout) in search.php - SQL related to search is build in a dedicated function include/functions::get_sql_search_clause - direct search author:<...>, date_avalaible:<...>, date_creation:<...>, keywords:<...> from picture.php are not available anymore. They will come back later, with improvement (new design). Same for date_*:<> in calendar calendar category. git-svn-id: http://piwigo.org/svn/trunk@1008 68402e56-0260-453c-a942-63ccdbb3a9ee
Diffstat (limited to '')
-rw-r--r--include/constants.php1
-rw-r--r--include/functions.inc.php186
-rw-r--r--include/functions_category.inc.php152
3 files changed, 191 insertions, 148 deletions
diff --git a/include/constants.php b/include/constants.php
index bb5a1d926..bf5cfd29c 100644
--- a/include/constants.php
+++ b/include/constants.php
@@ -60,4 +60,5 @@ define('RATE_TABLE', $prefixeTable.'rate');
define('USER_CACHE_TABLE', $prefixeTable.'user_cache');
define('CADDIE_TABLE', $prefixeTable.'caddie');
define('UPGRADE_TABLE', $prefixeTable.'upgrade');
+define('SEARCH_TABLE', $prefixeTable.'search');
?>
diff --git a/include/functions.inc.php b/include/functions.inc.php
index 556c62582..f5710bbdd 100644
--- a/include/functions.inc.php
+++ b/include/functions.inc.php
@@ -741,8 +741,8 @@ function l10n($key)
}
/**
- * returns the corresponding value from $themeconf if existing. Else, the key is
- * returned
+ * returns the corresponding value from $themeconf if existing. Else, the
+ * key is returned
*
* @param string key
* @return string
@@ -753,4 +753,186 @@ function get_themeconf($key)
return $themeconf[$key];
}
+
+/**
+ * Prepends and appends a string at each value of the given array.
+ *
+ * @param array
+ * @param string prefix to each array values
+ * @param string suffix to each array values
+ */
+function prepend_append_array_items($array, $prepend_str, $append_str)
+{
+ array_walk(
+ $array,
+ create_function('&$s', '$s = "'.$prepend_str.'".$s."'.$append_str.'";')
+ );
+
+ return $array;
+}
+
+/**
+ * returns the SQL clause from a search identifier
+ *
+ * Search rules are stored in search table as a serialized array. This array
+ * need to be transformed into an SQL clause to be used in queries.
+ *
+ * @param int search_id
+ * @return string
+ */
+function get_sql_search_clause($search_id)
+{
+ if (!is_numeric($search_id))
+ {
+ die('Search id must be an integer');
+ }
+
+ $query = '
+SELECT rules
+ FROM '.SEARCH_TABLE.'
+ WHERE id = '.$_GET['search'].'
+;';
+ list($serialized_rules) = mysql_fetch_row(pwg_query($query));
+
+ $search = unserialize($serialized_rules);
+
+// echo '<pre>';
+// print_r($search);
+// echo '</pre>';
+
+ // SQL where clauses are stored in $clauses array during query
+ // construction
+ $clauses = array();
+
+ foreach (array('file','name','comment','keywords','author') as $textfield)
+ {
+ if (isset($search['fields'][$textfield]))
+ {
+ $local_clauses = array();
+ foreach ($search['fields'][$textfield]['words'] as $word)
+ {
+ array_push($local_clauses, $textfield." LIKE '%".$word."%'");
+ }
+
+ // adds brackets around where clauses
+ $local_clauses = prepend_append_array_items($local_clauses, '(', ')');
+
+ array_push(
+ $clauses,
+ implode(
+ ' '.$search['fields'][$textfield]['mode'].' ',
+ $local_clauses
+ )
+ );
+ }
+ }
+
+ if (isset($search['fields']['allwords']))
+ {
+ $fields = array('file', 'name', 'comment', 'keywords', 'author');
+ // in the OR mode, request bust be :
+ // ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
+ // OR (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
+ //
+ // in the AND mode :
+ // ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
+ // AND (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
+ $word_clauses = array();
+ foreach ($search['fields']['allwords']['words'] as $word)
+ {
+ $field_clauses = array();
+ foreach ($fields as $field)
+ {
+ array_push($field_clauses, $field." LIKE '%".$word."%'");
+ }
+ // adds brackets around where clauses
+ array_push(
+ $word_clauses,
+ implode(
+ "\n OR ",
+ $field_clauses
+ )
+ );
+ }
+
+ array_walk(
+ $word_clauses,
+ create_function('&$s','$s="(".$s.")";')
+ );
+
+ array_push(
+ $clauses,
+ "\n ".
+ implode(
+ "\n ".
+ $search['fields']['allwords']['mode'].
+ "\n ",
+ $word_clauses
+ )
+ );
+ }
+
+ foreach (array('date_available', 'date_creation') as $datefield)
+ {
+ if (isset($search['fields'][$datefield]))
+ {
+ array_push(
+ $clauses,
+ $datefield." = '".$search['fields'][$datefield]['date']."'"
+ );
+ }
+
+ foreach (array('after','before') as $suffix)
+ {
+ $key = $datefield.'-'.$suffix;
+
+ if (isset($search['fields'][$key]))
+ {
+ array_push(
+ $clauses,
+
+ $datefield.
+ ($suffix == 'after' ? ' >' : ' <').
+ ($search['fields'][$key]['inc'] ? '=' : '').
+ " '".$search['fields'][$key]['date']."'"
+
+ );
+ }
+ }
+ }
+
+ if (isset($search['fields']['cat']))
+ {
+ if ($search['fields']['cat']['sub_inc'])
+ {
+ // searching all the categories id of sub-categories
+ $cat_ids = get_subcat_ids($search['fields']['cat']['words']);
+ }
+ else
+ {
+ $cat_ids = $search['fields']['cat']['words'];
+ }
+
+ $local_clause = 'category_id IN ('.implode(',', $cat_ids).')';
+ array_push($clauses, $local_clause);
+ }
+
+ // adds brackets around where clauses
+ $clauses = prepend_append_array_items($clauses, '(', ')');
+
+ $where_separator =
+ implode(
+ "\n ".$search['mode'].' ',
+ $clauses
+ );
+
+ $search_clause = $where_separator;
+
+ if (isset($forbidden))
+ {
+ $search_clause.= "\n AND ".$forbidden;
+ }
+
+ return $search_clause;
+}
?>
diff --git a/include/functions_category.inc.php b/include/functions_category.inc.php
index 6b9618db1..c9fee76f0 100644
--- a/include/functions_category.inc.php
+++ b/include/functions_category.inc.php
@@ -103,7 +103,9 @@ function check_cat_id( $cat )
{
$page['cat'] = $cat;
}
- if ($cat == 'search' and isset($_GET['search']))
+ if ($cat == 'search'
+ and isset($_GET['search'])
+ and is_numeric($_GET['search']))
{
$page['cat'] = $cat;
}
@@ -381,44 +383,6 @@ function initialize_category( $calling_page = 'category' )
// search result
if ( $page['cat'] == 'search' )
{
- // analyze search string given in URL (created in search.php)
- $tokens = explode('|', $_GET['search']);
-
- if (isset($tokens[1]) and $tokens[1] == 'AND')
- {
- $search['mode'] = 'AND';
- }
- else
- {
- $search['mode'] = 'OR';
- }
-
- $search_tokens = explode('--', $tokens[0]);
- foreach ($search_tokens as $search_token)
- {
- $tokens = explode(':', $search_token);
- $field_name = $tokens[0];
- $field_content = $tokens[1];
-
- $tokens = explode('~', $tokens[1]);
- if (isset($tokens[1]))
- {
- $search['fields'][$field_name]['mode'] = $tokens[1];
- }
- else
- {
- $search['fields'][$field_name]['mode'] = '';
- }
-
- $search['fields'][$field_name]['words'] = array();
- $tokens = explode(',', $tokens[0]);
- foreach ($tokens as $token)
- {
- array_push($search['fields'][$field_name]['words'],
- htmlentities($token));
- }
- }
-
$page['title'] = $lang['search_result'];
if ( $calling_page == 'picture' )
{
@@ -426,117 +390,13 @@ function initialize_category( $calling_page = 'category' )
$page['title'].= $_GET['search']."</span>";
}
- // SQL where clauses are stored in $clauses array during query
- // construction
- $clauses = array();
+ $page['where'] = 'WHERE '.get_sql_search_clause($_GET['search']);
- $textfields = array('file', 'name', 'comment', 'keywords', 'author');
- foreach ($textfields as $textfield)
- {
- if (isset($search['fields'][$textfield]))
- {
- $local_clauses = array();
- foreach ($search['fields'][$textfield]['words'] as $word)
- {
- array_push($local_clauses, $textfield." LIKE '%".$word."%'");
- }
- // adds brackets around where clauses
- array_walk($local_clauses,create_function('&$s','$s="(".$s.")";'));
- array_push($clauses,
- implode(' '.$search['fields'][$textfield]['mode'].' ',
- $local_clauses));
- }
- }
-
- if (isset($search['fields']['allwords']))
- {
- $fields = array('file', 'name', 'comment', 'keywords', 'author');
- // in the OR mode, request bust be :
- // ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
- // OR (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
- //
- // in the AND mode :
- // ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
- // AND (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
- $word_clauses = array();
- foreach ($search['fields']['allwords']['words'] as $word)
- {
- $field_clauses = array();
- foreach ($fields as $field)
- {
- array_push($field_clauses, $field." LIKE '%".$word."%'");
- }
- // adds brackets around where clauses
- array_push($word_clauses, implode(' OR ', $field_clauses));
- }
- array_walk($word_clauses, create_function('&$s','$s="(".$s.")";'));
- array_push($clauses,
- implode(' '.$search['fields']['allwords']['mode'].' ',
- $word_clauses));
- }
-
- $datefields = array('date_available', 'date_creation');
- foreach ($datefields as $datefield)
- {
- $key = $datefield;
- if (isset($search['fields'][$key]))
- {
- $local_clause = $datefield." = '";
- $local_clause.= str_replace('.', '-',
- $search['fields'][$key]['words'][0]);
- $local_clause.= "'";
- array_push($clauses, $local_clause);
- }
-
- foreach (array('after','before') as $suffix)
- {
- $key = $datefield.'-'.$suffix;
- if (isset($search['fields'][$key]))
- {
- $local_clause = $datefield;
- if ($suffix == 'after')
- {
- $local_clause.= ' >';
- }
- else
- {
- $local_clause.= ' <';
- }
- if (isset($search['fields'][$key]['mode'])
- and $search['fields'][$key]['mode'] == 'inc')
- {
- $local_clause.= '=';
- }
- $local_clause.= " '";
- $local_clause.= str_replace('.', '-',
- $search['fields'][$key]['words'][0]);
- $local_clause.= "'";
- array_push($clauses, $local_clause);
- }
- }
- }
-
- if (isset($search['fields']['cat']))
+ if (isset($forbidden))
{
- if ($search['fields']['cat']['mode'] == 'sub_inc')
- {
- // searching all the categories id of sub-categories
- $cat_ids = get_subcat_ids($search['fields']['cat']['words']);
- }
- else
- {
- $cat_ids = $search['fields']['cat']['words'];
- }
-
- $local_clause = 'category_id IN ('.implode(',', $cat_ids).')';
- array_push($clauses, $local_clause);
+ $page['where'].= "\n AND ".$forbidden;
}
- // adds brackets around where clauses
- array_walk($clauses, create_function('&$s', '$s = "(".$s.")";'));
- $page['where'] = 'WHERE '.implode(' '.$search['mode'].' ', $clauses);
- if ( isset( $forbidden ) ) $page['where'].= ' AND '.$forbidden;
-
$query = '
SELECT COUNT(DISTINCT(id)) AS nb_total_images
FROM '.IMAGES_TABLE.'