From 6261b4187a91099f4f2fd900562506cf2b3df984 Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Mon, 12 Mar 2018 12:15:14 -0400 Subject: [PATCH] rdbms: Add $join_conds to IDatabase::estimateRowCount() So queries with joins can be estimated. Change-Id: I9163cf9005d2c2001a88bb102eb4142f0322b0df --- includes/libs/rdbms/database/DBConnRef.php | 2 +- includes/libs/rdbms/database/Database.php | 6 ++++-- includes/libs/rdbms/database/DatabaseMssql.php | 5 +++-- includes/libs/rdbms/database/DatabaseMysqlBase.php | 5 +++-- includes/libs/rdbms/database/DatabasePostgres.php | 5 +++-- includes/libs/rdbms/database/IDatabase.php | 3 ++- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/includes/libs/rdbms/database/DBConnRef.php b/includes/libs/rdbms/database/DBConnRef.php index f26b98546b..c397202302 100644 --- a/includes/libs/rdbms/database/DBConnRef.php +++ b/includes/libs/rdbms/database/DBConnRef.php @@ -281,7 +281,7 @@ class DBConnRef implements IDatabase { } public function estimateRowCount( - $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [] + $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = [] ) { return $this->__call( __FUNCTION__, func_get_args() ); } diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index 014c4af399..19fc7028dd 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -1528,10 +1528,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function estimateRowCount( - $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [] + $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = [] ) { $rows = 0; - $res = $this->select( $table, [ 'rowcount' => 'COUNT(*)' ], $conds, $fname, $options ); + $res = $this->select( + $table, [ 'rowcount' => 'COUNT(*)' ], $conds, $fname, $options, $join_conds + ); if ( $res ) { $row = $this->fetchRow( $res ); diff --git a/includes/libs/rdbms/database/DatabaseMssql.php b/includes/libs/rdbms/database/DatabaseMssql.php index b6428c7b21..885880a1d3 100644 --- a/includes/libs/rdbms/database/DatabaseMssql.php +++ b/includes/libs/rdbms/database/DatabaseMssql.php @@ -509,15 +509,16 @@ class DatabaseMssql extends Database { * @param string $conds * @param string $fname * @param array $options + * @param array $join_conds * @return int */ public function estimateRowCount( $table, $vars = '*', $conds = '', - $fname = __METHOD__, $options = [] + $fname = __METHOD__, $options = [], $join_conds = [] ) { // http://msdn2.microsoft.com/en-us/library/aa259203.aspx $options['EXPLAIN'] = true; $options['FOR COUNT'] = true; - $res = $this->select( $table, $vars, $conds, $fname, $options ); + $res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds ); $rows = -1; if ( $res ) { diff --git a/includes/libs/rdbms/database/DatabaseMysqlBase.php b/includes/libs/rdbms/database/DatabaseMysqlBase.php index 8fb8db5c16..28a28a69eb 100644 --- a/includes/libs/rdbms/database/DatabaseMysqlBase.php +++ b/includes/libs/rdbms/database/DatabaseMysqlBase.php @@ -562,13 +562,14 @@ abstract class DatabaseMysqlBase extends Database { * @param string|array $conds * @param string $fname * @param string|array $options + * @param array $join_conds * @return bool|int */ public function estimateRowCount( $table, $vars = '*', $conds = '', - $fname = __METHOD__, $options = [] + $fname = __METHOD__, $options = [], $join_conds = [] ) { $options['EXPLAIN'] = true; - $res = $this->select( $table, $vars, $conds, $fname, $options ); + $res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds ); if ( $res === false ) { return false; } diff --git a/includes/libs/rdbms/database/DatabasePostgres.php b/includes/libs/rdbms/database/DatabasePostgres.php index 38cc4aec60..7b2ef831e5 100644 --- a/includes/libs/rdbms/database/DatabasePostgres.php +++ b/includes/libs/rdbms/database/DatabasePostgres.php @@ -413,13 +413,14 @@ class DatabasePostgres extends Database { * @param string $conds * @param string $fname * @param array $options + * @param array $join_conds * @return int */ public function estimateRowCount( $table, $vars = '*', $conds = '', - $fname = __METHOD__, $options = [] + $fname = __METHOD__, $options = [], $join_conds = [] ) { $options['EXPLAIN'] = true; - $res = $this->select( $table, $vars, $conds, $fname, $options ); + $res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds ); $rows = -1; if ( $res ) { $row = $this->fetchRow( $res ); diff --git a/includes/libs/rdbms/database/IDatabase.php b/includes/libs/rdbms/database/IDatabase.php index 28a812573e..2dc7be85e3 100644 --- a/includes/libs/rdbms/database/IDatabase.php +++ b/includes/libs/rdbms/database/IDatabase.php @@ -822,11 +822,12 @@ interface IDatabase { * @param array|string $conds Filters on the table * @param string $fname Function name for profiling * @param array $options Options for select + * @param array|string $join_conds Join conditions * @return int Row count * @throws DBError */ public function estimateRowCount( - $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [] + $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = [] ); /** -- 2.20.1