Browse Source

Merge remote branch 'kriswallsmith/mongodb/pretty-queries'

* kriswallsmith/mongodb/pretty-queries:
  [DoctrineMongoDBBundle] fixed pretty queries
Fabien Potencier 14 years ago
parent
commit
3667a32387

+ 28 - 7
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)

+ 50 - 0
src/Symfony/Bundle/DoctrineMongoDBBundle/Tests/Logger/DoctrineMongoDBLoggerTest.php

@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * 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();'),
+            ),
+        );
+    }
+}