<?php
+use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Linker\LinkTarget;
use Wikimedia\Assert\Assert;
/**
*
* @since 1.27
*/
-class WatchedItemStore {
+class WatchedItemStore implements StatsdAwareInterface {
const SORT_DESC = 'DESC';
const SORT_ASC = 'ASC';
private $revisionGetTimestampFromIdCallback;
/**
- * @var self|null
+ * @var StatsdDataFactoryInterface
*/
- private static $instance;
+ private $stats;
/**
* @param LoadBalancer $loadBalancer
) {
$this->loadBalancer = $loadBalancer;
$this->cache = $cache;
+ $this->stats = new NullStatsdDataFactory();
$this->deferredUpdatesAddCallableUpdateCallback = [ 'DeferredUpdates', 'addCallableUpdate' ];
$this->revisionGetTimestampFromIdCallback = [ 'Revision', 'getTimestampFromId' ];
}
+ public function setStatsdDataFactory( StatsdDataFactoryInterface $stats ) {
+ $this->stats = $stats;
+ }
+
/**
* Overrides the DeferredUpdates::addCallableUpdate callback
* This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
} );
}
- /**
- * Overrides the default instance of this class
- * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
- *
- * If this method is used it MUST also be called with null after a test to ensure a new
- * default instance is created next time getDefaultInstance is called.
- *
- * @param WatchedItemStore|null $store
- *
- * @return ScopedCallback to reset the overridden value
- * @throws MWException
- */
- public static function overrideDefaultInstance( WatchedItemStore $store = null ) {
- if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
- throw new MWException(
- 'Cannot override ' . __CLASS__ . 'default instance in operation.'
- );
- }
-
- $previousValue = self::$instance;
- self::$instance = $store;
- return new ScopedCallback( function() use ( $previousValue ) {
- self::$instance = $previousValue;
- } );
- }
-
- /**
- * @return self
- */
- public static function getDefaultInstance() {
- if ( !self::$instance ) {
- self::$instance = new self(
- wfGetLB(),
- new HashBagOStuff( [ 'maxKeys' => 100 ] )
- );
- }
- return self::$instance;
- }
-
private function getCacheKey( User $user, LinkTarget $target ) {
return $this->cache->makeKey(
(string)$target->getNamespace(),
$key = $this->getCacheKey( $user, $target );
$this->cache->set( $key, $item );
$this->cacheIndex[$target->getNamespace()][$target->getDBkey()][$user->getId()] = $key;
+ $this->stats->increment( 'WatchedItemStore.cache' );
}
private function uncache( User $user, LinkTarget $target ) {
$this->cache->delete( $this->getCacheKey( $user, $target ) );
unset( $this->cacheIndex[$target->getNamespace()][$target->getDBkey()][$user->getId()] );
+ $this->stats->increment( 'WatchedItemStore.uncache' );
}
private function uncacheLinkTarget( LinkTarget $target ) {
if ( !isset( $this->cacheIndex[$target->getNamespace()][$target->getDBkey()] ) ) {
return;
}
+ $this->stats->increment( 'WatchedItemStore.uncacheLinkTarget' );
foreach ( $this->cacheIndex[$target->getNamespace()][$target->getDBkey()] as $key ) {
+ $this->stats->increment( 'WatchedItemStore.uncacheLinkTarget.items' );
$this->cache->delete( $key );
}
}
$cached = $this->getCached( $user, $target );
if ( $cached ) {
+ $this->stats->increment( 'WatchedItemStore.getWatchedItem.cached' );
return $cached;
}
+ $this->stats->increment( 'WatchedItemStore.getWatchedItem.load' );
return $this->loadWatchedItem( $user, $target );
}
$this->reuseConnection( $dbr );
foreach ( $res as $row ) {
- $timestamps[(int)$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
+ $timestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
}
return $timestamps;
* @param LinkTarget $newTarget
*/
public function duplicateAllAssociatedEntries( LinkTarget $oldTarget, LinkTarget $newTarget ) {
- if ( !$oldTarget instanceof Title ) {
- $oldTarget = Title::newFromLinkTarget( $oldTarget );
- }
- if ( !$newTarget instanceof Title ) {
- $newTarget = Title::newFromLinkTarget( $newTarget );
- }
+ $oldTarget = Title::newFromLinkTarget( $oldTarget );
+ $newTarget = Title::newFromLinkTarget( $newTarget );
$this->duplicateEntry( $oldTarget->getSubjectPage(), $newTarget->getSubjectPage() );
$this->duplicateEntry( $oldTarget->getTalkPage(), $newTarget->getTalkPage() );