From 216e0ba85a98535298be33c49f2056046fc0ba04 Mon Sep 17 00:00:00 2001 From: plegall Date: Mon, 28 Jan 2019 14:05:36 +0100 Subject: [PATCH] (cp b29ab34) fixes #972 use an alternative algorithm to discover number of future orphans, with very large albums --- admin/cat_modify.php | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/admin/cat_modify.php b/admin/cat_modify.php index 3a1086ecb..5527bd44f 100644 --- a/admin/cat_modify.php +++ b/admin/cat_modify.php @@ -218,18 +218,49 @@ $category['nb_images_associated_outside'] = 0; if ($category['nb_images_recursive'] > 0) { - $query = ' + // if we don't have "too many" photos, it's faster to compute the orphans with MySQL + if ($category['nb_images_recursive'] < 30000) + { + $query = ' SELECT DISTINCT(image_id) FROM '.IMAGE_CATEGORY_TABLE.' WHERE category_id NOT IN ('.implode(',', $subcat_ids).') AND image_id IN ('.implode(',', $image_ids_recursive).') ;'; - $image_ids_associated_outside = query2array($query, null, 'image_id'); - $category['nb_images_associated_outside'] = count($image_ids_associated_outside); - $image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_associated_outside); - $category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan); + $image_ids_associated_outside = query2array($query, null, 'image_id'); + $category['nb_images_associated_outside'] = count($image_ids_associated_outside); + + $image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_associated_outside); + $category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan); + } + // else it's better to avoid sending a huge SQL request, we compute the orphan list with PHP + else + { + $image_ids_recursive_keys = array_flip($image_ids_recursive); + + $query = ' +SELECT + image_id + FROM '.IMAGE_CATEGORY_TABLE.' + WHERE category_id NOT IN ('.implode(',', $subcat_ids).') +;'; + $image_ids_associated_outside = query2array($query, null, 'image_id'); + $image_ids_not_orphan = array(); + + foreach ($image_ids_associated_outside as $image_id) + { + if (isset($image_ids_recursive_keys[$image_id])) + { + $image_ids_not_orphan[] = $image_id; + } + } + + $category['nb_images_associated_outside'] = count(array_unique($image_ids_not_orphan)); + $image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_not_orphan); + $category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan); + } } // Navigation path