/**
  * test
  */
 public function shouldGroupByAssociation()
 {
     $category1 = new Category();
     $category1->setName("Category1");
     $this->em->persist($category1);
     $category2 = new Category();
     $category2->setName("Category2");
     $this->em->persist($category2);
     $this->em->flush();
     $item3 = new Item();
     $item3->setName("Item3");
     $item3->setCategory($category1);
     $this->em->persist($item3);
     $item4 = new Item();
     $item4->setName("Item4");
     $item4->setCategory($category1);
     $this->em->persist($item4);
     $this->em->flush();
     $item1 = new Item();
     $item1->setName("Item1");
     $item1->setPosition(0);
     $item1->setCategory($category1);
     $this->em->persist($item1);
     $item2 = new Item();
     $item2->setName("Item2");
     $item2->setPosition(0);
     $item2->setCategory($category1);
     $this->em->persist($item2);
     $item2 = new Item();
     $item2->setName("Item2_2");
     $item2->setPosition(0);
     $item2->setCategory($category2);
     $this->em->persist($item2);
     $this->em->flush();
     $item1 = new Item();
     $item1->setName("Item1_2");
     $item1->setPosition(0);
     $item1->setCategory($category2);
     $this->em->persist($item1);
     $this->em->flush();
     $repo = $this->em->getRepository(self::CATEGORY);
     $category1 = $repo->findOneByName('Category1');
     $category2 = $repo->findOneByName('Category2');
     $repo = $this->em->getRepository(self::ITEM);
     $items = $repo->getBySortableGroups(array('category' => $category1));
     $this->assertEquals("Item1", $items[0]->getName());
     $this->assertEquals("Category1", $items[0]->getCategory()->getName());
     $this->assertEquals("Item2", $items[1]->getName());
     $this->assertEquals("Category1", $items[1]->getCategory()->getName());
     $this->assertEquals("Item3", $items[2]->getName());
     $this->assertEquals("Category1", $items[2]->getCategory()->getName());
     $this->assertEquals("Item4", $items[3]->getName());
     $this->assertEquals("Category1", $items[3]->getCategory()->getName());
     $items = $repo->getBySortableGroups(array('category' => $category2));
     $this->assertEquals("Item1_2", $items[0]->getName());
     $this->assertEquals("Category2", $items[0]->getCategory()->getName());
     $this->assertEquals("Item2_2", $items[1]->getName());
     $this->assertEquals("Category2", $items[1]->getCategory()->getName());
 }
 /**
  * @test
  */
 public function shouldInsertInbetween()
 {
     $this->markTestIncomplete('Currently it is not supported to change the position of a record and insert a new one in front of it in one step.');
     $item1 = new Item();
     $item1->setName("Item1");
     $this->em->persist($item1);
     $item3 = new Item();
     $item3->setName("Item3");
     $this->em->persist($item3);
     $this->em->flush();
     // update $item3's position
     $item3->setPosition(2);
     // and insert a further item between $item1 and $item3
     $item2 = new Item();
     $item2->setName("Item2");
     $item2->setPosition(1);
     $this->em->persist($item2);
     $this->em->flush();
     $repo = $this->em->getRepository(self::ITEM);
     $items = $repo->findBy(array(), array('position' => 'asc'));
     $this->assertEquals("Item1", $items[0]->getName());
     $this->assertEquals(0, $items[0]->getPosition());
     $this->assertEquals("Item2", $items[1]->getName());
     $this->assertEquals(1, $items[1]->getPosition());
     $this->assertEquals("Item3", $items[2]->getName());
     $this->assertEquals(2, $items[2]->getPosition());
 }
 private function populate()
 {
     // engines
     $v8 = new Engine();
     $v8->setType('V8');
     $v8->setValves(8);
     $this->em->persist($v8);
     $v6 = new Engine();
     $v6->setType('V6');
     $v6->setValves(8);
     $this->em->persist($v6);
     $this->em->flush();
     // cars
     $audi80 = new Car();
     $audi80->setEngine($v8);
     $audi80->setTitle('Audi-80');
     $this->em->persist($audi80);
     $audi80s = new Car();
     $audi80s->setParent($audi80);
     $audi80s->setTitle('Audi-80s');
     $audi80s->setEngine($v8);
     $this->em->persist($audi80s);
     $icarus = new Bus();
     $icarus->setEngine($v8);
     $icarus->setTitle('Icarus');
     $this->em->persist($icarus);
     $audiJet = new Car();
     $audiJet->setParent($audi80);
     $audiJet->setTitle('Audi-jet');
     $audiJet->setEngine($v6);
     $this->em->persist($audiJet);
     $today = \DateTime::createFromFormat(self::TRAVEL_DATE_FORMAT, self::TODAY);
     $tomorrow = \DateTime::createFromFormat(self::TRAVEL_DATE_FORMAT, self::TOMORROW);
     for ($i = 0; $i < self::SEATS; $i++) {
         $reservationBratislava = new Reservation();
         $reservationBratislava->setBus($icarus);
         $reservationBratislava->setDestination('Bratislava');
         $reservationBratislava->setTravelDate($today);
         $reservationBratislava->setName('Bratislava Today ' . $i);
         $this->em->persist($reservationBratislava);
         $reservationBratislava = new Reservation();
         $reservationBratislava->setBus($icarus);
         $reservationBratislava->setDestination('Bratislava');
         $reservationBratislava->setTravelDate($tomorrow);
         $reservationBratislava->setName('Bratislava Tomorrow ' . $i);
         $this->em->persist($reservationBratislava);
         $reservationPrague = new Reservation();
         $reservationPrague->setBus($icarus);
         $reservationPrague->setDestination('Prague');
         $reservationPrague->setTravelDate($today);
         $reservationPrague->setName('Prague Today ' . $i);
         $this->em->persist($reservationPrague);
     }
     $categoryVehicle = new Category();
     $categoryVehicle->setName('Vehicle');
     $this->em->persist($categoryVehicle);
     $categoryAccessory = new Category();
     $categoryAccessory->setName('Accessory');
     $this->em->persist($categoryAccessory);
     for ($i = 1; $i <= 60; $i++) {
         $item = new Item();
         $item->setName('Item ' . $i);
         if ($i <= 30) {
             $item->setCategory($categoryVehicle);
             $item->setPosition($i);
         } else {
             $item->setCategory($categoryAccessory);
             $item->setPosition($i - 30);
         }
         $this->em->persist($item);
     }
     $this->em->flush();
 }