aboutsummaryrefslogtreecommitdiffstats
path: root/include/functions_tag.inc.php
diff options
context:
space:
mode:
authorrvelices <rv-github@modusoptimus.com>2011-01-17 21:16:42 +0000
committerrvelices <rv-github@modusoptimus.com>2011-01-17 21:16:42 +0000
commite123585dde33f8ec3be13e788eea6fc10041920f (patch)
treea6857b12bdc8e83c060c5166ebf07fe932f8c745 /include/functions_tag.inc.php
parentb5046a4f949435ffbf068884f97cce300bf5ee90 (diff)
bug 2105 : Browsing tags is slow if tags contains many photos
git-svn-id: http://piwigo.org/svn/trunk@8726 68402e56-0260-453c-a942-63ccdbb3a9ee
Diffstat (limited to 'include/functions_tag.inc.php')
-rw-r--r--include/functions_tag.inc.php73
1 files changed, 33 insertions, 40 deletions
diff --git a/include/functions_tag.inc.php b/include/functions_tag.inc.php
index 0f5859333..4228219d4 100644
--- a/include/functions_tag.inc.php
+++ b/include/functions_tag.inc.php
@@ -160,52 +160,45 @@ function add_level_to_tags($tags)
*
* @param array tag ids
* @param string mode
+ * @param string extra_images_where_sql - optionally apply a sql where filter to retrieved images
+ * @param string order_by - optionally overwrite default photo order
* @return array
*/
-function get_image_ids_for_tags($tag_ids, $mode = 'AND')
+function get_image_ids_for_tags($tag_ids, $mode='AND', $extra_images_where_sql='', $order_by='')
{
- switch ($mode)
+ global $conf;
+ if (empty($tag_ids))
{
- case 'AND':
- {
- // strategy is to list images associated to each tag
- $tag_images = array();
-
- foreach ($tag_ids as $tag_id)
- {
- $query = '
-SELECT image_id
- FROM '.IMAGE_TAG_TABLE.'
- WHERE tag_id = '.$tag_id.'
-;';
- $tag_images[$tag_id] = array_from_query($query, 'image_id');
- }
+ return array();
+ }
- // then we calculate the intersection, the images that are associated to
- // every tags
- $items = array_shift($tag_images);
- foreach ($tag_images as $images)
- {
- $items = array_intersect($items, $images);
- }
- return $items;
- break;
- }
- case 'OR':
- {
- $query = '
-SELECT DISTINCT image_id
- FROM '.IMAGE_TAG_TABLE.'
- WHERE tag_id IN ('.implode(',', $tag_ids).')
-;';
- return array_from_query($query, 'image_id');
- break;
- }
- default:
- {
- die('get_image_ids_for_tags: unknown mode, only AND & OR are supported');
- }
+ $query = 'SELECT id
+ FROM '.IMAGES_TABLE.' i
+ INNER JOIN '.IMAGE_CATEGORY_TABLE.' ic ON id=ic.image_id
+ INNER JOIN '.IMAGE_TAG_TABLE.' it ON id=it.image_id
+ WHERE tag_id IN ('.implode(',', $tag_ids).')'
+ .get_sql_condition_FandF
+ (
+ array
+ (
+ 'forbidden_categories' => 'category_id',
+ 'visible_categories' => 'category_id',
+ 'visible_images' => 'id'
+ ),
+ "\n AND"
+ )
+ .(empty($extra_images_where_sql) ? '' : " \nAND (".$extra_images_where_sql.')')
+ .'
+ GROUP BY id';
+
+ if ($mode=='AND' and count($tag_ids)>1)
+ {
+ $query .= '
+ HAVING COUNT(DISTINCT tag_id)='.count($tag_ids);
}
+ $query .= "\n".(empty($order_by) ? $conf['order_by'] : $order_by);
+
+ return array_from_query($query, 'id');
}
/**