Development

Changeset 4686

You must first sign up to be able to contribute.

Changeset 4686

Show
Ignore:
Timestamp:
07/20/07 14:05:34 (1 year ago)
Author:
tristan
Message:

sfPropelActAsNestedSetBehaviorPlugin :

  • fixed getDescendants() performances (Jon.Collins)
  • added getReversedDescendants()`method (Jon.Collins) -- needs unit tests

closes #1872

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • plugins/sfPropelActAsNestedSetBehaviorPlugin/README

    r4685 r4686  
    202202 * `array getChildren($peer_method = 'doSelect')` : Returns given node direct children. 
    203203 * `array getDescendants($peer_method = 'doSelect')` : Returns given node descendants (n level). 
     204 * `array getReversedDescendants($peer_method = 'doSelect')` : Returns given node descendants (n level). 
    204205 * `BaseObject retrieveNextSibling()` : Returns given node next sibling. 
    205206 * `BaseObject retrievePrevSibling()` : Returns given node previous sibling. 
     
    268269 * implemented faster getPath() method (francois) 
    269270 * removed useless Propel::getConnection (Eric.Fredj) 
     271 * fixed `getDescendants()` performances (Jon.Collins) 
     272 * added `getReversedDescendants()``method (Jon.Collins) 
    270273 
    271274=== 2007-05-24 | 0.9.0 === 
  • plugins/sfPropelActAsNestedSetBehaviorPlugin/lib/sfPropelActAsNestedSetBehavior.class.php

    r4685 r4686  
    621621 
    622622  /** 
    623    * Returns given node descendants (n level)
     623   * Returns given node descendants (n level) in pre-order
    624624   *  
    625625   * @param      BaseObject  $node 
    626626   * @param      string      $peer_method  
    627    * @return     array       Node descendants 
     627   * @return     array       Node descendants, pre-order 
    628628   */ 
    629629  public function getDescendants(BaseObject $node, $peer_method = 'doSelect') 
     
    642642    } 
    643643 
    644     $descendants_by_parent = array(); 
    645     if (is_array($descendants) &&  count($descendants)) 
    646     { 
    647       for ($i = 0; $i < count($descendants); $i++) 
    648       { 
    649         $descendant = $descendants[$i]; 
    650         if (!isset($descendants_by_parent[$descendant->getParentIdValue()])) 
    651         { 
    652           $descendants_by_parent[$descendant->getParentIdValue()] = array(); 
    653         } 
    654         $descendants_by_parent[$descendant->getParentIdValue()][] = $descendant; 
     644    $prev = array($node->getRightValue()); 
     645    $i = 0; 
     646 
     647    foreach ($descendants as $cur) { 
     648      //get back to the parent 
     649      while ($cur->getRightValue() > $prev[$i]) { 
     650        $i--; 
    655651      } 
    656     } 
    657      
    658     $parent_ids = array_keys($descendants_by_parent); 
    659     foreach ($descendants_by_parent as $parent_id => $parent_descendants) 
    660     { 
    661       foreach ($parent_descendants as $descendant) 
    662       { 
    663         if (in_array($descendant->getParentIdValue(), $parent_ids)) 
    664         { 
    665           $descendant->setLevel($descendants_by_parent[$parent_id][0]->getLevel()); 
    666         } 
     652       
     653      $i++; 
     654      $cur->setLevel($i); 
     655      $prev[$i] = $cur->getRightValue(); 
     656    } 
     657 
     658    return $descendants; 
     659  } 
     660 
     661  /** 
     662   * Returns given node descendants (n level) in reversed pre-order. 
     663   *  
     664   * 
     665   * @param      BaseObject  $node 
     666   * @param      string      $peer_method 
     667   * @return     array       Node descendants, reversed pre-order 
     668   */ 
     669  public function getReversedDescendants(BaseObject $node, $peer_method = 'doSelect') 
     670  { 
     671    $descendants = array(); 
     672 
     673    if (!$node->isLeaf()) 
     674    { 
     675      $c = new Criteria(); 
     676      $c->addAnd(self::getColumnConstant(get_class($node), 'left'), $node->getLeftValue(), Criteria::GREATER_THAN); 
     677      $c->addAnd(self::getColumnConstant(get_class($node), 'right'), $node->getRightValue(), Criteria::LESS_THAN); 
     678      $c->addAnd(self::getColumnConstant(get_class($node), 'scope'), $node->getScopeIdValue(), Criteria::EQUAL); 
     679      $c->addDescendingOrderByColumn(self::getColumnConstant(get_class($node), 'right')); 
     680 
     681      $descendants = call_user_func(array(get_class($node->getPeer()), $peer_method), $c); 
     682    } 
     683 
     684    $prev = array($node); 
     685 
     686    foreach ($descendants as $cur) { 
     687      //get back to an ancestor 
     688      //this SHOULD always be the parent 
     689      while ($cur->getLeftValue() < $prev[count($prev)-1]->getLeftValue()) { 
     690        array_pop($prev); 
    667691      } 
     692 
     693      $cur->setLevel(count($prev)); 
     694      array_push($prev, $cur); 
    668695    } 
    669696