Browse Source

Making Query::count() return consistent results. It was trying to be too
smart on what it needed to return.

In some cases it returned the total rows found and in other cases the
total rows fetched. Having a consisten result. This method, while very
mariginally slower, will always return the correct result.

Jose Lorenzo Rodriguez 12 years ago
parent
commit
9f8505fb83
1 changed files with 12 additions and 8 deletions
  1. 12 8
      src/ORM/Query.php

+ 12 - 8
src/ORM/Query.php

@@ -868,18 +868,22 @@ class Query extends DatabaseQuery {
 /**
  * Return the COUNT(*) for for the query.
  *
- * If the query does not contain GROUP BY or map reduce functions, then
- * this method will replace the selected fields with a COUNT(*), and the resulting
- * count will be returned.
- *
  * @return integer
  */
 	public function count() {
 		$query = clone $this;
-		$query->select(['count' => $this->func()->count('*')])->hydrate(false);
-		$query->mapReduce(null, null, true);
-		$query->formatResults(null, true);
-		return (int)$query->first()['count'];
+		$query->limit(null);
+
+		// Forcing at least one field to be selected
+		$query->select($query->newExpr()->add('1'));
+		$statement = $this->connection()->newQuery()
+			->select(['count' => $query->func()->count('*')])
+			->from(['source' => $query])
+			->execute();
+		$result = $statement->fetch('assoc')['count'];
+
+		$statement->closeCursor();
+		return (int)$result;
 	}
 
 /**