duplicate-query-optimization (#3147)

This commit is contained in:
Yurii Kuznietsov
2024-09-16 09:10:08 +03:00
committed by GitHub
parent aced889566
commit debd0f700e
+20 -9
View File
@@ -129,28 +129,39 @@ class Finder
}
try {
$query = $this->selectBuilderFactory
$baseQueryBuilder = $this->selectBuilderFactory
->create()
->from($entityType)
->withStrictAccessControl()
->buildQueryBuilder()
->where($where)
->select(['id'])
->limit(0, self::LIMIT)
->build();
->limit(0, self::LIMIT);
} catch (Forbidden|BadRequest $e) {
throw new RuntimeException($e->getMessage(), 0, $e);
}
$builder = $this->entityManager
->getRDBRepository($entityType)
->clone($query);
$repository = $this->entityManager->getRDBRepository($entityType);
if (!$builder->findOne()) {
$query = $baseQueryBuilder
->where($where)
->build();
$rdbBuilder = $repository->clone($query);
if (!$rdbBuilder->findOne()) {
return null;
}
return $builder->select(['*'])->find();
$ids = array_map(
fn(Entity $e) => $e->getId(),
iterator_to_array($rdbBuilder->find())
);
return $repository
->clone($baseQueryBuilder->build())
->select(['*'])
->where(['id' => $ids])
->find();
}
private function getWhere(Entity $entity): ?WhereItem