$opts['target'] = $par;
}
- public function doMainQuery( $conds, $opts ) {
+ /**
+ * @inheritDoc
+ */
+ protected function doMainQuery( $tables, $select, $conds, $query_options,
+ $join_conds, FormOptions $opts
+ ) {
$target = $opts['target'];
$showlinkedto = $opts['showlinkedto'];
$limit = $opts['limit'];
$ns = $title->getNamespace();
$dbkey = $title->getDBkey();
- $tables = [ 'recentchanges' ];
- $select = RecentChange::selectFields();
- $join_conds = [];
- $query_options = [];
+ $tables[] = 'recentchanges';
+ $select = array_merge( RecentChange::selectFields(), $select );
// left join with watchlist table to highlight watched rows
$uid = $this->getUser()->getId();
$join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ];
$select[] = 'page_latest';
}
+
+ $tagFilter = $opts['tagfilter'] ? explode( '|', $opts['tagfilter'] ) : [];
ChangeTags::modifyDisplayQuery(
$tables,
$select,
$conds,
$join_conds,
$query_options,
- $opts['tagfilter']
+ $tagFilter
);
+ if ( $dbr->unionSupportsOrderAndLimit() ) {
+ if ( count( $tagFilter ) > 1 ) {
+ // ChangeTags::modifyDisplayQuery() will have added DISTINCT.
+ // To prevent this from causing query performance problems, we need to add
+ // a GROUP BY, and add rc_id to the ORDER BY.
+ $order = [
+ 'GROUP BY' => 'rc_timestamp, rc_id',
+ 'ORDER BY' => 'rc_timestamp DESC, rc_id DESC'
+ ];
+ } else {
+ $order = [ 'ORDER BY' => 'rc_timestamp DESC' ];
+ }
+ } else {
+ $order = [];
+ }
+
if ( !$this->runMainQueryHook( $tables, $select, $conds, $query_options, $join_conds,
$opts )
) {
}
}
- if ( $dbr->unionSupportsOrderAndLimit() ) {
- $order = [ 'ORDER BY' => 'rc_timestamp DESC' ];
- } else {
- $order = [];
- }
-
$query = $dbr->selectSQLText(
array_merge( $tables, [ $link_table ] ),
$select,