diff options
Diffstat (limited to 'includes/Categoryfinder.php')
-rw-r--r-- | includes/Categoryfinder.php | 142 |
1 files changed, 72 insertions, 70 deletions
diff --git a/includes/Categoryfinder.php b/includes/Categoryfinder.php index 7c1c2856..5ac8a9be 100644 --- a/includes/Categoryfinder.php +++ b/includes/Categoryfinder.php @@ -1,5 +1,4 @@ <?php - /** * The "Categoryfinder" class takes a list of articles, creates an internal * representation of all their parent categories (as well as parents of @@ -23,15 +22,14 @@ * */ class Categoryfinder { - - var $articles = array () ; # The original article IDs passed to the seed function - var $deadend = array () ; # Array of DBKEY category names for categories that don't have a page - var $parents = array () ; # Array of [ID => array()] - var $next = array () ; # Array of article/category IDs - var $targets = array () ; # Array of DBKEY category names - var $name2id = array () ; - var $mode ; # "AND" or "OR" - var $dbr ; # Read-DB slave + var $articles = array(); # The original article IDs passed to the seed function + var $deadend = array(); # Array of DBKEY category names for categories that don't have a page + var $parents = array(); # Array of [ID => array()] + var $next = array(); # Array of article/category IDs + var $targets = array(); # Array of DBKEY category names + var $name2id = array(); + var $mode; # "AND" or "OR" + var $dbr; # Read-DB slave /** * Constructor (currently empty). @@ -45,16 +43,16 @@ class Categoryfinder { * @param $categories FIXME * @param $mode String: FIXME, default 'AND'. */ - function seed ( $article_ids , $categories , $mode = "AND" ) { - $this->articles = $article_ids ; - $this->next = $article_ids ; - $this->mode = $mode ; + function seed( $article_ids, $categories, $mode = "AND" ) { + $this->articles = $article_ids; + $this->next = $article_ids; + $this->mode = $mode; # Set the list of target categories; convert them to DBKEY form first - $this->targets = array () ; - foreach ( $categories AS $c ) { + $this->targets = array(); + foreach ( $categories as $c ) { $ct = Title::makeTitleSafe( NS_CATEGORY, $c ); - if( $ct ) { + if ( $ct ) { $c = $ct->getDBkey(); $this->targets[$c] = $c; } @@ -69,19 +67,20 @@ class Categoryfinder { function run () { $this->dbr = wfGetDB( DB_SLAVE ); while ( count ( $this->next ) > 0 ) { - $this->scan_next_layer () ; + $this->scan_next_layer(); } # Now check if this applies to the individual articles - $ret = array () ; - foreach ( $this->articles AS $article ) { - $conds = $this->targets ; - if ( $this->check ( $article , $conds ) ) { + $ret = array(); + + foreach ( $this->articles as $article ) { + $conds = $this->targets; + if ( $this->check( $article, $conds ) ) { # Matches the conditions - $ret[] = $article ; + $ret[] = $article; } } - return $ret ; + return $ret; } /** @@ -91,108 +90,111 @@ class Categoryfinder { * @param $path used to check for recursion loops * @return bool Does this match the conditions? */ - function check ( $id , &$conds, $path=array() ) { + function check( $id , &$conds, $path = array() ) { // Check for loops and stop! - if( in_array( $id, $path ) ) + if ( in_array( $id, $path ) ) { return false; + } + $path[] = $id; # Shortcut (runtime paranoia): No contitions=all matched - if ( count ( $conds ) == 0 ) return true ; + if ( count( $conds ) == 0 ) { + return true; + } - if ( !isset ( $this->parents[$id] ) ) return false ; + if ( !isset( $this->parents[$id] ) ) { + return false; + } # iterate through the parents - foreach ( $this->parents[$id] AS $p ) { + foreach ( $this->parents[$id] as $p ) { $pname = $p->cl_to ; # Is this a condition? - if ( isset ( $conds[$pname] ) ) { + if ( isset( $conds[$pname] ) ) { # This key is in the category list! if ( $this->mode == "OR" ) { # One found, that's enough! - $conds = array () ; - return true ; + $conds = array(); + return true; } else { # Assuming "AND" as default - unset ( $conds[$pname] ) ; - if ( count ( $conds ) == 0 ) { + unset( $conds[$pname] ) ; + if ( count( $conds ) == 0 ) { # All conditions met, done - return true ; + return true; } } } # Not done yet, try sub-parents - if ( !isset ( $this->name2id[$pname] ) ) { + if ( !isset( $this->name2id[$pname] ) ) { # No sub-parent continue ; } - $done = $this->check ( $this->name2id[$pname] , $conds, $path ); - if ( $done OR count ( $conds ) == 0 ) { + $done = $this->check( $this->name2id[$pname], $conds, $path ); + if ( $done || count( $conds ) == 0 ) { # Subparents have done it! - return true ; + return true; } } - return false ; + return false; } /** * Scans a "parent layer" of the articles/categories in $this->next */ - function scan_next_layer () { - $fname = "Categoryfinder::scan_next_layer" ; - + function scan_next_layer() { # Find all parents of the article currently in $this->next - $layer = array () ; + $layer = array(); $res = $this->dbr->select( - /* FROM */ 'categorylinks', - /* SELECT */ '*', - /* WHERE */ array( 'cl_from' => $this->next ), - $fname."-1" + /* FROM */ 'categorylinks', + /* SELECT */ '*', + /* WHERE */ array( 'cl_from' => $this->next ), + __METHOD__ . "-1" ); while ( $o = $this->dbr->fetchObject( $res ) ) { $k = $o->cl_to ; # Update parent tree - if ( !isset ( $this->parents[$o->cl_from] ) ) { - $this->parents[$o->cl_from] = array () ; + if ( !isset( $this->parents[$o->cl_from] ) ) { + $this->parents[$o->cl_from] = array(); } - $this->parents[$o->cl_from][$k] = $o ; + $this->parents[$o->cl_from][$k] = $o; # Ignore those we already have - if ( in_array ( $k , $this->deadend ) ) continue ; - if ( isset ( $this->name2id[$k] ) ) continue ; + if ( in_array ( $k , $this->deadend ) ) continue; + + if ( isset ( $this->name2id[$k] ) ) continue; # Hey, new category! - $layer[$k] = $k ; + $layer[$k] = $k; } - $this->dbr->freeResult( $res ) ; - $this->next = array() ; + $this->next = array(); # 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 */ array( 'page_namespace' => NS_CATEGORY , 'page_title' => $layer ), - $fname."-2" + /* FROM */ 'page', + /* SELECT */ array( 'page_id', 'page_title' ), + /* WHERE */ array( 'page_namespace' => NS_CATEGORY , 'page_title' => $layer ), + __METHOD__ . "-2" ); while ( $o = $this->dbr->fetchObject( $res ) ) { - $id = $o->page_id ; - $name = $o->page_title ; - $this->name2id[$name] = $id ; - $this->next[] = $id ; - unset ( $layer[$name] ) ; - } - $this->dbr->freeResult( $res ) ; + $id = $o->page_id; + $name = $o->page_title; + $this->name2id[$name] = $id; + $this->next[] = $id; + unset( $layer[$name] ); } + } # Mark dead ends - foreach ( $layer AS $v ) { - $this->deadend[$v] = $v ; + foreach ( $layer as $v ) { + $this->deadend[$v] = $v; } } -} # END OF CLASS "Categoryfinder" +} |