@@ -239,7 +239,32 @@ public function getSelectCountSql()
239
239
$ countSelect ->columns ("COUNT(DISTINCT " . implode (", " , $ group ) . ") " );
240
240
} else {
241
241
$ countSelect ->columns ('COUNT(*) ' );
242
+
243
+ // Simple optimization - remove all joins if there are no where clauses using joined tables and all joins are left joins
244
+ $ leftJoins = array_filter ($ countSelect ->getPart (Zend_Db_Select::FROM ), function ($ table ) {
245
+ return ($ table ['joinType ' ] == Zend_Db_Select::LEFT_JOIN || $ table ['joinType ' ] == Zend_Db_Select::FROM );
246
+ });
247
+ if (count ($ leftJoins ) == count ($ countSelect ->getPart (Zend_Db_Select::FROM ))) {
248
+ $ mainTable = array_filter ($ leftJoins , function ($ table ) {
249
+ return $ table ['joinType ' ] == Zend_Db_Select::FROM ;
250
+ });
251
+ $ mainTable = key ($ mainTable );
252
+ $ mainTable = preg_quote ($ mainTable , '/ ' );
253
+ $ pattern = "/^ $ mainTable \\. \\w+/ " ;
254
+ $ whereUsingJoin = array_filter ($ countSelect ->getPart (Zend_Db_Select::WHERE ), function ($ clause ) use ($ pattern ) {
255
+ $ clauses = preg_split ('/(^|\s+)(AND|OR)\s+/ ' , $ clause , -1 , PREG_SPLIT_NO_EMPTY );
256
+ return array_filter ($ clauses , function ($ clause ) use ($ pattern ) {
257
+ $ clause = preg_replace ('/[()`\s]+/ ' , '' , $ clause );
258
+ return !preg_match ($ pattern , $ clause );
259
+ });
260
+ });
261
+ if (empty ($ whereUsingJoin )) {
262
+ $ from = array_slice ($ leftJoins , 0 , 1 );
263
+ $ countSelect ->setPart (Zend_Db_Select::FROM , $ from );
264
+ }
265
+ }
242
266
}
267
+
243
268
return $ countSelect ;
244
269
}
245
270
0 commit comments