From 250e40a5a6f17227059701255c4151aedaef8ff2 Mon Sep 17 00:00:00 2001
From: Laurent Laffont <llaffont@afi-sa.fr>
Date: Tue, 27 Nov 2018 17:08:11 +0100
Subject: [PATCH] dev #82369 indexable domains now index records in baskets

---
 .../admin/controllers/CatalogueController.php |  4 +--
 library/Class/Bib.php                         |  2 +-
 library/Class/Catalogue.php                   | 27 ++++++++++++++-----
 library/Class/CodifAnnexe.php                 |  2 +-
 library/Class/IntBib.php                      |  2 +-
 library/Class/MoteurRecherche.php             |  2 +-
 library/Class/MoteurRecherche/Facettes.php    |  2 +-
 library/Class/Notice.php                      |  4 ++-
 library/Class/NoticeDomain.php                | 13 ++++-----
 tests/library/Class/ArticleTest.php           |  3 ++-
 tests/library/Class/PanierNoticeTest.php      | 25 ++++++++++++++---
 11 files changed, 60 insertions(+), 26 deletions(-)

diff --git a/application/modules/admin/controllers/CatalogueController.php b/application/modules/admin/controllers/CatalogueController.php
index 727c710dd8a..60417cd4541 100644
--- a/application/modules/admin/controllers/CatalogueController.php
+++ b/application/modules/admin/controllers/CatalogueController.php
@@ -47,8 +47,8 @@ class Admin_CatalogueController extends ZendAfi_Controller_Action {
 
     $ret = array_merge($ret, $catalogue->getTestCatalogue());
 
-    if ($catalogue->isIndexable())
-      $catalogue->index();
+    if ($catalogue->hasIndexer())
+      $catalogue->indexWithBaskets();
 
     if (!$catalogue->isIndexable() && ($catalogue->numberOfPanierNotices() == 0))
       $this->view->error = $this->_('Le domaine ne peut pas être mis en favori utilisateur sans critères d\'indexation');
diff --git a/library/Class/Bib.php b/library/Class/Bib.php
index 21a07d6411b..32a8e4217b2 100644
--- a/library/Class/Bib.php
+++ b/library/Class/Bib.php
@@ -851,7 +851,7 @@ class Class_Bib extends Storm_Model_Abstract {
   }
 
 
-  public function getFacet() {
+  public function asBookmark() {
     return Class_Bib::CODE_FACETTE . $this->getIdSite();
   }
 
diff --git a/library/Class/Catalogue.php b/library/Class/Catalogue.php
index 4f295276b1f..9c0f019e22a 100644
--- a/library/Class/Catalogue.php
+++ b/library/Class/Catalogue.php
@@ -712,11 +712,6 @@ class Class_Catalogue extends Storm_Model_Abstract {
   }
 
 
-  public function getFacette() {
-    return $this->getFacetCode();
-  }
-
-
   public function getAllNoticeIdsForDomaine($nb_par_page,$numero_page) {
     $preferences = $this->toArray();
 
@@ -1275,11 +1270,16 @@ class Class_Catalogue extends Storm_Model_Abstract {
   }
 
 
-  public function getFacet() {
+  public function asBookmark() {
+    return $this->getThesaurusFacetCode();
+  }
+
+
+  public function getThesaurusFacetCode() {
     if(!$thesaurus = Class_CodifThesaurus::findThesaurusForCatalogue($this->getId()))
       return '';
 
-    return $thesaurus->getFacetteIndex();
+    return $thesaurus->getFacetCode();
   }
 
 
@@ -1339,6 +1339,19 @@ class Class_Catalogue extends Storm_Model_Abstract {
   }
 
 
+  public function indexWithBaskets() {
+    if (!$this->hasIndexer())
+      return $this;
+
+    $this->index();
+    foreach($this->getPanierNotices() as $basket) {
+      $basket->index();
+    }
+
+    return $this;
+  }
+
+
   public function getTitre() {
     return $this->getLibelle();
   }
diff --git a/library/Class/CodifAnnexe.php b/library/Class/CodifAnnexe.php
index f18c12368ca..a9b366c02ff 100644
--- a/library/Class/CodifAnnexe.php
+++ b/library/Class/CodifAnnexe.php
@@ -97,7 +97,7 @@ class Class_CodifAnnexe extends Storm_Model_Abstract {
   }
 
 
-  public function getFacet() {
+  public function asBookmark() {
     return $this->getFacetteIndex();
   }
 
diff --git a/library/Class/IntBib.php b/library/Class/IntBib.php
index d0dc1ae2a7a..dbe58101bb0 100644
--- a/library/Class/IntBib.php
+++ b/library/Class/IntBib.php
@@ -184,7 +184,7 @@ class Class_IntBib extends Storm_Model_Abstract {
   }
 
 
-  public function getFacet() {
+  public function asBookmark() {
     return Class_Bib::CODE_FACETTE . $this->getIdBib();
   }
 
diff --git a/library/Class/MoteurRecherche.php b/library/Class/MoteurRecherche.php
index dc2ce5765f6..bb698b7aeac 100644
--- a/library/Class/MoteurRecherche.php
+++ b/library/Class/MoteurRecherche.php
@@ -273,7 +273,7 @@ class Class_MoteurRecherche {
     if(!$domain_id)
       return '';
 
-    if(!$facette = Class_Catalogue::find($domain_id)->getFacette())
+    if(!$facette = Class_Catalogue::find($domain_id)->getFacetCode())
       return '';
 
     return 'MATCH(facettes) AGAINST(\'' . trim($facette) . '\' IN BOOLEAN MODE)';
diff --git a/library/Class/MoteurRecherche/Facettes.php b/library/Class/MoteurRecherche/Facettes.php
index 22231381380..4d3369999b7 100644
--- a/library/Class/MoteurRecherche/Facettes.php
+++ b/library/Class/MoteurRecherche/Facettes.php
@@ -206,7 +206,7 @@ class Class_MoteurRecherche_Facettes {
 
     $user_bookmarks_codes = array_map(function($model)
                                       {
-                                        return $model->getFacet();
+                                        return $model->asBookmark();
                                       },
                                       $user_bookmarks);
 
diff --git a/library/Class/Notice.php b/library/Class/Notice.php
index a471e638417..1caa0519700 100644
--- a/library/Class/Notice.php
+++ b/library/Class/Notice.php
@@ -1903,7 +1903,9 @@ class Class_Notice extends Storm_Model_Abstract {
       if (!Class_NoticeDomain::findFirstBy($params))
         Class_NoticeDomain::newInstance($params)->save();
 
-      $facets[] = $domain->getFacette();
+      $facets[] = $domain->getFacetCode();
+      if ($domain->hasIndexer())
+        $facets[] = $domain->getThesaurusFacetCode();
     }
 
     if (!empty($facets))
diff --git a/library/Class/NoticeDomain.php b/library/Class/NoticeDomain.php
index bc050d23353..b3d78fd8647 100644
--- a/library/Class/NoticeDomain.php
+++ b/library/Class/NoticeDomain.php
@@ -75,10 +75,11 @@ class NoticeDomainLoader extends Storm_Model_Loader {
 
 
   public function updateRecordsFacette($domain_id) {
-    if ($catalogue = Class_Catalogue::find($domain_id)) {
-      foreach (Class_NoticeDomain::getRecordsForDomain($domain_id) as $record)
-        $record->updateFacette($catalogue->getFacette())->save();
-    }
+    if (!$catalogue = Class_Catalogue::find($domain_id))
+      return;
+
+    foreach (Class_NoticeDomain::getRecordsForDomain($domain_id) as $record)
+      $record->updateFacette($catalogue->getFacetCode())->save();
   }
 
 
@@ -153,12 +154,12 @@ class Class_NoticeDomain extends Storm_Model_Abstract {
     if (1 < $existing)
       return;
 
-    $record->deleteFacettes($domain->getFacette())->save();
+    $record->deleteFacettes($domain->getFacetCode())->save();
   }
 
 
   protected function _updateRecordFacets($record, $domain) {
-    $record->updateFacette($domain->getFacette())->save();
+    $record->updateFacette($domain->getFacetCode())->save();
   }
 
 
diff --git a/tests/library/Class/ArticleTest.php b/tests/library/Class/ArticleTest.php
index e773cd56764..5f2fd33fdaa 100644
--- a/tests/library/Class/ArticleTest.php
+++ b/tests/library/Class/ArticleTest.php
@@ -1184,7 +1184,8 @@ class ArticleIndexAllTest extends ModelTestCase {
 
   /** @test */
   public function recordShouldHaveExpectedFacette() {
-    $this->assertContains(Class_Catalogue::find(1)->getFacette(), Class_Notice::find(2)->getFacettes());
+    $this->assertContains(Class_Catalogue::find(1)->getFacetCode(),
+                          Class_Notice::find(2)->getFacettes());
   }
 
 
diff --git a/tests/library/Class/PanierNoticeTest.php b/tests/library/Class/PanierNoticeTest.php
index aff31c8a079..b762462b936 100644
--- a/tests/library/Class/PanierNoticeTest.php
+++ b/tests/library/Class/PanierNoticeTest.php
@@ -421,8 +421,10 @@ class PanierNoticeIndexAllTest extends ModelTestCase {
   public function setUp() {
     parent::setUp();
 
-    Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Catalogue')
-      ->whenCalled('saveThesaurus')->answers(true);
+    Zend_Registry::set('sql',
+                       Storm_Test_ObjectWrapper::mock()
+                       ->whenCalled('query')
+                       ->answers(null));
 
     $this->fixture('Class_Notice', ['id' => 4,
                                     'titre_principal' => 'Le Montespan',
@@ -490,7 +492,21 @@ class PanierNoticeIndexAllTest extends ModelTestCase {
 
   /** @test */
   public function facetOfRecordMontespanShouldContainsFacetQ1() {
-    $this->assertContains('Q1', Class_Notice::findFirstBy(['clef_alpha' => 'MONTESPAN'])->getFacettes());
+    $this->assertEquals('Q1',
+                        Class_Notice::findFirstBy(['clef_alpha' => 'MONTESPAN'])->getFacettes());
+  }
+
+
+  /** @test */
+  public function withBookmarkableDomainFacetOfRecordMontespanShouldContainsFacetHCCCC() {
+    $domain = Class_Catalogue::find(1);
+    $domain
+      ->setIndexer(true)
+      ->assertSave();
+    $domain->indexWithBaskets();
+
+    $this->assertEquals('Q1 HCCCC0001',
+                        Class_Notice::findFirstBy(['clef_alpha' => 'MONTESPAN'])->getFacettes());
   }
 
 
@@ -502,6 +518,7 @@ class PanierNoticeIndexAllTest extends ModelTestCase {
 
   /** @test */
   public function recordMonstespanShouldNotHaveFacetQ2() {
-    $this->assertNotContains('Q2', Class_Notice::findFirstBy(['clef_alpha' => 'MONTESPAN'])->getFacettes());
+    $this->assertNotContains('Q2',
+                             Class_Notice::findFirstBy(['clef_alpha' => 'MONTESPAN'])->getFacettes());
   }
 }
-- 
GitLab