protected function fire()
{
$indexes = array();
$sessionId = craft()->assetIndexing->getIndexingSessionId();
$this->info('Fetching sources...');
$sources = craft()->assetSources->getAllSources();
$sourceIds = $this->argument('sourceIds');
if ($sourceIds) {
$sources = array_filter($sources, function ($source) use($sourceIds) {
return in_array($source->id, $sourceIds);
});
} else {
$sourceIds = array_map(function ($source) {
return $source->id;
}, $sources);
}
$missingFolders = array();
$grandTotal = 0;
$this->info('Fetching indexes...');
foreach ($sourceIds as $sourceId) {
// Get the indexing list
$indexList = craft()->assetIndexing->getIndexListForSource($sessionId, $sourceId);
if (!empty($indexList['error'])) {
$this->error($indexList['error']);
return;
}
if (isset($indexList['missingFolders'])) {
$missingFolders += $indexList['missingFolders'];
}
$grandTotal += $indexList['total'];
$indexes[$sourceId] = $indexList['total'];
}
$this->info('Updating indexes...');
$progressBar = new ProgressBar($this->output, $grandTotal);
$count = 0;
// Index the file
foreach ($indexes as $sourceId => $total) {
for ($i = 0; $i < $total; $i++) {
craft()->assetIndexing->processIndexForSource($sessionId, $i, $sourceId);
$progressBar->setProgress(++$count);
}
}
$progressBar->finish();
$this->line('');
$this->info('Deleting stale index data...');
// Clean up stale indexing data (all sessions that have all recordIds set)
$sessionsInProgress = craft()->db->createCommand()->select('sessionId')->from('assetindexdata')->where('recordId IS NULL')->group('sessionId')->queryScalar();
if (empty($sessionsInProgress)) {
craft()->db->createCommand()->delete('assetindexdata');
} else {
craft()->db->createCommand()->delete('assetindexdata', array('not in', 'sessionId', $sessionsInProgress));
}
if ($this->option('delete-missing-files')) {
$this->info('Deleting missing files...');
$missingFiles = craft()->assetIndexing->getMissingFiles($sourceIds, $sessionId);
if ($missingFiles) {
craft()->assetIndexing->removeObsoleteFileRecords(array_keys($missingFiles));
}
}
if ($missingFolders && $this->option('delete-missing-folders')) {
$this->info('Deleting missing folders...');
craft()->assetIndexing->removeObsoleteFolderRecords(array_keys($missingFolders));
}
$this->info('Asset indexes have been updated.');
}