diff --git a/Search/SearchProvider.php b/Search/SearchProvider.php index 4144298ec..3a5c3c977 100644 --- a/Search/SearchProvider.php +++ b/Search/SearchProvider.php @@ -124,20 +124,55 @@ class SearchProvider * @param number $start * @param number $limit * @return array of html results + * @throws UnknowSearchDomainException if the domain is unknow */ - public function getResults($pattern, $start = 0, $limit = 50) + public function getSearchResults($pattern, $start = 0, $limit = 50) { $terms = $this->parse($pattern); $results = array(); - - foreach ($this->searchServices as $service) { - if ($service->supports($terms['_domain'])) { - $results[] = $service->renderResult($terms, $start, $limit); + + //sort searchServices by order + $sortedSearchServices = array(); + foreach($this->searchServices as $service) { + $sortedSearchServices[$service->getOrder()] = $service; + } + + if ($terms['_domain'] !== NULL) { + foreach ($sortedSearchServices as $service) { + if ($service->supports($terms['_domain'])) { + $results[] = $service->renderResult($terms, $start, $limit); + } + } + + if (count($results) === 0) { + throw new UnknowSearchDomainException($terms['_domain']); + } + } else { // no domain provided, we use default search + foreach($sortedSearchServices as $service) { + if ($service->isActiveByDefault()) { + $results[] = $service->renderResult($terms, $start, $limit); + } } } + + //sort array + ksort($results); return $results; } + + public function getResultByName($pattern, $name, $start = 0, $limit = 50) + { + $terms = $this->parse($pattern); + $search = $this->getByName($name); + + if ($terms['_domain'] !== NULL && !$search->supports($terms['_domain'])) + { + throw new ParsingException("The domain is not supported for the search name"); + } + + return $search->renderResult($terms, $start, $limit); + } /** * return search services with a specific name, defined in service @@ -149,7 +184,7 @@ class SearchProvider public function getByName($name) { if (isset($this->searchServices[$name])) { - return $this->searchServices; + return $this->searchServices[$name]; } else { throw new UnknowSearchNameException($name); } diff --git a/Search/UnknowSearchDomainException.php b/Search/UnknowSearchDomainException.php index c03e09923..b2a2d4085 100644 --- a/Search/UnknowSearchDomainException.php +++ b/Search/UnknowSearchDomainException.php @@ -25,11 +25,19 @@ namespace Chill\MainBundle\Search; * * @author Julien Fastré */ -class UnknowSearchNameException extends \Exception +class UnknowSearchDomainException extends \Exception { - public function __construct($name) + + private $domain; + + public function __construct($domain) { - parent::__construct( "The module search with name $name " - . "is not found"); + parent::__construct( "The domain $domain is not found"); + $this->domain = $domain; + } + + public function getDomain() + { + return $this->domain; } } diff --git a/Search/UnknowSearchNameException.php b/Search/UnknowSearchNameException.php index c03e09923..d3e75a5dd 100644 --- a/Search/UnknowSearchNameException.php +++ b/Search/UnknowSearchNameException.php @@ -29,7 +29,6 @@ class UnknowSearchNameException extends \Exception { public function __construct($name) { - parent::__construct( "The module search with name $name " - . "is not found"); + parent::__construct( "No module search supports with the name $name"); } } diff --git a/Tests/Search/SearchProviderTest.php b/Tests/Search/SearchProviderTest.php index 6d4e15058..8040fe3e4 100644 --- a/Tests/Search/SearchProviderTest.php +++ b/Tests/Search/SearchProviderTest.php @@ -42,7 +42,7 @@ class SearchProviderTest extends \PHPUnit_Framework_TestCase ); //add a domain service $this->addSearchService( - $this->createDefaultSearchService('I am domain bar', 20), 'bar' + $this->createNonDefaultDomainSearchService('I am domain bar', 20, FALSE), 'bar' ); } @@ -169,11 +169,11 @@ class SearchProviderTest extends \PHPUnit_Framework_TestCase * Test the behaviour when no domain is provided in the search pattern : * the default search should be enabled */ - public function testDefaultSearch() + public function testSearchResultDefault() { $response = $this->search->getSearchResults('default search'); - $this->markTestSkipped(); + //$this->markTestSkipped(); $this->assertEquals(array( "I am default" @@ -183,15 +183,15 @@ class SearchProviderTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Chill\MainBundle\Search\UnknowSearchDomainException */ - public function testDomainUnknow() + public function testSearchResultDomainUnknow() { $response = $this->search->getSearchResults('@unknow domain'); - $this->markTestSkipped(); + //$this->markTestSkipped(); } - public function testDomainSearch() + public function testSearchResultDomainSearch() { //add a search service which will be supported $this->addSearchService( @@ -208,7 +208,6 @@ class SearchProviderTest extends \PHPUnit_Framework_TestCase public function testSearchWithinSpecificSearchName() { - $this->markTestSkipped(); //add a search service which will be supported $this->addSearchService( $this->createNonDefaultDomainSearchService("I am domain foo", 100, TRUE), 'foo' @@ -216,9 +215,7 @@ class SearchProviderTest extends \PHPUnit_Framework_TestCase $response = $this->search->getResultByName('@foo search', 'foo'); - $this->assertEquals(array( - 'I am domain foo' - ), $response); + $this->assertEquals('I am domain foo', $response); } @@ -227,8 +224,6 @@ class SearchProviderTest extends \PHPUnit_Framework_TestCase */ public function testSearchWithinSpecificSearchNameInConflictWithSupport() { - $this->markTestSkipped(); - $response = $this->search->getResultByName('@foo default search', 'bar'); }