addDescription( 'Populate the pp_sortkey field' ); $this->setBatchSize( 100 ); } protected function doDBUpdates() { $dbw = $this->getPrimaryDB(); $lastProp = null; $lastPageValue = 0; $lastRowCount = 0; $editedRowCount = 0; $this->output( "Populating page_props.pp_sortkey...\n" ); while ( true ) { $queryBuilder = $dbw->newSelectQueryBuilder() ->select( [ 'pp_propname', 'pp_page', 'pp_sortkey', 'pp_value' ] ) ->from( 'page_props' ) ->where( [ 'pp_sortkey' => null ] ) ->orderBy( [ 'pp_page', 'pp_propname' ] ) ->limit( $this->getBatchSize() ); if ( $lastPageValue !== 0 ) { $queryBuilder->andWhere( $dbw->buildComparison( '>', [ 'pp_page' => $lastPageValue, 'pp_propname' => $lastProp, ] ) ); } $res = $queryBuilder->caller( __METHOD__ )->fetchResultSet(); if ( $res->numRows() === 0 ) { break; } $this->beginTransaction( $dbw, __METHOD__ ); foreach ( $res as $row ) { if ( !is_numeric( $row->pp_value ) ) { continue; } $dbw->newUpdateQueryBuilder() ->update( 'page_props' ) ->set( [ 'pp_sortkey' => $row->pp_value ] ) ->where( [ 'pp_page' => $row->pp_page, 'pp_propname' => $row->pp_propname ] ) ->caller( __METHOD__ ) ->execute(); $editedRowCount++; } if ( $editedRowCount !== $lastRowCount ) { $this->output( "Updated " . $editedRowCount . " rows\n" ); $lastRowCount = $editedRowCount; } $this->commitTransaction( $dbw, __METHOD__ ); // We need to get the last element's page ID // @phan-suppress-next-line PhanPossiblyUndeclaredVariable rows contains at least one item $lastPageValue = $row->pp_page; // And the propname... // @phan-suppress-next-line PhanPossiblyUndeclaredVariable rows contains at least one item $lastProp = $row->pp_propname; } $this->output( "Populating page_props.pp_sortkey complete.\n" ); $this->output( "Updated a total of $editedRowCount rows\n" ); return true; } protected function getUpdateKey() { return 'populate pp_sortkey'; } } $maintClass = PopulatePPSortKey::class; require_once RUN_MAINTENANCE_IF_MAIN;