public function matching(Criteria $criteria)
{
$visitor = new QueryExpressionVisitor($this->createQueryBuilder());
$queryBuilder = $this->createQueryBuilder();
if ($criteria->getWhereExpression() !== null) {
$expr = $visitor->dispatch($criteria->getWhereExpression());
$queryBuilder->setQueryArray($expr->getQuery());
}
if ($criteria->getMaxResults() !== null) {
$queryBuilder->limit($criteria->getMaxResults());
}
if ($criteria->getFirstResult() !== null) {
$queryBuilder->skip($criteria->getFirstResult());
}
if ($criteria->getOrderings() !== null) {
$queryBuilder->sort($criteria->getOrderings());
}
// @TODO: wrap around a specialized Collection for efficient count on large collections
return new ArrayCollection($queryBuilder->getQuery()->execute()->toArray(false));
}