From 51106a8540539a701c999ad88c0d143801496174 Mon Sep 17 00:00:00 2001 From: Kris Wallsmith Date: Thu, 10 Mar 2011 12:53:35 -0800 Subject: [PATCH] [DoctrineMongoDBBundle] fixed pretty queries --- .../Logger/DoctrineMongoDBLogger.php | 35 ++++++++++--- .../Logger/DoctrineMongoDBLoggerTest.php | 50 +++++++++++++++++++ 2 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 src/Symfony/Bundle/DoctrineMongoDBBundle/Tests/Logger/DoctrineMongoDBLoggerTest.php diff --git a/src/Symfony/Bundle/DoctrineMongoDBBundle/Logger/DoctrineMongoDBLogger.php b/src/Symfony/Bundle/DoctrineMongoDBBundle/Logger/DoctrineMongoDBLogger.php index bd81261fd7..cbf99514d5 100644 --- a/src/Symfony/Bundle/DoctrineMongoDBBundle/Logger/DoctrineMongoDBLogger.php +++ b/src/Symfony/Bundle/DoctrineMongoDBBundle/Logger/DoctrineMongoDBLogger.php @@ -54,7 +54,7 @@ class DoctrineMongoDBLogger * * @param array $query A query log array from Doctrine */ - public function logQuery($query) + public function logQuery(array $query) { $this->queries[] = $query; $this->processed = false; @@ -107,6 +107,12 @@ class DoctrineMongoDBLogger $grouped = array(); $ordered = array(); foreach ($this->queries as $query) { + if (!isset($query['query']) || !isset($query['fields'])) { + // no grouping necessary + $ordered[] = array($query); + continue; + } + $cursor = serialize($query['query']).serialize($query['fields']); // append if issued from cursor (currently just "sort") @@ -180,15 +186,21 @@ class DoctrineMongoDBLogger } elseif (isset($log['execute'])) { $query .= '.execute()'; } elseif (isset($log['find'])) { - $query .= '.find('.static::bsonEncode($log['query']); - if (!empty($log['fields'])) { - $query .= ', '.static::bsonEncode($log['fields']); + $query .= '.find('; + if ($log['query'] || $log['fields']) { + $query .= static::bsonEncode($log['query']); + if ($log['fields']) { + $query .= ', '.static::bsonEncode($log['fields']); + } } $query .= ')'; } elseif (isset($log['findOne'])) { - $query .= '.findOne('.static::bsonEncode($log['query']); - if (!empty($log['fields'])) { - $query .= ', '.static::bsonEncode($log['fields']); + $query .= '.findOne('; + if ($log['query'] || $log['fields']) { + $query .= static::bsonEncode($log['query']); + if ($log['fields']) { + $query .= ', '.static::bsonEncode($log['fields']); + } } $query .= ')'; } elseif (isset($log['getDBRef'])) { @@ -215,6 +227,15 @@ class DoctrineMongoDBLogger } } } + + if (!empty($query)) { + if ('.' == $query[0]) { + $query = 'db'.$query; + } + + $this->formattedQueries[$i++] = $query.';'; + ++$this->nbRealQueries; + } } static protected function bsonEncode($query, $array = true) diff --git a/src/Symfony/Bundle/DoctrineMongoDBBundle/Tests/Logger/DoctrineMongoDBLoggerTest.php b/src/Symfony/Bundle/DoctrineMongoDBBundle/Tests/Logger/DoctrineMongoDBLoggerTest.php new file mode 100644 index 0000000000..d1173a8764 --- /dev/null +++ b/src/Symfony/Bundle/DoctrineMongoDBBundle/Tests/Logger/DoctrineMongoDBLoggerTest.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\DoctrineMongoDBBundle\Tests\Logger; + +use Symfony\Bundle\DoctrineMongoDBBundle\Logger\DoctrineMongoDBLogger; + +class DoctrineMongoDBLoggerTest extends \PHPUnit_Framework_TestCase +{ + protected $logger; + + protected function setUp() + { + $this->logger = new DoctrineMongoDBLogger(); + } + + /** + * @dataProvider getQueries + */ + public function testLogger($query, $formatted) + { + $this->logger->logQuery($query); + + $this->assertEquals($formatted, $this->logger->getQueries()); + } + + public function getQueries() + { + return array( + // batchInsert + array( + array('db' => 'foo', 'collection' => 'bar', 'batchInsert' => true, 'num' => 1, 'data' => array('foo'), 'options' => array()), + array('use foo;', 'db.bar.batchInsert(**1 item(s)**);'), + ), + // find + array( + array('db' => 'foo', 'collection' => 'bar', 'find' => true, 'query' => array(), 'fields' => array()), + array('use foo;', 'db.bar.find();'), + ), + ); + } +}