/**
  * Update event's exclude dates and recurrenceIds when start datetime changes.
  *
  * @param OnFlushEventArgs $eventArgs
  */
 public function onFlush(OnFlushEventArgs $eventArgs)
 {
     $em = $eventArgs->getEntityManager();
     $uow = $em->getUnitOfWork();
     $entities = array_merge($uow->getScheduledEntityUpdates(), $uow->getScheduledEntityInsertions());
     $eventUtil = new EventUtil($em);
     foreach ($entities as $entity) {
         if (!$entity instanceof Event) {
             continue;
         }
         /** @var $entity \Xima\ICalBundle\Entity\Component\Event */
         $eventUtil->cleanUpEvent($entity);
         $uow->recomputeSingleEntityChangeSet($em->getClassMetadata(get_class($entity)), $entity);
         // apply changed $dtStart values to child events $recurrenceIds if any
         $changeSet = $uow->getEntityChangeSet($entity);
         if (isset($changeSet['dtStart']) && isset($changeSet['dtStart'][0])) {
             $interval = $changeSet['dtStart'][0]->diff($entity->getDtStart());
             $q = $em->createQuery("select e from Xima\\ICalBundle\\Entity\\Component\\Event e where e.uniqueId = '" . $entity->getUniqueId() . "' AND e.recurrenceId IS NOT NULL");
             $detachedEvents = $q->getResult();
             foreach ($detachedEvents as $detachedEvent) {
                 /** @var $detachedEvent \Xima\ICalBundle\Entity\Component\Event */
                 $recurrenceId = $detachedEvent->getRecurrenceId();
                 $recurrenceId->getDatetime()->add($interval);
                 // make Doctrine accept a DateTime as changed
                 $recurrenceId->setDatetime(clone $recurrenceId->getDatetime());
                 $uow->recomputeSingleEntityChangeSet($em->getClassMetadata(get_class($recurrenceId)), $recurrenceId);
             }
         }
     }
 }
 /**
  *
  * @return Array
  */
 protected function getRecurringInstances(QueryBuilder $qb, \DateTime $dateFrom, \DateTime $dateTo)
 {
     $events = array();
     $qb->andWhere($qb->expr()->isNotNull($qb->getRootAliases()[0] . '.recurrenceRule'));
     $recurringEvents = $qb->getQuery()->getResult();
     $eventUtil = new EventUtil($this->getEntityManager());
     foreach ($recurringEvents as $recurringEvent) {
         /* @var $recurringEvent \Xima\ICalBundle\Entity\Component\Event */
         $events = array_merge($events, $eventUtil->getInstances($recurringEvent, $dateFrom, $dateTo));
     }
     return $events;
 }