From 25fd47fa7be807ca02b69c407aa4c77102ac31c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Burnichon?= Date: Fri, 4 Mar 2016 15:27:00 +0100 Subject: [PATCH] Added RecordReferenceCollection utility method --- .../Controller/Api/OrderController.php | 53 +++------- .../Phrasea/Controller/Api/V1Controller.php | 8 +- lib/Alchemy/Phrasea/Model/RecordInterface.php | 17 +-- .../Model/RecordReferenceInterface.php | 29 +++++ .../Phrasea/Record/RecordReference.php | 3 +- .../Record/RecordReferenceCollection.php | 100 ++++++++++++++++++ .../SearchEngineResultToRecordsConverter.php | 74 ------------- 7 files changed, 150 insertions(+), 134 deletions(-) create mode 100644 lib/Alchemy/Phrasea/Model/RecordReferenceInterface.php create mode 100644 lib/Alchemy/Phrasea/Record/RecordReferenceCollection.php delete mode 100644 lib/Alchemy/Phrasea/SearchEngine/SearchEngineResultToRecordsConverter.php diff --git a/lib/Alchemy/Phrasea/Controller/Api/OrderController.php b/lib/Alchemy/Phrasea/Controller/Api/OrderController.php index d4b55ccb53..3bd6b54e01 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/OrderController.php +++ b/lib/Alchemy/Phrasea/Controller/Api/OrderController.php @@ -20,6 +20,7 @@ use Alchemy\Phrasea\Model\Entities\Order; use Alchemy\Phrasea\Order\OrderElementTransformer; use Alchemy\Phrasea\Order\OrderFiller; use Alchemy\Phrasea\Order\OrderTransformer; +use Alchemy\Phrasea\Record\RecordReferenceCollection; use Assert\Assertion; use Assert\InvalidArgumentException; use Doctrine\Common\Collections\ArrayCollection; @@ -45,8 +46,7 @@ class OrderController extends Controller { $data = $this->decodeJsonBody($request, 'orders.json#/definitions/order_request'); - $requestedRecords = $this->toRequestedRecordsArray($data->data->records); - $availableRecords = $this->fetchRecords($requestedRecords); + $availableRecords = $this->toRequestedRecords($data->data->records); $records = $this->filterOrderableRecords($availableRecords); $recordRequest = new RecordsRequest($records, new ArrayCollection($availableRecords), null, RecordsRequest::FLATTEN_YES); @@ -132,9 +132,9 @@ class OrderController extends Controller /** * @param array $records - * @return array + * @return \record_adapter[] */ - private function toRequestedRecordsArray(array $records) + private function toRequestedRecords(array $records) { $requestedRecords = []; @@ -145,38 +145,7 @@ class OrderController extends Controller ]; } - return $requestedRecords; - } - - /** - * @param array $recordIds - * @return \record_adapter[] - */ - private function fetchRecords(array $recordIds) - { - $perDataboxRecords = []; - - foreach ($recordIds as $index => $record) { - if (!isset($perDataboxRecords[$record['databox_id']])) { - $perDataboxRecords[$record['databox_id']] = []; - } - - $perDataboxRecords[$record['databox_id']][$record['record_id']] = $index; - } - - $records = []; - - foreach ($perDataboxRecords as $databoxId => $recordIndexes) { - $repository = $this->findDataboxById($databoxId)->getRecordRepository(); - - foreach ($repository->findByRecordIds(array_keys($perDataboxRecords[$databoxId])) as $record) { - $records[$recordIndexes[$record->getRecordId()]] = $record; - } - } - - ksort($records); - - return $records; + return RecordReferenceCollection::fromArrayOfArray($requestedRecords)->toRecords($this->getApplicationBox()); } /** @@ -187,9 +156,15 @@ class OrderController extends Controller { $acl = $this->getAclForUser(); - return array_filter($records, function (\record_adapter $record) use ($acl) { - return $acl->has_right_on_base($record->getBaseId(), 'cancmd'); - }); + $filtered = []; + + foreach ($records as $index => $record) { + if ($acl->has_right_on_base($record->getBaseId(), 'cancmd')) { + $filtered[$index] = $record; + } + } + + return $filtered; } /** diff --git a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php index 6b6a64a853..de751a1e0b 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php @@ -53,11 +53,11 @@ use Alchemy\Phrasea\Model\Repositories\FeedEntryRepository; use Alchemy\Phrasea\Model\Repositories\FeedRepository; use Alchemy\Phrasea\Model\Repositories\LazaretFileRepository; use Alchemy\Phrasea\Model\Repositories\TaskRepository; +use Alchemy\Phrasea\Record\RecordReferenceCollection; use Alchemy\Phrasea\SearchEngine\SearchEngineInterface; use Alchemy\Phrasea\SearchEngine\SearchEngineLogger; use Alchemy\Phrasea\SearchEngine\SearchEngineOptions; use Alchemy\Phrasea\SearchEngine\SearchEngineResult; -use Alchemy\Phrasea\SearchEngine\SearchEngineResultToRecordsConverter; use Alchemy\Phrasea\SearchEngine\SearchEngineSuggestion; use Alchemy\Phrasea\Status\StatusStructure; use Alchemy\Phrasea\TaskManager\LiveInformation; @@ -1065,10 +1065,10 @@ class V1Controller extends Controller $ret['results'] = ['records' => [], 'stories' => []]; - $converter = new SearchEngineResultToRecordsConverter($this->getApplicationBox()); - /** @var SearchEngineResult $search_result */ - foreach ($converter->convert($search_result->getResults()) as $record) { + $references = new RecordReferenceCollection($search_result->getResults()); + + foreach ($references->toRecords($this->getApplicationBox()) as $record) { if ($record->isStory()) { $ret['results']['stories'][] = $this->listStory($request, $record); } else { diff --git a/lib/Alchemy/Phrasea/Model/RecordInterface.php b/lib/Alchemy/Phrasea/Model/RecordInterface.php index e1ff83c847..fb2e47fe0b 100644 --- a/lib/Alchemy/Phrasea/Model/RecordInterface.php +++ b/lib/Alchemy/Phrasea/Model/RecordInterface.php @@ -2,13 +2,8 @@ namespace Alchemy\Phrasea\Model; -interface RecordInterface +interface RecordInterface extends RecordReferenceInterface { - /** - * @return string - */ - public function getId(); - /** * The unique id of the collection where belong the record. * @@ -26,13 +21,6 @@ interface RecordInterface /** @return \DateTime */ public function getCreated(); - /** - * The id of the databox where belong the record. - * - * @return integer - */ - public function getDataboxId(); - /** @return boolean */ public function isStory(); @@ -42,9 +30,6 @@ interface RecordInterface /** @return string */ public function getOriginalName(); - /** @return integer */ - public function getRecordId(); - /** @return string */ public function getSha256(); diff --git a/lib/Alchemy/Phrasea/Model/RecordReferenceInterface.php b/lib/Alchemy/Phrasea/Model/RecordReferenceInterface.php new file mode 100644 index 0000000000..6049921cfb --- /dev/null +++ b/lib/Alchemy/Phrasea/Model/RecordReferenceInterface.php @@ -0,0 +1,29 @@ + $records + * @return RecordReferenceCollection + */ + public static function fromArrayOfArray($records) + { + Assertion::allIsArrayAccessible($records); + + $references = []; + + foreach ($records as $index => $record) { + if (isset($record['id'])) { + $references[$index] = RecordReference::createFromRecordReference($record['id']); + } elseif (isset($record['databox_id']) && isset($record['record_id'])) { + $references[$index] = RecordReference::createFromDataboxIdAndRecordId($record['databox_id'], $record['record_id']); + } + } + + return new self($references); + } + + /** + * @var RecordReference[] + */ + private $references = []; + + /** + * @param RecordReference[] $references + */ + public function __construct($references) + { + Assertion::allIsInstanceOf($references, RecordReference::class); + + $this->references = $references; + } + + public function getIterator() + { + return new \ArrayIterator($this->references); + } + + /** + * @return array> + */ + public function groupPerDataboxId() + { + $groups = []; + + foreach ($this->references as $index => $reference) { + $databoxId = $reference->getDataboxId(); + + if (!isset($groups[$databoxId])) { + $groups[$databoxId] = []; + } + + $groups[$databoxId][$reference->getRecordId()] = $index; + } + + return $groups; + } + + /** + * @param \appbox $appbox + * @return \record_adapter[] + */ + public function toRecords(\appbox $appbox) + { + $groups = $this->groupPerDataboxId(); + + $records = []; + + foreach ($groups as $databoxId => $recordIds) { + $databox = $appbox->get_databox($databoxId); + + foreach ($databox->getRecordRepository()->findByRecordIds(array_keys($recordIds)) as $record) { + $records[$recordIds[$record->getRecordId()]] = $record; + } + } + + ksort($records); + + return array_values($records); + } +} diff --git a/lib/Alchemy/Phrasea/SearchEngine/SearchEngineResultToRecordsConverter.php b/lib/Alchemy/Phrasea/SearchEngine/SearchEngineResultToRecordsConverter.php deleted file mode 100644 index efdd81904c..0000000000 --- a/lib/Alchemy/Phrasea/SearchEngine/SearchEngineResultToRecordsConverter.php +++ /dev/null @@ -1,74 +0,0 @@ -appbox = $appbox; - } - - /** - * @param RecordInterface[] $records - * @return \record_adapter[] - */ - public function convert($records) - { - Assertion::allIsInstanceOf($records, RecordInterface::class); - - $perDataboxRecordIds = $this->groupRecordIdsPerDataboxId($records); - - $records = []; - - foreach ($perDataboxRecordIds as $databoxId => $recordIds) { - $databox = $this->appbox->get_databox($databoxId); - - foreach ($databox->getRecordRepository()->findByRecordIds(array_keys($recordIds)) as $record) { - $records[$recordIds[$record->getRecordId()]] = $record; - } - } - - ksort($records); - - return $records; - } - - /** - * @param RecordInterface[] $records - * @return array[] - */ - private function groupRecordIdsPerDataboxId($records) - { - $number = 0; - $perDataboxRecordIds = []; - - foreach ($records as $record) { - $databoxId = $record->getDataboxId(); - - if (!isset($perDataboxRecordIds[$databoxId])) { - $perDataboxRecordIds[$databoxId] = []; - } - - $perDataboxRecordIds[$databoxId][$record->getRecordId()] = $number++; - } - - return $perDataboxRecordIds; - } -}