3 use MediaWiki\Maintenance\Maintenance
;
5 // @codeCoverageIgnoreStart
6 require_once __DIR__
. '/Maintenance.php';
7 // @codeCoverageIgnoreEnd
10 * Maintenance script that initializes a user preference
11 * based on the value of another preference.
13 * This is done by copying any non-empty (i.e. excluding 0 or null) value for a given
14 * source preference to be the value of the target preference. Only users with the value set
15 * will have the target preference set.
17 * @ingroup Maintenance
19 class InitUserPreference
extends Maintenance
{
20 public function __construct() {
21 parent
::__construct();
24 'Name of the user preference to initialize',
31 'Name of the user preference to take the value from',
36 $this->setBatchSize( 300 );
39 public function execute() {
40 $target = $this->getOption( 'target' );
41 $source = $this->getOption( 'source' );
42 $this->output( "Initializing '$target' based on the value of '$source'\n" );
44 $dbr = $this->getReplicaDB();
45 $dbw = $this->getPrimaryDB();
47 $iterator = new BatchRowIterator(
49 $dbr->newSelectQueryBuilder()
50 ->from( 'user_properties' )
51 ->select( [ 'up_user', 'up_value' ] )
53 'up_property' => $source,
54 $dbr->expr( 'up_value', '!=', null ),
55 $dbr->expr( 'up_value', '!=', '0' ),
57 ->caller( __METHOD__
),
58 [ 'up_user', 'up_property' ],
63 foreach ( $iterator as $batch ) {
64 foreach ( $batch as $row ) {
65 $dbw->newInsertQueryBuilder()
66 ->insertInto( 'user_properties' )
68 'up_user' => $row->up_user
,
69 'up_property' => $target,
70 'up_value' => $row->up_value
,
72 ->onDuplicateKeyUpdate()
73 ->uniqueIndexFields( [ 'up_user', 'up_property' ] )
74 ->set( [ 'up_value' => $row->up_value
] )
75 ->caller( __METHOD__
)->execute();
77 $processed +
= $dbw->affectedRows();
81 $this->output( "Processed $processed user(s)\n" );
82 $this->output( "Finished!\n" );
86 // @codeCoverageIgnoreStart
87 $maintClass = InitUserPreference
::class;
88 require_once RUN_MAINTENANCE_IF_MAIN
;
89 // @codeCoverageIgnoreEnd