fixes #1830 faster way to calculate number of orphans

* store count result in config table, as a cache
* resets this cache on invalidate_user_cache
* instead of a costly SQL query with a LEFT JOIN, use 2 simple COUNT in the 2 tables, and compare
This commit is contained in:
plegall 2023-10-06 15:03:22 +02:00
parent d050573d83
commit 09890487cd
3 changed files with 30 additions and 2 deletions

View file

@ -301,7 +301,7 @@ $page['nb_orphans'] = 0;
list($page['nb_photos_total']) = pwg_db_fetch_row(pwg_query('SELECT COUNT(*) FROM '.IMAGES_TABLE));
if ($page['nb_photos_total'] < 100000) // 100k is already a big gallery
{
$page['nb_orphans'] = count(get_orphans());
$page['nb_orphans'] = count_orphans();
}
$template->assign(

View file

@ -2206,6 +2206,7 @@ UPDATE '.USER_CACHE_TABLE.'
SET need_update = \'true\';';
pwg_query($query);
}
conf_delete_param('count_orphans');
trigger_notify('invalidate_user_cache', $full);
}
@ -3269,6 +3270,33 @@ SELECT path
return count($ids);
}
function count_orphans()
{
if (is_null(conf_get_param('count_orphans')))
{
// we don't care about the list of image_ids, we only care about the number
// of orphans, so let's use a faster method than calling count(get_orphans())
$query = '
SELECT
COUNT(*)
FROM '.IMAGES_TABLE.'
;';
list($image_counter_all) = pwg_db_fetch_row(pwg_query($query));
$query = '
SELECT
COUNT(DISTINCT(image_id))
FROM '.IMAGE_CATEGORY_TABLE.'
;';
list($image_counter_in_categories) = pwg_db_fetch_row(pwg_query($query));
$counter = $image_counter_all - $image_counter_in_categories;
conf_update_param('count_orphans', $counter, true);
}
return conf_get_param('count_orphans');
}
/**
* Return the list of image ids associated to no album
*

View file

@ -59,7 +59,7 @@ $nb_orphans = $page['nb_orphans']; // already calculated in admin.php
if ($page['nb_photos_total'] >= 100000) // but has not been calculated on a big gallery, so force it now
{
$nb_orphans = count(get_orphans());
$nb_orphans = count_orphans();
}
if ($nb_orphans > 0)