5use InvalidArgumentException;
14use Wikimedia\Timestamp\ConvertibleTimestamp;
31 private const LEVELS = [
'unregistered',
'registered',
'newcomer',
'learner',
'experienced' ];
45 if ( !in_array( $value, self::LEVELS ) ) {
46 throw new InvalidArgumentException(
"must be one of : " .
47 implode(
', ', self::LEVELS )
58 throw new LogicException(
'unimplemented' );
62 public function evaluate( stdClass $row, $value ): bool {
63 if ( $value ===
'registered' || $value ===
'unregistered' ) {
64 $rowValue = $this->namedConditionHelper->isNamed( $row )
65 ?
'registered' :
'unregistered';
66 return $value === $rowValue;
68 return $this->getExperienceFromRow( $row ) === $value;
72 private function getExperienceFromRow( stdClass $row ): string {
75 if ( !$this->namedConditionHelper->isNamed( $row ) ) {
76 return 'unregistered';
82 $user = $this->userFactory->newFromAnyId( $row->rc_user, $row->rc_user_text );
83 return $user->getExperienceLevel();
94 $selected = array_fill_keys( $this->required,
true );
96 $isUnregistered = $this->namedConditionHelper->getExpression( $dbr,
false );
97 $isRegistered = $this->namedConditionHelper->getExpression( $dbr,
true );
98 $aboveNewcomer = $this->getExperienceExpr(
'learner', $dbr );
99 $notAboveNewcomer = $this->getExperienceExpr(
'learner', $dbr,
true );
100 $aboveLearner = $this->getExperienceExpr(
'experienced', $dbr );
101 $notAboveLearner = $this->getExperienceExpr(
'experienced', $dbr,
true );
110 'unregistered' => $isUnregistered,
111 'registered' => $isRegistered,
112 'newcomer' => $dbr->
andExpr( [ $isRegistered, $notAboveNewcomer ] ),
113 'learner' => $dbr->
andExpr( [ $isRegistered, $aboveNewcomer, $notAboveLearner ] ),
114 'experienced' => $dbr->
andExpr( [ $isRegistered, $aboveLearner ] ),
125 isset( $selected[
'registered'] ) ||
126 ( isset( $selected[
'newcomer'] ) && isset( $selected[
'learner'] ) && isset( $selected[
'experienced'] ) )
128 unset( $selected[
'newcomer'], $selected[
'learner'], $selected[
'experienced'] );
129 $selected[
'registered'] =
true;
132 if ( isset( $selected[
'registered'] ) && isset( $selected[
'unregistered'] ) ) {
133 unset( $selected[
'registered'], $selected[
'unregistered'] );
140 $selectedColumnConds = array_values( array_intersect_key( $columnConds, $selected ) );
141 $query->
where( $dbr->
orExpr( $selectedColumnConds ) );
145 if ( isset( $selected[
'newcomer'] ) || isset( $selected[
'learner'] ) || isset( $selected[
'experienced'] ) ) {
157 $configSince = $this->getRegistrationThreshold( $level );
158 $now = ConvertibleTimestamp::time();
159 $secondsPerDay = 86400;
160 $timeCutoff = $now - $configSince * $secondsPerDay;
162 $editCutoff = $this->getEditThreshold( $level );
164 if ( $asNotCondition ) {
165 return $dbr->
expr(
'user_editcount',
'<', $editCutoff )
166 ->or(
'user_registration',
'>', $dbr->
timestamp( $timeCutoff ) );
168 return $dbr->
expr(
'user_editcount',
'>=', $editCutoff )->andExpr(
170 $dbr->
expr(
'user_registration',
'=',
null )
171 ->or(
'user_registration',
'<=', $dbr->
timestamp( $timeCutoff ) )
179 private function getRegistrationThreshold( $level ) {
180 return match ( $level ) {
181 'learner' => $this->config->get( MainConfigNames::LearnerMemberSince ),
182 'experienced' => $this->config->get( MainConfigNames::ExperiencedUserMemberSince ),
190 private function getEditThreshold( $level ) {
191 return match ( $level ) {
192 'learner' => $this->config->get( MainConfigNames::LearnerEdits ),
193 '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()