diff --git a/VERSIONS_HOTLINE/93469 b/VERSIONS_HOTLINE/93469 new file mode 100644 index 0000000000000000000000000000000000000000..12c56708a1db4023e5f600a06c523ad692029d65 --- /dev/null +++ b/VERSIONS_HOTLINE/93469 @@ -0,0 +1 @@ + - ticket #93469 : Intégrations : Amélioration de la création des facettes dynamiques \ No newline at end of file diff --git a/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php b/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php index b5140863edd40cf69ab1c329304350f0d0754c82..4d8e068cb57d1198aab4b193c676fe0a636c0c39 100644 --- a/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php +++ b/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php @@ -471,7 +471,6 @@ class KohaRecordIntegrationVagabondWithTooMany610aTest extends KohaRecordIntegra - class KohaRecordIntegrationEscapableAnnexeCodesTest extends KohaRecordIntegrationTestCase { public function setUp() { parent::setUp(); @@ -496,3 +495,64 @@ class KohaRecordIntegrationEscapableAnnexeCodesTest extends KohaRecordIntegratio $this->assertEquals('CHYJR', $this->notice_data['exemplaires'][0]['annexe']); } } + + + +class KohaRecordIntegrationBdMilleniumWithAuthorityTest extends KohaRecordIntegrationTestCase { + public function setUp() { + parent::setUp(); + + $this->fixture('Class_CodifThesaurus', + ['id' => 6, + 'libelle' => 'Mots-clés', + 'id_thesaurus' => 'MOTC', + 'id_origine' => null, + 'code' => 'MOTC', + 'rule_zone' => '609', + 'rule_label_field' => 'a', + 'rule_id_field' => '9']); + + $attributs = [[Class_IntProfilDonnees::PROFILE_INDEX_SYSTEMS_FIELDS + => [['rule' => '', + 'system' => 'MSAS', + 'default_type' => 'j', + 'thesaurus' => '6']]]]; + + $this->fixture('Class_IntProfilDonnees', + ['id' => 1004, + 'libelle' => 'Authorities', + 'type_fichier' => Class_IntProfilDonnees::FT_AUTHORITY, + 'format' => Class_IntProfilDonnees::FORMAT_UNIMARC, + 'accents' => Class_IntProfilDonnees::ENCODING_UTF8, + 'attributs' => serialize($attributs), + ]); + + $this->loadNotice('unimarc_bd_millenium_with_authority'); + $this->millenium = Class_Notice::findFirstBy(['type' => 1]); + } + + + /** @test */ + public function titreShouldBeHommesQuiNaimaientPasLesFemmes() { + $this->assertEquals('Les hommes qui n\'aimaient pas les femmes', + $this->millenium->getTitrePrincipal()); + } + + + /** @test */ + public function codifThesaurusIdOrigineShouldBeTrilogie() { + $this->assertNotNull(Class_CodifThesaurus::findFirstBy(['code' => 'MOTC', + 'id_thesaurus' => 'MOTC0001', + 'id_origine' => 'TRILOGIE', + 'libelle' => 'Trilogie', + ])); + } + + + /** @test */ + public function codifThesaurusIdOrigineShouldNotBe37483() { + $this->assertNull(Class_CodifThesaurus::findFirstBy(['code' => 'MOTC', + 'id_origine' => '37483', + ])); + } +} diff --git a/cosmogramme/tests/php/classes/unimarc_bd_millenium_with_authority.txt b/cosmogramme/tests/php/classes/unimarc_bd_millenium_with_authority.txt new file mode 100644 index 0000000000000000000000000000000000000000..f5a62b5922fa4399ae61957a9df164041b264bfc --- /dev/null +++ b/cosmogramme/tests/php/classes/unimarc_bd_millenium_with_authority.txt @@ -0,0 +1 @@ +01322 2200301 4500001000700000010002400007035002100031073001800052090001900070091000900089099000700098100004100105101000800146102000700154106000600161200019000167210004300357215006700400225001700467609002000484700004500504701002200549702004300571801006700614995010900681995012100790995010900911260265 a9782800157771brel. a(OCoLC)868591687 1a9782800157771 9260265a260265 a2c1 tBD a20140318 frey50 afre aFR ar1 aLes hommes qui n'aimaient pas les femmesbTexte impriméeseconde partiefscénario, Sylvain Runberggdessin, José Homsgd'après la trilogie de Stieg LarssonhTome 2hseconde partie aPariscDupuisd2013eimpr. en Belgique a1 vol. (64 p.)ctout ill. en coul., couv. ill. en coul.d32 cm aMilleniumv2 aTrilogie937483 9495032aRunbergbSylvainf1971-....4690 9485177aHoms4440 9545077aLarssonbStiegf1954-20044100 3gAFNORaFRbMediatheque intercommunale Ouest Provencec20140225 f31301011644247m2014-07-0840009492216bFOS20kBD RUN62014-03-11o0cLLv14.50rBDaFOSeL1l00qNL4 f31301011644122m2014-10-0440009492217bMIR20kBD RUN62014-03-11n2014-10-25o0cLLv14.50rBDaMIReL1l00qNL4 f31301011644189m2014-10-1040009492218bENT20kBD RUN62014-03-11o0cLLv14.50rBDaENTeL1l00qNL4 \ No newline at end of file diff --git a/library/Class/Cosmogramme/Integration/Record/BibliographicDynamicFacets.php b/library/Class/Cosmogramme/Integration/Record/BibliographicDynamicFacets.php index 88b4276a82c0075b31f6330621bfc692e20e33d3..70c6d47e5c4591c3319cac359d62d6659ddd8494 100644 --- a/library/Class/Cosmogramme/Integration/Record/BibliographicDynamicFacets.php +++ b/library/Class/Cosmogramme/Integration/Record/BibliographicDynamicFacets.php @@ -32,7 +32,7 @@ class Class_Cosmogramme_Integration_Record_BibliographicDynamicFacets { protected function _newFor($thesaurus, $int_bib) { - return $int_bib && ($index_systems = $thesaurus->authoritiesIndexSystems()) + return ($index_systems = $thesaurus->authoritiesIndexSystems()) ? new Class_Cosmogramme_Integration_Record_BibliographicDynamicFacets_Authority($thesaurus, $index_systems, $int_bib) : new Class_Cosmogramme_Integration_Record_BibliographicDynamicFacets_Simple($thesaurus); } @@ -60,12 +60,20 @@ class Class_Cosmogramme_Integration_Record_BibliographicDynamicFacets_Simple { protected function _getOrCreateChildren($rules, $reader) { $id_labels = $rules->extractIdAndFields($reader); - return array_map(function($id_label) - { - return $this->_thesaurus->getOrCreateChild($id_label['id'], - $id_label['label']); - }, - $id_labels); + return array_filter(array_map([$this, '_getOrCreateChild'], $id_labels)); + } + + + protected function _getOrCreateChild($id_label) { + $id = trim($id_label['id']); + $label = trim($id_label['label']); + if (!$label) + return; + + if (!$id) + $id = strtoupper($label); + + return $this->_thesaurus->getOrCreateChild($id, $label); } } diff --git a/scripts/reindex_local_authorities.php b/scripts/reindex_local_authorities.php index 838505f1f2990e03e6007b6136c4690e079fd69c..135584927955860a6ff21c655ac792c25d39fd0d 100644 --- a/scripts/reindex_local_authorities.php +++ b/scripts/reindex_local_authorities.php @@ -5,15 +5,6 @@ require(__DIR__.'/../console.php'); echo "\n\nWelcome to the iReindex Authorities 3000 PRO tool by @patbator\n\n"; -$int_bib = null; - -while(!$int_bib) { - $id_int_bib = (int)readline('Please tell me the id_int_bib : '); - echo ($int_bib = Class_IntBib::find($id_int_bib)) - ? ("Authorities generated by bibliographic links will be linked to : " . $int_bib->getNomCourt() . "\n\n") - : "IntBib not found try again \n\n"; -} - echo "\n\n==== AUTHORITIES ====\n\n"; class Scripts_Local_Authorities_Indexer { @@ -79,18 +70,23 @@ while ($records = Class_Notice::findAllBy(['type' => Class_Notice::TYPE_AUTHORIT echo "\n\n==== BIBLIOS ====\n\n"; class Scripts_Local_Biblios_Indexer { - protected $_dynamic_facets, $_int_bib; + protected $_dynamic_facets; - public function __construct($int_bib) { - $this->_int_bib = $int_bib; + public function __construct() { $this->_dynamic_facets = new Class_Cosmogramme_Integration_Record_BibliographicDynamicFacets(); } public function index($record) { echo '.'; - $thesauri = $this->_dynamic_facets->thesauriOf($record, $this->_int_bib); + if (!$first_item = $record->getFirstExemplaire()) + return;; + + if (!$bib = $first_item->getIntBib()) + return; + + $thesauri = $this->_dynamic_facets->thesauriOf($record, $bib); $record->updateFacette(implode(' ', array_map(function($item) { return $item->getFacetCode(); }, array_filter($thesauri)))) ->save(); @@ -98,7 +94,7 @@ class Scripts_Local_Biblios_Indexer { } -$indexer = new Scripts_Local_Biblios_Indexer($int_bib); +$indexer = new Scripts_Local_Biblios_Indexer(); $page = 1; while ($records = Class_Notice::findAllBy(['type' => Class_Notice::TYPE_BIBLIOGRAPHIC, 'limitPage' => [$page, 1000]])) { diff --git a/tests/scenarios/Authorities/AuthoritiesTest.php b/tests/scenarios/Authorities/AuthoritiesTest.php index 49a133afd7b9cb66509a5f59cbd3468311afd487..c8b6ce93a9eaef90b2d1aa01e4ca2e258e0558c5 100644 --- a/tests/scenarios/Authorities/AuthoritiesTest.php +++ b/tests/scenarios/Authorities/AuthoritiesTest.php @@ -147,7 +147,7 @@ class AuthoritiesNoticeAjaxControllerTest extends AuthoritiesTestCase { class AuthoritiesBibliographicDynamicFacetsWithoutIndexSystemTest extends ModelTestCase { - protected $_thesaurus; + protected $_thesauri; public function setUp() { parent::setUp(); @@ -162,22 +162,39 @@ class AuthoritiesBibliographicDynamicFacetsWithoutIndexSystemTest extends ModelT 'rule_label_field' => 'a', 'rule_id_field' => '9']); - $thesauri = (new Class_Cosmogramme_Integration_Record_BibliographicDynamicFacets()) + $this->_thesauri = (new Class_Cosmogramme_Integration_Record_BibliographicDynamicFacets()) ->thesauriOf((new Class_NoticeUnimarc())->setNotice(file_get_contents(__DIR__ . '/vagabond.mrc')), $this->fixture('Class_IntBib', ['id' => 3])); - $this->_thesaurus = reset($thesauri); } /** @test */ - public function thesaurusIdShouldBeMots0001() { - $this->assertEquals('MOTS0001', $this->_thesaurus->getIdThesaurus()); + public function shouldHave2Thesauri() { + $this->assertEquals(2, count($this->_thesauri)); } /** @test */ - public function thesaurusLabelShouldBeManga() { - $this->assertEquals('Manga', $this->_thesaurus->getLibelle()); + public function firstThesaurusIdShouldBeMots0001() { + $this->assertEquals('MOTS0001', $this->_thesauri[0]->getIdThesaurus()); + } + + + /** @test */ + public function firstThesaurusLabelShouldBeManga() { + $this->assertEquals('Manga', $this->_thesauri[0]->getLibelle()); + } + + + /** @test */ + public function firstThesaurusIdOrigineShouldBe213399() { + $this->assertEquals('213399', $this->_thesauri[0]->getIdOrigine()); + } + + + /** @test */ + public function secondThesaurusLabelShouldBeTrimmed() { + $this->assertEquals('Cicatrice', $this->_thesauri[1]->getLibelle()); } @@ -373,19 +390,36 @@ class AuthoritiesBibliographicDynamicFacetsWithIndexSystemAlreadyExistingTest ex /** @test */ - public function authorityShouldNotBeCreated() { - $this->assertEquals(1, Class_Notice::countBy(['type' => Class_Notice::TYPE_AUTHORITY])); + public function authorityItemShouldNotBeDuplicated() { + $this->assertEquals(1, Class_Exemplaire::countBy(['type' => Class_Notice::TYPE_AUTHORITY, + 'id_origine' => 213399])); } /** @test */ - public function authorityItemShouldNotBeCreated() { + public function authorityShouldHaveOneItemOnly() { $this->assertEquals(1, Class_Notice::find(14)->numberOfExemplaires()); } /** @test */ - public function authorityShouldHaveThesaurusFacet() { + public function authorityShouldHaveThesaurusFacetHMOTS0001() { $this->assertContains('HMOTS0001', Class_Notice::find(14)->getFacetCodes()); } + + + /** @test */ + public function authorityItemForCicatriceShouldBeCreated() { + $this->assertNotNull(Class_Exemplaire::findFirstBy(['type' => Class_Notice::TYPE_AUTHORITY, + 'id_origine' => 78])); + } + + + /** @test */ + public function authorityRecordForCicactriceShouldHaveThesaurusFacetHMOTS0002() { + $this->assertContains('HMOTS0002', + Class_Exemplaire::findFirstBy(['type' => Class_Notice::TYPE_AUTHORITY, + 'id_origine' => 78]) + ->getNotice()->getFacetCodes()); + } } diff --git a/tests/scenarios/Authorities/vagabond.mrc b/tests/scenarios/Authorities/vagabond.mrc index f4d084d69a639e1ce0a4f450930ae8b33888f4d3..3f84c12c27b7fa50d9c7ad93898bcfeb6276fc09 100644 --- a/tests/scenarios/Authorities/vagabond.mrc +++ b/tests/scenarios/Authorities/vagabond.mrc @@ -1 +1 @@ -01499nam 2200361 4500001000400000003004700004010004700051020001700098021002000115039001900135090000800154091001900162099001300181100004100194101000800235102000700243105001800250106000600268200017600274210005600450215009700506461003300603610001000636619001800646676001000664700007200674702005000746702006100796702004000857801007000897930002900967995014100996869http://catalogue.bnf.fr/ark:/12148/cb37710769n a2-84580-144-0bbr.dPrix : 59 F : 8,99 EUR aFRb00201411 aFRbDL 01-54100 oOPLa027037083 a869 b20140822c1a2 eUZELtBD a20020103d2001 m y0frey50 ba1 afre aFR aa t 00|a| ar1 aVagabondbTexte impriméh4fTakehiko Inouégd'après l'oeuvre d'Eiji Yoshikawa, "Miyamoto Musashi"g[trad. du japonais par Jacques Lalloz]g[adapté par Philippe Marcel] aPariscÉd. Tonkamd2001e35-RennesgImpr. Oberthur aNon paginé [ca 206] p.cill. en noir et en coul., couv. ill., jaquette ill. en coul.d19 cm 0tVagabondv4aTakehiko Inoué aManga aManga9213399 a741.5 313527612935oISNI0000000121039965aInouebTakehikof1967-....4070 311929525936aYoshikawabEijif1892-19624100 312040286937oISNI0000000108815456aLallozbJacques4730 312320807938aMarcelbPhilippe4010 0aFRbFR-751131015c20020103gAFNORhFRBNF3771076900000002intermrc 5FR-751131010:2003-196584 fSTJ000095w2014-06-2630009117cMTRSTJ20kBD VAG 452012-09-07o0efiction adulte bande dessineesddcrBDm2014-06-19bMTRSTJ6MTRSTJ \ No newline at end of file +01557nam 2200385 4500001000400000003004700004010004700051020001700098021002000115039001900135090000800154091001900162099001300181100004100194101000800235102000700243105001800250106000600268200017600274210005600450215009700506461003300603610001000636619001800646619002300664619001100687676001000698700007200708702005000780702006100830702004000891801007000931930002901001995014101030869http://catalogue.bnf.fr/ark:/12148/cb37710769n a2-84580-144-0bbr.dPrix : 59 F : 8,99 EUR aFRb00201411 aFRbDL 01-54100 oOPLa027037083 a869 b20140822c1a2 eUZELtBD a20020103d2001 m y0frey50 ba1 afre aFR aa t 00|a| ar1 aVagabondbTexte impriméh4fTakehiko Inouégd'après l'oeuvre d'Eiji Yoshikawa, "Miyamoto Musashi"g[trad. du japonais par Jacques Lalloz]g[adapté par Philippe Marcel] aPariscÉd. Tonkamd2001e35-RennesgImpr. Oberthur aNon paginé [ca 206] p.cill. en noir et en coul., couv. ill., jaquette ill. en coul.d19 cm 0tVagabondv4aTakehiko Inoué aManga aManga9213399 a Cicatrice 978 a98839 a741.5 313527612935oISNI0000000121039965aInouebTakehikof1967-....4070 311929525936aYoshikawabEijif1892-19624100 312040286937oISNI0000000108815456aLallozbJacques4730 312320807938aMarcelbPhilippe4010 0aFRbFR-751131015c20020103gAFNORhFRBNF3771076900000002intermrc 5FR-751131010:2003-196584 fSTJ000095w2014-06-2630009117cMTRSTJ20kBD VAG 452012-09-07o0efiction adulte bande dessineesddcrBDm2014-06-19bMTRSTJ6MTRSTJ \ No newline at end of file