Allow retrieve collection by a collection of base ids

This commit is contained in:
Benoît Burnichon
2016-03-17 16:54:27 +01:00
parent 8ca8f61726
commit 5ded48dafb
5 changed files with 80 additions and 12 deletions

View File

@@ -72,6 +72,25 @@ class ArrayCacheCollectionReferenceRepository implements CollectionReferenceRepo
return null; return null;
} }
/**
* @param array $baseIds
* @return CollectionReference[]
*/
public function findMany(array $baseIds)
{
$references = $this->findAll();
$requested = [];
foreach ($baseIds as $baseId) {
if (isset($references[$baseId])) {
$requested[] = $references[$baseId];
}
}
return $requested;
}
/** /**
* @param int $databoxId * @param int $databoxId
* @param int $collectionId * @param int $collectionId
@@ -90,6 +109,10 @@ class ArrayCacheCollectionReferenceRepository implements CollectionReferenceRepo
return null; return null;
} }
/**
* @param array|null $baseIdsSubset
* @return CollectionReference[]
*/
public function findHavingOrderMaster(array $baseIdsSubset = null) public function findHavingOrderMaster(array $baseIdsSubset = null)
{ {
return $this->repository->findHavingOrderMaster($baseIdsSubset); return $this->repository->findHavingOrderMaster($baseIdsSubset);

View File

@@ -29,6 +29,12 @@ interface CollectionReferenceRepository
*/ */
public function find($baseId); public function find($baseId);
/**
* @param int[] $baseIds
* @return CollectionReference[]
*/
public function findMany(array $baseIds);
/** /**
* @param int $databoxId * @param int $databoxId
* @param int $collectionId * @param int $collectionId

View File

@@ -95,6 +95,25 @@ WHERE base_id = :baseId';
return null; return null;
} }
/**
* @param array $basesId
* @return CollectionReference[]
*/
public function findMany(array $basesId)
{
if (empty($basesId)) {
return [];
}
$rows = $this->connection->fetchAll(
self::$selectQuery . ' WHERE base_id IN (:baseIds)',
['baseIds' => $basesId],
['baseIds' => Connection::PARAM_INT_ARRAY]
);
return $this->createManyReferences($rows);
}
/** /**
* @param int $databoxId * @param int $databoxId
* @param int $collectionId * @param int $collectionId

View File

@@ -1763,20 +1763,39 @@ class ACL implements cache_cacheableInterface
/** /**
* Returns an array of collections on which the user is 'order master' * Returns an array of collections on which the user is 'order master'
* *
* @return array * @return collection[]
*/ */
public function get_order_master_collections() public function get_order_master_collections()
{ {
$sql = 'SELECT base_id FROM basusr WHERE order_master="1" AND usr_id= :usr_id'; $sql = 'SELECT base_id FROM basusr WHERE order_master="1" AND usr_id= :usr_id';
$stmt = $this->app->getApplicationBox()->get_connection()->prepare($sql); $result = $this->app->getApplicationBox()
$stmt->execute([':usr_id' => $this->user->getId()]); ->get_connection()
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); ->executeQuery($sql, [':usr_id' => $this->user->getId()])
$stmt->closeCursor(); ->fetchAll(\PDO::FETCH_ASSOC);
$baseIds = [];
foreach ($result as $item) {
$baseIds[] = $item['base_id'];
}
$groups = [];
foreach ($this->app['repo.collection-references']->findHavingOrderMaster($baseIds) as $index => $reference) {
$databoxId = $reference->getDataboxId();
$group = isset($groups[$databoxId]) ? $groups[$databoxId] : [];
$group[$reference->getCollectionId()] = $index;
$groups[$databoxId] = $group;
}
$collections = []; $collections = [];
foreach ($rs as $row) { foreach ($groups as $databoxId => $group) {
$collections[] = \collection::getByBaseId($this->app, $row['base_id']); foreach ($group as $collectionId => $index) {
$collections[$index] = \collection::getByCollectionId($this->app, $databoxId, $collectionId);
}
} }
return $collections; return $collections;

View File

@@ -193,15 +193,16 @@ class collection implements ThumbnailedElement, cache_cacheableInterface
/** /**
* @param Application $app * @param Application $app
* @param databox $databox * @param databox|int $databox
* @param int $collectionId * @param int $collectionId
* @return collection * @return collection
*/ */
public static function getByCollectionId(Application $app, databox $databox, $collectionId) public static function getByCollectionId(Application $app, $databox, $collectionId)
{ {
assert(is_int($collectionId)); assert(is_int($collectionId));
$databoxId = $databox instanceof databox ? $databox->get_sbas_id() : (int)$databox;
return self::getAvailableCollection($app, $databox->get_sbas_id(), $collectionId); return self::getAvailableCollection($app, $databoxId, $collectionId);
} }
/** /**