Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
UpdateHitCountWatcher
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
3 / 3
5
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 run
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
3
 updateHitCounts
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter\Watcher;
4
5use MediaWiki\Deferred\DeferredUpdates;
6use MediaWiki\Extension\AbuseFilter\CentralDBManager;
7use MediaWiki\Extension\AbuseFilter\ServiceNames;
8use Wikimedia\Rdbms\IDatabase;
9use Wikimedia\Rdbms\LBFactory;
10
11/**
12 * Watcher that updates hit counts of filters
13 */
14class UpdateHitCountWatcher implements Watcher {
15    public const SERVICE_NAME = ServiceNames::UpdateHitCountWatcher;
16
17    public function __construct(
18        private readonly LBFactory $lbFactory,
19        private readonly CentralDBManager $centralDBManager
20    ) {
21    }
22
23    /**
24     * @inheritDoc
25     */
26    public function run( array $localFilters, array $globalFilters, string $group ): void {
27        // Run in a DeferredUpdate to avoid primary database queries on raw/view requests (T274455)
28        DeferredUpdates::addCallableUpdate( function () use ( $localFilters, $globalFilters ) {
29            if ( $localFilters ) {
30                $this->updateHitCounts( $this->lbFactory->getPrimaryDatabase(), $localFilters );
31            }
32
33            if ( $globalFilters ) {
34                $fdb = $this->centralDBManager->getConnection( DB_PRIMARY );
35                $this->updateHitCounts( $fdb, $globalFilters );
36            }
37        } );
38    }
39
40    private function updateHitCounts( IDatabase $dbw, array $loggedFilters ): void {
41        $dbw->newUpdateQueryBuilder()
42            ->update( 'abuse_filter' )
43            ->set( [ 'af_hit_count=af_hit_count+1' ] )
44            ->where( [ 'af_id' => $loggedFilters ] )
45            ->caller( __METHOD__ )
46            ->execute();
47    }
48}