From 66cc7bf10103137255b3346fb508b54b957db0e6 Mon Sep 17 00:00:00 2001 From: Reedy Date: Sat, 14 Mar 2020 23:51:26 +0000 Subject: [PATCH] Remove CategoryFinder class Bug: T250572 Change-Id: I792cf30d9edc330c3a28e2e000f17d9e2dab69d6 --- RELEASE-NOTES-1.36 | 6 +- autoload.php | 1 - includes/CategoryFinder.php | 266 -------------------------------------------- 3 files changed, 4 insertions(+), 269 deletions(-) delete mode 100644 includes/CategoryFinder.php diff --git a/RELEASE-NOTES-1.36 b/RELEASE-NOTES-1.36 index d55ff0e18bd..1cef2d67e2c 100644 --- a/RELEASE-NOTES-1.36 +++ b/RELEASE-NOTES-1.36 @@ -86,11 +86,13 @@ because of Phabricator reports. individually hard deprecated previously. The following have now been removed: - ApiTestCase::doLogin - All methods of the old SpecialPageFactory; the entire class was removed -* The global function `wfWaitForSlaves`, deprecated since 1.27 & hard-deprecated - since 1.35, has been removed. Use LBFactory::waitForReplication() instead. +* The global function `wfWaitForSlaves`, deprecated in 1.27 and hard-deprecated + in 1.35, has been removed. Use LBFactory::waitForReplication() instead. * The global variable $wgMemc, deprecated since 1.35, has been removed. Usage should generally be migrated to WANObjectCache, or if you really need the internal object, use ObjectCache::getLocalClusterInstance instead. +* CategoryFinder, which was deprecated in 1.31 and hard-deprecated in 1.35, + has been removed. * The support for IE8 has been dropped. * Less mixin `.background-image-svg-quick()` from mediawiki.mixins.less, deprecated since 1.35, has been removed. diff --git a/autoload.php b/autoload.php index 7ac792ad5b7..1e8835065db 100644 --- a/autoload.php +++ b/autoload.php @@ -229,7 +229,6 @@ $wgAutoloadLocalClasses = [ 'CategoriesRdf' => __DIR__ . '/includes/CategoriesRdf.php', 'Category' => __DIR__ . '/includes/Category.php', 'CategoryChangesAsRdf' => __DIR__ . '/maintenance/categoryChangesAsRdf.php', - 'CategoryFinder' => __DIR__ . '/includes/CategoryFinder.php', 'CategoryMembershipChange' => __DIR__ . '/includes/changes/CategoryMembershipChange.php', 'CategoryMembershipChangeJob' => __DIR__ . '/includes/jobqueue/jobs/CategoryMembershipChangeJob.php', 'CategoryPage' => __DIR__ . '/includes/page/CategoryPage.php', diff --git a/includes/CategoryFinder.php b/includes/CategoryFinder.php deleted file mode 100644 index 49503112dfb..00000000000 --- a/includes/CategoryFinder.php +++ /dev/null @@ -1,266 +0,0 @@ -seed( - * [ 12345 ], - * [ 'Category 1', 'Category 2' ], - * 'AND' - * ); - * $a = $cf->run(); - * print implode( ',' , $a ); - * @endcode - * - * @deprecated since 1.31 - */ -class CategoryFinder { - /** @var int[] The original article IDs passed to the seed function */ - protected $articles = []; - - /** @var array Array of DBKEY category names for categories that don't have a page */ - protected $deadend = []; - - /** @var array Array of [ ID => [] ] */ - protected $parents = []; - - /** @var array Array of article/category IDs */ - protected $next = []; - - /** @var int Max layer depth */ - protected $maxdepth = -1; - - /** @var array Array of DBKEY category names */ - protected $targets = []; - - /** @var array */ - protected $name2id = []; - - /** @var string "AND" or "OR" */ - protected $mode; - - /** @var IDatabase Read-DB replica DB */ - protected $dbr; - - public function __construct() { - wfDeprecated( __METHOD__, '1.31' ); - } - - /** - * Initializes the instance. Do this prior to calling run(). - * @param array $articleIds Array of article IDs - * @param array $categories FIXME - * @param string $mode FIXME, default 'AND'. - * @param int $maxdepth Maximum layer depth. Where: - * -1 means deep recursion (default); - * 0 means no-parents; - * 1 means one parent layer, etc. - * @todo FIXME: $categories/$mode - */ - public function seed( $articleIds, $categories, $mode = 'AND', $maxdepth = -1 ) { - $this->articles = $articleIds; - $this->next = $articleIds; - $this->mode = $mode; - $this->maxdepth = $maxdepth; - - # Set the list of target categories; convert them to DBKEY form first - $this->targets = []; - foreach ( $categories as $c ) { - $ct = Title::makeTitleSafe( NS_CATEGORY, $c ); - if ( $ct ) { - $c = $ct->getDBkey(); - $this->targets[$c] = $c; - } - } - } - - /** - * Iterates through the parent tree starting with the seed values, - * then checks the articles if they match the conditions - * @return array Array of page_ids (those given to seed() that match the conditions) - */ - public function run() { - $this->dbr = wfGetDB( DB_REPLICA ); - - $i = 0; - $dig = true; - while ( count( $this->next ) && $dig ) { - $this->scanNextLayer(); - - // Is there any depth limit? - if ( $this->maxdepth !== -1 ) { - $dig = $i < $this->maxdepth; - $i++; - } - } - - # Now check if this applies to the individual articles - $ret = []; - - foreach ( $this->articles as $article ) { - $conds = $this->targets; - if ( $this->check( $article, $conds ) ) { - # Matches the conditions - $ret[] = $article; - } - } - return $ret; - } - - /** - * Get the parents. Only really useful if run() has been called already - * @return array - */ - public function getParents() { - return $this->parents; - } - - /** - * This functions recurses through the parent representation, trying to match the conditions - * @param int $id The article/category to check - * @param array &$conds The array of categories to match - * @param array $path Used to check for recursion loops - * @return bool Does this match the conditions? - */ - private function check( $id, &$conds, $path = [] ) { - // Check for loops and stop! - if ( in_array( $id, $path ) ) { - return false; - } - - $path[] = $id; - - # Shortcut (runtime paranoia): No conditions=all matched - if ( count( $conds ) == 0 ) { - return true; - } - - if ( !isset( $this->parents[$id] ) ) { - return false; - } - - # iterate through the parents - foreach ( $this->parents[$id] as $p ) { - $pname = $p->cl_to; - - # Is this a condition? - if ( isset( $conds[$pname] ) ) { - # This key is in the category list! - if ( $this->mode == 'OR' ) { - # One found, that's enough! - $conds = []; - return true; - } else { - # Assuming "AND" as default - unset( $conds[$pname] ); - if ( count( $conds ) == 0 ) { - # All conditions met, done - return true; - } - } - } - - # Not done yet, try sub-parents - if ( !isset( $this->name2id[$pname] ) ) { - # No sub-parent - continue; - } - $done = $this->check( $this->name2id[$pname], $conds, $path ); - if ( $done || count( $conds ) == 0 ) { - # Subparents have done it! - return true; - } - } - return false; - } - - /** - * Scans a "parent layer" of the articles/categories in $this->next - */ - private function scanNextLayer() { - # Find all parents of the article currently in $this->next - $layer = []; - $res = $this->dbr->select( - /* FROM */ 'categorylinks', - /* SELECT */ [ 'cl_to', 'cl_from' ], - /* WHERE */ [ 'cl_from' => $this->next ], - __METHOD__ . '-1' - ); - foreach ( $res as $row ) { - $k = $row->cl_to; - - # Update parent tree - if ( !isset( $this->parents[$row->cl_from] ) ) { - $this->parents[$row->cl_from] = []; - } - $this->parents[$row->cl_from][$k] = $row; - - # Ignore those we already have - if ( in_array( $k, $this->deadend ) ) { - continue; - } - - if ( isset( $this->name2id[$k] ) ) { - continue; - } - - # Hey, new category! - $layer[$k] = $k; - } - - $this->next = []; - - # Find the IDs of all category pages in $layer, if they exist - if ( count( $layer ) > 0 ) { - $res = $this->dbr->select( - /* FROM */ 'page', - /* SELECT */ [ 'page_id', 'page_title' ], - /* WHERE */ [ 'page_namespace' => NS_CATEGORY, 'page_title' => $layer ], - __METHOD__ . '-2' - ); - foreach ( $res as $row ) { - $id = $row->page_id; - $name = $row->page_title; - $this->name2id[$name] = $id; - $this->next[] = $id; - unset( $layer[$name] ); - } - } - - # Mark dead ends - foreach ( $layer as $v ) { - $this->deadend[$v] = $v; - } - } -} -- 2.11.4.GIT