Changeset 1901

Show
Ignore:
Timestamp:
10/24/08 16:10:24 (2 months ago)
Author:
mikey
Message:

add support for limit clause

Files:

Legend:

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

    r1763 r1901  
    66 * @package     stubbles 
    77 * @subpackage  rdbms_persistence_finder 
     8 * @version     $Id$ 
    89 */ 
    910stubClassLoader::load('net::stubbles::rdbms::stubDatabaseConnection', 
     
    109110     * @param   string                    $entityClass  entity class to find instances of 
    110111     * @param   string                    $orderBy      optional  overrule default order of entity 
     112     * @param   int                       $offset       optional  overrule to start selection at given offset 
     113     * @param   int                       $amount       optional  overrule to limit selection to given amount 
    111114     * @return  stubDatabaseFinderResult  list of instances of $entityClass found with $criterion 
    112115     * @throws  stubPersistenceException 
    113116     */ 
    114     public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null
     117    public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null
    115118    { 
    116119        if ($entityClass->hasAnnotation('Entity') === false) { 
     
    119122         
    120123        $setterMethodHelper = new stubSetterMethodHelper($entityClass); 
    121         $data               = $this->fetchData($entityClass, $setterMethodHelper, $criterion, null, $orderBy); 
     124        $data               = $this->fetchData($entityClass, $setterMethodHelper, $criterion, null, $orderBy, $offset, $amount); 
    122125        $finderResult       = new stubDatabaseFinderResult($entityClass, $data, $setterMethodHelper); 
    123126        return $finderResult; 
     
    129132     * @param   string                    $entityClass  entity class to find instances of 
    130133     * @param   string                    $orderBy      optional  overrule default order of entity 
     134     * @param   int                       $offset       optional  overrule to start selection at given offset 
     135     * @param   int                       $amount       optional  overrule to limit selection to given amount 
    131136     * @return  stubDatabaseFinderResult  list of instances of $entityClass found 
    132137     * @throws  stubPersistenceException 
    133138     */ 
    134     public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null
     139    public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null
    135140    { 
    136141        if ($entityClass->hasAnnotation('Entity') === false) { 
     
    139144         
    140145        $setterMethodHelper = new stubSetterMethodHelper($entityClass); 
    141         $data               = $this->fetchData($entityClass, $setterMethodHelper, null, null, $orderBy); 
     146        $data               = $this->fetchData($entityClass, $setterMethodHelper, null, null, $orderBy, $offset, $amount); 
    142147        $finderResult       = new stubDatabaseFinderResult($entityClass, $data, $setterMethodHelper); 
    143148        return $finderResult; 
     
    152157     * @param   array                    $primaryKeys         optional 
    153158     * @param   string                   $orderBy             optional  overrule default order of entity 
     159     * @param   int                      $offset              optional  overrule to start selection at given offset 
     160     * @param   int                      $amount              optional  overrule to limit selection to given amount 
    154161     * @return  array 
    155162     * @throws  stubDatabaseFinderException 
    156163     */ 
    157     protected function fetchData(stubBaseReflectionClass $entityClass, stubSetterMethodHelper $setterMethodHelper, stubCriterion $criterion = null, array $primaryKeys = null, $orderBy = null
     164    protected function fetchData(stubBaseReflectionClass $entityClass, stubSetterMethodHelper $setterMethodHelper, stubCriterion $criterion = null, array $primaryKeys = null, $orderBy = null, $offset = null, $amount = null
    158165    { 
    159166        $select = $this->createSelect($entityClass, $setterMethodHelper, ((null === $primaryKeys) ? (array()) : ($primaryKeys))); 
     
    170177            } 
    171178        } 
     179         
     180        $select->limitBy($offset, $amount); 
    172181         
    173182        try { 
  • framework/trunk/src/main/php/net/stubbles/rdbms/persistence/stubDefaultEntityManager.php

    r1763 r1901  
    66 * @package     stubbles 
    77 * @subpackage  rdbms_persistence 
     8 * @version     $Id$ 
    89 */ 
    910stubClassLoader::load('net::stubbles::rdbms::stubDatabaseConnection', 
     
    5859     * @param   string                       $entityClass  entity class to find instances of 
    5960     * @param   string                       $orderBy      optional  overrule default order of entity 
     61     * @param   int                          $offset       optional  overrule to start selection at given offset 
     62     * @param   int                          $amount       optional  overrule to limit selection to given amount 
    6063     * @return  stubDatabaseFinderResult     list of instances of $entityClass found with $criterion 
    6164     * @throws  stubDatabaseFinderException 
    6265     * @throws  stubPersistenceException 
    6366     */ 
    64     public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null
     67    public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null
    6568    { 
    6669        return stubDatabaseFinder::getInstance($this->connection) 
    67                                  ->findByCriterion($criterion, $entityClass, $orderBy); 
     70                                 ->findByCriterion($criterion, $entityClass, $orderBy, $offset, $amount); 
    6871    } 
    6972 
     
    7376     * @param   string                       $entityClass  entity class to find instances of 
    7477     * @param   string                       $orderBy      optional  overrule default order of entity 
     78     * @param   int                          $offset       optional  overrule to start selection at given offset 
     79     * @param   int                          $amount       optional  overrule to limit selection to given amount 
    7580     * @return  stubDatabaseFinderResult     list of instances of $entityClass found 
    7681     * @throws  stubDatabaseFinderException 
    7782     * @throws  stubPersistenceException 
    7883     */ 
    79     public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null
     84    public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null
    8085    { 
    8186        return stubDatabaseFinder::getInstance($this->connection) 
    82                                  ->findAll($entityClass, $orderBy); 
     87                                 ->findAll($entityClass, $orderBy, $offset, $amount); 
    8388    } 
    8489 
  • framework/trunk/src/main/php/net/stubbles/rdbms/persistence/stubEntityManager.php

    r1763 r1901  
    66 * @package     stubbles 
    77 * @subpackage  rdbms_persistence 
     8 * @version     $Id$ 
    89 */ 
    910stubClassLoader::load('net::stubbles::rdbms::stubDatabaseConnection', 
     
    4041     * @param   string                       $entityClass  entity class to find instances of 
    4142     * @param   string                       $orderBy      optional  overrule default order of entity 
     43     * @param   int                          $offset       optional  overrule to start selection at given offset 
     44     * @param   int                          $amount       optional  overrule to limit selection to given amount 
    4245     * @return  stubDatabaseFinderResult     list of instances of $entityClass found with $criterion 
    4346     * @throws  stubDatabaseFinderException 
    4447     * @throws  stubPersistenceException 
    4548     */ 
    46     public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null); 
     49    public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null); 
    4750 
    4851    /** 
     
    5154     * @param   string                       $entityClass  entity class to find instances of 
    5255     * @param   string                       $orderBy      optional  overrule default order of entity 
     56     * @param   int                          $offset       optional  overrule to start selection at given offset 
     57     * @param   int                          $amount       optional  overrule to limit selection to given amount 
    5358     * @return  stubDatabaseFinderResult     list of instances of $entityClass found 
    5459     * @throws  stubDatabaseFinderException 
    5560     * @throws  stubPersistenceException 
    5661     */ 
    57     public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null); 
     62    public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null); 
    5863 
    5964    /** 
  • framework/trunk/src/main/php/net/stubbles/rdbms/querybuilder/stubDatabaseMySQLQueryBuilder.php

    r1899 r1901  
    101101        } 
    102102         
     103        if ($select->hasLimit() === true) { 
     104            $selectQuery .= ' LIMIT ' . $select->getOffset() . ',' . $select->getAmount(); 
     105        } 
     106         
    103107        return $selectQuery; 
    104108    } 
  • framework/trunk/src/main/php/net/stubbles/rdbms/querybuilder/stubDatabaseSelect.php

    r1763 r1901  
    66 * @package     stubbles 
    77 * @subpackage  rdbms_querybuilder 
     8 * @version     $Id$ 
    89 */ 
    910stubClassLoader::load('net::stubbles::rdbms::criteria::stubAndCriterion', 
     
    4445     */ 
    4546    protected $orderBy; 
     47    /** 
     48     * offset for limit clause 
     49     * 
     50     * @var  int 
     51     */ 
     52    protected $offset; 
     53    /** 
     54     * amount for limit clause 
     55     * 
     56     * @var  int 
     57     */ 
     58    protected $amount; 
    4659 
    4760    /** 
     
    157170        return  $this->orderBy; 
    158171    } 
     172 
     173    /** 
     174     * limits query to start at given offset and contain only given amount of results 
     175     * 
     176     * @param   int                 $offset 
     177     * @param   int                 $amount 
     178     * @return  stubDatabaseSelect 
     179     */ 
     180    public function limitBy($offset, $amount) 
     181    { 
     182        $this->offset = ((null === $offset) ? (null) : ((int) $offset)); 
     183        $this->amount = ((null === $amount) ? (null) : ((int) $amount)); 
     184        return $this; 
     185    } 
     186 
     187    /** 
     188     * checks if select has a limit 
     189     * 
     190     * @return  bool 
     191     */ 
     192    public function hasLimit() 
     193    { 
     194        return (null !== $this->offset && null !== $this->amount); 
     195    } 
     196 
     197    /** 
     198     * returns offset for limit clause 
     199     * 
     200     * @return  int 
     201     */ 
     202    public function getOffset() 
     203    { 
     204        return $this->offset; 
     205    } 
     206 
     207    /** 
     208     * returns amount for limit clause 
     209     * 
     210     * @return  int 
     211     */ 
     212    public function getAmount() 
     213    { 
     214        return $this->amount; 
     215    } 
    159216} 
    160217?> 
  • framework/trunk/src/test/php/net/stubbles/rdbms/persistence/finder/stubDatabaseFinderTestCase.php

    r1763 r1901  
    66 * @package     stubbles 
    77 * @subpackage  rdbms_persistence_finder_test 
     8 * @version     $Id$ 
    89 */ 
    910stubClassLoader::load('net::stubbles::rdbms::persistence::finder::stubDatabaseFinder', 
     
    220221        $this->assertEquals('foo', $select->getBaseTableName()); 
    221222        $this->assertEquals('blub DESC', $select->getOrderedBy()); 
     223        $this->assertFalse($select->hasLimit()); 
     224        $this->assertNull($select->getOffset()); 
     225        $this->assertNull($select->getAmount()); 
     226        $this->assertTrue($select->hasCriterion()); 
     227    } 
     228 
     229    /** 
     230     * test that finding data of an object with a criterion works as expected 
     231     * 
     232     * @test 
     233     */ 
     234    public function byCriterionOverruleLimitClause() 
     235    { 
     236        $mockCriterion = $this->getMock('stubCriterion'); 
     237        $mockCriterion->expects($this->any())->method('toSQL')->will($this->returnValue('example')); 
     238        $mockResult = $this->getMock('stubDatabaseResult'); 
     239        $this->mockConnection->expects($this->any())->method('query')->will($this->returnValue($mockResult)); 
     240        $mockResult->expects($this->once()) 
     241                   ->method('fetchAll') 
     242                   ->will($this->returnValue(array(array('bar' => 'Here is bar.', 'default' => 'And this is default.')))); 
     243        $finderResult = $this->dbFinder->findByCriterion($mockCriterion, new stubReflectionClass('MockSinglePrimaryKeyEntity'), null, 50, 10); 
     244        $this->assertEquals(1, $finderResult->count()); 
     245        $data = $finderResult->current(); 
     246        $this->assertEquals('Here is bar.', $data->withAnnotation()); 
     247        $this->assertEquals('And this is default.', $data->withDefaultValue()); 
     248        $select = $this->mockQueryBuilder->getSelect(); 
     249        $this->assertEquals('foo', $select->getBaseTableName()); 
     250        $this->assertEquals('bar ASC', $select->getOrderedBy()); 
     251        $this->assertTrue($select->hasLimit()); 
     252        $this->assertEquals(50, $select->getOffset()); 
     253        $this->assertEquals(10, $select->getAmount()); 
    222254        $this->assertTrue($select->hasCriterion()); 
    223255    } 
     
    245277        $this->assertEquals('foo', $select->getBaseTableName()); 
    246278        $this->assertEquals('bar ASC', $select->getOrderedBy()); 
     279        $this->assertFalse($select->hasLimit()); 
     280        $this->assertNull($select->getOffset()); 
     281        $this->assertNull($select->getAmount()); 
    247282        $this->assertFalse($select->hasCriterion()); 
    248283    } 
     
    268303        $this->assertEquals('foo', $select->getBaseTableName()); 
    269304        $this->assertEquals('blub DESC', $select->getOrderedBy()); 
     305        $this->assertFalse($select->hasLimit()); 
     306        $this->assertNull($select->getOffset()); 
     307        $this->assertNull($select->getAmount()); 
     308        $this->assertFalse($select->hasCriterion()); 
     309    } 
     310 
     311    /** 
     312     * test that finding data for all instances of an object works as expected 
     313     * 
     314     * @test 
     315     */ 
     316    public function findAllOverruleLimitClause() 
     317    { 
     318        $mockResult = $this->getMock('stubDatabaseResult'); 
     319        $this->mockConnection->expects($this->any())->method('query')->will($this->returnValue($mockResult)); 
     320        $mockResult->expects($this->once()) 
     321                   ->method('fetchAll') 
     322                   ->will($this->returnValue(array(array('bar' => 'Here is bar.', 'default' => 'And this is default.')))); 
     323        $finderResult = $this->dbFinder->findAll(new stubReflectionClass('MockSinglePrimaryKeyEntity'), null, 50, 10); 
     324        $this->assertEquals(1, $finderResult->count()); 
     325        $data = $finderResult->current(); 
     326        $this->assertEquals('Here is bar.', $data->withAnnotation()); 
     327        $this->assertEquals('And this is default.', $data->withDefaultValue()); 
     328        $select = $this->mockQueryBuilder->getSelect(); 
     329        $this->assertEquals('foo', $select->getBaseTableName()); 
     330        $this->assertEquals('bar ASC', $select->getOrderedBy()); 
     331        $this->assertTrue($select->hasLimit()); 
     332        $this->assertEquals(50, $select->getOffset()); 
     333        $this->assertEquals(10, $select->getAmount()); 
    270334        $this->assertFalse($select->hasCriterion()); 
    271335    } 
  • framework/trunk/src/test/php/net/stubbles/rdbms/querybuilder/stubDatabaseMySQLQueryBuilderTestCase.php

    r1899 r1901  
    6868        $select->orderBy('foo ASC'); 
    6969        $this->assertEquals("SELECT * FROM `foo` INNER JOIN `bar` USING (`id`) LEFT JOIN `baz` ON `bar`.`id` = `baz`.`other_id` WHERE (`foo`.`id` = 'mock' AND `baz`.`other_id` IS NOT NULL) ORDER BY foo ASC", $this->mySqlQueryBuilder->createSelect($select)); 
     70        $select->limitBy(50, 10); 
     71        $this->assertEquals("SELECT * FROM `foo` INNER JOIN `bar` USING (`id`) LEFT JOIN `baz` ON `bar`.`id` = `baz`.`other_id` WHERE (`foo`.`id` = 'mock' AND `baz`.`other_id` IS NOT NULL) ORDER BY foo ASC LIMIT 50,10", $this->mySqlQueryBuilder->createSelect($select)); 
    7072    } 
    7173 
  • framework/trunk/src/test/php/net/stubbles/rdbms/querybuilder/stubDatabaseSelectTestCase.php

    r1763 r1901  
    66 * @package     stubbles 
    77 * @subpackage  rdbms_querybuilder_test 
     8 * @version     $Id$ 
    89 */ 
    910stubClassLoader::load('net::stubbles::rdbms::querybuilder::stubDatabaseSelect'); 
     
    8788        $this->assertEquals('foo ASC', $this->select->getOrderedBy()); 
    8889    } 
     90 
     91    /** 
     92     * limit clause properties 
     93     * 
     94     * @test 
     95     */ 
     96    public function limitClause() 
     97    { 
     98        $this->assertFalse($this->select->hasLimit()); 
     99        $this->assertNull($this->select->getOffset()); 
     100        $this->assertNull($this->select->getAmount()); 
     101        $this->assertSame($this->select, $this->select->limitBy(50, 10)); 
     102        $this->assertTrue($this->select->hasLimit()); 
     103        $this->assertEquals(50, $this->select->getOffset()); 
     104        $this->assertEquals(10, $this->select->getAmount()); 
     105        $this->assertSame($this->select, $this->select->limitBy(null, null)); 
     106        $this->assertFalse($this->select->hasLimit()); 
     107        $this->assertNull($this->select->getOffset()); 
     108        $this->assertNull($this->select->getAmount()); 
     109    } 
     110 
    89111} 
    90112?>