setDatabaseProvider( $dbProvider ); } public function isExpensive() { return true; } protected function sortDescending() { return false; } public function isSyndicated() { return false; } public function getQueryInfo() { $retval = [ 'tables' => [ 'image', 'imagelinks' ], 'fields' => [ 'namespace' => NS_FILE, 'title' => 'img_name', 'value' => 'img_timestamp', ], 'conds' => [ 'il_to' => null ], 'join_conds' => [ 'imagelinks' => [ 'LEFT JOIN', 'il_to = img_name' ] ] ]; if ( $this->getConfig()->get( MainConfigNames::CountCategorizedImagesAsUsed ) ) { // Order is significant $retval['tables'] = [ 'image', 'page', 'categorylinks', 'imagelinks' ]; $retval['conds']['page_namespace'] = NS_FILE; $retval['conds']['cl_from'] = null; $retval['conds'][] = 'img_name = page_title'; $retval['join_conds']['categorylinks'] = [ 'LEFT JOIN', 'cl_from = page_id' ]; $retval['join_conds']['imagelinks'] = [ 'LEFT JOIN', 'il_to = page_title' ]; } return $retval; } public function usesTimestamps() { return true; } protected function getPageHeader() { if ( $this->getConfig()->get( MainConfigNames::CountCategorizedImagesAsUsed ) ) { return $this->msg( 'unusedimagestext-categorizedimgisused' )->parseAsBlock(); } return $this->msg( 'unusedimagestext' )->parseAsBlock(); } protected function getGroupName() { return 'maintenance'; } } /** * Retain the old class name for backwards compatibility. * @deprecated since 1.41 */ class_alias( SpecialUnusedImages::class, 'SpecialUnusedImages' );