/** * If the provider does not perform the paging (ordering, top, skip) then this method does it * * @param array $result * @return array */ private function performPaging(array $result) { //Apply (implicit and explicit) $orderby option $internalOrderByInfo = $this->request->getInternalOrderByInfo(); if (!is_null($internalOrderByInfo)) { $orderByFunction = $internalOrderByInfo->getSorterFunction()->getReference(); usort($result, $orderByFunction); } //Apply $skiptoken option $internalSkipTokenInfo = $this->request->getInternalSkipTokenInfo(); if (!is_null($internalSkipTokenInfo)) { $matchingIndex = $internalSkipTokenInfo->getIndexOfFirstEntryInTheNextPage($result); $result = array_slice($result, $matchingIndex); } //Apply $top and $skip option if (!empty($result)) { $top = $this->request->getTopCount(); $skip = $this->request->getSkipCount(); if (is_null($skip)) { $skip = 0; } $result = array_slice($result, $skip, $top); } return $result; }
/** * Process the $expand and $select option and update the request description. * * @return void * * @throws ODataException Throws bad request error in the following cases * (1) If $expand or select cannot be applied to the * requested resource. * (2) If projection is disabled by the developer * (3) If some error occurs while parsing the options */ private function _processExpandAndSelect() { $expand = $this->service->getHost()->getQueryStringItem(ODataConstants::HTTPQUERY_STRING_EXPAND); if (!is_null($expand)) { $this->_checkExpandOrSelectApplicable(ODataConstants::HTTPQUERY_STRING_EXPAND); } $select = $this->service->getHost()->getQueryStringItem(ODataConstants::HTTPQUERY_STRING_SELECT); if (!is_null($select)) { if (!$this->service->getConfiguration()->getAcceptProjectionRequests()) { throw ODataException::createBadRequestError(Messages::configurationProjectionsNotAccepted()); } $this->_checkExpandOrSelectApplicable(ODataConstants::HTTPQUERY_STRING_SELECT); } // We will generate RootProjectionNode in case of $link request also, but // expand and select in this case must be null (we are ensuring this above) // 'RootProjectionNode' is required while generating next page Link if ($this->_expandSelectApplicable || $this->request->isLinkUri()) { $rootProjectionNode = ExpandProjectionParser::parseExpandAndSelectClause($this->request->getTargetResourceSetWrapper(), $this->request->getTargetResourceType(), $this->request->getInternalOrderByInfo(), $this->request->getSkipCount(), $this->request->getTopCount(), $expand, $select, $this->service->getProvidersWrapper()); if ($rootProjectionNode->isSelectionSpecified()) { $this->request->raiseMinVersionRequirement(2, 0); } if ($rootProjectionNode->hasPagedExpandedResult()) { $this->request->raiseResponseVersion(2, 0); } $this->request->setRootProjectionNode($rootProjectionNode); } }