From a6b5c892798a05982444faf875b2a940aa71e2d4 Mon Sep 17 00:00:00 2001 From: AlexeyDsov Date: Wed, 5 Nov 2014 15:36:40 +0300 Subject: [PATCH] fix projection group by field recognition --- core/OSQL/QuerySkeleton.class.php | 2 +- test/db/CriteriaDBTest.class.php | 71 ++++++++++++++++++++++++++++++- test/misc/DBTestPool.class.php | 5 ++- 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/core/OSQL/QuerySkeleton.class.php b/core/OSQL/QuerySkeleton.class.php index 8c5b1bd980..3ba0f086a3 100644 --- a/core/OSQL/QuerySkeleton.class.php +++ b/core/OSQL/QuerySkeleton.class.php @@ -178,7 +178,7 @@ protected function resolveAliasByField($field, $alias) $field instanceof SelectQuery || ($field instanceof DialectString && $field instanceof Aliased) ) { - return $field->getAlias(); + return $field->getAlias() ?: $alias; } } diff --git a/test/db/CriteriaDBTest.class.php b/test/db/CriteriaDBTest.class.php index e7346c76c4..fbdc14d728 100644 --- a/test/db/CriteriaDBTest.class.php +++ b/test/db/CriteriaDBTest.class.php @@ -4,7 +4,6 @@ class CriteriaDBTest extends TestCaseDAO public function testCriteria() { foreach (DBTestPool::me()->getPool() as $db) { - /* @var $db DB */ DBPool::me()->setDefault($db); $this->getDBCreator()->fillDB(); @@ -14,5 +13,75 @@ public function testCriteria() Cache::me()->clean(); } } + + public function testDialectsGroupByFunction() + { + $resultMap = [ + 'PgSQL' => 'SELECT date("test_user"."strange_time") AS "st" FROM "test_user" GROUP BY "st"', + 'SQLitePDO' => 'SELECT date("test_user"."strange_time") AS "st" FROM "test_user" GROUP BY "st"', + 'MySQL' => 'SELECT date(`test_user`.`strange_time`) AS `st` FROM `test_user` GROUP BY `st`', + 'MySQLim' => 'SELECT date(`test_user`.`strange_time`) AS `st` FROM `test_user` GROUP BY `st`', + ]; + + foreach (DBTestPool::me()->getPool() as $db) { + $result = $this->getResultByDb($db, $resultMap); + + $criteria = + Criteria::create(TestUser::dao())-> + addProjection( + Projection::property( + SQLFunction::create( + 'date', 'strangeTime' + ), + + 'st' + ) + )-> + addProjection( + Projection::group('st') + ); + + $this->assertEquals( + $result, + $criteria->toDialectString($db->getDialect()) + ); + } + } + + public function testDialectsGroupByField() + { + $resultMap = [ + 'PgSQL' => 'SELECT "test_user"."strange_time" AS "st" FROM "test_user" GROUP BY "st", \'stt\' ORDER BY "st", \'stt\'', + 'SQLitePDO' => 'SELECT "test_user"."strange_time" AS "st" FROM "test_user" GROUP BY "st", \'stt\' ORDER BY "st", \'stt\'', + 'MySQL' => 'SELECT `test_user`.`strange_time` AS `st` FROM `test_user` GROUP BY `st`, \'stt\' ORDER BY `st`, \'stt\'', + 'MySQLim' => 'SELECT `test_user`.`strange_time` AS `st` FROM `test_user` GROUP BY `st`, \'stt\' ORDER BY `st`, \'stt\'', + ]; + + foreach (DBTestPool::me()->getPool() as $db) { + $result = $this->getResultByDb($db, $resultMap); + $criteria = + Criteria::create(TestUser::dao())-> + addProjection( + Projection::property('strangeTime', 'st') + )-> + addProjection(Projection::group('st'))-> + addProjection(Projection::group('stt')) + ->addOrder('st') + ->addOrder('stt'); + + $this->assertEquals( + $result, + $criteria->toDialectString($db->getDialect()) + ); + } + } + + private function getResultByDb(DB $db, $resultMap) + { + if (!array_key_exists($class = get_class($db), $resultMap)) { + $this->fail("Uknonwn SQL for db ".get_class($db)); + } + return $resultMap[$class]; + } } ?> \ No newline at end of file diff --git a/test/misc/DBTestPool.class.php b/test/misc/DBTestPool.class.php index c020b60cb1..a098e211f7 100644 --- a/test/misc/DBTestPool.class.php +++ b/test/misc/DBTestPool.class.php @@ -38,7 +38,10 @@ public function connect($persistent = false) $connector->setPersistent($persistent)->connect(); } } - + + /** + * @return DB[] + */ public function getPool() { return $this->pool;