diff --git a/lib/Alchemy/Phrasea/Collection/Reference/ArrayCacheCollectionReferenceRepository.php b/lib/Alchemy/Phrasea/Collection/Reference/ArrayCacheCollectionReferenceRepository.php index a97f47e043..17a9a1d790 100644 --- a/lib/Alchemy/Phrasea/Collection/Reference/ArrayCacheCollectionReferenceRepository.php +++ b/lib/Alchemy/Phrasea/Collection/Reference/ArrayCacheCollectionReferenceRepository.php @@ -90,6 +90,15 @@ class ArrayCacheCollectionReferenceRepository implements CollectionReferenceRepo return null; } + /** + * @param array|null $subset + * @return CollectionReference[] + */ + public function findHavingOrderMaster(array $subset = null) + { + return $this->repository->findHavingOrderMaster($subset); + } + /** * @param CollectionReference $reference * @return void diff --git a/lib/Alchemy/Phrasea/Collection/Reference/CollectionReferenceRepository.php b/lib/Alchemy/Phrasea/Collection/Reference/CollectionReferenceRepository.php index 72b6ad4d40..d40e827f76 100644 --- a/lib/Alchemy/Phrasea/Collection/Reference/CollectionReferenceRepository.php +++ b/lib/Alchemy/Phrasea/Collection/Reference/CollectionReferenceRepository.php @@ -36,6 +36,14 @@ interface CollectionReferenceRepository */ public function findByCollectionId($databoxId, $collectionId); + /** + * Find Collection references having at least one Order Master + * + * @param array|null $subset Restrict search to a subset of base ids. + * @return CollectionReference[] + */ + public function findHavingOrderMaster(array $subset = null); + /** * @param CollectionReference $reference * @return void diff --git a/lib/Alchemy/Phrasea/Collection/Reference/DbalCollectionReferenceRepository.php b/lib/Alchemy/Phrasea/Collection/Reference/DbalCollectionReferenceRepository.php index 67e01582e7..68026bd087 100644 --- a/lib/Alchemy/Phrasea/Collection/Reference/DbalCollectionReferenceRepository.php +++ b/lib/Alchemy/Phrasea/Collection/Reference/DbalCollectionReferenceRepository.php @@ -10,7 +10,6 @@ namespace Alchemy\Phrasea\Collection\Reference; -use Alchemy\Phrasea\Core\Database\QueryBuilder; use Doctrine\DBAL\Connection; class DbalCollectionReferenceRepository implements CollectionReferenceRepository @@ -107,6 +106,29 @@ class DbalCollectionReferenceRepository implements CollectionReferenceRepository return null; } + public function findHavingOrderMaster(array $subset = null) + { + $query = self::$selectQuery + . ' WHERE EXISTS(SELECT 1 FROM basusr WHERE basusr.order_master = 1 AND basusr.base_id = bas.base_id)'; + + $parameters = []; + $types = []; + + if (null !== $subset) { + if (empty($subset)) { + return []; + } + + $query .= ' AND bas.base_id IN (:subset)'; + $parameters['subset'] = $subset; + $types['subset'] = Connection::PARAM_INT_ARRAY; + } + + $rows = $this->connection->fetchAll($query, $parameters); + + return $this->createManyReferences($rows); + } + public function save(CollectionReference $collectionReference) { $query = self::$insertQuery; diff --git a/lib/Alchemy/Phrasea/Core/Provider/RepositoriesServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/RepositoriesServiceProvider.php index 5e50367f09..61d2fbbd83 100644 --- a/lib/Alchemy/Phrasea/Core/Provider/RepositoriesServiceProvider.php +++ b/lib/Alchemy/Phrasea/Core/Provider/RepositoriesServiceProvider.php @@ -175,7 +175,8 @@ class RepositoriesServiceProvider implements ServiceProviderInterface $repository = new DbalCollectionReferenceRepository($app->getApplicationBox()->get_connection()); return new ArrayCacheCollectionReferenceRepository($repository); - }); + }); + $app['repo.collections-registry'] = $app->share(function (PhraseaApplication $app) { $factory = new CollectionFactory($app); $connectionProvider = new DataboxConnectionProvider($app->getApplicationBox());