Permalink
Browse files

Merge pull request #191 from FabioBatSilva/DDC1430

DDC-1430
  • Loading branch information...
2 parents a0ee72f + 3dd5d14 commit 9916f342624927df564ce99c79c308567b756b32 @beberlei beberlei committed Nov 15, 2011
@@ -1302,11 +1302,10 @@ public function walkGroupByClause($groupByClause)
continue;
}
- foreach ($this->_queryComponents[$groupByItem]['metadata']->identifier AS $idField) {
- $groupByItem = new AST\PathExpression(AST\PathExpression::TYPE_STATE_FIELD, $groupByItem, $idField);
- $groupByItem->type = AST\PathExpression::TYPE_STATE_FIELD;
-
- $sqlParts[] = $this->walkGroupByItem($groupByItem);
+ foreach ($this->_queryComponents[$groupByItem]['metadata']->fieldNames AS $field) {
+ $item = new AST\PathExpression(AST\PathExpression::TYPE_STATE_FIELD, $groupByItem, $field);
+ $item->type = AST\PathExpression::TYPE_STATE_FIELD;
+ $sqlParts[] = $this->walkGroupByItem($item);
}
}
@@ -0,0 +1,294 @@
+<?php
+
+namespace Doctrine\Tests\ORM\Functional\Ticket;
+
+require_once __DIR__ . '/../../../TestInit.php';
+
+/**
+ * @group DDC-1430
+ */
+class DDC1430Test extends \Doctrine\Tests\OrmFunctionalTestCase
+{
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ try {
+ $this->_schemaTool->createSchema(array(
+ $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1430Order'),
+ $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1430OrderProduct'),
+ ));
+ $this->loadFixtures();
+ } catch (\Exception $exc) {
+
+ }
+ }
+
+ public function testOrderByFields()
+ {
+ $repository = $this->_em->getRepository(__NAMESPACE__ . '\DDC1430Order');
+ $builder = $repository->createQueryBuilder('o');
+ $query = $builder->select('o.id, o.date, COUNT(p.id) AS p_count')
+ ->leftJoin('o.products', 'p')
+ ->groupBy('o.id, o.date')
+ ->getQuery();
+
+ $this->assertEquals('SELECT o.id, o.date, COUNT(p.id) AS p_count FROM Doctrine\Tests\ORM\Functional\Ticket\DDC1430Order o LEFT JOIN o.products p GROUP BY o.id, o.date', $query->getDQL());
+ $this->assertEquals('SELECT d0_.order_id AS order_id0, d0_.created_at AS created_at1, COUNT(d1_.id) AS sclr2 FROM DDC1430Order d0_ LEFT JOIN DDC1430OrderProduct d1_ ON d0_.order_id = d1_.order_id GROUP BY d0_.order_id, d0_.created_at', $query->getSQL());
+
+
+ $result = $query->getResult();
+
+ $this->assertEquals(2, sizeof($result));
+
+ $this->assertArrayHasKey('id', $result[0]);
+ $this->assertArrayHasKey('id', $result[1]);
+
+ $this->assertArrayHasKey('p_count', $result[0]);
+ $this->assertArrayHasKey('p_count', $result[1]);
+
+ $this->assertEquals(1, $result[0]['id']);
+ $this->assertEquals(2, $result[1]['id']);
+
+ $this->assertEquals(2, $result[0]['p_count']);
+ $this->assertEquals(3, $result[1]['p_count']);
+ }
+
+ public function testOrderByAllObjectFields()
+ {
+ $repository = $this->_em->getRepository(__NAMESPACE__ . '\DDC1430Order');
+ $builder = $repository->createQueryBuilder('o');
+ $query = $builder->select('o, COUNT(p.id) AS p_count')
+ ->leftJoin('o.products', 'p')
+ ->groupBy('o.id, o.date')
+ ->getQuery();
+
+
+ $this->assertEquals('SELECT o, COUNT(p.id) AS p_count FROM Doctrine\Tests\ORM\Functional\Ticket\DDC1430Order o LEFT JOIN o.products p GROUP BY o.id, o.date', $query->getDQL());
+ $this->assertEquals('SELECT d0_.order_id AS order_id0, d0_.created_at AS created_at1, d0_.order_status AS order_status2, COUNT(d1_.id) AS sclr3 FROM DDC1430Order d0_ LEFT JOIN DDC1430OrderProduct d1_ ON d0_.order_id = d1_.order_id GROUP BY d0_.order_id, d0_.created_at', $query->getSQL());
+
+ $result = $query->getResult();
+
+
+ $this->assertEquals(2, sizeof($result));
+
+ $this->assertTrue($result[0][0] instanceof DDC1430Order);
+ $this->assertTrue($result[1][0] instanceof DDC1430Order);
+
+ $this->assertEquals($result[0][0]->getId(), 1);
+ $this->assertEquals($result[1][0]->getId(), 2);
+
+ $this->assertEquals($result[0]['p_count'], 2);
+ $this->assertEquals($result[1]['p_count'], 3);
+ }
+
+ public function testTicket()
+ {
+ $repository = $this->_em->getRepository(__NAMESPACE__ . '\DDC1430Order');
+ $builder = $repository->createQueryBuilder('o');
+ $query = $builder->select('o, COUNT(p.id) AS p_count')
+ ->leftJoin('o.products', 'p')
+ ->groupBy('o')
+ ->getQuery();
+
+
+ $this->assertEquals('SELECT o, COUNT(p.id) AS p_count FROM Doctrine\Tests\ORM\Functional\Ticket\DDC1430Order o LEFT JOIN o.products p GROUP BY o', $query->getDQL());
+ $this->assertEquals('SELECT d0_.order_id AS order_id0, d0_.created_at AS created_at1, d0_.order_status AS order_status2, COUNT(d1_.id) AS sclr3 FROM DDC1430Order d0_ LEFT JOIN DDC1430OrderProduct d1_ ON d0_.order_id = d1_.order_id GROUP BY d0_.order_id, d0_.created_at, d0_.order_status', $query->getSQL());
+
+
+ $result = $query->getResult();
+
+ $this->assertEquals(2, sizeof($result));
+
+ $this->assertTrue($result[0][0] instanceof DDC1430Order);
+ $this->assertTrue($result[1][0] instanceof DDC1430Order);
+
+ $this->assertEquals($result[0][0]->getId(), 1);
+ $this->assertEquals($result[1][0]->getId(), 2);
+
+ $this->assertEquals($result[0]['p_count'], 2);
+ $this->assertEquals($result[1]['p_count'], 3);
+ }
+
+ public function loadFixtures()
+ {
+ $o1 = new DDC1430Order('NEW');
+ $o2 = new DDC1430Order('OK');
+
+ $o1->addProduct(new DDC1430OrderProduct(1.1));
+ $o1->addProduct(new DDC1430OrderProduct(1.2));
+
+ $o2->addProduct(new DDC1430OrderProduct(2.1));
+ $o2->addProduct(new DDC1430OrderProduct(2.2));
+ $o2->addProduct(new DDC1430OrderProduct(2.3));
+
+ $this->_em->persist($o1);
+ $this->_em->persist($o2);
+
+ $this->_em->flush();
+ }
+
+}
+
+/**
+ * @Entity
+ */
+class DDC1430Order
+{
+
+ /**
+ * @Id
+ * @Column(name="order_id", type="integer")
+ * @GeneratedValue()
+ */
+ protected $id;
+
+ /**
+ * @Column(name="created_at", type="datetime")
+ */
+ private $date;
+
+ /**
+ * @Column(name="order_status", type="string")
+ */
+ private $status;
+
+ /**
+ * @OneToMany(targetEntity="DDC1430OrderProduct", mappedBy="order", cascade={"persist", "remove"})
+ *
+ * @var \Doctrine\Common\Collections\ArrayCollection $products
+ */
+ private $products;
+
+ /**
+ * @return integer
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ public function __construct($status)
+ {
+ $this->status = $status;
+ $this->date = new \DateTime();
+ $this->products = new \Doctrine\Common\Collections\ArrayCollection();
+ }
+ /**
+ * @return \DateTime
+ */
+ public function getDate()
+ {
+ return $this->date;
+ }
+
+ /**
+ * @return string
+ */
+ public function getStatus()
+ {
+ return $this->status;
+ }
+
+ /**
+ * @param string $status
+ */
+ public function setStatus($status)
+ {
+ $this->status = $status;
+ }
+
+ /**
+ * @return \Doctrine\Common\Collections\ArrayCollection
+ */
+ public function getProducts()
+ {
+ return $this->products;
+ }
+
+ /**
+ * @param DDC1430OrderProduct $product
+ */
+ public function addProduct(DDC1430OrderProduct $product)
+ {
+ $product->setOrder($this);
+ $this->products->add($product);
+ }
+}
+
+/**
+ * @Entity
+ */
+class DDC1430OrderProduct
+{
+
+ /**
+ * @Id
+ * @Column(type="integer")
+ * @GeneratedValue()
+ */
+ protected $id;
+
+ /**
+ * @var DDC1430Order $order
+ *
+ * @ManyToOne(targetEntity="DDC1430Order", inversedBy="products")
+ * @JoinColumn(name="order_id", referencedColumnName="order_id", nullable = false)
+ */
+ private $order;
+
+ /**
+ * @column(type="float")
+ */
+ private $value;
+
+ /**
+ * @param float $value
+ */
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ /**
+ * @return integer
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return DDC1430Order
+ */
+ public function getOrder()
+ {
+ return $this->order;
+ }
+
+ /**
+ * @param DDC1430Order $order
+ */
+ public function setOrder(DDC1430Order $order)
+ {
+ $this->order = $order;
+ }
+
+ /**
+ * @return float
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * @param float $value
+ */
+ public function setValue($value)
+ {
+ $this->value = $value;
+ }
+
+}
@@ -945,7 +945,7 @@ public function testGroupByIdentificationVariable()
{
$this->assertSqlGeneration(
'SELECT g, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY g',
- 'SELECT c0_.id AS id0, c0_.name AS name1, count(c1_.id) AS sclr2 FROM cms_groups c0_ INNER JOIN cms_users_groups c2_ ON c0_.id = c2_.group_id INNER JOIN cms_users c1_ ON c1_.id = c2_.user_id GROUP BY c0_.id'
+ 'SELECT c0_.id AS id0, c0_.name AS name1, count(c1_.id) AS sclr2 FROM cms_groups c0_ INNER JOIN cms_users_groups c2_ ON c0_.id = c2_.group_id INNER JOIN cms_users c1_ ON c1_.id = c2_.user_id GROUP BY c0_.id, c0_.name'
);
}

0 comments on commit 9916f34

Please sign in to comment.