public function sortedQuery(SortedQuery $query, $check_full_set_size = false, $use_cache = true)
{
$metadata = $this->getMapper()->getEntityMetadata($query->getClassName());
if ($query->getRelationshipName()) {
// Entity relationship based query
$reader = new Reader($metadata, $query->getEntity());
$relationship = $metadata->getRelationshipByName($query->getRelationshipName());
if (!$relationship) {
throw new InvalidArgumentException('Relationship "' . $query->getRelationshipName() . '" does not exist');
}
// Important, else the QueryResult class will try to hydrate the wrong entity
$query->setClassName($relationship->getTarget());
$key = $this->getSortIndexKey($relationship, $query->getSortBy(), $reader->getId());
} else {
// Table based query
$key = $this->getKeyScheme()->getTableSortKey($metadata->getTableName(), $query->getSortBy());
}
$results = $this->getDriver()->getSortedIndex($key, $query->getDirection() == Direction::DESC(), $query->getStart(), $query->getEnd());
if (!$query->getStart() && !$query->getEnd()) {
$full_size = count($results);
} elseif ($check_full_set_size) {
$full_size = $this->getDriver()->getSortedIndexSize($key);
} else {
$full_size = null;
}
return new QueryResult($this->entity_manager, $query, $results, $full_size, $use_cache);
}