components-web-app/api-components-bundle

View on GitHub
src/Repository/Core/FileInfoRepository.php

Summary

Maintainability
A
35 mins
Test Coverage
<?php

/*
 * This file is part of the Silverback API Components Bundle Project
 *
 * (c) Daniel West <daniel@silverback.is>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

declare(strict_types=1);

namespace Silverback\ApiComponentsBundle\Repository\Core;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use Silverback\ApiComponentsBundle\Entity\Core\FileInfo;

/**
 * @author Daniel West <daniel@silverback.is>
 *
 * @method FileInfo|null find($id, $lockMode = null, $lockVersion = null)
 * @method FileInfo|null findOneBy(array $criteria, array $orderBy = null)
 * @method FileInfo[]    findAll()
 * @method FileInfo[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class FileInfoRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, FileInfo::class);
    }

    public function findOneByPathAndFilter(string $path, ?string $filter): ?FileInfo
    {
        return $this->findOneBy(
            [
                'path' => $path,
                'filter' => $filter,
            ]
        );
    }

    /**
     * @return FileInfo[]
     */
    public function findByPathsAndFilters(array $paths, ?array $filters): array
    {
        if (!\count($paths)) {
            return [];
        }

        $queryBuilder = $this->createQueryBuilder('f');
        $expr = $queryBuilder->expr();

        $filterQueries = $this->getFilterQueries($filters, $expr, $queryBuilder);
        $filterQueryCount = (bool) \count($filterQueries);

        foreach ($paths as $pathIndex => $path) {
            $queryBuilder->setParameter(':path_' . $pathIndex, $path);

            if (!$filterQueryCount) {
                $queryBuilder
                    ->orWhere($expr->eq('f.path', ':path_' . $pathIndex));
                continue;
            }

            $queryBuilder
                ->orWhere($expr->andX($expr->eq('f.path', ':path_' . $pathIndex), $expr->orX(...$filterQueries)));
        }

        return $queryBuilder->getQuery()->getResult();
    }

    private function getFilterQueries(?array $filters, Expr $expr, QueryBuilder $queryBuilder): array
    {
        $filterQueries = [];
        if (null !== $filters) {
            foreach ($filters as $filterIndex => $filter) {
                if (!$filter) {
                    $filterQueries[] = $expr->isNull('f.filter');
                    continue;
                }
                $filterQueries[] = $expr->eq('f.filter', ':filter_' . $filterIndex);
                $queryBuilder->setParameter(':filter_' . $filterIndex, $filter);
            }
        }

        return $filterQueries;
    }
}