5use InvalidArgumentException;
14use Wikimedia\Timestamp\ConvertibleTimestamp;
29 private const LEVELS = [
'unregistered',
'registered',
'newcomer',
'learner',
'experienced' ];
43 if ( !in_array( $value, self::LEVELS ) ) {
44 throw new InvalidArgumentException(
"must be one of : " .
45 implode(
', ', self::LEVELS )
56 throw new LogicException(
'unimplemented' );
60 public function evaluate( stdClass $row, $value ): bool {
61 if ( $value ===
'registered' || $value ===
'unregistered' ) {
62 $rowValue = $this->namedConditionHelper->isNamed( $row )
63 ?
'registered' :
'unregistered';
64 return $value === $rowValue;
66 return $this->getExperienceFromRow( $row ) === $value;
70 private function getExperienceFromRow( stdClass $row ): string {
73 if ( !$this->namedConditionHelper->isNamed( $row ) ) {
74 return 'unregistered';
80 $user = $this->userFactory->newFromAnyId( $row->rc_user, $row->rc_user_text );
81 return $user->getExperienceLevel();
92 $selected = array_fill_keys( $this->required,
true );
94 $isUnregistered = $this->namedConditionHelper->getExpression( $dbr,
false );
95 $isRegistered = $this->namedConditionHelper->getExpression( $dbr,
true );
96 $aboveNewcomer = $this->getExperienceExpr(
'learner', $dbr );
97 $notAboveNewcomer = $this->getExperienceExpr(
'learner', $dbr,
true );
98 $aboveLearner = $this->getExperienceExpr(
'experienced', $dbr );
99 $notAboveLearner = $this->getExperienceExpr(
'experienced', $dbr,
true );
108 'unregistered' => $isUnregistered,
109 'registered' => $isRegistered,
110 'newcomer' => $dbr->
andExpr( [ $isRegistered, $notAboveNewcomer ] ),
111 'learner' => $dbr->
andExpr( [ $isRegistered, $aboveNewcomer, $notAboveLearner ] ),
112 'experienced' => $dbr->
andExpr( [ $isRegistered, $aboveLearner ] ),
123 isset( $selected[
'registered'] ) ||
124 ( isset( $selected[
'newcomer'] ) && isset( $selected[
'learner'] ) && isset( $selected[
'experienced'] ) )
126 unset( $selected[
'newcomer'], $selected[
'learner'], $selected[
'experienced'] );
127 $selected[
'registered'] =
true;
130 if ( isset( $selected[
'registered'] ) && isset( $selected[
'unregistered'] ) ) {
131 unset( $selected[
'registered'], $selected[
'unregistered'] );
138 $selectedColumnConds = array_values( array_intersect_key( $columnConds, $selected ) );
139 $query->
where( $dbr->
orExpr( $selectedColumnConds ) );
143 if ( isset( $selected[
'newcomer'] ) || isset( $selected[
'learner'] ) || isset( $selected[
'experienced'] ) ) {
155 $configSince = $this->getRegistrationThreshold( $level );
156 $now = ConvertibleTimestamp::time();
157 $secondsPerDay = 86400;
158 $timeCutoff = $now - $configSince * $secondsPerDay;
160 $editCutoff = $this->getEditThreshold( $level );
162 if ( $asNotCondition ) {
163 return $dbr->
expr(
'user_editcount',
'<', $editCutoff )
164 ->or(
'user_registration',
'>', $dbr->
timestamp( $timeCutoff ) );
166 return $dbr->
expr(
'user_editcount',
'>=', $editCutoff )->andExpr(
168 $dbr->
expr(
'user_registration',
'=',
null )
169 ->or(
'user_registration',
'<=', $dbr->
timestamp( $timeCutoff ) )
177 private function getRegistrationThreshold( $level ) {
178 return match ( $level ) {
179 'learner' => $this->config->get( MainConfigNames::LearnerMemberSince ),
180 'experienced' => $this->config->get( MainConfigNames::ExperiencedUserMemberSince ),
188 private function getEditThreshold( $level ) {
189 return match ( $level ) {
190 'learner' => $this->config->get( MainConfigNames::LearnerEdits ),
191 'experienced' => $this->config->get( MainConfigNames::ExperiencedUserEdits ),
if(!defined('MW_SETUP_CALLBACK'))
A class containing constants representing the names of configuration variables.
const ExperiencedUserEdits
Name constant for the ExperiencedUserEdits setting, for use with Config::get()
const LearnerEdits
Name constant for the LearnerEdits setting, for use with Config::get()
const LearnerMemberSince
Name constant for the LearnerMemberSince setting, for use with Config::get()
const ExperiencedUserMemberSince
Name constant for the ExperiencedUserMemberSince setting, for use with Config::get()