%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/CirrusSearch/includes/Job/ |
| Current File : //www/varak.net/wiki.varak.net/extensions/CirrusSearch/includes/Job/LinksUpdate.php |
<?php
namespace CirrusSearch\Job;
use JobQueueGroup;
use Title;
/**
* Performs the appropriate updates to Elasticsearch after a LinksUpdate is
* completed. The page itself is updated first then a second copy of this job
* is queued to update linked articles if any links change. The job can be
* 'prioritized' via the 'prioritize' parameter which will switch it to a
* different queue then the non-prioritized jobs. Prioritized jobs will never
* be deduplicated with non-prioritized jobs which is good because we can't
* control which job is removed during deduplication. In our case it'd only be
* ok to remove the non-prioritized version.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*/
class LinksUpdate extends Job {
public function __construct( $title, $params ) {
parent::__construct( $title, $params );
if ( $this->isPrioritized() ) {
$this->command .= 'Prioritized';
}
// Note that we have to keep the prioritized param or else when the job
// is loaded it'll load under a different name/command/type which would
// be confusing.
}
protected function doJob() {
global $wgCirrusSearchRefreshInterval;
$updater = $this->createUpdater();
$res = $updater->updateFromTitle( $this->title );
if ( $res === false ) {
// Couldn't update. Bail early and retry rather than adding an
// IncomingLinkCount job that will produce the wrong answer.
return $res;
}
// Queue IncomingLinkCount jobs when pages are newly linked or unlinked
$titleKeys = array_merge( $this->params[ 'addedLinks' ],
$this->params[ 'removedLinks' ] );
foreach ( $titleKeys as $titleKey ) {
$title = Title::newFromDBkey( $titleKey );
if ( !$title ) {
continue;
}
$linkCount = new IncomingLinkCount( $title, [
'cluster' => $this->params['cluster'],
] );
// If possible, delay the job execution by a few seconds so Elasticsearch
// can refresh to contain what we just sent it. The delay should be long
// enough for Elasticsearch to complete the refresh cycle, which normally
// takes wgCirrusSearchRefreshInterval seconds but we double it and add
// one just in case.
$linkCount->setDelay( 2 * $wgCirrusSearchRefreshInterval + 1 );
JobQueueGroup::singleton()->push( $linkCount );
}
// All done
return $res;
}
/**
* @return bool Is this job prioritized?
*/
public function isPrioritized() {
return isset( $this->params[ 'prioritize' ] ) && $this->params[ 'prioritize' ];
}
}