Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
87.88% covered (warning)
87.88%
29 / 33
50.00% covered (danger)
50.00%
3 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserCondition
87.88% covered (warning)
87.88%
29 / 33
50.00% covered (danger)
50.00%
3 / 6
16.46
0.00% covered (danger)
0.00%
0 / 1
 validateValue
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
2.15
 evaluate
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 prepareCapture
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 prepareConds
88.24% covered (warning)
88.24%
15 / 17
0.00% covered (danger)
0.00%
0 / 1
7.08
 makeSet
85.71% covered (warning)
85.71%
6 / 7
0.00% covered (danger)
0.00%
0 / 1
3.03
 makeNames
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace MediaWiki\RecentChanges\ChangesListQuery;
4
5use MediaWiki\User\UserIdentity;
6use MediaWiki\User\UserIdentityValue;
7use stdClass;
8use Wikimedia\Rdbms\IReadableDatabase;
9
10/**
11 * @internal For use by ChangesListQuery
12 * @since 1.45
13 * @ingroup RecentChanges
14 */
15class UserCondition extends ChangesListConditionBase {
16    /** @inheritDoc */
17    public function validateValue( $value ) {
18        if ( $value instanceof UserIdentity ) {
19            // Convert to UserIdentityValue since that is stringable and so will
20            // work with array_unique() etc.
21            return new UserIdentityValue( $value->getId(), $value->getName() );
22        } else {
23            throw new \InvalidArgumentException( 'user filter value must be a UserIdentity' );
24        }
25    }
26
27    /**
28     * @param stdClass $row
29     * @param UserIdentityValue $value
30     * @return bool
31     */
32    public function evaluate( stdClass $row, $value ): bool {
33        return $row->rc_user_text === $value->getName();
34    }
35
36    protected function prepareCapture( IReadableDatabase $dbr, QueryBackend $query ) {
37        $query->rcUserFields();
38    }
39
40    protected function prepareConds( IReadableDatabase $dbr, QueryBackend $query ) {
41        [ $required, $excluded ] = $this->getUniqueValues();
42        if ( $required === [] ) {
43            $query->forceEmptySet();
44        } elseif ( $required ) {
45            [ $ids, $names ] = $this->makeSet( $required );
46            $orConds = [];
47            if ( $ids ) {
48                 $orConds[] = $dbr->expr( 'actor_user', '=', $ids );
49            }
50            if ( $names ) {
51                $orConds[] = $dbr->expr( 'actor_name', '=', $names );
52            }
53            $query->where( count( $orConds ) > 1 ? $dbr->orExpr( $orConds ) : $orConds[0] );
54            $query->joinForConds( 'actor' )->reorderable();
55            $query->adjustDensity( QueryBackend::DENSITY_USER );
56        } elseif ( $excluded ) {
57            $names = $this->makeNames( $excluded );
58            $query->where( $dbr->expr( 'actor_name', '!=', $names ) );
59            $query->joinForConds( 'actor' )->straight();
60        }
61    }
62
63    /**
64     * @param UserIdentityValue[] $users
65     * @return array{int[],string[]}
66     */
67    private function makeSet( $users ) {
68        $ids = [];
69        $names = [];
70        foreach ( $users as $user ) {
71            if ( $user->isRegistered() ) {
72                $ids[] = $user->getId();
73            } else {
74                $names[] = $user->getName();
75            }
76        }
77        return [ $ids, $names ];
78    }
79
80    /**
81     * @param UserIdentityValue[] $users
82     * @return string[]
83     */
84    private function makeNames( $users ) {
85        $names = [];
86        foreach ( $users as $user ) {
87            $names[] = $user->getName();
88        }
89        return $names;
90    }
91}