48 private $userOptionsLookup;
55 $this->nsInfo = $nsInfo ?? MediaWikiServices::getInstance()->getNamespaceInfo();
56 $this->dbProvider = $dbProvider;
57 $this->userOptionsLookup = $userOptionsLookup ?? MediaWikiServices::getInstance()->getUserOptionsLookup();
65 $this->
default ??= $this->userOptionsLookup->getDefaultOption(
'gender' );
78 $username = $username->getName();
81 $username = self::normalizeUsername( $username );
82 if ( !isset( $this->cache[$username] ) ) {
83 if ( $this->misses >= $this->missLimit &&
86 if ( $this->misses === $this->missLimit ) {
88 wfDebug( __METHOD__ .
": too many misses, returning default onwards" );
94 $this->
doQuery( $username, $caller );
101 return $this->cache[$username] ?? $this->
getDefault();
112 foreach ( $data as $ns => $pagenames ) {
113 if ( $this->nsInfo->hasGenderDistinction( $ns ) ) {
114 $users += $pagenames;
117 $this->
doQuery( array_keys( $users ), $caller );
129 foreach ( $titles as $titleObj ) {
130 if ( $this->nsInfo->hasGenderDistinction( $titleObj->getNamespace() ) ) {
131 $users[] = $titleObj->getText();
134 $this->
doQuery( $users, $caller );
142 public function doQuery( $users, $caller =
'' ) {
146 foreach ( (array)$users as $value ) {
147 $name = self::normalizeUsername( $value );
149 if ( !isset( $this->cache[$name] ) ) {
153 $usersToCheck[] = $name;
157 if ( count( $usersToCheck ) === 0 ) {
163 if ( $this->dbProvider ===
null ) {
167 $queryBuilder = $this->dbProvider->getReplicaDatabase()->newSelectQueryBuilder()
168 ->select( [
'user_name',
'up_value' ] )
170 ->leftJoin(
'user_properties',
null, [
'user_id = up_user',
'up_property' =>
'gender' ] )
171 ->where( [
'user_name' => $usersToCheck ] );
173 $comment = __METHOD__;
174 if ( strval( $caller ) !==
'' ) {
175 $comment .=
"/$caller";
177 $res = $queryBuilder->caller( $comment )->fetchResultSet();
179 foreach ( $res as $row ) {
180 $this->cache[$row->user_name] = $row->up_value ?:
$default;
184 private static function normalizeUsername( $username ) {
186 $indexSlash = strpos( $username,
'/' );
187 if ( $indexSlash !==
false ) {
188 $username = substr( $username, 0, $indexSlash );
192 return strtr( $username,
'_',
' ' );
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
Caches user genders when needed to use correct namespace aliases.
__construct(NamespaceInfo $nsInfo=null, IConnectionProvider $dbProvider=null, UserOptionsLookup $userOptionsLookup=null)
getGenderOf( $username, $caller='')
Returns the gender for given username.
doLinkBatch(array $data, $caller='')
Wrapper for doQuery that processes raw LinkBatch data.
getDefault()
Returns the default gender option in this wiki.
doTitlesArray( $titles, $caller='')
Wrapper for doQuery that processes a title array.
doQuery( $users, $caller='')
Preloads genders for given list of users.
static getMain()
Get the RequestContext object associated with the main request.