From 2990c2143c11f0c056156ae51071ffa29e46fa99 Mon Sep 17 00:00:00 2001 From: euromark Date: Tue, 11 Nov 2014 01:49:19 +0100 Subject: [PATCH 1/6] Correct assert argument order. --- .../Model/Behavior/TreeBehaviorNumberTest.php | 20 +++++++++---------- .../Model/Behavior/TreeBehaviorScopedTest.php | 10 +++++----- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php b/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php index 2021d1175..34d85d4e5 100644 --- a/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php +++ b/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php @@ -93,7 +93,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { $this->Tree->create(); $this->Tree->save($save); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -121,7 +121,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { $this->Tree->create(); $this->Tree->save($save); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -147,7 +147,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { $this->Tree->updateAll(array($parentField => null), array('id' => $result[$modelClass]['id'])); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -171,7 +171,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { $this->Tree->updateAll(array($parentField => 999999), array('id' => $result[$modelClass]['id'])); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover('MPTT'); $this->assertTrue($result); @@ -212,7 +212,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { $this->Tree->Behaviors->enable('Tree'); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -280,7 +280,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { )))); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $count = $this->Tree->find('count'); $this->assertEquals(6, $count); @@ -325,7 +325,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { $this->Tree->updateAll(array($parentField => 999999), array('id' => $result[$modelClass]['id'])); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -348,7 +348,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { $this->Tree->updateAll(array($parentField => null)); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -371,7 +371,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { $this->Tree->updateAll(array($leftField => 0, $rightField => 0)); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $this->Tree->recover(); @@ -398,7 +398,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { array($rightField . ' >' => $result[$modelClass][$leftField])); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); diff --git a/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorScopedTest.php b/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorScopedTest.php index 172cfe5af..932d64628 100644 --- a/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorScopedTest.php +++ b/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorScopedTest.php @@ -438,7 +438,7 @@ class TreeBehaviorScopedTest extends CakeTestCase { $this->Tree->Behaviors->enable('Tree'); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -485,7 +485,7 @@ class TreeBehaviorScopedTest extends CakeTestCase { $this->Tree->updateAll(array($parentField => 999999), array('id' => $result[$modelClass]['id'])); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -515,7 +515,7 @@ class TreeBehaviorScopedTest extends CakeTestCase { $this->Tree->updateAll(array($parentField => null)); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); @@ -545,7 +545,7 @@ class TreeBehaviorScopedTest extends CakeTestCase { $this->Tree->updateAll(array($leftField => 0, $rightField => 0)); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $this->Tree->recover(); @@ -579,7 +579,7 @@ class TreeBehaviorScopedTest extends CakeTestCase { array($rightField . ' >' => $result[$modelClass][$leftField])); $result = $this->Tree->verify(); - $this->assertNotSame($result, true); + $this->assertNotSame(true, $result); $result = $this->Tree->recover(); $this->assertTrue($result); From 8712dc01df473aa6f63a8056593f4edb785d997a Mon Sep 17 00:00:00 2001 From: watermark Date: Tue, 11 Nov 2014 16:13:16 -0500 Subject: [PATCH 2/6] Cleanup of isUnique isUnique takes the count of the args multiple times. Store the count in a variable to cut down on overhead. --- lib/Cake/Model/Model.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Cake/Model/Model.php b/lib/Cake/Model/Model.php index 3952ad5c3..0848c0762 100644 --- a/lib/Cake/Model/Model.php +++ b/lib/Cake/Model/Model.php @@ -3315,9 +3315,10 @@ class Model extends Object implements CakeEventListener { } if (!is_array($fields)) { $fields = func_get_args(); - if (is_bool($fields[count($fields) - 1])) { - $or = $fields[count($fields) - 1]; - unset($fields[count($fields) - 1]); + $fieldCount = count($fields) - 1; + if (is_bool($fields[$fieldCount])) { + $or = $fields[$fieldCount]; + unset($fields[$fieldCount]); } } From 93a6fd56483c3893d7c4c9c017b1348c7e56ed20 Mon Sep 17 00:00:00 2001 From: mark_story Date: Tue, 11 Nov 2014 23:13:44 -0500 Subject: [PATCH 3/6] Fix SQLite parsing fields incorrectly when using subqueries. When using subqueries or joining against tables containing FROM the results were bizzare and unexpected. By tokenizing the entire query we can more accurately grab the fields. Refs #3972 --- lib/Cake/Model/Datasource/Database/Sqlite.php | 11 ++++----- .../Model/Datasource/Database/SqliteTest.php | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/Cake/Model/Datasource/Database/Sqlite.php b/lib/Cake/Model/Datasource/Database/Sqlite.php index 5e141a757..4cb7b6b2d 100644 --- a/lib/Cake/Model/Datasource/Database/Sqlite.php +++ b/lib/Cake/Model/Datasource/Database/Sqlite.php @@ -300,12 +300,11 @@ class Sqlite extends DboSource { // PDO::getColumnMeta is experimental and does not work with sqlite3, // so try to figure it out based on the querystring $querystring = $results->queryString; - if (stripos($querystring, 'SELECT') === 0) { - $last = strripos($querystring, 'FROM'); - if ($last !== false) { - $selectpart = substr($querystring, 7, $last - 8); - $selects = String::tokenize($selectpart, ',', '(', ')'); - } + if (stripos($querystring, 'SELECT') === 0 && stripos($querystring, 'FROM') > 0) { + $selectpart = substr($querystring, 7); + $selects = String::tokenize($selectpart, ',', '(', ')'); + $last = count($selects) - 1; + $selects[$last] = trim(substr($selects[$last], 0, stripos($selects[$last], 'FROM'))); } elseif (strpos($querystring, 'PRAGMA table_info') === 0) { $selects = array('cid', 'name', 'type', 'notnull', 'dflt_value', 'pk'); } elseif (strpos($querystring, 'PRAGMA index_list') === 0) { diff --git a/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php b/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php index 4a8693e66..b7a7e9d10 100644 --- a/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php @@ -518,4 +518,28 @@ class SqliteTest extends CakeTestCase { $this->assertNotContains($scientificNotation, $result); } +/** + * Test that fields are parsed out in a reasonable fashion. + * + * @return void + */ + public function testFetchRowColumnParsing() { + $this->loadFixtures('User'); + $sql = 'SELECT "User"."id", "User"."user", "User"."password", "User"."created", (1 + 1) AS "two" ' . + 'FROM "users" AS "User" WHERE ' . + '"User"."id" IN (SELECT MAX("id") FROM "users")'; + $result = $this->Dbo->fetchRow($sql); + + $this->assertArrayHasKey('User', $result); + $this->assertArrayHasKey('0', $result); + $this->assertCount(2, $result, 'Too many top level keys'); + $this->assertCount(4, $result['User'], 'Too many keys'); + $this->assertCount(1, $result['0'], 'Too many keys'); + $this->assertArrayHasKey('id', $result['User']); + $this->assertArrayHasKey('user', $result['User']); + $this->assertArrayHasKey('password', $result['User']); + $this->assertArrayHasKey('created', $result['User']); + $this->assertArrayHasKey('two', $result['0']); + } + } From 6092c168a9bd4c08cabbba0269592992af5ed4a5 Mon Sep 17 00:00:00 2001 From: mark_story Date: Wed, 12 Nov 2014 20:49:19 -0500 Subject: [PATCH 4/6] Fix issues with sqlite field parsing. The previous attempt would still fail on unions or derived table join queries. This new approach is a bit slower but more robust. Refs #3972 --- lib/Cake/Model/Datasource/Database/Sqlite.php | 12 ++++-- .../Model/Datasource/Database/SqliteTest.php | 40 ++++++++++++++----- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/lib/Cake/Model/Datasource/Database/Sqlite.php b/lib/Cake/Model/Datasource/Database/Sqlite.php index 4cb7b6b2d..955f51f42 100644 --- a/lib/Cake/Model/Datasource/Database/Sqlite.php +++ b/lib/Cake/Model/Datasource/Database/Sqlite.php @@ -302,9 +302,15 @@ class Sqlite extends DboSource { $querystring = $results->queryString; if (stripos($querystring, 'SELECT') === 0 && stripos($querystring, 'FROM') > 0) { $selectpart = substr($querystring, 7); - $selects = String::tokenize($selectpart, ',', '(', ')'); - $last = count($selects) - 1; - $selects[$last] = trim(substr($selects[$last], 0, stripos($selects[$last], 'FROM'))); + $selects = array(); + foreach (String::tokenize($selectpart, ',', '(', ')') as $part) { + $fromPos = stripos($part, ' FROM '); + if ($fromPos !== false) { + $selects[] = trim(substr($part, 0, $fromPos)); + break; + } + $selects[] = $part; + } } elseif (strpos($querystring, 'PRAGMA table_info') === 0) { $selects = array('cid', 'name', 'type', 'notnull', 'dflt_value', 'pk'); } elseif (strpos($querystring, 'PRAGMA index_list') === 0) { diff --git a/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php b/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php index b7a7e9d10..48ca68513 100644 --- a/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php @@ -527,19 +527,37 @@ class SqliteTest extends CakeTestCase { $this->loadFixtures('User'); $sql = 'SELECT "User"."id", "User"."user", "User"."password", "User"."created", (1 + 1) AS "two" ' . 'FROM "users" AS "User" WHERE ' . - '"User"."id" IN (SELECT MAX("id") FROM "users")'; + '"User"."id" IN (SELECT MAX("id") FROM "users") ' . + 'OR "User.id" IN (5, 6, 7, 8)'; $result = $this->Dbo->fetchRow($sql); - $this->assertArrayHasKey('User', $result); - $this->assertArrayHasKey('0', $result); - $this->assertCount(2, $result, 'Too many top level keys'); - $this->assertCount(4, $result['User'], 'Too many keys'); - $this->assertCount(1, $result['0'], 'Too many keys'); - $this->assertArrayHasKey('id', $result['User']); - $this->assertArrayHasKey('user', $result['User']); - $this->assertArrayHasKey('password', $result['User']); - $this->assertArrayHasKey('created', $result['User']); - $this->assertArrayHasKey('two', $result['0']); + $expected = array( + 'User' => array( + 'id' => 4, + 'user' => 'garrett', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:22:23' + ), + 0 => array( + 'two' => 2 + ) + ); + $this->assertEquals($expected, $result); + + $sql = 'SELECT "User"."id", "User"."user" ' . + 'FROM "users" AS "User" WHERE "User"."id" = 4 ' . + 'UNION ' . + 'SELECT "User"."id", "User"."user" ' . + 'FROM "users" AS "User" WHERE "User"."id" = 3'; + $result = $this->Dbo->fetchRow($sql); + + $expected = array( + 'User' => array( + 'id' => 3, + 'user' => 'larry', + ), + ); + $this->assertEquals($expected, $result); } } From e3e54d40faf4273c1063a93ee509daa09d5fb426 Mon Sep 17 00:00:00 2001 From: Bryan Crowe Date: Thu, 13 Nov 2014 16:47:10 -0500 Subject: [PATCH 5/6] Fix CS, remove extra space --- lib/Cake/Model/Datasource/Database/Sqlite.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Cake/Model/Datasource/Database/Sqlite.php b/lib/Cake/Model/Datasource/Database/Sqlite.php index 955f51f42..37c3787a8 100644 --- a/lib/Cake/Model/Datasource/Database/Sqlite.php +++ b/lib/Cake/Model/Datasource/Database/Sqlite.php @@ -306,7 +306,7 @@ class Sqlite extends DboSource { foreach (String::tokenize($selectpart, ',', '(', ')') as $part) { $fromPos = stripos($part, ' FROM '); if ($fromPos !== false) { - $selects[] = trim(substr($part, 0, $fromPos)); + $selects[] = trim(substr($part, 0, $fromPos)); break; } $selects[] = $part; From 4b6dba0c0a7095ce1c8dbbb79bcf4481f0b10f56 Mon Sep 17 00:00:00 2001 From: mark_story Date: Thu, 13 Nov 2014 21:21:47 -0500 Subject: [PATCH 6/6] Add order=>false to all treebehavior queries. Models can define default order conditions that will cause issues with postgres. By setting order=>false on all the queries emitted by TreeBehavior, we can avoid this issue and not have issues with models that define a default ordering. Refs #5155 --- lib/Cake/Model/Behavior/TreeBehavior.php | 86 +++++++++++++++---- .../Model/Behavior/TreeBehaviorNumberTest.php | 51 ----------- 2 files changed, 69 insertions(+), 68 deletions(-) diff --git a/lib/Cake/Model/Behavior/TreeBehavior.php b/lib/Cake/Model/Behavior/TreeBehavior.php index 3bd0991ea..7c0afedf1 100644 --- a/lib/Cake/Model/Behavior/TreeBehavior.php +++ b/lib/Cake/Model/Behavior/TreeBehavior.php @@ -129,6 +129,7 @@ class TreeBehavior extends ModelBehavior { $data = $Model->find('first', array( 'conditions' => array($Model->escapeField($Model->primaryKey) => $Model->id), 'fields' => array($Model->escapeField($left), $Model->escapeField($right)), + 'order' => false, 'recursive' => -1)); if ($data) { $this->_deletedRow[$Model->alias] = current($data); @@ -185,7 +186,9 @@ class TreeBehavior extends ModelBehavior { if (array_key_exists($parent, $Model->data[$Model->alias]) && $Model->data[$Model->alias][$parent]) { $parentNode = $Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $Model->data[$Model->alias][$parent]), - 'fields' => array($Model->primaryKey, $right), 'recursive' => $recursive + 'fields' => array($Model->primaryKey, $right), + 'recursive' => $recursive, + 'order' => false, )); if (!$parentNode) { return false; @@ -208,7 +211,9 @@ class TreeBehavior extends ModelBehavior { } else { $values = $Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $Model->id), - 'fields' => array($Model->primaryKey, $parent, $left, $right), 'recursive' => $recursive) + 'fields' => array($Model->primaryKey, $parent, $left, $right), + 'order' => false, + 'recursive' => $recursive) ); if (empty($values)) { @@ -218,7 +223,9 @@ class TreeBehavior extends ModelBehavior { $parentNode = $Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $Model->data[$Model->alias][$parent]), - 'fields' => array($Model->primaryKey, $left, $right), 'recursive' => $recursive + 'fields' => array($Model->primaryKey, $left, $right), + 'order' => false, + 'recursive' => $recursive )); if (!$parentNode) { return false; @@ -268,7 +275,11 @@ class TreeBehavior extends ModelBehavior { } elseif ($Model->id === $id && isset($Model->data[$Model->alias][$left]) && isset($Model->data[$Model->alias][$right])) { $data = $Model->data[$Model->alias]; } else { - $data = $Model->find('first', array('conditions' => array($scope, $Model->escapeField() => $id), 'recursive' => $recursive)); + $data = $Model->find('first', array( + 'conditions' => array($scope, $Model->escapeField() => $id), + 'order' => false, + 'recursive' => $recursive + )); if (!$data) { return 0; } @@ -325,7 +336,8 @@ class TreeBehavior extends ModelBehavior { $result = array_values((array)$Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $id), 'fields' => array($left, $right), - 'recursive' => $recursive + 'recursive' => $recursive, + 'order' => false, ))); if (empty($result) || !isset($result[0])) { @@ -425,11 +437,21 @@ class TreeBehavior extends ModelBehavior { if ($overrideRecursive !== null) { $recursive = $overrideRecursive; } - $parentId = $Model->find('first', array('conditions' => array($Model->primaryKey => $id), 'fields' => array($parent), 'recursive' => -1)); + $parentId = $Model->find('first', array( + 'conditions' => array($Model->primaryKey => $id), + 'fields' => array($parent), + 'order' => false, + 'recursive' => -1 + )); if ($parentId) { $parentId = $parentId[$Model->alias][$parent]; - $parent = $Model->find('first', array('conditions' => array($Model->escapeField() => $parentId), 'fields' => $fields, 'recursive' => $recursive)); + $parent = $Model->find('first', array( + 'conditions' => array($Model->escapeField() => $parentId), + 'fields' => $fields, + 'order' => false, + 'recursive' => $recursive + )); return $parent; } @@ -458,7 +480,12 @@ class TreeBehavior extends ModelBehavior { if ($overrideRecursive !== null) { $recursive = $overrideRecursive; } - $result = $Model->find('first', array('conditions' => array($Model->escapeField() => $id), 'fields' => array($left, $right), 'recursive' => $recursive)); + $result = $Model->find('first', array( + 'conditions' => array($Model->escapeField() => $id), + 'fields' => array($left, $right), + 'order' => false, + 'recursive' => $recursive + )); if ($result) { $result = array_values($result); } else { @@ -467,7 +494,9 @@ class TreeBehavior extends ModelBehavior { $item = $result[0]; $results = $Model->find('all', array( 'conditions' => array($scope, $Model->escapeField($left) . ' <=' => $item[$left], $Model->escapeField($right) . ' >=' => $item[$right]), - 'fields' => $fields, 'order' => array($Model->escapeField($left) => 'asc'), 'recursive' => $recursive + 'fields' => $fields, 'order' => array($Model->escapeField($left) => 'asc'), + 'order' => false, + 'recursive' => $recursive )); return $results; } @@ -496,12 +525,16 @@ class TreeBehavior extends ModelBehavior { extract($this->settings[$Model->alias]); list($node) = array_values($Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $id), - 'fields' => array($Model->primaryKey, $left, $right, $parent), 'recursive' => $recursive + 'fields' => array($Model->primaryKey, $left, $right, $parent), + 'order' => false, + 'recursive' => $recursive ))); if ($node[$parent]) { list($parentNode) = array_values($Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $node[$parent]), - 'fields' => array($Model->primaryKey, $left, $right), 'recursive' => $recursive + 'fields' => array($Model->primaryKey, $left, $right), + 'order' => false, + 'recursive' => $recursive ))); if (($node[$right] + 1) == $parentNode[$right]) { return false; @@ -509,7 +542,9 @@ class TreeBehavior extends ModelBehavior { } $nextNode = $Model->find('first', array( 'conditions' => array($scope, $Model->escapeField($left) => ($node[$right] + 1)), - 'fields' => array($Model->primaryKey, $left, $right), 'recursive' => $recursive) + 'fields' => array($Model->primaryKey, $left, $right), + 'order' => false, + 'recursive' => $recursive) ); if ($nextNode) { list($nextNode) = array_values($nextNode); @@ -554,12 +589,16 @@ class TreeBehavior extends ModelBehavior { extract($this->settings[$Model->alias]); list($node) = array_values($Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $id), - 'fields' => array($Model->primaryKey, $left, $right, $parent), 'recursive' => $recursive + 'fields' => array($Model->primaryKey, $left, $right, $parent), + 'order' => false, + 'recursive' => $recursive ))); if ($node[$parent]) { list($parentNode) = array_values($Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $node[$parent]), - 'fields' => array($Model->primaryKey, $left, $right), 'recursive' => $recursive + 'fields' => array($Model->primaryKey, $left, $right), + 'order' => false, + 'recursive' => $recursive ))); if (($node[$left] - 1) == $parentNode[$left]) { return false; @@ -568,6 +607,7 @@ class TreeBehavior extends ModelBehavior { $previousNode = $Model->find('first', array( 'conditions' => array($scope, $Model->escapeField($right) => ($node[$left] - 1)), 'fields' => array($Model->primaryKey, $left, $right), + 'order' => false, 'recursive' => $recursive )); @@ -620,7 +660,8 @@ class TreeBehavior extends ModelBehavior { 'recursive' => 0, 'conditions' => array($scope, array( 'NOT' => array($Model->escapeField($parent) => null), $Model->VerifyParent->escapeField() => null - )) + )), + 'order' => false, )); $Model->unbindModel(array('belongsTo' => array('VerifyParent'))); if ($missingParents) { @@ -790,6 +831,7 @@ class TreeBehavior extends ModelBehavior { list($node) = array_values($Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $id), 'fields' => array($Model->primaryKey, $left, $right, $parent), + 'order' => false, 'recursive' => $recursive ))); @@ -803,6 +845,7 @@ class TreeBehavior extends ModelBehavior { list($parentNode) = array_values($Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $node[$parent]), 'fields' => array($Model->primaryKey, $left, $right), + 'order' => false, 'recursive' => $recursive ))); } else { @@ -871,7 +914,11 @@ class TreeBehavior extends ModelBehavior { } } } - $node = $Model->find('first', array('conditions' => array($scope, $Model->escapeField($right) . '< ' . $Model->escapeField($left)), 'recursive' => 0)); + $node = $Model->find('first', array( + 'conditions' => array($scope, $Model->escapeField($right) . '< ' . $Model->escapeField($left)), + 'order' => false, + 'recursive' => 0 + )); if ($node) { $errors[] = array('node', $node[$Model->alias][$Model->primaryKey], 'left greater than right.'); } @@ -882,7 +929,8 @@ class TreeBehavior extends ModelBehavior { 'fields' => array($Model->primaryKey, $left, $right, $parent) )))); - foreach ($Model->find('all', array('conditions' => $scope, 'recursive' => 0)) as $instance) { + $rows = $Model->find('all', array('conditions' => $scope, 'recursive' => 0)); + foreach ($rows as $instance) { if ($instance[$Model->alias][$left] === null || $instance[$Model->alias][$right] === null) { $errors[] = array('node', $instance[$Model->alias][$Model->primaryKey], 'has invalid left or right values'); @@ -927,6 +975,7 @@ class TreeBehavior extends ModelBehavior { list($node) = array_values($Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $Model->id), 'fields' => array($Model->primaryKey, $parent, $left, $right), + 'order' => false, 'recursive' => $recursive ))); $edge = $this->_getMax($Model, $scope, $right, $recursive, $created); @@ -938,6 +987,7 @@ class TreeBehavior extends ModelBehavior { $values = $Model->find('first', array( 'conditions' => array($scope, $Model->escapeField() => $parentId), 'fields' => array($Model->primaryKey, $left, $right), + 'order' => false, 'recursive' => $recursive )); @@ -1009,6 +1059,7 @@ class TreeBehavior extends ModelBehavior { 'conditions' => $scope, 'fields' => $db->calculate($Model, 'max', array($name, $right)), 'recursive' => $recursive, + 'order' => false, 'callbacks' => false ))); return (empty($edge[$right])) ? 0 : $edge[$right]; @@ -1030,6 +1081,7 @@ class TreeBehavior extends ModelBehavior { 'conditions' => $scope, 'fields' => $db->calculate($Model, 'min', array($name, $left)), 'recursive' => $recursive, + 'order' => false, 'callbacks' => false ))); return (empty($edge[$left])) ? 0 : $edge[$left]; diff --git a/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php b/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php index 34d85d4e5..f03ac2a79 100644 --- a/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php +++ b/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php @@ -64,7 +64,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testInitialize() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $result = $this->Tree->find('count'); @@ -82,7 +81,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDetectInvalidLeft() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $result = $this->Tree->findByName('1.1'); @@ -110,7 +108,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDetectInvalidRight() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $result = $this->Tree->findByName('1.1'); @@ -138,7 +135,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDetectInvalidParent() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $result = $this->Tree->findByName('1.1'); @@ -164,7 +160,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDetectNoneExistentParent() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $result = $this->Tree->findByName('1.1'); @@ -188,7 +183,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testRecoverUsingParentMode() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->Behaviors->disable('Tree'); $this->Tree->create(); @@ -244,7 +238,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testRecoverUsingParentModeAndDelete() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->Behaviors->disable('Tree'); $this->Tree->create(); @@ -318,7 +311,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testRecoverFromMissingParent() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $result = $this->Tree->findByName('1.1'); @@ -342,7 +334,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDetectInvalidParents() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->updateAll(array($parentField => null)); @@ -365,7 +356,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDetectInvalidLftsRghts() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->updateAll(array($leftField => 0, $rightField => 0)); @@ -387,7 +377,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDetectEqualLftsRghts() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(1, 3); $result = $this->Tree->findByName('1.1'); @@ -415,7 +404,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testAddOrphan() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->create(); @@ -436,7 +424,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testAddMiddle() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.1'))); @@ -468,7 +455,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testAddWithPreSpecifiedId() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array( @@ -499,7 +485,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testAddInvalid() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->id = null; @@ -525,7 +510,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testAddNotIndexedByModel() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->create(); @@ -546,7 +530,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMovePromote() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->id = null; @@ -573,7 +556,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveWithWhitelist() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->id = null; @@ -601,7 +583,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testInsertWithWhitelist() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->whitelist = array('name', $parentField); @@ -621,7 +602,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveBefore() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->id = null; @@ -650,7 +630,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveAfter() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->id = null; @@ -679,7 +658,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveDemoteInvalid() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->id = null; @@ -712,7 +690,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveInvalid() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->id = null; @@ -737,7 +714,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveSelfInvalid() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->id = null; @@ -763,7 +739,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveUpSuccess() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.2'))); @@ -785,7 +760,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveUpFail() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('conditions' => array($modelClass . '.name' => '1.1'))); @@ -808,7 +782,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveUp2() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(1, 10); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.5'))); @@ -839,7 +812,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveUpFirst() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(1, 10); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.5'))); @@ -870,7 +842,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveDownSuccess() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.1'))); @@ -892,7 +863,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveDownFail() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('conditions' => array($modelClass . '.name' => '1.2'))); @@ -914,7 +884,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveDownLast() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(1, 10); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.5'))); @@ -945,7 +914,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveDown2() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(1, 10); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.5'))); @@ -976,7 +944,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testSaveNoMove() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(1, 10); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.5'))); @@ -1007,7 +974,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testMoveToRootAndMoveUp() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(1, 1); $data = $this->Tree->find('first', array('fields' => array('id'), 'conditions' => array($modelClass . '.name' => '1.1'))); $this->Tree->id = $data[$modelClass]['id']; @@ -1032,7 +998,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDelete() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $initialCount = $this->Tree->find('count'); @@ -1068,7 +1033,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testDeleteDoesNotExist() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $this->Tree->delete(99999); } @@ -1081,7 +1045,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testRemove() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $initialCount = $this->Tree->find('count'); $result = $this->Tree->findByName('1.1'); @@ -1114,7 +1077,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testRemoveLastTopParent() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $initialCount = $this->Tree->find('count'); @@ -1148,7 +1110,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testRemoveNoChildren() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $initialCount = $this->Tree->find('count'); @@ -1183,7 +1144,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testRemoveAndDelete() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $initialCount = $this->Tree->find('count'); @@ -1218,7 +1178,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testRemoveAndDeleteNoChildren() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $initialCount = $this->Tree->find('count'); @@ -1251,7 +1210,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testChildren() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('conditions' => array($modelClass . '.name' => '1. Root'))); @@ -1282,7 +1240,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testCountChildren() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('conditions' => array($modelClass . '.name' => '1. Root'))); @@ -1308,7 +1265,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testGetParentNode() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('conditions' => array($modelClass . '.name' => '1.2.2'))); @@ -1327,7 +1283,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testGetPath() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $data = $this->Tree->find('first', array('conditions' => array($modelClass . '.name' => '1.2.2'))); @@ -1348,7 +1303,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testNoAmbiguousColumn() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->bindModel(array('belongsTo' => array('Dummy' => array('className' => $modelClass, 'foreignKey' => $parentField, 'conditions' => array('Dummy.id' => null)))), false); $this->Tree->initialize(2, 2); @@ -1381,7 +1335,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testReorderTree() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(3, 3); $nodes = $this->Tree->find('list', array('order' => $leftField)); @@ -1413,7 +1366,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testReorderBigTreeWithQueryCaching() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 10); $original = $this->Tree->cacheQueries; @@ -1431,7 +1383,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testGenerateTreeListWithSelfJoin() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->bindModel(array('belongsTo' => array('Dummy' => array('className' => $modelClass, 'foreignKey' => $parentField, 'conditions' => array('Dummy.id' => null)))), false); $this->Tree->initialize(2, 2); @@ -1449,7 +1400,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testGenerateTreeListFormatting() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(2, 2); $result = $this->Tree->generateTreeList( @@ -1470,7 +1420,6 @@ class TreeBehaviorNumberTest extends CakeTestCase { public function testArraySyntax() { extract($this->settings); $this->Tree = new $modelClass(); - $this->Tree->order = null; $this->Tree->initialize(3, 3); $this->assertSame($this->Tree->childCount(2), $this->Tree->childCount(array('id' => 2))); $this->assertSame($this->Tree->getParentNode(2), $this->Tree->getParentNode(array('id' => 2)));