diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..751d019 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea/ +.Build/ +Build/testing-docker/.env +composer.lock +public/ diff --git a/Classes/Command/CompleteGndWorksCommand.php b/Classes/Command/CompleteGndWorksCommand.php index 4541481..b38cdb9 100644 --- a/Classes/Command/CompleteGndWorksCommand.php +++ b/Classes/Command/CompleteGndWorksCommand.php @@ -4,25 +4,25 @@ * */ -namespace SLUB\MpdbCore\Command; +namespace Slub\MpdbCore\Command; +use Slub\DmNorm\Domain\Repository\GndInstrumentRepository; +use Slub\DmNorm\Domain\Repository\GndGenreRepository; +use Slub\DmNorm\Domain\Repository\GndPersonRepository; +use Slub\DmNorm\Domain\Repository\GndWorkRepository; +use Slub\MpdbCore\Lib\DbArray; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; -use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Extbase\Object\ObjectManager; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface; -use TYPO3\CMS\Core\Core\Bootstrap; -use SLUB\DMNorm\Domain\Repository\InstrumentRepository; -use SLUB\DMNorm\Domain\Repository\FormRepository; -use SLUB\MpdbCore\Lib\DbArray; -use SLUB\MpdbCore\Domain\Repository\PersonRepository; -use SLUB\MpdbCore\Domain\Repository\WorkRepository; -use \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; +use TYPO3\CMS\Extbase\Object\ObjectManager; +use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; /** * CompleteGndWorks Command class @@ -57,6 +57,10 @@ class CompleteGndWorksCommand extends Command */ protected $instrumentRepository = null; + protected ?SymfonyStyle $io = null; + + protected ?ExtensionConfiguration $extConf = null; + /** * formRepository * @@ -75,19 +79,8 @@ protected function initialize(InputInterface $input, OutputInterface $output) { * * @return void */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): void { - /* - $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); - $tmpConfiguration = $configurationManager->getConfiguration( - ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK, - 'publisherDb' - ); - $configurationManager->setConfiguration($tmpConfiguration); - $om = GeneralUtility::makeInstance(ObjectManager::class); - $workRepository = $om->get(WorkRepository::class); - */ - $countWorks = $this->workRepository->findAll()->count(); $nonTitleWorks = $this->workRepository->findByTitle(''); $countNonTitleWorks = $nonTitleWorks->count(); @@ -113,7 +106,7 @@ protected function execute(InputInterface $input, OutputInterface $output) return Command::SUCCESS; } - protected function configure() + protected function configure(): void { $this->setHelp('Fetch GND data for new works (works without title).'); $this->setDescription('Fetching GND data for new works (works without title).'); @@ -126,19 +119,19 @@ protected function configure() * * @param int $storagePid The storage pid * - * @return bool + * @return void */ - protected function initializeRepositories() + protected function initializeRepositories(): void { $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); $frameworkConfiguration = $configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); $frameworkConfiguration['persistence']['storagePid'] = 0; $configurationManager->setConfiguration($frameworkConfiguration); $objectManager = GeneralUtility::makeInstance(ObjectManager::class); - $this->workRepository = $objectManager->get(WorkRepository::class); - $this->personRepository = $objectManager->get(PersonRepository::class); - $this->instrumentRepository = $objectManager->get(InstrumentRepository::class); - $this->formRepository = $objectManager->get(FormRepository::class); + $this->workRepository = $objectManager->get(GndWorkRepository::class); + $this->personRepository = $objectManager->get(GndPersonRepository::class); + $this->instrumentRepository = $objectManager->get(GndInstrumentRepository::class); + $this->formRepository = $objectManager->get(GndGenreRepository::class); $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('mpdb_core'); } diff --git a/Classes/Command/HealthCheckCommand.php b/Classes/Command/HealthCheckCommand.php index 56f5440..8bafdef 100644 --- a/Classes/Command/HealthCheckCommand.php +++ b/Classes/Command/HealthCheckCommand.php @@ -4,23 +4,23 @@ * */ -namespace SLUB\MpdbCore\Command; +namespace Slub\MpdbCore\Command; +use Slub\DmNorm\Domain\Repository\GndPersonRepository; +use Slub\DmNorm\Domain\Repository\GndWorkRepository; +use Slub\MpdbCore\Common\ElasticClientBuilder; +use Slub\MpdbCore\Domain\Repository\PublishedItemRepository; +use Slub\MpdbCore\Lib\DbArray; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ChoiceQuestion; use Symfony\Component\Console\Style\SymfonyStyle; -use SLUB\MpdbCore\Lib\DbArray; -use SLUB\MpdbCore\Common\ElasticClientBuilder; -use SLUB\MpdbCore\Domain\Repository\PublishedItemRepository; -use SLUB\MpdbCore\Domain\Repository\PersonRepository; -use SLUB\MpdbCore\Domain\Repository\WorkRepository; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; use TYPO3\CMS\Extbase\Object\ObjectManager; -use \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; +use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; /** * HealthCheck Command class @@ -40,7 +40,16 @@ class HealthCheckCommand extends Command const choiceRemovePersonDoubles = 'Remove double persons'; const choiceAll = 'Perform all checks'; - protected function initialize(InputInterface $input, OutputInterface $output) { + protected ?PublishedItemRepository $publishedItemRepository = null; + + protected ?GndPersonRepository $personRepository = null; + + protected ?GndWorkRepository $workRepository = null; + + protected ?SymfonyStyle $io = null; + + protected function initialize(InputInterface $input, OutputInterface $output): void + { $this->io = new SymfonyStyle($input, $output); $this->io->title($this->getDescription()); } @@ -48,9 +57,9 @@ protected function initialize(InputInterface $input, OutputInterface $output) { /** * Executes the command to build indices from Database * - * @return void + * @return int */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $helper = $this->getHelper('question'); $question = new ChoiceQuestion( @@ -79,7 +88,7 @@ protected function execute(InputInterface $input, OutputInterface $output) return Command::SUCCESS; } - protected function checkMvdbIds() + protected function checkMvdbIds(): void { $this->io->section('Checking all MVDB IDs'); $publishedItems = $this->publishedItemRepository->findAll(); @@ -102,18 +111,18 @@ protected function checkMvdbIds() /** * Pre-Execution configuration * - * @return array + * @return void */ - protected function configure() + protected function configure(): void { $this->setHelp('Check Database Consistency'); } - protected function setFinal() + protected function setFinal(): void { } - protected function setWorkTitles() + protected function setWorkTitles(): void { $this->io->section('Checking all work titles'); $works = $this->workRepository->findAll(); @@ -134,11 +143,11 @@ protected function setWorkTitles() $this->io->progressFinish(); } - protected function setInstrumentationNames() + protected function setInstrumentationNames(): void { } - protected function removeDoubleWorks() + protected function removeDoubleWorks(): void { $this->io->section('Removing double works'); $publishedItems = $this->publishedItemRepository->findAll(); @@ -175,7 +184,7 @@ protected function removeDoubleWorks() $this->removeUnusedWorks(); } - protected function removeDoublePersons() + protected function removeDoublePersons(): void { $this->io->section('Removing double persons'); $works = $this->workRepository->findAll(); @@ -238,11 +247,11 @@ protected function removeDoublePersons() $this->removeUnusedPersons(); } - protected function removeDoublePlaces() + protected function removeDoublePlaces(): void { } - protected function removeUnusedWorks() + protected function removeUnusedWorks(): void { $this->io->section('Removing unused works'); $publishedItems = $this->publishedItemRepository->findAll(); @@ -267,7 +276,7 @@ protected function removeUnusedWorks() $this->io->progressFinish(); } - protected function removeUnusedPersons() + protected function removeUnusedPersons(): void { $this->io->section('Removing unused persons'); $works = $this->workRepository->findAll(); @@ -311,7 +320,7 @@ protected function removeUnusedPersons() $this->io->progressFinish(); } - protected function removeUnusedPlaces() + protected function removeUnusedPlaces(): void { } @@ -322,17 +331,17 @@ protected function removeUnusedPlaces() * * @param int $storagePid The storage pid * - * @return bool + * @return void */ - protected function initializeRepositories() + protected function initializeRepositories(): void { $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); $frameworkConfiguration = $configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); $frameworkConfiguration['persistence']['storagePid'] = 0; $configurationManager->setConfiguration($frameworkConfiguration); $objectManager = GeneralUtility::makeInstance(ObjectManager::class); - $this->workRepository = $objectManager->get(WorkRepository::class); - $this->publishedItemRepository = $objectManager->get(publishedItemRepository::class); - $this->personRepository = $objectManager->get(PersonRepository::class); + $this->workRepository = $objectManager->get(GndWorkRepository::class); + $this->publishedItemRepository = $objectManager->get(PublishedItemRepository::class); + $this->personRepository = $objectManager->get(GndPersonRepository::class); } } diff --git a/Classes/Command/IndexCommand.php b/Classes/Command/IndexCommand.php index d9e7fcc..52a6057 100644 --- a/Classes/Command/IndexCommand.php +++ b/Classes/Command/IndexCommand.php @@ -2,6 +2,7 @@ namespace Slub\MpdbCore\Command; +use Elastic\Elasticsearch\Client; use Illuminate\Support\Collection; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -29,6 +30,16 @@ class IndexCommand extends Command const WORK_INDEX = 'work'; const PERSON_INDEX = 'person'; + const NAME_COLNAME = 'name'; + const SHORTHAND_COLNAME = 'shorthand'; + const PUBLIC_COLNAME = 'public'; + const PUBLISHER_TABLE_NAME = 'tx_mpdbcore_domain_model_publisher'; + const PUBLISHER_INDEX_NAME = 'publishers'; + + protected string $prefix = ''; + protected ?Client $client = null; + protected ?ExtensionConfiguration $extConf = null; + protected static $personData = [ [ 'name', '', 'string' ], [ 'gnd_id', '', 'string' ], @@ -504,7 +515,10 @@ class IndexCommand extends Command protected $indexList; - protected function initialize(InputInterface $input, OutputInterface $output) { + protected ?SymfonyStyle $io = null; + + protected function initialize(InputInterface $input, OutputInterface $output): void + { $this->dataObjectList = [ 'person' => [ 'table' => 'tx_dmnorm_domain_model_gndperson', @@ -588,19 +602,27 @@ protected function initialize(InputInterface $input, OutputInterface $output) { 'fields' => self::$genreData ] ]; + $this->indexList = [ self::PUBLISHED_ITEM_INDEX => self::$publishedItemSeq, self::PERSON_INDEX => self::$personSeq, self::WORK_INDEX => self::$workSeq ]; + + $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('mpdb_core'); + $this->prefix = $this->extConf['prefix']; + + $this->client = ElasticClientBuilder::create()-> + autoconfig()-> + build(); } /** * Executes the command to build indices from Database * - * @return void + * @return int */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { //$this->initialize(); @@ -616,6 +638,8 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->io->section('Committing Indices'); $this->commitIndices(); + $this->io->section('Indexing Publishers'); + $this->indexPublishers(); $this->io->success('All indices built and committed.'); return 0; @@ -623,29 +647,61 @@ protected function execute(InputInterface $input, OutputInterface $output) } /** - * Commits indices to Elasticsearch + * Indexes public publishers * * @return void */ - protected function commitIndices() { - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('mpdb_core'); - $prefix = $extConf['prefix']; - $client = ElasticClientBuilder::create()-> - autoconfig()-> - build(); + protected function indexPublishers(): void + { + $qb = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable(self::PUBLISHER_TABLE_NAME); + $qb->select( + 'uid', + self::NAME_COLNAME . ' AS name', + self::SHORTHAND_COLNAME . ' AS shorthand', + self::PUBLIC_COLNAME . ' AS public' + )-> + from(self::PUBLISHER_TABLE_NAME); + + if ($this->client->indices()->exists(['index' => $this->prefix . self::PUBLISHER_INDEX_NAME])) { + $this->client->indices()->delete(['index' => $this->prefix . self::PUBLISHER_INDEX_NAME]); + } + + Collection::wrap($qb->execute()->fetchAll())-> + filter(function ($publisher) { return self::isPublic($publisher); })-> + each(function ($publisher) { self::indexPublisher($publisher); }); + } + + private static function isPublic(array $publisher): bool { + return (bool) $publisher[self::PUBLIC_COLNAME]; + } + private function indexPublisher(array $publisher): void { + unset($publisher[self::PUBLIC_COLNAME]); + + $params = [ + 'index' => $this->prefix . self::PUBLISHER_INDEX_NAME, + 'id' => $publisher['uid'], + 'body' => $publisher ]; + + $this->client->index($params); + } + + /** + * Commits indices to Elasticsearch + * + * @return void + */ + protected function commitIndices(): void + { foreach ($this->indices as $name => $index) { $this->io->text('Committing the ' . $name . ' index'); $idField = $this->dataObjectList[$name]['key']; - //$indexName = Collection::wrap([ $extConf['prefix'], $name ]).join('_'); $params = []; $params = [ 'body' => [] ]; $bulkCount = 0; - $client = ElasticClientBuilder::create()-> - autoconfig()-> - build(); $this->io->progressStart(count($index)); foreach ($index as $document) { @@ -653,38 +709,38 @@ protected function commitIndices() { $this->io->progressAdvance(); $params['body'][] = [ 'index' => [ - '_index' => 'temp' . $prefix . $name, + '_index' => 'temp' . $this->prefix . $name, '_id' => $document[$idField] ] ]; $params['body'][] = json_encode($document); // commit bulk - if (!(++$bulkCount % $extConf['bulkSize'])) { - $client->bulk($params); + if (!(++$bulkCount % $this->extConf['bulkSize'])) { + $this->client->bulk($params); $params = [ 'body' => [] ]; } } $this->io->progressFinish(); - $client->bulk($params); + $this->client->bulk($params); - if ($client->indices()->exists(['index' => $prefix . $name])) { - $client->indices()->delete(['index' => $prefix . $name]); + if ($this->client->indices()->exists(['index' => $this->prefix . $name])) { + $this->client->indices()->delete(['index' => $this->prefix . $name]); } $params = [ - 'index' => 'temp' . $prefix . $name, + 'index' => 'temp' . $this->prefix . $name, 'body' => [ 'index.blocks.write' => TRUE ] ]; - $client->indices()->putSettings($params); + $this->client->indices()->putSettings($params); $params = [ - 'index' => 'temp' . $prefix . $name, - 'target' => $prefix . $name + 'index' => 'temp' . $this->prefix . $name, + 'target' => $this->prefix . $name ]; - $client->indices()->clone($params); - $client->indices()->delete(['index' => 'temp' . $prefix . $name]); + $this->client->indices()->clone($params); + $this->client->indices()->delete(['index' => 'temp' . $this->prefix . $name]); } } @@ -693,7 +749,8 @@ protected function commitIndices() { * * @return array */ - protected static function getSelectStmt(array $fields = null, bool $mm) { + protected static function getSelectStmt(array $fields = null, bool $mm): array + { if ($mm) { return [ 'uid_local', 'uid_foreign' ]; } @@ -715,7 +772,8 @@ protected static function getSelectStmt(array $fields = null, bool $mm) { * * @return void */ - protected function fetchObjects() { + protected function fetchObjects(): void + { foreach ($this->dataObjectList as $name => $object) { $mm = preg_match('/_mm/', $name) ? TRUE : FALSE; $fields = isset($object['fields']) ? $object['fields'] : null; @@ -744,7 +802,8 @@ protected function fetchObjects() { * * @return array */ - protected function buildIndex($indexSeq) { + protected function buildIndex($indexSeq): array + { // TODO rewrite to static function? $buffer = []; foreach ($indexSeq as $step) { @@ -786,7 +845,8 @@ protected function buildIndex($indexSeq) { * @param array $bufferedObject * @return array */ - protected function index(array $config, array $bufferedObject = null) { + protected function index(array $config, array $bufferedObject = null): array + { $indexedObjects = []; if ($config['mm']) { @@ -818,9 +878,10 @@ protected function index(array $config, array $bufferedObject = null) { /** * Builds indices * - * @return array + * @return void */ - protected function buildIndices() { + protected function buildIndices(): void + { $this->io->text('Separating Publisher Actions'); $this->dataObjects['prints'] = []; $this->dataObjects['sales'] = []; @@ -852,15 +913,15 @@ protected function buildIndices() { /** * Pre-Execution configuration * - * @return array + * @return void */ - protected function configure() + protected function configure(): void { $this->setHelp('Update elasticsearch index.'); $this->setDescription('Updating the elasticsearch index.'); } - protected function correctDatatypes(array $data, array $tables) + protected function correctDatatypes(array $data, array $tables): array { $mapper = []; foreach($tables as $key => $table) { diff --git a/Classes/Common/ElasticClientBuilder.php b/Classes/Common/ElasticClientBuilder.php index 34e1a73..d73f436 100644 --- a/Classes/Common/ElasticClientBuilder.php +++ b/Classes/Common/ElasticClientBuilder.php @@ -4,14 +4,19 @@ * This class wraps around Elasticsearch's ClientBuilder and offers an automatic configuration */ -namespace SLUB\MpdbCore\Common; +namespace Slub\MpdbCore\Common; use TYPO3\CMS\Core\Utility\GeneralUtility; -use Elasticsearch\ClientBuilder; +use Elastic\Elasticsearch\ClientBuilder; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; class ElasticClientBuilder extends ClientBuilder { + public static function create(): ElasticClientBuilder + { + return new ElasticClientBuilder(); + } + public function autoconfig () { $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('mpdb_core'); diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php index 8131369..5e8f14e 100644 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -1,19 +1,24 @@ searchService = $searchService; + } else { + throw new SearchServiceNotFoundException(); + } + + $this->searchService-> + setSize(self::RESULT_COUNT); + } + /** * @param GndGenreRepository $gndGenreRepository */ @@ -172,6 +209,14 @@ public function injectGndPersonRepository(GndPersonRepository $gndPersonReposito $this->gndPersonRepository = $gndPersonRepository; } + /** + * @param PublisherActionRepository $publisherActionRepository + */ + public function injectPublisherActionRepository(PublisherActionRepository $publisherActionRepository) + { + $this->publisherActionRepository = $publisherActionRepository; + } + /** * @param PublisherRepository $publisherRepository */ diff --git a/Classes/Controller/PublishedItemController.php b/Classes/Controller/PublishedItemController.php index a150a99..cd774c4 100644 --- a/Classes/Controller/PublishedItemController.php +++ b/Classes/Controller/PublishedItemController.php @@ -1,23 +1,24 @@ publisherRepository->findAll(); $desc = false; - $publisherMakroItems = $this->publisherMakroItemRepository-> + $publisherMakroItems = $this->publishedItemRepository-> dbListFe($publisher, $sortString, $desc, $final); $publisherMakroItemPaginator = new QueryResultPaginator($publisherMakroItems, $from, $itemsPerPage); @@ -103,47 +104,28 @@ private function makeQuickpager(int $current, SimplePagination $pagination): arr return $pages; } - private function search($level, $searchTerm, $publisher) + private function searchAction(array $config) { - $umlauts = ['ae', 'oe', 'ue', 'ss', 'ä', 'ö', 'ü', 'é']; - $purgedTerm = str_replace($umlauts, ' ', $searchTerm); - $makrosFromPersons = (new DbArray(explode(' ', $purgedTerm)))-> - filter(function ($term) { return strlen($term) != 1; })-> - map( function ($term) use ($level) { return $this->personRepository->search($term, $level)->toArray(); } )-> - merge()-> - unique()-> - map( function ($person) { return $person->getWorks()->toArray(); } )-> - merge()-> - map( function ($work) { return $work->getPublisherMakroItems()->toArray(); } )-> - merge()-> - filter( function ($makro) { return $makro->getFinal() >= $level; } ); - if ($publisher) { - $makrosFromPersons = $makrosFromPersons - ->filter( function ($makro) use ($publisher) { - return $makro->getPublisher() == $publisher; } ); - } - return (new DbArray())-> - set(explode(' ', $purgedTerm))-> - filter(function ($term) { return strlen($term) != 1; })-> - map(function ($term) use ($level, $publisher) { return $this->publisherMakroItemRepository->dbSearchFe($level, $term, $publisher)->toArray(); })-> - merge()-> - concat($makrosFromPersons->toArray())-> - group( - function ($item) { return $item; }, - function ($item) { return $item->getMvdbId(); } - )-> - map( - function ($groupedItem) use($searchTerm) { - $baseRelevance = 0; - if ($groupedItem['groupObject']->getTitle() === $searchTerm) { - $baseRelevance = 1; - } - return ['item' => $groupedItem['groupObject'], 'relevance' => count($groupedItem['group'])]; - } - )-> - sort(function ($a, $b) { return $a['relevance'] - $b['relevance']; })-> - map(function ($groupedItem) { return $groupedItem['item']; })-> - toArray(); + $publishedItems = $this->searchService-> + setPublisher($config['publisher'] ?? '')-> + setIndex(IndexCommand::PUBLISHED_ITEM_INDEX)-> + setSearchterm($config['searchTerm'] ?? '')-> + setFrom($config['from'] ?? 0)-> + search(); + $totalItems = $this->searchService->count(); + $publishers = $this->searchService-> + reset()-> + setIndex(IndexCommand::PUBLISHER_INDEX_NAME)-> + search()-> + pluck('_source'); + + $this->view->assign('entities', $publishedItems->all()); + $this->view->assign('config', $config); + $this->view->assign('totalItems', $totalItems); + $this->view->assign('publishers', $publishers->all()); + $this->view->assign('resultCount', self::RESULT_COUNT); + + return $this->htmlResponse(); } /** @@ -163,14 +145,16 @@ public function showAction(PublishedItem $publishedItem) // use dbarray! foreach ($publisherMikroItems as $publisherMikroItem) { $publisherActions = array_merge( - $publisherActions, - $this->publisherActionRepository->findByPublisherMikroItem($publisherMikroItem)->toArray() + $publisherActions, + $this->publisherActionRepository-> + findByPublisherMikroItem($publisherMikroItem)-> + toArray() ); } usort($publisherActions, $sortByDate); $document = $this->elasticClient->get([ - 'index' => PublishedItem::TABLE_INDEX_NAME, + 'index' => IndexCommand::PUBLISHED_ITEM_INDEX, 'id' => $publishedItem->getMvdbId() ]); $jsonDocument = json_encode($document['_source']); @@ -208,39 +192,6 @@ protected static function scriptWrap(string $call): string return ''; } - /** - * action lookup - * - * @param string $searchString - * @return void - */ - public function lookupAction(string $searchString) - { - $delim = substr_count($searchString, '_') ? '_' : ','; - $query = explode($delim, $searchString); - if (isset($query[1])) - $plate = trim($query[1]); - $publisherShorthand = trim($query[0]); - $publisher = $this->publisherRepository->findOneByShorthand($publisherShorthand); - - if ($publisher && $plate) { - $publisherMakroItem = $this->publisherMakroItemRepository->lookupPlateId($plate, $publisher, $this->level); - if ($publisherMakroItem) { - foreach ($publisherMakroItem->getPublisherMikroItems() as $publisherMikroItem) { - if ($publisherMikroItem->getPlateId() == $plate) break; - } - if (TYPO3_MODE === 'BE') - $this->redirect('edit', null, null, ['publisherMakroItem' => $publisherMakroItem, 'activeMikro' => $publisherMikroItem]); - else - $this->redirect('show', null, null, ['publisherMakroItem' => $publisherMakroItem]); - } else { - $this->addFlashMessage('Verlagsartikel nicht gefunden', 'Fehler', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR); - $this->redirect('list'); - } - } - $this->redirect('search', null, null, ['term' => $searchString]); - } - /** * action getNext * @@ -249,7 +200,7 @@ public function lookupAction(string $searchString) */ public function getNextAction(PublishedItem $publisherMakroItem) { - $next = $this->publisherMakroItemRepository->findNext($publisherMakroItem); + $next = $this->publishedItemRepository->findNext($publisherMakroItem); if ($next) { $this->redirect('edit', null, null, ['publisherMakroItem' => $next]); } else { @@ -265,7 +216,7 @@ public function getNextAction(PublishedItem $publisherMakroItem) */ public function getPreviousAction(PublishedItem $publisherMakroItem) { - $previous = $this->publisherMakroItemRepository->findPrevious($publisherMakroItem); + $previous = $this->publishedItemRepository->findPrevious($publisherMakroItem); if ($previous) { $this->redirect('edit', null, null, ['publisherMakroItem' => $previous]); } else { @@ -273,118 +224,4 @@ public function getPreviousAction(PublishedItem $publisherMakroItem) } } - /** - * action lookupWork - * - * @param Slub\MpdbCore\Domain\Model\PublishedItem $publisherMakroItem - * @param string $name - * @return void - */ - public function lookupWorkAction(PublisherMakroItem $publisherMakroItem, string $name) - { - $works = $this->workRepository->lookupWork($name); - $this->view->assign('works', $works); - $this->view->assign('name', $name); - $this->view->assign('publisherMakroItem', $publisherMakroItem); - } - - /** - * action lookupForm - * - * @param Slub\MpdbCore\Domain\Model\PublishedItem $publisherMakroItem - * @param string $name - * @return void - */ - public function lookupFormAction( - PublisherMakroItem $publisherMakroItem, - string $name - ) - { - //throw away or refactor - $forms = $this->objectManager->get('SLUB\\PublisherDb\\Domain\\Repository\\FormRepository')->lookupForm($name); - $forms = Tools::elimDuplicates($forms); - $this->view->assign('forms', $forms); - $this->view->assign('publisherMakroItem', $publisherMakroItem); - } - - /** - * action lookupInstrument - * - * @param Slub\MpdbCore\Domain\Model\PublishedItem $publisherMakroItem - * @param string $name - * @return void - */ - public function lookupInstrumentAction(PublishedItem $publisherMakroItem, string $name) - { - //throw away or refactor - $instruments = $this->objectManager->get('SLUB\\PublisherDb\\Domain\\Repository\\InstrumentRepository')->lookupInstrument($name); - $instruments = Tools::elimDuplicates($instruments); - $url = 'http://sdvlodpro.slub-dresden.de:9200/gnd_marc21/_search?q=150.__.a.keyword:' . $name; - $query = json_decode(file_get_contents($url), true); - foreach ($query['hits']['hits'] as $set) { - $superWord = ''; - $flatSet = \SLUB\PublisherDb\Lib\GndLib::flattenDataSet($set['_source']); - foreach ($flatSet[550] as $row) { - if ($row['i'] == 'Oberbegriff allgemein') { - if ($superWord) { - $superWord = $superWord . ', ' . $row['a']; - } else { - $superWord = $row['a']; - } - } - } - $queryOut[] = [ - 'name' => $flatSet[150][0]['a'], - 'superWord' => $superWord, - 'id' => $flatSet['024'][0]['a'] - ]; - } - $this->view->assign('query', $queryOut); - $this->view->assign('instruments', $instruments); - $this->view->assign('publisherMakroItem', $publisherMakroItem); - } - - /** - * action search - * - * @param string $term - * @return void - */ - public function searchAction(string $term) - { - $params = [ - 'index' => 'published_item', - 'body' => [ - 'query' => [ - 'query_string' => [ - 'query' => $term - ] - ] - ] - ]; - $elasticResults = $this->elasticClient->search($params)['hits']['hits']; - - foreach ($elasticResults as $elasticResult) { - $results[] = $this->publisherMakroItemRepository->findByUid($elasticResult['_source']['uid']); - } - - $this->view->assign('publisherMakroItems', $results ?? []); - } - - /** - * action lookupPerson - * - * @param PublisherMakroItem $publisherMakroItem - * @param string $name - * @param string $role - * @return void - */ - public function lookupPersonAction(PublishedItem $publisherMakroItem, string $name, string $role) - { - $persons = $this->personRepository->lookupComposer($name); - $persons = Tools::elimDuplicates($persons); - $this->view->assign('persons', $persons); - $this->view->assign('publisherMakroItem', $publisherMakroItem); - $this->view->assign('role', $role); - } } diff --git a/Classes/Domain/Model/PublishedItem.php b/Classes/Domain/Model/PublishedItem.php index a13198d..e8e3842 100755 --- a/Classes/Domain/Model/PublishedItem.php +++ b/Classes/Domain/Model/PublishedItem.php @@ -1,8 +1,11 @@ pianoCombination = $pianoCombination; @@ -254,7 +250,7 @@ public function setPianoCombination($pianoCombination) * * @return void */ - public function getPianoCombination() + public function getPianoCombination(): string { return $this->pianoCombination; } @@ -262,9 +258,9 @@ public function getPianoCombination() /** * gets if published item is a piano reduction * - * @return boolean + * @return bool */ - public function getIsPianoReduction() + public function getIsPianoReduction(): bool { $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('mpdb_core'); @@ -283,20 +279,23 @@ public function getIsPianoReduction() * @param string $mvdbId * @return void */ - public function setMvdbId() + public function setMvdbId(): void { - $this->setPlateIds(); - $minPlateId = $this->getPlateIds() ? min($this->getPlateIds()) : ''; + $minPlateId = $this->getPlateIds()->min(); $this->mvdbId = $this->publisher->getShorthand() . '_' . $minPlateId; - foreach($this->publishedSubitems as $publishedSubitem) { - $publishedSubitem->setMvdbId( - $this->mvdbId . '_' . - $publishedSubitem->getPlateId() . '_' . - $publishedSubitem->getPart() . '_' . - $publishedSubitem->getVoice()); - } + Collection::wrap($this->publishedSubitems)-> + each( function($subitem) { $this->setSubitemMvdbId($subitem); } ); + } + + protected function setSubitemMvdbId(PublishedSubitem $subitem): void + { + $subitem->setMvdbId( + $this->mvdbId . '_' . + $subitem->getPlateId() . '_' . + $subitem->getPart() . '_' . + $subitem->getVoice()); } /** @@ -304,7 +303,7 @@ public function setMvdbId() * * @return string type */ - public function getType() + public function getType(): string { return $this->type; } @@ -315,7 +314,7 @@ public function getType() * @param int $type * @return void */ - public function setType($type) + public function setType($type): void { $this->type = $type; } @@ -325,12 +324,11 @@ public function setType($type) */ public function __construct() { - //Do not remove the next line: It would break the functionality $this->initializeObject(); } - public function initializeObject() + public function initializeObject(): void { $this->containedWorks = new ObjectStorage(); $this->editors = new ObjectStorage(); @@ -345,7 +343,7 @@ public function initializeObject() * * @return string $instrumentation */ - public function getInstrumentation() + public function getInstrumentation(): string { return $this->instrumentation; } @@ -356,7 +354,7 @@ public function getInstrumentation() * @param string $instrumentation * @return void */ - public function setInstrumentation($instrumentation) + public function setInstrumentation($instrumentation): void { $this->instrumentation = $instrumentation; } @@ -366,7 +364,7 @@ public function setInstrumentation($instrumentation) * * @return \Slub\MpdbCore\Domain\Model\Publisher $publisher */ - public function getPublisher() + public function getPublisher(): Publisher { return $this->publisher; } @@ -377,13 +375,10 @@ public function getPublisher() * @param \Slub\MpdbCore\Domain\Model\Publisher $publisher * @return void */ - public function setPublisher(Publisher $publisher = null) + public function setPublisher(Publisher $publisher = null): void { - $this->mvdbId = $this->getPlateIdFrom(); - if ($publisher !== null) { - $this->mvdbId = $publisher->getShorthand() . '_' . $this->mvdbId; - } $this->publisher = $publisher; + $this->setMvdbId(); } /** @@ -391,7 +386,7 @@ public function setPublisher(Publisher $publisher = null) * * @return string title */ - public function getTitle() + public function getTitle(): string { return $this->title; } @@ -402,7 +397,7 @@ public function getTitle() * @param int $title * @return void */ - public function setTitle($title) + public function setTitle($title): void { $this->title = $title; } @@ -413,11 +408,12 @@ public function setTitle($title) * @param \Slub\PublisherDb\Domain\Model\PublishedSubitem $publishedSubitem * @return void */ - public function addPublishedSubitem(PublishedSubitem $publishedSubitem = null) + public function addPublishedSubitem(PublishedSubitem $publishedSubitem = null): void { if ($publishedSubitem != null) { $this->publishedSubitems->attach($publishedSubitem); } + $this->setMvdbId(); } /** @@ -426,7 +422,7 @@ public function addPublishedSubitem(PublishedSubitem $publishedSubitem = null) * @param \Slub\MpdbCore\Domain\Model\PublishedSubitem $publishedSubitemToRemove * @return void */ - public function removePublishedSubitem(PublishedSubitem $publishedSubitemToRemove) + public function removePublishedSubitem(PublishedSubitem $publishedSubitemToRemove): void { $this->publishedSubitems->detach($publishedSubitemToRemove); } @@ -437,7 +433,7 @@ public function removePublishedSubitem(PublishedSubitem $publishedSubitemToRemov * @param \Slub\DmNorm\Domain\Model\GndWork $containedWork * @return void */ - public function addContainedWork(GndWork $containedWork = null) + public function addContainedWork(GndWork $containedWork = null): void { if ($containedWork != null) { $this->containedWorks->attach($containedWork); @@ -450,7 +446,7 @@ public function addContainedWork(GndWork $containedWork = null) * @param \Slub\DmNorm\Domain\Model\GndWork $containedWorkToRemove The Work to be removed * @return void */ - public function removeContainedWork(GndWork $containedWorkToRemove) + public function removeContainedWork(GndWork $containedWorkToRemove): void { $this->containedWorks->detach($containedWorkToRemove); } @@ -460,7 +456,7 @@ public function removeContainedWork(GndWork $containedWorkToRemove) * * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\MpdbCore\Domain\Model\PublisherActions> publisherActions */ - public function getPublisherActions() + public function getPublisherActions(): ObjectStorage { return array_merge( ...array_map( @@ -476,9 +472,9 @@ function ($mikro) { * Returns boolean indicating if there are publisherActions pointing * to the Makro * - * @return boolean + * @return bool */ - public function getHasPublisherActions() + public function getHasPublisherActions(): bool { $mikros = $this->getPublishedSubitems()->toArray(); foreach ($mikros as $mikro) { @@ -494,9 +490,9 @@ public function getHasPublisherActions() * * @return string */ - public function getNumberOfMikroString() + public function getNumberOfMikroString(): string { - return $this->publishedSubitemRepository->getNumberOfMikroString($this); + return $this->publishedSubitems->count(); } /** @@ -504,7 +500,7 @@ public function getNumberOfMikroString() * * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\MpdbCore\Domain\Model\PublishedSubitem> $publishedSubitems */ - public function getPublishedSubitems() + public function getPublishedSubitems(): ObjectStorage { return $this->publishedSubitems; } @@ -515,7 +511,7 @@ public function getPublishedSubitems() * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\MpdbCore\Domain\Model\PublishedSubitem> $publishedSubitems * @return void */ - public function setPublishedSubitems(ObjectStorage $publishedSubitems = null) + public function setPublishedSubitems(ObjectStorage $publishedSubitems = null): void { $publishedSubitems = $publishedSubitems ?? new ObjectStorage(); $this->publishedSubitems = $publishedSubitems; @@ -526,7 +522,7 @@ public function setPublishedSubitems(ObjectStorage $publishedSubitems = null) * * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmNorm\Domain\Model\GndWork> $containedWorks */ - public function getContainedWorks() + public function getContainedWorks(): ObjectStorage { return $this->containedWorks; } @@ -537,111 +533,18 @@ public function getContainedWorks() * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmNorm\Domain\Model\GndWork> $containedWorks * @return void */ - public function setContainedWorks(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $containedWorks = null) + public function setContainedWorks(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $containedWorks = null): void { $containedWorks = $containedWorks ?? new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); $this->containedWorks = $containedWorks; } - /** - * Returns the plateIdFrom - * - * @return string $plateIdFrom - */ - public function getPlateIdFrom() - { - // ?? - return (new \SLUB\PublisherDb\Lib\DbArray())->set($this->getPublishedSubitems())->map( - function ($mikro) { - return $mikro->getPlateId(); - } - )->reduce( - function ($a, $b) { - return $a < $b ? $a : $b; - }, - '10000000' - ); - } - - /** - * Checks if current plateIdFrom is minimal plateId of contained Mikros - * - * @param array $mikros - * @return void - */ - public function minPlateIdFromAdd(array $mikros) - { - // throw away!! - $getPlateId = function(PublishedSubitem $publishedSubitem): string { - return $publishedSubitem->getPlateId(); - }; - - $this->plateIdFrom = (new DbArray()) - ->set( $mikros ) - ->map( $getPlateId ) - ->min(); - $this->updateIdentifier(); - } - - /** - * Checks if current plateIdFrom is minimal plateId of contained Mikros - * - * @param \TYPO3\CMS\Extbase\Persistence\Generic\QueryResult $mikros - * @param string $oldPlateId - * @return void - */ - public function minPlateIdFromRemove(\TYPO3\CMS\Extbase\Persistence\Generic\QueryResult $mikros, string $oldPlateId) - { - // throw away! - $min = '10000000'; - $encounteredSameNumber = false; - foreach ($mikros as $mikro) { - if (!$encounteredSameNumber && $mikro->getPlateId() != $oldPlateId) { - continue; - } - if ($mikro->getPlateId() < $min) { - $min = $mikro->getPlateId(); - } - } - $this->plateIdFrom = $min; - $this->updateIdentifier(); - } - - public function updateMvdbId() { - $getPlateId = function(PublishedSubitem $publishedSubitem): string { - return $publishedSubitem->getPlateId(); - }; - - $this->plateIdFrom = (new DbArray()) - ->set( $this->getPublishedSubitems()->toArray() ) - ->map( $getPlateId ) - ->min(); - - $this->mvdbId = $this->plateIdFrom; - if (!is_null($this->publisher)) { - $this->mvdbId = $this->publisher->getShorthand() . '_' . $this->plateIdFrom; - } - } - /** - * Updates Identifier according to publisher name and plateIdFrom - * - * @return void - */ - public function updateIdentifier() - { - // throw away! - $this->mvdbId = $this->plateIdFrom; - if (!is_null($this->publisher)) { - $this->mvdbId = $this->publisher->getShorthand() . '_' . $this->plateIdFrom; - } - } - /** * Returns the dataAcquisitionCertain * * @return bool $dataAcquisitionCertain */ - public function getDataAcquisitionCertain() + public function getDataAcquisitionCertain(): bool { return $this->dataAcquisitionCertain; } @@ -652,7 +555,7 @@ public function getDataAcquisitionCertain() * @param bool $dataAcquisitionCertain * @return void */ - public function setDataAcquisitionCertain($dataAcquisitionCertain) + public function setDataAcquisitionCertain($dataAcquisitionCertain): void { $this->dataAcquisitionCertain = $dataAcquisitionCertain; } @@ -662,7 +565,7 @@ public function setDataAcquisitionCertain($dataAcquisitionCertain) * * @return bool */ - public function isDataAcquisitionCertain() + public function isDataAcquisitionCertain(): bool { return $this->dataAcquisitionCertain; } @@ -672,7 +575,7 @@ public function isDataAcquisitionCertain() * * @return bool $relatedPersonsKnown */ - public function getRelatedPersonsKnown() + public function getRelatedPersonsKnown(): bool { return $this->relatedPersonsKnown; } @@ -683,7 +586,7 @@ public function getRelatedPersonsKnown() * @param bool $relatedPersonsKnown * @return void */ - public function setRelatedPersonsKnown($relatedPersonsKnown) + public function setRelatedPersonsKnown($relatedPersonsKnown): void { $this->relatedPersonsKnown = $relatedPersonsKnown; } @@ -693,7 +596,7 @@ public function setRelatedPersonsKnown($relatedPersonsKnown) * * @return bool */ - public function isRelatedPersonsKnown() + public function isRelatedPersonsKnown(): bool { return $this->relatedPersonsKnown; } @@ -703,7 +606,7 @@ public function isRelatedPersonsKnown() * * @return bool $workExamined */ - public function getWorkExamined() + public function getWorkExamined(): bool { return $this->workExamined; } @@ -714,7 +617,7 @@ public function getWorkExamined() * @param bool $workExamined * @return void */ - public function setWorkExamined($workExamined) + public function setWorkExamined($workExamined): void { $this->workExamined = $workExamined; } @@ -724,7 +627,7 @@ public function setWorkExamined($workExamined) * * @return bool */ - public function isWorkExamined() + public function isWorkExamined(): bool { return $this->workExamined; } @@ -734,7 +637,7 @@ public function isWorkExamined() * * @return bool $dataSetManuallyChecked */ - public function getDataSetManuallyChecked() + public function getDataSetManuallyChecked(): bool { return $this->dataSetManuallyChecked; } @@ -745,7 +648,7 @@ public function getDataSetManuallyChecked() * @param bool $dataSetManuallyChecked * @return void */ - public function setDataSetManuallyChecked($dataSetManuallyChecked) + public function setDataSetManuallyChecked(bool $dataSetManuallyChecked): void { $this->dataSetManuallyChecked = $dataSetManuallyChecked; } @@ -755,7 +658,7 @@ public function setDataSetManuallyChecked($dataSetManuallyChecked) * * @return bool */ - public function isDataSetManuallyChecked() + public function isDataSetManuallyChecked(): bool { return $this->dataSetManuallyChecked; } @@ -765,7 +668,7 @@ public function isDataSetManuallyChecked() * * @return bool $containedWorksIdentified */ - public function getContainedWorksIdentified() + public function getContainedWorksIdentified(): bool { return $this->containedWorksIdentified; } @@ -776,7 +679,7 @@ public function getContainedWorksIdentified() * @param bool $containedWorksIdentified * @return void */ - public function setContainedWorksIdentified($containedWorksIdentified) + public function setContainedWorksIdentified(bool $containedWorksIdentified): void { $this->containedWorksIdentified = $containedWorksIdentified; } @@ -786,7 +689,7 @@ public function setContainedWorksIdentified($containedWorksIdentified) * * @return bool */ - public function isContainedWorksIdentified() + public function isContainedWorksIdentified(): bool { return $this->containedWorksIdentified; } @@ -796,7 +699,7 @@ public function isContainedWorksIdentified() * * @return string $responsiblePerson */ - public function getResponsiblePerson() + public function getResponsiblePerson(): GndPerson { return $this->responsiblePerson; } @@ -807,7 +710,7 @@ public function getResponsiblePerson() * @param string $responsiblePerson * @return void */ - public function setResponsiblePerson($responsiblePerson) + public function setResponsiblePerson(GndPerson $responsiblePerson): void { $this->responsiblePerson = $responsiblePerson; } @@ -817,7 +720,7 @@ public function setResponsiblePerson($responsiblePerson) * * @return \DateTime $dateOfPublishing */ - public function getDateOfPublishing() + public function getDateOfPublishing(): \DateTime { return $this->dateOfPublishing; } @@ -828,7 +731,7 @@ public function getDateOfPublishing() * @param \DateTime $dateOfPublishing * @return void */ - public function setDateOfPublishing(\DateTime $dateOfPublishing) + public function setDateOfPublishing(\DateTime $dateOfPublishing): void { $this->dateOfPublishing = $dateOfPublishing; } @@ -838,7 +741,7 @@ public function setDateOfPublishing(\DateTime $dateOfPublishing) * * @return string mvdbId */ - public function getMvdbId() + public function getMvdbId(): string { return $this->mvdbId; } @@ -849,7 +752,7 @@ public function getMvdbId() * @param \Slub\DmOnt\Domain\Model\Instrument $instrument * @return void */ - public function addInstrument($instrument) + public function addInstrument(Instrument $instrument): void { $this->instruments->attach($instrument); } @@ -860,7 +763,7 @@ public function addInstrument($instrument) * @param \Slub\DmOnt\Domain\Model\Instrument $instrumentToRemove The Instrument to be removed * @return void */ - public function removeInstrument($instrumentToRemove) + public function removeInstrument(Instrument $instrumentToRemove): void { $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('mpdb_core'); if ($instrumentToRemove->getGndId() == $extConf['pianoGndId']) { @@ -874,7 +777,7 @@ public function removeInstrument($instrumentToRemove) * * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmOnt\Domain\Model\Instrument> instruments */ - public function getInstruments() + public function getInstruments(): ObjectStorage { return $this->instruments; } @@ -885,7 +788,7 @@ public function getInstruments() * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmOnt\Domain\Model\Instrument> $instruments * @return void */ - public function setInstruments(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $instruments) + public function setInstruments(ObjectStorage $instruments): void { $this->instruments = $instruments; } @@ -896,7 +799,7 @@ public function setInstruments(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $ins * @param \Slub\DmOnt\Domain\Model\Genre $genre * @return void */ - public function addForm($form) + public function addForm(Genre $form): void { $this->form->attach($form); } @@ -907,7 +810,7 @@ public function addForm($form) * @param \Slub\DmOnt\Domain\Model\Genre $formToRemove The Form to be removed * @return void */ - public function removeForm($formToRemove) + public function removeForm(Genre $formToRemove): void { $this->form->detach($formToRemove); } @@ -917,7 +820,7 @@ public function removeForm($formToRemove) * * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmOnt\Domain\Model\Genre> form */ - public function getForm() + public function getForm(): Genre { return $this->form; } @@ -928,7 +831,7 @@ public function getForm() * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmOnt\Domain\Model\Genre> $form * @return void */ - public function setForm(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $form) + public function setForm(ObjectStorage $form): void { $this->form = $form; } @@ -939,7 +842,7 @@ public function setForm(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $form) * @param \Slub\DmNorm\Domain\Model\GndPerson $editor * @return void */ - public function addEditor(GndPerson $editor) + public function addEditor(GndPerson $editor): void { $this->editors->attach($editor); } @@ -950,7 +853,7 @@ public function addEditor(GndPerson $editor) * @param \Slub\DmNorm\Domain\Model\GndPerson $editorToRemove * @return void */ - public function removeEditor(GndPerson $editorToRemove) + public function removeEditor(GndPerson $editorToRemove): void { $this->editors->detach($editorToRemove); } @@ -960,7 +863,7 @@ public function removeEditor(GndPerson $editorToRemove) * * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmNorm\Domain\Model\GndPerson> */ - public function getEditors() + public function getEditors(): ObjectStorage { return $this->editors; } @@ -971,7 +874,7 @@ public function getEditors() * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmNorm\Domain\Model\GndPerson> $editors * @return void */ - public function setEditors(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $editors) + public function setEditors(ObjectStorage $editors): void { $this->editors = $editors; } @@ -981,7 +884,7 @@ public function setEditors(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $editors * * @return int final */ - public function getFinal() + public function getFinal(): int { return $this->final; } @@ -992,24 +895,26 @@ public function getFinal() * @param bool $final * @return void */ - public function setFinal($final) + public function setFinal(bool $final): void { - $works = (new \SLUB\PublisherDb\Lib\DbArray())->set($this->getContainedWorks()->toArray()); - $works->each( - function ($work) use($final) { - $work->updateFinal($final, $this); - $this->gndWorkRepository->update($work); - } - ); $this->final = $final; + Collection::wrap($this->getContainedWorks()->toArray())-> + each( function($work) { $this->updateFinalWork($work); } ); + } + + protected function updateFinalWork(GndWork $work): void + { + $work->updateFinal($this->final, $this); + $this->gndWorkRepository->update($work); } + /** * Returns the language * * @return string $language */ - public function getLanguage() + public function getLanguage(): string { return $this->language; } @@ -1020,7 +925,7 @@ public function getLanguage() * @param string $language * @return void */ - public function setLanguage($language) + public function setLanguage($language): void { $this->language = $language; } @@ -1031,7 +936,7 @@ public function setLanguage($language) * @param \Slub\DmNorm\Domain\Model\GndPerson $firstComposer * @return void */ - public function addFirstComposer(GndPerson $firstComposer) + public function addFirstComposer(GndPerson $firstComposer): void { $this->firstComposer->attach($firstComposer); } @@ -1042,7 +947,7 @@ public function addFirstComposer(GndPerson $firstComposer) * @param \Slub\DmNorm\Domain\Model\GndPerson $firstComposerToRemove * @return void */ - public function removeFirstComposer(GndPerson $firstComposerToRemove) + public function removeFirstComposer(GndPerson $firstComposerToRemove): void { $this->firstComposer->detach($firstComposerToRemove); } @@ -1052,7 +957,7 @@ public function removeFirstComposer(GndPerson $firstComposerToRemove) * * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmNorm\Domain\Model\GndPerson> $firstComposer */ - public function getFirstComposer() + public function getFirstComposer(): ObjectStorage { return $this->firstComposer; } @@ -1063,7 +968,7 @@ public function getFirstComposer() * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Slub\DmNorm\Domain\Model\GndPerson> $firstComposer * @return void */ - public function setFirstComposer(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $firstComposer) + public function setFirstComposer(ObjectStorage $firstComposer): void { $this->firstComposer = $firstComposer; } @@ -1073,24 +978,28 @@ public function setFirstComposer(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $f * * @return string */ - public function getComposers() + public function getComposers(): string { - if ($this->firstComposer && $this->firstComposer->toArray() != []) { - return (new \SLUB\PublisherDb\Lib\DbArray())->set($this->firstComposer)->map( - function ($composer) { - return $composer->getName(); - } - )->unique()->implode('; '); + $composers = Collection::wrap($this->firstComposer); + if ($composers->count() > 0) { + return $composers->map( function ($composer) { return self::getComposerName($composer); } )-> + unique()-> + join('; '); } - return (new \SLUB\PublisherDb\Lib\DbArray())->set($this->getContainedWorks()->toArray())->map( - function ($work) { - return $work->getFirstComposer() ? $work->getFirstComposer()->getName() : ''; - } - )->filter( - function ($name) { - return $name != ''; - } - )->unique()->implode('; '); + return Collection::wrap($this->containedWorks->toArray())-> + map( function($work) { return self::getWorkComposerName($work); } )-> + unique()-> + join(';'); + } + + protected static function getComposerName(GndPerson $composer): string + { + return $composer->getName(); + } + + protected static function getWorkComposerName(GndWork $work): string + { + return self::getComposerName($work->getFirstComposer()); } /** @@ -1098,19 +1007,25 @@ function ($name) { * * @return string $plateIds */ - public function getPlateIds() + public function getPlateIds(): Collection { - return json_decode($this->plateIds); + return Collection::wrap($this->publishedSubitems)-> + map( function($subitem) { return self::getSubitemPlateId($subitem); } ); } /** - * Returns a string for plateIds + * Returns the plateIds as a newline separated string * - * @return string $plateIdsString + * @return string $plateIds */ - public function getPlateIdsString() + public function getPlateIdsString(): string { - return implode("\n", $this->getPlateIds()); + return $this->getPlateIds()->join('\n'); + } + + protected static function getSubitemPlateId(PublishedSubitem $subitem): string + { + return $subitem->getPlateId(); } /** @@ -1118,7 +1033,7 @@ public function getPlateIdsString() * * @return string $comment */ - public function getComment() + public function getComment(): string { return $this->comment; } @@ -1129,50 +1044,31 @@ public function getComment() * @param string $comment * @return void */ - public function setComment($comment) + public function setComment(string $comment): void { $this->comment = $comment; } - /** - * Sets the plateIds - * - * @param string $plateIds - * @return void - */ - public function setPlateIds() - { - $plateIds = []; - - foreach($this->publishedSubitems as $publishedSubitem) { - if(!in_array($publishedSubitem->getPlateId(), $plateIds)) { - $plateIds[] = $publishedSubitem->getPlateId(); - } - } - - $this->plateIds = json_encode($plateIds); - } - /** * Returns bool indicating if there is a PublishedSubitem not * Linking a workRepository * * @return bool */ - public function getHasMikroWithoutWork() + public function getHasMikroWithoutWork(): bool { - $hasNoLinkedWorks = function (PublishedSubitem $mikro) { - return $mikro->getContainedWorks()->toArray() == []; - }; - $or = function (bool $a, bool $b) { - return $a || $b; - }; - return (new DbArray())->set($this->getPublishedSubitems())->map($hasNoLinkedWorks)->reduce($or, false); + return Collection::wrap($this->publishedSubitems)-> + map(function ($subitem) { return self::subitemWithoutWorks($subitem); } )-> + reduce(function ($a, $b) { return self::or($a, $b); } ); } - // TODO - public function proposeDataAcquisitionCertain() + protected static function subitemWithoutWorks(PublishedSubitem $subitem): bool { - return false; + return $subitem->getContainedWorks()->count() > 0; + } + + protected static function or(bool $a, bool $b): bool + { + return $a || $b; } } diff --git a/Classes/Domain/Model/PublishedSubitem.php b/Classes/Domain/Model/PublishedSubitem.php index a2170cd..b671229 100755 --- a/Classes/Domain/Model/PublishedSubitem.php +++ b/Classes/Domain/Model/PublishedSubitem.php @@ -1,7 +1,9 @@ + * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\DmNorm\Domain\Model\GndWork> */ protected $containedWorks = null; /** * publisherActions * - * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\PublisherDb\Domain\Model\PublisherAction> + * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\MpdbCore\Domain\Model\PublisherAction> */ protected $publisherActions = null; @@ -282,10 +284,10 @@ public function setComment($comment) /** * Adds a PublisherAction * - * @param \SLUB\PublisherDb\Domain\Model\PublisherAction $publisherAction + * @param \SLUB\MpdbCore\Domain\Model\PublisherAction $publisherAction * @return void */ - public function addPublisherAction(\SLUB\PublisherDb\Domain\Model\PublisherAction $publisherAction = null) + public function addPublisherAction(PublisherAction $publisherAction = null) { if ($publisherAction != null) { $this->publisherActions->attach($publisherAction); @@ -295,10 +297,10 @@ public function addPublisherAction(\SLUB\PublisherDb\Domain\Model\PublisherActio /** * Removes a PublisherAction * - * @param \SLUB\PublisherDb\Domain\Model\PublisherAction $publisherActionToRemove The PublisherAction to be removed + * @param \SLUB\MpdbCore\Domain\Model\PublisherAction $publisherActionToRemove The PublisherAction to be removed * @return void */ - public function removePublisherAction(\SLUB\PublisherDb\Domain\Model\PublisherAction $publisherActionToRemove) + public function removePublisherAction(PublisherAction $publisherActionToRemove) { $this->publisherActions->detach($publisherActionToRemove); } @@ -306,7 +308,7 @@ public function removePublisherAction(\SLUB\PublisherDb\Domain\Model\PublisherAc /** * Returns the publisherActions * - * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\PublisherDb\Domain\Model\PublisherAction> publisherActions + * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\MpdCore\Domain\Model\PublisherAction> publisherActions */ public function getPublisherActions() { @@ -316,7 +318,7 @@ public function getPublisherActions() /** * Sets the publisherActions * - * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\PublisherDb\Domain\Model\PublisherAction> $publisherActions + * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\MpdCore\Domain\Model\PublisherAction> $publisherActions * @return void */ public function setPublisherActions(ObjectStorage $publisherActions = null) @@ -328,10 +330,10 @@ public function setPublisherActions(ObjectStorage $publisherActions = null) /** * Adds a Work * - * @param \SLUB\PublisherDb\Domain\Model\Work $containedWork + * @param \SLUB\DmNorm\Domain\Model\GndWork $containedWork * @return void */ - public function addContainedWork(\SLUB\PublisherDb\Domain\Model\Work $containedWork = null) + public function addContainedWork(GndWork $containedWork = null) { if ($containedWork != null) { $this->containedWorks->attach($containedWork); @@ -341,10 +343,10 @@ public function addContainedWork(\SLUB\PublisherDb\Domain\Model\Work $containedW /** * Removes a Work * - * @param \SLUB\PublisherDb\Domain\Model\Work $containedWorkToRemove The Work to be removed + * @param \SLUB\DmOnt\Domain\Model\GndWork $containedWorkToRemove The Work to be removed * @return void */ - public function removeContainedWork(\SLUB\PublisherDb\Domain\Model\Work $containedWorkToRemove) + public function removeContainedWork(GndWork $containedWorkToRemove) { $this->containedWorks->detach($containedWorkToRemove); } @@ -352,7 +354,7 @@ public function removeContainedWork(\SLUB\PublisherDb\Domain\Model\Work $contain /** * Returns the containedWorks * - * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\PublisherDb\Domain\Model\Work> containedWorks + * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\DmOnt\Domain\Model\GndWork> containedWorks */ public function getContainedWorks() { @@ -362,7 +364,7 @@ public function getContainedWorks() /** * Sets the containedWorks * - * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\PublisherDb\Domain\Model\Work> $containedWorks + * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\DmOnt\Domain\Model\GndWork> $containedWorks * @return void */ public function setContainedWorks(ObjectStorage $containedWorks = null) @@ -590,15 +592,16 @@ public function setStartStore($startStore) */ public function getComposers() { - return (new \SLUB\PublisherDb\Lib\DbArray())->set($this->getContainedWorks()->toArray())->map( - function ($work) { - return $work->getFirstComposer() ? $work->getFirstComposer()->getName() : ''; - } - )->filter( - function ($name) { - return $name != ''; - } - )->unique()->implode(', '); + return Collection::wrap($this->containedWorks)-> + map( function($work) { return self::getWorkComposerName($work); } )-> + filter( function($name) { return $name != ''; } )-> + unique()-> + implode(', '); + } + + protected static function getWorkComposerName(GndWork $work): string + { + return $work->getFirstComposer()->getName(); } /** diff --git a/Classes/Domain/Model/Publisher.php b/Classes/Domain/Model/Publisher.php index cb3c0c7..d928a30 100755 --- a/Classes/Domain/Model/Publisher.php +++ b/Classes/Domain/Model/Publisher.php @@ -62,11 +62,18 @@ class Publisher extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity protected $activeTo = null; /** - * publisherMakroItems + * publishedItems * - * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\PublisherDb\Domain\Model\PublisherMakroItem> + * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\MpdbCore\Domain\Model\PublishedItem> */ - protected $publisherMakroItems = null; + protected $publishedItems = null; + + /** + * responsiblePersons + * + * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\DmNorm\Domain\Model\GndPerson> + */ + protected $responsiblePersons = null; /** * __construct @@ -89,7 +96,7 @@ public function __construct() protected function initStorageObjects() { $this->responsiblePersons = new ObjectStorage(); - $this->publisherMikroItems = new ObjectStorage(); + $this->publishedItems = new ObjectStorage(); } /** @@ -223,9 +230,9 @@ public function setActiveTo(\DateTime $activeTo = null) * * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SLUB\PublisherDb\Domain\Model\PublisherMakroItem> $publisherMakroItems */ - public function getPublisherMakroItems() + public function getPublishedItems() { - return $this->publisherMakroItems; + return $this->publishedItems; } /** @@ -237,7 +244,7 @@ public function getPublisherMakroItems() public function setPublisherMakroItems(ObjectStorage $publisherMakroItems = null) { $publisherMakroItems = $publisherMakroItems ?? new ObjectStorage(); - $this->publisherMakroItems = $publisherMakroItems; + $this->publishedItems = $publisherMakroItems; } } diff --git a/Classes/Services/ElasticSearchService.php b/Classes/Services/ElasticSearchService.php new file mode 100644 index 0000000..ffbc71c --- /dev/null +++ b/Classes/Services/ElasticSearchService.php @@ -0,0 +1,206 @@ +index = ''; + } else { + $this->index = $this->prefix . $index; + } + + return $this; + } + + public function setPublisher(string $publisher = ''): SearchServiceInterface + { + if ($publisher != '' && $this->id != '') { + throw new InvalidParamsException('Attempted to restrict search for publisher while searching for id'); + } + + $this->publisher = $publisher; + + return $this; + } + + public function setSearchterm(string $searchTerm = ''): SearchServiceInterface + { + if ($searchTerm != '' && $this->id != '') { + throw new InvalidParamsException('Attempted to search for term and id simultaneously'); + } + + $this->searchTerm = $searchTerm; + + return $this; + } + + public function setId(string $id = ''): SearchServiceInterface + { + if ($id != '' && $this->searchTerm != '') { + throw new InvalidParamsException('Attempted to search for term and id simultaneously'); + } + if ($id != '' && $this->publisher != '') { + throw new InvalidParamsException('Attempted to restrict search for publisher while searching for id'); + } + + if ($id == '') { + $this->method = 'search'; + } else { + $this->method = 'get'; + } + + $this->id = $id; + + return $this; + } + + public function setFrom(int $from = 0): SearchServiceInterface + { + $this->from = $from; + + return $this; + } + + public function setSize(int $size = self::DEFAULT_RESULT_COUNT): SearchServiceInterface + { + $this->size = $size; + + return $this; + } + + public function search(): Collection + { + if ($this->id != '' && $this->index == '') { + throw new InvalidParamsException('Id specified but index unspecified'); + } + + $this->createParams(); + + switch ($this->method) { + case 'search': + $result = $this->client->search($this->params); + return Collection::wrap($result['hits']['hits']); + break; + case 'get': + $result = $this->client->get($this->params); + return Collection::wrap($result['_source']); + break; + } + + return Collection::wrap([]); + } + + public function count(): int + { + if ($this->method == 'get') { + throw new InvalidOperationException('Attempt to count a id based search'); + } + + $this->createParams(); + unset($this->params['body']['size']); + unset($this->params['body']['from']); + + return $this->client->count($this->params)['count']; + } + + public function reset(): SearchServiceInterface + { + $this->setIndex(); + $this->setPublisher(); + $this->setSearchterm(); + $this->setId(); + $this->setFrom(); + $this->setSize(); + $this->method = 'search'; + + return $this; + } + + public function init(): bool + { + $this->client = ElasticClientBuilder::create()-> + autoconfig()-> + build(); + $coreExtConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('mpdb_core'); + $this->prefix = $coreExtConf['prefix']; + + return true; + } + + private function createParams(): void + { + $this->params = []; + + if ($this->index != '') { + $this->params['index'] = $this->index; + } else { + $this->params['index'] = Collection::wrap([ + $this->prefix . IndexCommand::PUBLISHED_ITEM_INDEX, + $this->prefix . IndexCommand::WORK_INDEX, + $this->prefix . IndexCommand::PERSON_INDEX])-> + join(','); + } + + if ($this->id != '') { + $this->params['id'] = $this->id; + } + + if ($this->method == 'search') { + $this->params['body'] = [ 'query' => [] ]; + $this->params['body']['size'] = $this->size; + $this->params['body']['from'] = $this->from; + + if ($this->searchTerm == '') { + $this->params['body']['query'] = [ + 'bool' => [ + 'must' => [ [ + 'match_all' => new \stdClass() + ] ] + ] + ]; + } else { + $this->params['body']['query'] = [ + 'bool' => [ + 'must' => [ [ + 'query_string' => [ + 'query' => $this->searchTerm + ] + ] ] + ] + ]; + } + + if ($this->publisher != '') { + $this->params['body']['query']['bool']['must'][] = + [ 'query_string' => [ + 'query' => $this->publisher . '_*', + 'fields' => [ 'mvdb_id', 'published_items.mvdb_id', 'works.published_items.mvdb_id' ] + ] + ]; + } + } + } +} diff --git a/Classes/Services/InvalidOperationException.php b/Classes/Services/InvalidOperationException.php new file mode 100644 index 0000000..9b0fcf1 --- /dev/null +++ b/Classes/Services/InvalidOperationException.php @@ -0,0 +1,8 @@ + 'Elasticsearch Service', + 'description' => 'Provides the frontend with a connection to elasticsearch', + 'subtype' => '', + 'available' => true, + 'priority' => 50, + 'quality' => 50, + 'os' => '', + 'exec' => '', + 'className' => ElasticSearchService::class, + ] +);