From: addshore Date: Wed, 16 Mar 2016 13:40:40 +0000 (+0000) Subject: Use WIS::getWatchedItemsForUser in SpecialEditWatchlist X-Git-Tag: 1.31.0-rc.0~7523^2 X-Git-Url: http://git.cyclocoop.org/ecrire?a=commitdiff_plain;h=4e42311f92ca70023adfde80dea2c7d52a4ebb06;p=lhc%2Fweb%2Fwiklou.git Use WIS::getWatchedItemsForUser in SpecialEditWatchlist This also adds a order option to: WacthedItemStore::getWatchedItemsForUser Tests are also updated Change-Id: Ia683b92846ad79bde3f37068a8e168c5a8bdc201 --- diff --git a/includes/WatchedItemStore.php b/includes/WatchedItemStore.php index 20ec592d6c..4eea54deec 100644 --- a/includes/WatchedItemStore.php +++ b/includes/WatchedItemStore.php @@ -12,6 +12,9 @@ use Wikimedia\Assert\Assert; */ class WatchedItemStore { + const SORT_DESC = 'DESC'; + const SORT_ASC = 'ASC'; + /** * @var LoadBalancer */ @@ -494,18 +497,34 @@ class WatchedItemStore { * @param User $user * @param array $options Allowed keys: * 'forWrite' => bool defaults to false + * 'sort' => string optional sorting by namespace ID and title + * one of the self::SORT_* constants * * @return WatchedItem[] */ public function getWatchedItemsForUser( User $user, array $options = [] ) { $options += [ 'forWrite' => false ]; + $dbOptions = []; + if ( array_key_exists( 'sort', $options ) ) { + Assert::parameter( + ( in_array( $options['sort'], [ self::SORT_ASC, self::SORT_DESC ] ) ), + '$options[\'sort\']', + 'must be SORT_ASC or SORT_DESC' + ); + $dbOptions['ORDER BY'] = [ + "wl_namespace {$options['sort']}", + "wl_title {$options['sort']}" + ]; + } $db = $this->getConnection( $options['forWrite'] ? DB_MASTER : DB_SLAVE ); + $res = $db->select( 'watchlist', [ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ], [ 'wl_user' => $user->getId() ], - __METHOD__ + __METHOD__, + $dbOptions ); $this->reuseConnection( $db ); diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php index dd440b9689..290ae8c678 100644 --- a/includes/specials/SpecialEditWatchlist.php +++ b/includes/specials/SpecialEditWatchlist.php @@ -347,22 +347,18 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { */ protected function getWatchlistInfo() { $titles = []; - $dbr = wfGetDB( DB_SLAVE ); - $res = $dbr->select( - [ 'watchlist' ], - [ 'wl_namespace', 'wl_title' ], - [ 'wl_user' => $this->getUser()->getId() ], - __METHOD__, - [ 'ORDER BY' => [ 'wl_namespace', 'wl_title' ] ] - ); + $watchedItems = WatchedItemStore::getDefaultInstance() + ->getWatchedItemsForUser( $this->getUser(), [ 'sort' => WatchedItemStore::SORT_ASC ] ); $lb = new LinkBatch(); - foreach ( $res as $row ) { - $lb->add( $row->wl_namespace, $row->wl_title ); - if ( !MWNamespace::isTalk( $row->wl_namespace ) ) { - $titles[$row->wl_namespace][$row->wl_title] = 1; + foreach ( $watchedItems as $watchedItem ) { + $namespace = $watchedItem->getLinkTarget()->getNamespace(); + $dbKey = $watchedItem->getLinkTarget()->getDBkey(); + $lb->add( $namespace, $dbKey ); + if ( !MWNamespace::isTalk( $namespace ) ) { + $titles[$namespace][$dbKey] = 1; } } diff --git a/tests/phpunit/includes/WatchedItemStoreUnitTest.php b/tests/phpunit/includes/WatchedItemStoreUnitTest.php index 1354b1c790..afde88cddf 100644 --- a/tests/phpunit/includes/WatchedItemStoreUnitTest.php +++ b/tests/phpunit/includes/WatchedItemStoreUnitTest.php @@ -1458,7 +1458,9 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase { ->with( 'watchlist', [ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ], - [ 'wl_user' => 1 ] + [ 'wl_user' => 1 ], + $this->isType( 'string' ), + [ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ] ) ->will( $this->returnValue( [] ) ); @@ -1469,11 +1471,24 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase { $watchedItems = $store->getWatchedItemsForUser( $user, - [ 'forWrite' => $forWrite ] + [ 'forWrite' => $forWrite, 'sort' => WatchedItemStore::SORT_ASC ] ); $this->assertEquals( [], $watchedItems ); } + public function testGetWatchedItemsForUser_badSortOptionThrowsException() { + $store = new WatchedItemStore( + $this->getMockLoadBalancer( $this->getMockDb() ), + $this->getMockCache() + ); + + $this->setExpectedException( 'InvalidArgumentException' ); + $store->getWatchedItemsForUser( + $this->getMockNonAnonUserWithId( 1 ), + [ 'sort' => 'foo' ] + ); + } + public function testIsWatchedItem_existingItem() { $mockDb = $this->getMockDb(); $mockDb->expects( $this->once() )