Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

move find threaded logic to the set class

  • Loading branch information...
commit 7b640b8123c722e2bcdf4b67dcafbf2a3c63a02b 1 parent b8598c5
@AD7six AD7six authored
View
43 lib/Cake/Model/Model.php
@@ -2812,43 +2812,12 @@ protected function _findThreaded($state, $query, $results = array()) {
if ($state === 'before') {
return $query;
} elseif ($state === 'after') {
- $return = $idMap = array();
- $ids = Set::extract($results, '{n}.' . $this->alias . '.' . $this->primaryKey);
-
- foreach ($results as $result) {
- $result['children'] = array();
- $id = $result[$this->alias][$this->primaryKey];
- if (!isset($result[$this->alias]['parent_id'])) {
- trigger_error(
- __d('cake_dev', 'You cannot use find("threaded") on models without a "parent_id" field.'),
- E_USER_WARNING
- );
- return $return;
- }
- $parentId = $result[$this->alias]['parent_id'];
- if (isset($idMap[$id]['children'])) {
- $idMap[$id] = array_merge($result, (array)$idMap[$id]);
- } else {
- $idMap[$id] = array_merge($result, array('children' => array()));
- }
- if (!$parentId || !in_array($parentId, $ids)) {
- $return[] =& $idMap[$id];
- } else {
- $idMap[$parentId]['children'][] =& $idMap[$id];
- }
- }
- if (count($return) > 1) {
- $ids = array_unique(Set::extract('/' . $this->alias . '/parent_id', $return));
- if (count($ids) > 1) {
- $root = $return[0][$this->alias]['parent_id'];
- foreach ($return as $key => $value) {
- if ($value[$this->alias]['parent_id'] != $root) {
- unset($return[$key]);
- }
- }
- }
- }
- return $return;
+ return Set::nest($results, array(
+ 'alias' => $this->alias,
+ 'primaryKey' => $this->primaryKey,
+ 'parent' => 'parent_id',
+ 'children' => 'children'
+ ));
}
}
View
12 lib/Cake/Test/Case/Model/ModelReadTest.php
@@ -2991,18 +2991,6 @@ public function testSelfAssociationAfterFind() {
}
/**
- * find(threaded) should trigger errors whne there is no parent_id field.
- *
- * @expectedException PHPUnit_Framework_Error_Warning
- * @return void
- */
- public function testFindThreadedError() {
- $this->loadFixtures('Apple', 'Sample');
- $Apple = new Apple();
- $Apple->find('threaded');
- }
-
-/**
* testFindAllThreaded method
*
* @return void
View
60 lib/Cake/Utility/Set.php
@@ -1114,4 +1114,64 @@ public static function apply($path, $data, $callback, $options = array()) {
}
return null;
}
+
+/**
+ * Takes in a flat 2 dimensional array and returns a nested array
+ *
+ * @param mixed $data
+ * @param array $options Options are:
+ * alias - the first array key to look for
+ * primaryKey - the key to use to identify the rows
+ * parentId - the key to use to identify the parent
+ * children - the key name to use in the resultset for children
+ * @return array of results, nested
+ * @link
+ */
+ public static function nest($data, $options = array()) {
+ if (!$data) {
+ return $data;
+ }
+
+ $options = array(
+ 'alias' => key(current($data)),
+ 'primaryKey' => 'id',
+ 'parentId' => 'parent_id',
+ 'children' => 'children'
+ ) + $options;
+
+ $return = $idMap = array();
+ $ids = Set::extract($data, '{n}.' . $options['alias'] . '.' . $options['primaryKey']);
+
+ foreach ($data as $result) {
+ $result[$options['children']] = array();
+ $id = $result[$options['alias']][$options['primaryKey']];
+ if (isset($result[$options['alias']][$options['parentId']])) {
+ $parentId = $result[$options['alias']][$options['parentId']];
+ } else {
+ $parentId = null;
+ }
+ if (isset($idMap[$id]['children'])) {
+ $idMap[$id] = array_merge($result, (array)$idMap[$id]);
+ } else {
+ $idMap[$id] = array_merge($result, array('children' => array()));
+ }
+ if (!$parentId || !in_array($parentId, $ids)) {
+ $return[] =& $idMap[$id];
+ } else {
+ $idMap[$parentId]['children'][] =& $idMap[$id];
+ }
+ }
+ if (count($return) > 1) {
+ $ids = array_unique(Set::extract('/' . $options['alias'] . '/' . $options['parentId'], $return));
+ if (count($ids) > 1) {
+ $root = $return[0][$options['alias']][$options['parentId']];
+ foreach ($return as $key => $value) {
+ if ($value[$options['alias']][$options['parentId']] != $root) {
+ unset($return[$key]);
+ }
+ }
+ }
+ }
+ return $return;
+ }
}
Please sign in to comment.
Something went wrong with that request. Please try again.