protected function _performCount()
{
$query = $this->cleanCopy();
$counter = $this->_counter;
if ($counter) {
$query->counter(null);
return (int) $counter($query);
}
$complex = $query->clause('distinct') || count($query->clause('group')) || count($query->clause('union')) || $query->clause('having');
if (!$complex) {
// Expression fields could have bound parameters.
foreach ($query->clause('select') as $field) {
if ($field instanceof ExpressionInterface) {
$complex = true;
break;
}
}
}
if (!$complex && $this->_valueBinder !== null) {
$order = $this->clause('order');
$complex = $order === null ? false : $order->hasNestedExpression();
}
$count = ['count' => $query->func()->count('*')];
if (!$complex) {
$query->eagerLoader()->autoFields(false);
$statement = $query->select($count, true)->autoFields(false)->execute();
} else {
$statement = $this->connection()->newQuery()->select($count)->from(['count_source' => $query])->execute();
}
$result = $statement->fetch('assoc')['count'];
$statement->closeCursor();
return (int) $result;
}