/**
  * Generates the paginated resultset
  *
  * @param ItemsEvent $event
  */
 public function items(ItemsEvent $event)
 {
     $query = $event->getQuery();
     $distinct = $event->isDistinct();
     $result = null;
     if ($distinct) {
         $limitSubQuery = QueryHelper::cloneQuery($query);
         $limitSubQuery->setParameters($query->getParameters());
         QueryHelper::addCustomTreeWalker($limitSubQuery, self::TREE_WALKER_LIMIT_SUBQUERY);
         $limitSubQuery->setFirstResult($event->getOffset())->setMaxResults($event->getRowCountPerPage());
         $ids = array_map('current', $limitSubQuery->getScalarResult());
         // create where-in query
         $whereInQuery = QueryHelper::cloneQuery($query);
         QueryHelper::addCustomTreeWalker($whereInQuery, self::TREE_WALKER_WHERE_IN);
         $whereInQuery->setHint(WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids))->setFirstResult(null)->setMaxResults(null);
         foreach ($ids as $i => $id) {
             $whereInQuery->setParameter(WhereInWalker::PAGINATOR_ID_ALIAS . '_' . ++$i, $id);
         }
         $result = $whereInQuery->getResult();
     } else {
         $query->setFirstResult($event->getOffset())->setMaxResults($event->getRowCountPerPage());
         $result = $query->getResult();
     }
     $event->stopPropagation();
     $event->setItems($result);
 }
 /**
  * Adds a sorting to the query if request
  * parameters were set for sorting
  *
  * @param ItemsEvent $event
  */
 public function items(ItemsEvent $event)
 {
     $params = $this->request->query->all();
     $sortKey = $event->getAlias() . 'sort';
     $directionKey = $event->getAlias() . 'direction';
     if (isset($params[$sortKey])) {
         $query = $event->getQuery();
         $whitelist = $query->getHint(OrderByWalker::HINT_PAGINATOR_SORT_FIELDS_WHITELIST);
         if (isset($whitelist[$params[$sortKey]])) {
             $sortField = $whitelist[$params[$sortKey]];
         } elseif ($whitelist === false) {
             $sortField = $params[$sortKey];
         } else {
             //passed field name do not match to whitelist, skip sorting
             return;
         }
         $parts = explode('.', $sortField);
         if (count($parts) != 2) {
             throw new UnexpectedValueException('Invalid sort key came by request, should be example: "article.title"');
         }
         $query->setHint(OrderByWalker::HINT_PAGINATOR_SORT_ALIAS, current($parts))->setHint(OrderByWalker::HINT_PAGINATOR_SORT_DIRECTION, stripos($params[$directionKey], 'desc') === false ? 'ASC' : 'DESC')->setHint(OrderByWalker::HINT_PAGINATOR_SORT_FIELD, end($parts));
         QueryHelper::addCustomTreeWalker($query, self::TREE_WALKER_ORDER_BY);
     }
 }