From eca53ed33d52f555b2620119f507ac41575b65a4 Mon Sep 17 00:00:00 2001 From: Laurent Laffont <llaffont@afi-sa.fr> Date: Tue, 22 Feb 2022 12:14:27 +0100 Subject: [PATCH] hotline #151401 Improve CodifThesaurus::findParent performance --- library/Class/CodifThesaurus.php | 11 ++++++----- tests/library/Class/CodifThesaurusTest.php | 22 ++++++++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/library/Class/CodifThesaurus.php b/library/Class/CodifThesaurus.php index 62f47cbe199..d0dcb9fed48 100644 --- a/library/Class/CodifThesaurus.php +++ b/library/Class/CodifThesaurus.php @@ -225,12 +225,13 @@ class CodifThesaurusLoader extends Storm_Model_Loader { public function findParent($id_thesaurus) { - $parent_str = substr($id_thesaurus, 0, strlen($id_thesaurus) - (4 - strlen($id_thesaurus) % 4)); + $parent_str = substr($id_thesaurus, + 0, + strlen($id_thesaurus) - Class_CodifThesaurus::ID_KEY_LENGTH); if (!$parent_str) return null; - $parent = Class_CodifThesaurus::findFirstBy(['where' => 'id_thesaurus like "'.$parent_str.'%" and LENGTH(id_thesaurus)<'.strlen($id_thesaurus), - 'order' => 'id_thesaurus desc']); + $parent = Class_CodifThesaurus::findFirstBy(['id_thesaurus' => $parent_str]); if (!$parent) return $this->findParent($parent_str); @@ -887,8 +888,8 @@ class Class_CodifThesaurus extends Storm_Model_Abstract { public function getParentId() { - return $this->getParent() - ? $this->getParent()->getId() + return ($parent = $this->getParent()) + ? $parent->getId() : null; } diff --git a/tests/library/Class/CodifThesaurusTest.php b/tests/library/Class/CodifThesaurusTest.php index 41bb52071ff..94c67c3e83d 100644 --- a/tests/library/Class/CodifThesaurusTest.php +++ b/tests/library/Class/CodifThesaurusTest.php @@ -87,19 +87,25 @@ class CodifThesaurusCommonTest extends ModelTestCase { /** @test */ public function libelleHierarchiqueForCultureShouldBeConfGesticulee() { - $this->onLoaderOfModel('Class_CodifThesaurus') - ->whenCalled('findParent') - ->with('THEM000100503000') - ->answers(Class_CodifThesaurus::newInstanceWithId(70,['id_thesaurus'=>'THEM00010050'])->setLibelle('Spectacles')) + $this->fixture(Class_CodifThesaurus::class, + ['id' => 20, + 'id_thesaurus'=>'THEM0001', + 'libelle' => 'Culture']); + + $this->fixture(Class_CodifThesaurus::class, + ['id' => 70, + 'id_thesaurus'=>'THEM00010050', + 'libelle' => 'Spectacles']); - ->whenCalled('findParent') - ->with('THEM00010050') - ->answers(Class_CodifThesaurus::newInstanceWithId(20,['id_thesaurus'=>'THEM0001'])->setLibelle('Culture')); + $gesticule = $this->fixture(Class_CodifThesaurus::class, + ['id' => 10, + 'id_thesaurus'=>'THEM0001005066663000', + 'libelle' => 'Conférences Gesticulées']); $this->assertEquals('Culture : Spectacles : Conférences Gesticulées', - Class_CodifThesaurus::getLibelleHierarchique(Class_CodifThesaurus::newInstanceWithId(10,['id_thesaurus'=>'THEM000100503000'])->setLibelle('Conférences Gesticulées'))); + Class_CodifThesaurus::getLibelleHierarchique($gesticule)); } -- GitLab