Changeset 1063

Show
Ignore:
Timestamp:
11/22/07 22:28:59 (11 months ago)
Author:
mikey
Message:

implemented enhancement #99: added new method net::stubbles::rdbms::persistence::finder::stubDatabaseFinder::findAll()

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/main/php/net/stubbles/rdbms/persistence/finder/stubDatabaseFinder.php

    r951 r1063  
    9595         
    9696        $setterMethodHelper = new stubSetterMethodHelper($entityClass); 
    97         $select             = $this->createSelect($entityClass, $setterMethodHelper, $primaryKeys); 
    98         try { 
    99             $result = $this->connection->query(stubDatabaseQueryBuilderFactory::create($this->connection)->createSelect($select)); 
    100             $data   = $result->fetch(); 
    101             $result->free(); 
    102         } catch (stubException $se) { 
    103             throw new stubDatabaseFinderException('Can not find instance of ' . $entityClass->getFullQualifiedClassName() . ' by its primary keys.', $se); 
    104         } 
    105          
    106         if (false === $data) { 
     97        $data               = $this->fetchData($entityClass,  $setterMethodHelper, null, $primaryKeys); 
     98        if (count($data) === 0) { 
    10799            return null; 
    108100        } 
     
    130122         
    131123        $setterMethodHelper = new stubSetterMethodHelper($entityClass); 
    132         $select             = $this->createSelect($entityClass, $setterMethodHelper); 
    133         $select->addCriterion($criterion); 
     124        $data               = $this->fetchData($entityClass,  $setterMethodHelper, $criterion); 
     125        $finderResult       = new stubDatabaseFinderResult($entityClass, $data, $setterMethodHelper, $arguments); 
     126        return $finderResult; 
     127    } 
     128 
     129    /** 
     130     * finds all instances of $entityClass 
     131     * 
     132     * @param   string                       $entityClass  entity class to find instances of 
     133     * @param   array                        $arguments    optional  arguments for constructor 
     134     * @return  stubDatabaseFinderResult     list of instances of $entityClass found 
     135     * @throws  stubDatabaseFinderException 
     136     * @throws  stubPersistenceException 
     137     */ 
     138    public function findAll(stubBaseReflectionClass $entityClass, array $arguments = null) 
     139    { 
     140        if ($entityClass->hasAnnotation('Entity') === false) { 
     141            throw new stubPersistenceException('Class ' . $entityClass->getFullQualifiedClassName() . ' is not an entity.'); 
     142        } 
     143         
     144        $setterMethodHelper = new stubSetterMethodHelper($entityClass); 
     145        $data               = $this->fetchData($entityClass, $setterMethodHelper); 
     146        $finderResult       = new stubDatabaseFinderResult($entityClass, $data, $setterMethodHelper, $arguments); 
     147        return $finderResult; 
     148    } 
     149 
     150    /** 
     151     * helper method to retrieve the data for a given select instance 
     152     * 
     153     * @param   stubDatabaseSelect       $select 
     154     * @param   stubBaseReflectionClass  $entityClass 
     155     * @return  array 
     156     */ 
     157    protected function fetchData(stubBaseReflectionClass $entityClass, stubSetterMethodHelper $setterMethodHelper, stubCriterion $criterion = null, array $primaryKeys = null) 
     158    { 
     159        $select = $this->createSelect($entityClass, $setterMethodHelper, ((null === $primaryKeys) ? (array()) : ($primaryKeys))); 
     160        if (null !== $criterion) { 
     161            $select->addCriterion($criterion); 
     162        } 
     163         
    134164        try { 
    135165            $result = $this->connection->query(stubDatabaseQueryBuilderFactory::create($this->connection)->createSelect($select)); 
    136             $data   = $result->fetchAll(); 
     166            if (null !== $primaryKeys) { 
     167                $data = $result->fetch(); 
     168            } else { 
     169                $data = $result->fetchAll(); 
     170            } 
     171             
    137172            $result->free(); 
    138173        } catch (stubDatabaseException $se) { 
    139             throw new stubDatabaseFinderException('Can not find any instance of ' . $entityClass->getFullQualifiedClassName() . ' by criterion ' . $criterion, $se); 
    140         }  
     174            $exceptionInfo = null; 
     175            if (null !== $criterion) { 
     176                $exceptionInfo = ' by criterion ' . $criterion; 
     177            } elseif (null !== $primaryKeys) { 
     178                $exceptionInfo = ' by its primary keys.'; 
     179            } 
     180             
     181            throw new stubDatabaseFinderException('Can not find any instance of ' . $entityClass->getFullQualifiedClassName() . $exceptionInfo, $se); 
     182        } 
    141183         
    142184        if (false === $data) { 
    143             $data = array(); 
    144         } 
    145          
    146         $finderResult = new stubDatabaseFinderResult($entityClass, $data, $setterMethodHelper, $arguments); 
    147         return $finderResult; 
     185            return array(); 
     186        } 
     187         
     188        return $data; 
    148189    } 
    149190 
     
    158199    protected function createSelect(stubBaseReflectionClass $entityClass, stubSetterMethodHelper $setterMethodHelper, array $primaryKeys = array()) 
    159200    { 
    160  
    161201        $select  = new stubDatabaseSelect($this->getTableDescription($entityClass)); 
    162202        $methods = $entityClass->getMethods(); 
  • trunk/src/main/php/net/stubbles/rdbms/persistence/stubDefaultEntityManager.php

    r1056 r1063  
    6969 
    7070    /** 
     71     * finds all instances of $entityClass 
     72     * 
     73     * @param   string                       $entityClass  entity class to find instances of 
     74     * @param   array                        $arguments    optional  arguments for constructor 
     75     * @return  stubDatabaseFinderResult     list of instances of $entityClass found 
     76     * @throws  stubDatabaseFinderException 
     77     * @throws  stubPersistenceException 
     78     */ 
     79    public function findAll(stubBaseReflectionClass $entityClass, array $arguments = null) 
     80    { 
     81        return stubDatabaseFinder::getInstance($this->connection) 
     82                                 ->findAll($entityClass, $arguments); 
     83    } 
     84 
     85    /** 
    7186     * takes an entity and serializes it into the database 
    7287     * 
  • trunk/src/main/php/net/stubbles/rdbms/persistence/stubEntityManager.php

    r1054 r1063  
    4848 
    4949    /** 
     50     * finds all instances of $entityClass 
     51     * 
     52     * @param   string                       $entityClass  entity class to find instances of 
     53     * @param   array                        $arguments    optional  arguments for constructor 
     54     * @return  stubDatabaseFinderResult     list of instances of $entityClass found 
     55     * @throws  stubDatabaseFinderException 
     56     * @throws  stubPersistenceException 
     57     */ 
     58    public function findAll(stubBaseReflectionClass $entityClass, array $arguments = null); 
     59 
     60    /** 
    5061     * takes an entity and serializes it into the database 
    5162     * 
  • trunk/src/test/php/net/stubbles/rdbms/persistence/finder/stubDatabaseFinderTestCase.php

    r951 r1063  
    193193        $mockResult = new MockstubDatabaseResult(); 
    194194        $this->mockConnection->setReturnValue('query', $mockResult); 
    195         $mockResult->setReturnValue('fetch', array()); 
     195        $mockResult->setReturnValue('fetch', array('foo' => 'notUsed')); 
    196196        $entity = $this->dbFinder->findByPrimaryKeys(new stubReflectionClass('MockInstanceArgsEntity'), array(), array('foo', 'bar')); 
    197197        $this->assertEqual($entity->getArg1(), 'foo'); 
     
    231231        $select = $this->mockQueryBuilder->getSelect(); 
    232232        $this->assertEqual($select->getBaseTableName(), 'foo'); 
     233        $this->assertTrue($select->hasCriterion()); 
    233234    } 
    234235 
     
    251252        $this->assertEqual($data->getArg1(), 'foo'); 
    252253        $this->assertNull($data->getArg2()); 
     254        $select = $this->mockQueryBuilder->getSelect(); 
     255        $this->assertEqual($select->getBaseTableName(), 'bar'); 
     256        $this->assertTrue($select->hasCriterion()); 
     257    } 
     258 
     259    /** 
     260     * test that finding data for all instances of an object works as expected 
     261     */ 
     262    public function testFindAll() 
     263    { 
     264        $mockResult = new MockstubDatabaseResult(); 
     265        $this->mockConnection->setReturnValue('query', $mockResult); 
     266        $mockResult->setReturnValueAt(0, 'fetchAll', false); 
     267        $mockResult->setReturnValueAt(1, 'fetchAll', array(array('bar' => 'Here is bar.', 'default' => 'And this is default.'))); 
     268        $finderResult = $this->dbFinder->findAll(new stubReflectionClass('MockSinglePrimaryKeyEntity')); 
     269        $this->assertEqual($finderResult->count(), 0); 
     270        $finderResult = $this->dbFinder->findAll(new stubReflectionClass('MockSinglePrimaryKeyEntity')); 
     271        $this->assertEqual($finderResult->count(), 1); 
     272        $data = $finderResult->current(); 
     273        $this->assertEqual($data->withAnnotation(), 'Here is bar.'); 
     274        $this->assertEqual($data->withDefaultValue(), 'And this is default.'); 
     275        $select = $this->mockQueryBuilder->getSelect(); 
     276        $this->assertEqual($select->getBaseTableName(), 'foo'); 
     277        $this->assertFalse($select->hasCriterion()); 
     278    } 
     279 
     280    /** 
     281     * test that instance args are transmitted correct 
     282     */ 
     283    public function testFindAllWithInstanceArguments() 
     284    { 
     285        $mockResult = new MockstubDatabaseResult(); 
     286        $this->mockConnection->setReturnValue('query', $mockResult); 
     287        $mockResult->setReturnValue('fetchAll', array(array())); 
     288        $finderResult = $this->dbFinder->findAll(new stubReflectionClass('MockInstanceArgsEntity'), array('foo', 'bar')); 
     289        $data = $finderResult->current(); 
     290        $this->assertEqual($data->getArg1(), 'foo'); 
     291        $this->assertEqual($data->getArg2(), 'bar'); 
     292        $finderResult = $this->dbFinder->findAll(new stubReflectionClass('MockInstanceArgsEntity'), array('foo')); 
     293        $data = $finderResult->current(); 
     294        $this->assertEqual($data->getArg1(), 'foo'); 
     295        $this->assertNull($data->getArg2()); 
     296        $select = $this->mockQueryBuilder->getSelect(); 
     297        $this->assertEqual($select->getBaseTableName(), 'bar'); 
     298        $this->assertFalse($select->hasCriterion()); 
    253299    } 
    254300}