dbProvider = $dbProvider; $this->userNameUtils = $userNameUtils; $this->hideUserUtils = $hideUserUtils; } /** * Do a prefix search of user names and return a list of matching user names. * * @param string|Authority $audience Either AUDIENCE_PUBLIC or a user to * show the search for * @param string $search * @param int $limit * @param int $offset How many results to offset from the beginning * @return string[] * @throws InvalidArgumentException if $audience is invalid */ public function search( $audience, string $search, int $limit, int $offset = 0 ): array { if ( $audience !== self::AUDIENCE_PUBLIC && !( $audience instanceof Authority ) ) { throw new InvalidArgumentException( '$audience must be AUDIENCE_PUBLIC or an Authority object' ); } // Invalid user names are treated as empty strings $prefix = $this->userNameUtils->getCanonical( $search ) ?: ''; $dbr = $this->dbProvider->getReplicaDatabase(); $queryBuilder = $dbr->newSelectQueryBuilder() ->select( 'user_name' ) ->from( 'user' ) ->where( $dbr->expr( 'user_name', IExpression::LIKE, new LikeValue( $prefix, $dbr->anyString() ) ) ) ->orderBy( 'user_name' ) ->limit( $limit ) ->offset( $offset ); // Filter out hidden user names if ( $audience === self::AUDIENCE_PUBLIC || !$audience->isAllowed( 'hideuser' ) ) { $queryBuilder->andWhere( $this->hideUserUtils->getExpression( $dbr ) ); } return $queryBuilder->caller( __METHOD__ )->fetchFieldValues(); } }