Changeset 1901
- Timestamp:
- 10/24/08 16:10:24 (2 months ago)
- Files:
-
- framework/trunk/src/main/php/net/stubbles/rdbms/persistence/finder/stubDatabaseFinder.php (modified) (7 diffs)
- framework/trunk/src/main/php/net/stubbles/rdbms/persistence/stubDefaultEntityManager.php (modified) (3 diffs)
- framework/trunk/src/main/php/net/stubbles/rdbms/persistence/stubEntityManager.php (modified) (3 diffs)
- framework/trunk/src/main/php/net/stubbles/rdbms/querybuilder/stubDatabaseMySQLQueryBuilder.php (modified) (1 diff)
- framework/trunk/src/main/php/net/stubbles/rdbms/querybuilder/stubDatabaseSelect.php (modified) (3 diffs)
- framework/trunk/src/test/php/net/stubbles/rdbms/persistence/finder/stubDatabaseFinderTestCase.php (modified) (4 diffs)
- framework/trunk/src/test/php/net/stubbles/rdbms/querybuilder/stubDatabaseMySQLQueryBuilderTestCase.php (modified) (1 diff)
- framework/trunk/src/test/php/net/stubbles/rdbms/querybuilder/stubDatabaseSelectTestCase.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
framework/trunk/src/main/php/net/stubbles/rdbms/persistence/finder/stubDatabaseFinder.php
r1763 r1901 6 6 * @package stubbles 7 7 * @subpackage rdbms_persistence_finder 8 * @version $Id$ 8 9 */ 9 10 stubClassLoader::load('net::stubbles::rdbms::stubDatabaseConnection', … … 109 110 * @param string $entityClass entity class to find instances of 110 111 * @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 111 114 * @return stubDatabaseFinderResult list of instances of $entityClass found with $criterion 112 115 * @throws stubPersistenceException 113 116 */ 114 public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null )117 public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null) 115 118 { 116 119 if ($entityClass->hasAnnotation('Entity') === false) { … … 119 122 120 123 $setterMethodHelper = new stubSetterMethodHelper($entityClass); 121 $data = $this->fetchData($entityClass, $setterMethodHelper, $criterion, null, $orderBy );124 $data = $this->fetchData($entityClass, $setterMethodHelper, $criterion, null, $orderBy, $offset, $amount); 122 125 $finderResult = new stubDatabaseFinderResult($entityClass, $data, $setterMethodHelper); 123 126 return $finderResult; … … 129 132 * @param string $entityClass entity class to find instances of 130 133 * @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 131 136 * @return stubDatabaseFinderResult list of instances of $entityClass found 132 137 * @throws stubPersistenceException 133 138 */ 134 public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null )139 public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null) 135 140 { 136 141 if ($entityClass->hasAnnotation('Entity') === false) { … … 139 144 140 145 $setterMethodHelper = new stubSetterMethodHelper($entityClass); 141 $data = $this->fetchData($entityClass, $setterMethodHelper, null, null, $orderBy );146 $data = $this->fetchData($entityClass, $setterMethodHelper, null, null, $orderBy, $offset, $amount); 142 147 $finderResult = new stubDatabaseFinderResult($entityClass, $data, $setterMethodHelper); 143 148 return $finderResult; … … 152 157 * @param array $primaryKeys optional 153 158 * @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 154 161 * @return array 155 162 * @throws stubDatabaseFinderException 156 163 */ 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) 158 165 { 159 166 $select = $this->createSelect($entityClass, $setterMethodHelper, ((null === $primaryKeys) ? (array()) : ($primaryKeys))); … … 170 177 } 171 178 } 179 180 $select->limitBy($offset, $amount); 172 181 173 182 try { framework/trunk/src/main/php/net/stubbles/rdbms/persistence/stubDefaultEntityManager.php
r1763 r1901 6 6 * @package stubbles 7 7 * @subpackage rdbms_persistence 8 * @version $Id$ 8 9 */ 9 10 stubClassLoader::load('net::stubbles::rdbms::stubDatabaseConnection', … … 58 59 * @param string $entityClass entity class to find instances of 59 60 * @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 60 63 * @return stubDatabaseFinderResult list of instances of $entityClass found with $criterion 61 64 * @throws stubDatabaseFinderException 62 65 * @throws stubPersistenceException 63 66 */ 64 public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null )67 public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null) 65 68 { 66 69 return stubDatabaseFinder::getInstance($this->connection) 67 ->findByCriterion($criterion, $entityClass, $orderBy );70 ->findByCriterion($criterion, $entityClass, $orderBy, $offset, $amount); 68 71 } 69 72 … … 73 76 * @param string $entityClass entity class to find instances of 74 77 * @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 75 80 * @return stubDatabaseFinderResult list of instances of $entityClass found 76 81 * @throws stubDatabaseFinderException 77 82 * @throws stubPersistenceException 78 83 */ 79 public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null )84 public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null) 80 85 { 81 86 return stubDatabaseFinder::getInstance($this->connection) 82 ->findAll($entityClass, $orderBy );87 ->findAll($entityClass, $orderBy, $offset, $amount); 83 88 } 84 89 framework/trunk/src/main/php/net/stubbles/rdbms/persistence/stubEntityManager.php
r1763 r1901 6 6 * @package stubbles 7 7 * @subpackage rdbms_persistence 8 * @version $Id$ 8 9 */ 9 10 stubClassLoader::load('net::stubbles::rdbms::stubDatabaseConnection', … … 40 41 * @param string $entityClass entity class to find instances of 41 42 * @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 42 45 * @return stubDatabaseFinderResult list of instances of $entityClass found with $criterion 43 46 * @throws stubDatabaseFinderException 44 47 * @throws stubPersistenceException 45 48 */ 46 public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null );49 public function findByCriterion(stubCriterion $criterion, stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null); 47 50 48 51 /** … … 51 54 * @param string $entityClass entity class to find instances of 52 55 * @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 53 58 * @return stubDatabaseFinderResult list of instances of $entityClass found 54 59 * @throws stubDatabaseFinderException 55 60 * @throws stubPersistenceException 56 61 */ 57 public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null );62 public function findAll(stubBaseReflectionClass $entityClass, $orderBy = null, $offset = null, $amount = null); 58 63 59 64 /** framework/trunk/src/main/php/net/stubbles/rdbms/querybuilder/stubDatabaseMySQLQueryBuilder.php
r1899 r1901 101 101 } 102 102 103 if ($select->hasLimit() === true) { 104 $selectQuery .= ' LIMIT ' . $select->getOffset() . ',' . $select->getAmount(); 105 } 106 103 107 return $selectQuery; 104 108 } framework/trunk/src/main/php/net/stubbles/rdbms/querybuilder/stubDatabaseSelect.php
r1763 r1901 6 6 * @package stubbles 7 7 * @subpackage rdbms_querybuilder 8 * @version $Id$ 8 9 */ 9 10 stubClassLoader::load('net::stubbles::rdbms::criteria::stubAndCriterion', … … 44 45 */ 45 46 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; 46 59 47 60 /** … … 157 170 return $this->orderBy; 158 171 } 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 } 159 216 } 160 217 ?> framework/trunk/src/test/php/net/stubbles/rdbms/persistence/finder/stubDatabaseFinderTestCase.php
r1763 r1901 6 6 * @package stubbles 7 7 * @subpackage rdbms_persistence_finder_test 8 * @version $Id$ 8 9 */ 9 10 stubClassLoader::load('net::stubbles::rdbms::persistence::finder::stubDatabaseFinder', … … 220 221 $this->assertEquals('foo', $select->getBaseTableName()); 221 222 $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()); 222 254 $this->assertTrue($select->hasCriterion()); 223 255 } … … 245 277 $this->assertEquals('foo', $select->getBaseTableName()); 246 278 $this->assertEquals('bar ASC', $select->getOrderedBy()); 279 $this->assertFalse($select->hasLimit()); 280 $this->assertNull($select->getOffset()); 281 $this->assertNull($select->getAmount()); 247 282 $this->assertFalse($select->hasCriterion()); 248 283 } … … 268 303 $this->assertEquals('foo', $select->getBaseTableName()); 269 304 $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()); 270 334 $this->assertFalse($select->hasCriterion()); 271 335 } framework/trunk/src/test/php/net/stubbles/rdbms/querybuilder/stubDatabaseMySQLQueryBuilderTestCase.php
r1899 r1901 68 68 $select->orderBy('foo ASC'); 69 69 $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)); 70 72 } 71 73 framework/trunk/src/test/php/net/stubbles/rdbms/querybuilder/stubDatabaseSelectTestCase.php
r1763 r1901 6 6 * @package stubbles 7 7 * @subpackage rdbms_querybuilder_test 8 * @version $Id$ 8 9 */ 9 10 stubClassLoader::load('net::stubbles::rdbms::querybuilder::stubDatabaseSelect'); … … 87 88 $this->assertEquals('foo ASC', $this->select->getOrderedBy()); 88 89 } 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 89 111 } 90 112 ?>
