Browse Source

Fixing more failing tests

Jose Lorenzo Rodriguez 12 years ago
parent
commit
bb2f6f60b1
3 changed files with 20 additions and 18 deletions
  1. 18 4
      src/ORM/EagerLoader.php
  2. 1 12
      src/ORM/Query.php
  3. 1 2
      src/ORM/ResultSet.php

+ 18 - 4
src/ORM/EagerLoader.php

@@ -14,6 +14,8 @@
  */
 namespace Cake\ORM;
 
+use Cake\Database\Statement\BufferedStatement;
+use Cake\Database\Statement\CallbackStatement;
 use Cake\ORM\Table;
 use Cake\ORM\Query;
 use Closure;
@@ -261,19 +263,31 @@ class EagerLoader {
  * directly in this query and will setup the required extra queries for fetching
  * the extra data.
  *
- * @param Statement $statement original query statement
+ * @param \Cake\ORM\Query $query The query for which to eage load external
+ * associations
+ * @param Statement $statement The statement created after executing the $query
  * @return CallbackStatement $statement modified statement with extra loaders
  */
-	public function eagerLoad($statement) {
+	public function eagerLoad($query, $statement) {
+		if (!$this->hasExternal($query->repository())) {
+			return $statement;
+		}
+
+		$driver = $query->connection()->driver();
+
+		if (!($statement instanceof BufferedStatement)) {
+			$statement = new BufferedStatement($statement, $driver);
+		}
+
 		$collected = $this->_collectKeys($statement);
 		foreach ($this->_loadEagerly as $meta) {
 			$contain = $meta['associations'];
 			$alias = $meta['instance']->source()->alias();
 			$keys = isset($collected[$alias]) ? $collected[$alias] : null;
 			$f = $meta['instance']->eagerLoader(
-				$meta['config'] + ['query' => $this, 'contain' => $contain, 'keys' => $keys]
+				$meta['config'] + ['query' => $query, 'contain' => $contain, 'keys' => $keys]
 			);
-			$statement = new CallbackStatement($statement, $this->connection()->driver(), $f);
+			$statement = new CallbackStatement($statement, $driver, $f);
 		}
 
 		return $statement;

+ 1 - 12
src/ORM/Query.php

@@ -16,8 +16,6 @@ namespace Cake\ORM;
 
 use Cake\Collection\Iterator\MapReduce;
 use Cake\Database\Query as DatabaseQuery;
-use Cake\Database\Statement\BufferedStatement;
-use Cake\Database\Statement\CallbackStatement;
 use Cake\Event\Event;
 use Cake\ORM\EagerLoader;
 use Cake\ORM\QueryCacher;
@@ -903,16 +901,7 @@ class Query extends DatabaseQuery {
  */
 	protected function _decorateStatement($statement) {
 		$statement = parent::_decorateStatement($statement);
-		$loader = $this->eagerLoader();
-
-		if ($loader->hasExternal($this->repository())) {
-			if (!($statement instanceof BufferedStatement)) {
-				$statement = new BufferedStatement($statement, $this->connection()->driver());
-			}
-			$statement = $loader->eagerLoad($statement);
-		}
-
-		return $statement;
+		return $this->eagerLoader()->eagerLoad($this, $statement);
 	}
 
 /**

+ 1 - 2
src/ORM/ResultSet.php

@@ -284,8 +284,7 @@ class ResultSet implements Countable, Iterator, Serializable, JsonSerializable {
  * @return void
  */
 	protected function _calculateAssociationMap() {
-		$contain = $this->_query->normalizedContainments();
-
+		$contain = $this->_query->eagerLoader()->normalized($this->_defaultTable);
 		if (!$contain) {
 			return;
 		}