From cd30335df7f2a4c3b15c5f2ba181dc1b0444f00a Mon Sep 17 00:00:00 2001 From: rvelices Date: Sun, 20 Apr 2008 22:25:40 +0000 Subject: merge r 2306 from trunk to branch-1_7 - merged function ordering() with update_global_rank() and also optimized the queries git-svn-id: http://piwigo.org/svn/branches/branch-1_7@2307 68402e56-0260-453c-a942-63ccdbb3a9ee --- admin/cat_list.php | 5 +- admin/include/functions.php | 117 ++++++++++++++++---------------------------- admin/maintenance.php | 1 - admin/site_update.php | 11 ++--- install/upgrade_1.3.1.php | 21 ++++---- 5 files changed, 58 insertions(+), 97 deletions(-) diff --git a/admin/cat_list.php b/admin/cat_list.php index aac736a21..2b805b105 100644 --- a/admin/cat_list.php +++ b/admin/cat_list.php @@ -60,7 +60,7 @@ function save_categories_order($categories) $fields = array('primary' => array('id'), 'update' => array('rank')); mass_updates(CATEGORIES_TABLE, $fields, $datas); - update_global_rank(@$_GET['parent_id']); + update_global_rank(); } // +-----------------------------------------------------------------------+ @@ -82,7 +82,6 @@ if (isset($_GET['delete']) and is_numeric($_GET['delete']) and !is_adviser()) { delete_categories(array($_GET['delete'])); array_push($page['infos'], l10n('cat_virtual_deleted')); - ordering(); update_global_rank(); } // request to add a virtual category @@ -294,7 +293,7 @@ foreach ($categories as $category) } } // Add a link to Page bottom only if needed (10 or more categories) -if ( isset($category['rank']) and $category['rank'] > 9 ) +if ( isset($category['rank']) and $category['rank'] > 9 ) { $template->assign_block_vars('eop_link', array('ICON'=>'Displayed')); } diff --git a/admin/include/functions.php b/admin/include/functions.php index c7f2acde7..64ad4d93d 100644 --- a/admin/include/functions.php +++ b/admin/include/functions.php @@ -683,69 +683,72 @@ function mass_updates($tablename, $dbfields, $datas) } /** - * updates the global_rank of categories under the given id_uppercat - * - * @param int id_uppercat + * order categories (update categories.rank and global_rank database fields) + * so that rank field are consecutive integers starting at 1 for each child * @return void */ -function update_global_rank($id_uppercat = 'all') +function update_global_rank() { $query = ' -SELECT id,rank +SELECT id, if(id_uppercat is null,\'\',id_uppercat) AS id_uppercat, uppercats, rank, global_rank FROM '.CATEGORIES_TABLE.' + ORDER BY id_uppercat,rank,name ;'; - $result = pwg_query($query); - $ranks_array = array(); - while ($row = mysql_fetch_array($result)) - { - $ranks_array[$row['id']] = $row['rank']; - } - // which categories to update ? - $uppercats_array = array(); + $cat_map = array(); + + $current_rank = 0; + $current_uppercat = ''; - $query = ' -SELECT id,uppercats - FROM '.CATEGORIES_TABLE; - if (is_numeric($id_uppercat)) - { - $query.= ' - WHERE uppercats REGEXP \'(^|,)'.$id_uppercat.'(,|$)\' - AND id != '.$id_uppercat.' -'; - } - $query.= ' -;'; $result = pwg_query($query); while ($row = mysql_fetch_array($result)) { - $uppercats_array[$row['id']] = $row['uppercats']; + if ($row['id_uppercat'] != $current_uppercat) + { + $current_rank = 0; + $current_uppercat = $row['id_uppercat']; + } + ++$current_rank; + $cat = + array( + 'rank' => $current_rank, + 'rank_changed' =>$current_rank!=$row['rank'], + 'global_rank' => $row['global_rank'], + 'uppercats' => $row['uppercats'], + ); + $cat_map[ $row['id'] ] = $cat; } $datas = array(); - foreach ($uppercats_array as $id => $uppercats) + + foreach( $cat_map as $id=>$cat ) { - array_push( - $datas, - array( - 'id' => $id, - 'global_rank' => preg_replace( + $new_global_rank = preg_replace( '/(\d+)/e', - "\$ranks_array['$1']", - str_replace(',', '.', $uppercats) - ), - ) - ); + "\$cat_map['$1']['rank']", + str_replace(',', '.', $cat['uppercats'] ) + ); + if ( $cat['rank_changed'] + or $new_global_rank!=$cat['global_rank'] + ) + { + $datas[] = array( + 'id' => $id, + 'rank' => $cat['rank'], + 'global_rank' => $new_global_rank, + ); + } } mass_updates( CATEGORIES_TABLE, array( 'primary' => array('id'), - 'update' => array('global_rank') + 'update' => array('rank', 'global_rank') ), $datas ); + return count($datas); } /** @@ -893,43 +896,6 @@ SELECT image_id ); } -/** - * order categories (update categories.rank and global_rank database fields) - * - * the purpose of this function is to give a rank for all categories - * (insides its sub-category), even the newer that have none at te - * beginning. For this, ordering function selects all categories ordered by - * rank ASC then name ASC for each uppercat. - * - * @returns void - */ -function ordering() -{ - $current_rank = 0; - $current_uppercat = ''; - - $query = ' -SELECT id, if(id_uppercat is null,\'\',id_uppercat) AS id_uppercat - FROM '.CATEGORIES_TABLE.' - ORDER BY id_uppercat,rank,name -;'; - $result = pwg_query($query); - $datas = array(); - while ($row = mysql_fetch_array($result)) - { - if ($row['id_uppercat'] != $current_uppercat) - { - $current_rank = 0; - $current_uppercat = $row['id_uppercat']; - } - $data = array('id' => $row['id'], 'rank' => ++$current_rank); - array_push($datas, $data); - } - - $fields = array('primary' => array('id'), 'update' => array('rank')); - mass_updates(CATEGORIES_TABLE, $fields, $datas); -} - /** * returns the fulldir for each given category id * @@ -1370,7 +1336,6 @@ UPDATE '.CATEGORIES_TABLE.' pwg_query($query); update_uppercats(); - ordering(); update_global_rank(); // status and related permissions management diff --git a/admin/maintenance.php b/admin/maintenance.php index 7ee5f84e5..f44797b7d 100644 --- a/admin/maintenance.php +++ b/admin/maintenance.php @@ -48,7 +48,6 @@ switch ($action) { update_uppercats(); update_category('all'); - ordering(); update_global_rank(); invalidate_user_cache(); break; diff --git a/admin/site_update.php b/admin/site_update.php index fc69a940b..df05e11eb 100644 --- a/admin/site_update.php +++ b/admin/site_update.php @@ -242,7 +242,7 @@ SELECT IF(MAX(id)+1 IS NULL, 1, MAX(id)+1) AS next_id // If $_POST['subcats-included'] != 1 ("Search in subcategories" is unchecked) // $db_fulldirs doesn't include any subdirectories and $fs_fulldirs does - // So $fs_fulldirs will be limited to the selected basedir + // So $fs_fulldirs will be limited to the selected basedir // (if that one is in $fs_fulldirs) if (!isset($_POST['subcats-included']) or $_POST['subcats-included'] != 1) { @@ -253,7 +253,7 @@ SELECT IF(MAX(id)+1 IS NULL, 1, MAX(id)+1) AS next_id // print_r( array_diff($fs_fulldirs, array_keys($db_fulldirs)) ); echo "
"; // die('That\'s why dirs or files synchronizations were duplicating cats.'); - $inserts = array(); + $inserts = array(); // new categories are the directories not present yet in the database foreach (array_diff($fs_fulldirs, array_keys($db_fulldirs)) as $fulldir) { @@ -670,7 +670,6 @@ if (isset($_POST['submit']) echo get_elapsed_time($start,get_moment()); echo ' -->'."\n"; $start = get_moment(); - ordering(); update_global_rank(); echo '