Merged relevant test cases from 'alkemann' into tree test and made them pass, fixes #4493

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@6939 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
the_undefined 2008-05-19 03:03:44 +00:00
parent 775707838e
commit e5d7f5279e
4 changed files with 96 additions and 13 deletions

View file

@ -240,7 +240,9 @@ class TreeBehavior extends ModelBehavior {
}
$name = $model->alias;
extract($this->settings[$name]);
if ($scope != '1 = 1') {
$recursive = 0;
}
if (!$order) {
$order = $model->alias . '.' . $left . ' asc';
}
@ -251,7 +253,7 @@ class TreeBehavior extends ModelBehavior {
if (!$id) {
$constraint = $scope;
} else {
@list($item) = array_values($model->find('first', array('conditions' => array($scope, $model->escapeField() => $id), 'fields' => array($left, $right), 'recursive' => -1)));
@list($item) = array_values($model->find('first', array('conditions' => array($scope, $model->escapeField() => $id), 'fields' => array($left, $right), 'recursive' => $recursive)));
$constraint = array($scope, $model->escapeField($right) . '< ' . $item[$right], $model->escapeField($left) => '> ' . $item[$left]);
}
return $model->find('all', array('conditions' => $constraint, 'fields' => $fields, 'order' => $order, 'limit' => $limit, 'page' => $page, 'recursive' => $recursive));
@ -380,27 +382,31 @@ class TreeBehavior extends ModelBehavior {
$id = $model->id;
}
extract($this->settings[$model->alias]);
$recursive = -1;
if ($scope != '1 = 1') {
$recursive = 0;
}
list($node) = array_values($model->find('first', array(
'conditions' => array($scope, $model->escapeField() => $id),
'fields' => array($model->primaryKey, $left, $right, $parent), 'recursive' => -1
'fields' => array($model->primaryKey, $left, $right, $parent), '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' => -1
'fields' => array($model->primaryKey, $left, $right), 'recursive' => $recursive
)));
if (($node[$right] + 1) == $parentNode[$right]) {
return false;
}
}
$nextNode = $model->find('first', array('conditions' => array($scope, $model->escapeField($left) => ($node[$right] + 1)),
'fields' => array($model->primaryKey, $left, $right), 'recursive' => -1));
'fields' => array($model->primaryKey, $left, $right), 'recursive' => $recursive));
if ($nextNode) {
list($nextNode)= array_values($nextNode);
} else {
return false;
}
$edge = $this->__getMax($model, $scope, $right);
$edge = $this->__getMax($model, $scope, $right, $recursive);
$this->__sync($model, $edge - $node[$left] + 1, '+', 'BETWEEN ' . $node[$left] . ' AND ' . $node[$right]);
$this->__sync($model, $nextNode[$left] - $node[$left], '-', 'BETWEEN ' . $nextNode[$left] . ' AND ' . $nextNode[$right]);
$this->__sync($model, $edge - $node[$left] - ($nextNode[$right] - $nextNode[$left]), '-', '> ' . $edge);
@ -431,27 +437,31 @@ class TreeBehavior extends ModelBehavior {
$id = $model->id;
}
extract($this->settings[$model->alias]);
$recursive = -1;
if ($scope != '1 = 1') {
$recursive = 0;
}
list($node) = array_values($model->find('first', array(
'conditions' => array($scope, $model->escapeField() => $id),
'fields' => array($model->primaryKey, $left, $right, $parent ), 'recursive' => -1
'fields' => array($model->primaryKey, $left, $right, $parent ), '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' => -1
'fields' => array($model->primaryKey, $left, $right), 'recursive' => $recursive
)));
if (($node[$left] - 1) == $parentNode[$left]) {
return false;
}
}
$previousNode = $model->find('first', array('conditions' => array($scope, $model->escapeField($right) => ($node[$left] - 1)),
'fields' => array($model->primaryKey, $left, $right), 'recursive' => -1));
'fields' => array($model->primaryKey, $left, $right), 'recursive' => $recursive));
if ($previousNode) {
list($previousNode) = array_values($previousNode);
} else {
return false;
}
$edge = $this->__getMax($model, $scope, $right);
$edge = $this->__getMax($model, $scope, $right, $recursive);
$this->__sync($model, $edge - $previousNode[$left] +1, '+', 'BETWEEN ' . $previousNode[$left] . ' AND ' . $previousNode[$right]);
$this->__sync($model, $node[$left] - $previousNode[$left], '-', 'BETWEEN ' .$node[$left] . ' AND ' . $node[$right]);
$this->__sync($model, $edge - $previousNode[$left] - ($node[$right] - $node[$left]), '-', '> ' . $edge);
@ -768,9 +778,9 @@ class TreeBehavior extends ModelBehavior {
* @return int
* @access private
*/
function __getMax($model, $scope, $right) {
function __getMax($model, $scope, $right, $recursive = -1) {
$db =& ConnectionManager::getDataSource($model->useDbConfig);
list($edge) = array_values($model->find('first', array('conditions' => $scope, 'fields' => $db->calculate($model, 'max', array($right)), 'recursive' => -1)));
list($edge) = array_values($model->find('first', array('conditions' => $scope, 'fields' => $db->calculate($model, 'max', array($right)), 'recursive' => $recursive)));
return ife(empty ($edge[$right]), 0, $edge[$right]);
}
/**

View file

@ -73,9 +73,19 @@ class FlagTree extends NumberTree {
var $name = 'FlagTree';
}
class Campaign extends CakeTestModel {
var $name = 'Campaign';
var $hasMany = array('Ad' => array('fields'=>array('id','campaign_id','name') ));
}
class Ad extends CakeTestModel {
var $name = 'Ad';
var $actsAs = array('Tree');
var $belongsTo = array('Campaign' );
}
class NumberTreeCase extends CakeTestCase {
var $fixtures = array('core.number_tree', 'core.flag_tree');
var $fixtures = array('core.number_tree', 'core.flag_tree', 'core.campaign','core.ad');
var $debug = false;
function tearDown() {
@ -931,6 +941,28 @@ class NumberTreeCase extends CakeTestCase {
$expected = array(1 => '1. Root', 2 => '_1.1', 3 => '__1.1.1', 4 => '__1.1.2', 5 => '_1.2', 6 => '__1.2.1', 7 => '__1.2.2');
$this->assertIdentical($result, $expected);
}
function testMoveUpWithScope() {
$this->Ad =& new Ad();
$this->Ad->Behaviors->attach('Tree', array('scope'=>'Campaign'));
$this->Ad->moveUp(6);
$this->Ad->id = 4;
$result = $this->Ad->children();
$this->assertEqual(Set::extract('/Ad/id', $result), array(6, 5));
$this->assertEqual(Set::extract('/Campaign/id', $result), array(2, 2));
}
function testMoveDownWithScope() {
$this->Ad =& new Ad();
$this->Ad->Behaviors->attach('Tree', array('scope'=>'Campaign'));
$this->Ad->moveDown(6);
$this->Ad->id = 4;
$result = $this->Ad->children();
$this->assertEqual(Set::extract('/Ad/id', $result), array(5, 6));
$this->assertEqual(Set::extract('/Campaign/id', $result), array(2, 2));
}
}
?>

25
cake/tests/fixtures/ad_fixture.php vendored Normal file
View file

@ -0,0 +1,25 @@
<?php
class AdFixture extends CakeTestFixture {
var $name = 'Ad';
var $fields = array(
'id' => array('type' => 'integer', 'key' => 'primary'),
'campaign_id' => array('type' => 'integer'),
'parent_id' => array('type' => 'integer'),
'lft' => array('type' => 'integer'),
'rght' => array('type' => 'integer'),
'name' => array('type' => 'string', 'length' => 255, 'null' => false),
);
var $records = array(
array( 'id' => 1, 'parent_id' => NULL, 'lft' => 1, 'rght' => 2, 'campaign_id' => 1, 'name' => 'Nordover' ),
array( 'id' => 2, 'parent_id' => NULL, 'lft' => 3, 'rght' => 4, 'campaign_id' => 1, 'name' => 'Statbergen' ),
array( 'id' => 3, 'parent_id' => NULL, 'lft' => 5, 'rght' => 6, 'campaign_id' => 1, 'name' => 'Feroy' ),
array( 'id' => 4, 'parent_id' => NULL, 'lft' => 7, 'rght' => 12, 'campaign_id' => 2, 'name' => 'Newcastle' ),
array( 'id' => 5, 'parent_id' => NULL, 'lft' => 8, 'rght' => 9, 'campaign_id' => 2, 'name' => 'Dublin' ),
array( 'id' => 6, 'parent_id' => NULL, 'lft' => 10, 'rght' => 11, 'campaign_id' => 2, 'name' => 'Alborg' ),
array( 'id' => 7, 'parent_id' => NULL, 'lft' => 13, 'rght' => 14, 'campaign_id' => 3, 'name' => 'New York' ),
);
}
?>

View file

@ -0,0 +1,16 @@
<?php
class CampaignFixture extends CakeTestFixture {
var $name = 'Campaign';
var $fields = array(
'id' => array('type' => 'integer', 'key' => 'primary'),
'name' => array('type' => 'string', 'length' => 255, 'null' => false),
);
var $records = array(
array( 'id' => 1 , 'name' => 'Hurtigruten' ),
array( 'id' => 2 , 'name' => 'Colorline' ),
array( 'id' => 3 , 'name' => 'Queen of Scandinavia' )
);
}
?>