$options = isset( $query['options'] ) ? (array)$query['options'] : [];
$join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : [];
- if ( count( $order ) ) {
+ if ( $order ) {
$options['ORDER BY'] = $order;
}
public function fetchFromCache( $limit, $offset = false ) {
$dbr = wfGetDB( DB_REPLICA );
$options = [];
+
if ( $limit !== false ) {
$options['LIMIT'] = intval( $limit );
}
+
if ( $offset !== false ) {
$options['OFFSET'] = intval( $offset );
}
+
+ $order = $this->getCacheOrderFields();
if ( $this->sortDescending() ) {
- $options['ORDER BY'] = 'qc_value DESC';
- } else {
- $options['ORDER BY'] = 'qc_value ASC';
+ foreach ( $order as &$field ) {
+ $field .= " DESC";
+ }
+ }
+ if ( $order ) {
+ $options['ORDER BY'] = $order;
}
- return $dbr->select( 'querycache', [ 'qc_type',
+
+ return $dbr->select( 'querycache',
+ [ 'qc_type',
'namespace' => 'qc_namespace',
'title' => 'qc_title',
'value' => 'qc_value' ],
[ 'qc_type' => $this->getName() ],
- __METHOD__, $options
+ __METHOD__,
+ $options
);
}
+ /**
+ * Return the order fields for fetchFromCache. Default is to always use
+ * "ORDER BY value" which was the default prior to this function.
+ * @return array
+ * @since 1.29
+ */
+ function getCacheOrderFields() {
+ return [ 'value' ];
+ }
+
public function getCachedTimestamp() {
if ( is_null( $this->cachedTimestamp ) ) {
$dbr = wfGetDB( DB_REPLICA );
$label = $this->msg( 'nlinks' )->numParams( $result->value )->escaped();
return Linker::link( $wlh, $label );
}
+
+ /**
+ * Order by title for pages with the same number of links to them
+ *
+ * @return array
+ * @since 1.29
+ */
+ function getOrderFields() {
+ return [ 'value DESC', 'namespace', 'title' ];
+ }
+
+ /**
+ * Do not order descending for all order fields. We will use DESC only on one field, see
+ * getOrderFields above. This overwrites sortDescending from QueryPage::getOrderFields().
+ * Do NOT change this to true unless you remove the phrase DESC in getOrderFiels above.
+ * If you do a database error will be thrown due to double adding DESC to query!
+ *
+ * @return bool
+ * @since 1.29
+ */
+ function sortDescending() {
+ return false;
+ }
+
+ /**
+ * Also use the order fields returned by getOrderFields when fetching from the cache.
+ * @return array
+ * @since 1.29
+ */
+ function getCacheOrderFields() {
+ return $this->getOrderFields();
+ }
+
}