public function getList(MvcEvent $event)
 {
     $options = $event->getTarget()->getOptions();
     $documentManager = $options->getModelManager();
     $metadata = $documentManager->getClassMetadata($options->getClass());
     if ($list = $event->getParam('list')) {
         $list = $list->getValues();
     }
     unset($this->range);
     $criteria = $this->getCriteria($event);
     //filter list on criteria
     if (count($criteria) > 0 && $list) {
         $list = $this->applyCriteriaToList($list, $criteria, $metadata);
     }
     if ($list) {
         $total = count($list);
     } else {
         //load the total from the db
         $totalQuery = $documentManager->createQueryBuilder()->find($metadata->name);
         $total = $this->addCriteriaToQuery($totalQuery, $criteria, $metadata, $documentManager)->getQuery()->execute()->count();
     }
     if ($total == 0) {
         $result = new Result([]);
         $result->setStatusCode(204);
         $event->setResult($result);
         return $result;
     }
     $offset = $this->getOffset($event);
     if ($offset > $total - 1) {
         throw new Exception\BadRangeException();
     }
     $sort = $this->getSort($event);
     if ($list) {
         //apply any required sort to the result
         if (count($sort) > 0) {
             $this->applySortToList($list, $sort, $metadata);
         }
         $list = array_slice($list, $offset, $this->getLimit($event));
     } else {
         $resultsQuery = $documentManager->createQueryBuilder()->find($metadata->name);
         $this->addCriteriaToQuery($resultsQuery, $criteria, $metadata, $documentManager);
         $resultsQuery->limit($this->getLimit($event))->skip($offset);
         $list = $this->addSortToQuery($resultsQuery, $sort)->eagerCursor(true)->getQuery()->execute();
     }
     $max = $offset + count($list) - 1;
     $result = new Result($list);
     $result->addHeader(ContentRange::fromString("Content-Range: {$offset}-{$max}/{$total}"));
     $event->setResult($result);
     return $result;
 }
 public function deleteList(MvcEvent $event)
 {
     if ($list = $event->getParam('list')) {
         foreach ($list->getKeys() as $key) {
             $list->remove($key);
         }
     } else {
         $options = $event->getTarget()->getOptions();
         $options->getModelManager()->createQueryBuilder($options->getClass())->remove()->getQuery()->execute();
     }
     if (!($result = $event->getResult())) {
         $result = new Result([]);
         $result->setStatusCode(204);
         $event->setResult($result);
     }
     return $result;
 }
 protected function handleAssociatedCollection(MvcEvent $event, $metadata, $documentManager, $field)
 {
     $deeperResource = $event->getParam('deeperResource');
     if (count($deeperResource) == 0) {
         $document = $this->loadDocument($event, $metadata, $documentManager, $field);
         $collection = $metadata->getFieldValue($document, $field);
         foreach ($collection->getKeys() as $key) {
             $collection->remove($key);
         }
         $result = new Result([]);
         $result->setStatusCode(204);
         $event->setResult($result);
         return $result;
     }
     if (isset($metadata->fieldMappings[$field]['reference'])) {
         $event->getRequest()->getQuery()->set($metadata->fieldMappings[$field]['mappedBy'], $event->getParam('id'));
         $targetOptions = $this->getRestControllerMap($event)->getOptionsFromEndpoint($event->getTarget()->getOptions()->getEndpoint() . '.' . $field);
         $id = array_shift($deeperResource);
         $event->setParam('id', $id);
         $event->setParam('deeperResource', $deeperResource);
         $event->setParam('document', null);
         return $event->getTarget()->forward()->dispatch('shard.rest.' . $targetOptions->getEndpoint(), ['id' => $id]);
     }
     $document = $this->loadDocument($event, $metadata, $documentManager, $field);
     $endpoint = $event->getTarget()->getOptions()->getEndpoint();
     $collection = $metadata->getFieldValue($document, $field);
     if (!($targetDocument = $this->selectItemFromCollection($collection, $deeperResource[0], $this->getRestControllerMap($event)->getOptionsFromEndpoint($endpoint . '.' . $field)->getProperty()))) {
         //embedded document not found in collection
         throw new Exception\DocumentNotFoundException();
     }
     if (!isset($targetDocument)) {
         //embedded document not found in collection
         throw new Exception\DocumentNotFoundException();
     }
     $id = array_shift($deeperResource);
     $event->setParam('id', $id);
     if (count($deeperResource) == 0) {
         $collection->removeElement($targetDocument);
         $result = new Result([]);
         $result->setStatusCode(204);
         $event->setResult($result);
         return $result;
     } else {
         array_shift($deeperResource);
         $event->setParam('deeperResource', $deeperResource);
         $event->setParam('document', $targetDocument);
         return $event->getTarget()->forward()->dispatch('shard.rest.' . $endpoint . '.' . $field);
     }
 }