diff --git a/lib/Alchemy/Phrasea/Core/Provider/SearchEngineServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/SearchEngineServiceProvider.php index e1e9993fcc..25de9918e8 100644 --- a/lib/Alchemy/Phrasea/Core/Provider/SearchEngineServiceProvider.php +++ b/lib/Alchemy/Phrasea/Core/Provider/SearchEngineServiceProvider.php @@ -13,6 +13,7 @@ namespace Alchemy\Phrasea\Core\Provider; use Alchemy\Phrasea\Controller\LazyLocator; use Alchemy\Phrasea\SearchEngine\Elastic\ElasticsearchOptions; +use Alchemy\Phrasea\SearchEngine\Elastic\Search\QueryVisitor; use Alchemy\Phrasea\SearchEngine\SearchEngineLogger; use Alchemy\Phrasea\Exception\InvalidArgumentException; use Alchemy\Phrasea\SearchEngine\SearchEngineInterface; @@ -203,10 +204,14 @@ class SearchEngineServiceProvider implements ServiceProviderInterface return Compiler\Llk\Llk::load(new File\Read($grammarPath)); }); + $app['query_visitor.factory'] = $app->protect(function () use ($app) { + return new QueryVisitor($app['search_engine.structure']); + }); + $app['query_compiler'] = $app->share(function ($app) { return new QueryCompiler( $app['query_parser'], - $app['search_engine.structure'], + $app['query_visitor.factory'], $app['thesaurus'] ); }); diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryCompiler.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryCompiler.php index 29b4c6b64e..ac3de7929a 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryCompiler.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryCompiler.php @@ -2,9 +2,7 @@ namespace Alchemy\Phrasea\SearchEngine\Elastic\Search; -use Alchemy\Phrasea\SearchEngine\Elastic\AST; use Alchemy\Phrasea\SearchEngine\Elastic\Exception\QueryException; -use Alchemy\Phrasea\SearchEngine\Elastic\Structure\Structure; use Alchemy\Phrasea\SearchEngine\Elastic\Thesaurus; use Hoa\Compiler\Exception\Exception as CompilerException; use Hoa\Compiler\Llk\Parser; @@ -15,7 +13,7 @@ use Hoa\Visitor\Visit; class QueryCompiler { private $parser; - private $structure; + private $queryVisitorFactory; private $thesaurus; private static $leftAssociativeOperators = array( @@ -24,10 +22,10 @@ class QueryCompiler NodeTypes::EXCEPT_EXPR ); - public function __construct(Parser $parser, Structure $structure, Thesaurus $thesaurus) + public function __construct(Parser $parser, callable $queryVisitorFactory, Thesaurus $thesaurus) { $this->parser = $parser; - $this->structure = $structure; + $this->queryVisitorFactory = $queryVisitorFactory; $this->thesaurus = $thesaurus; } @@ -60,9 +58,12 @@ class QueryCompiler return $this->visitString($string, $this->createQueryVisitor(), $postprocessing); } + /** + * @return Visit + */ private function createQueryVisitor() { - return new QueryVisitor($this->structure); + return call_user_func($this->queryVisitorFactory); } public function dump($string, $postprocessing = true) diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryVisitor.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryVisitor.php index 7ee5d7b793..36815ac3ec 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryVisitor.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryVisitor.php @@ -4,7 +4,6 @@ namespace Alchemy\Phrasea\SearchEngine\Elastic\Search; use Alchemy\Phrasea\SearchEngine\Elastic\AST; use Alchemy\Phrasea\SearchEngine\Elastic\Exception\Exception; -use Alchemy\Phrasea\SearchEngine\Elastic\Search\QueryHelper; use Alchemy\Phrasea\SearchEngine\Elastic\Structure\Structure; use Hoa\Compiler\Llk\TreeNode; use Hoa\Visitor\Element; diff --git a/tests/Alchemy/Tests/Phrasea/SearchEngine/QueryCompilerTest.php b/tests/Alchemy/Tests/Phrasea/SearchEngine/QueryCompilerTest.php index 4f1ebed027..73d5325935 100644 --- a/tests/Alchemy/Tests/Phrasea/SearchEngine/QueryCompilerTest.php +++ b/tests/Alchemy/Tests/Phrasea/SearchEngine/QueryCompilerTest.php @@ -3,6 +3,8 @@ namespace Alchemy\Tests\Phrasea\SearchEngine; use Alchemy\Phrasea\SearchEngine\Elastic\Search\QueryCompiler; +use Alchemy\Phrasea\SearchEngine\Elastic\Search\QueryVisitor; +use Alchemy\Phrasea\SearchEngine\Elastic\Structure\Structure; use Alchemy\Phrasea\SearchEngine\Elastic\Thesaurus; use Alchemy\Tests\Tools\CsvFileIterator; use Hoa\Compiler; @@ -23,11 +25,17 @@ class QueryCompilerTest extends \PHPUnit_Framework_TestCase $grammar_path = realpath(implode('/', [__DIR__, $project_root, $grammar_path])); $parser = Compiler\Llk\Llk::load(new File\Read($grammar_path)); + $structure = $this->getMock(Structure::class); + + $queryVisitorFactory = function () use ($structure) { + return new QueryVisitor($structure); + }; + $thesaurus = $this->getMockBuilder(Thesaurus::class) ->disableOriginalConstructor() ->getMock(); - $this->compiler = new QueryCompiler($parser, $thesaurus); + $this->compiler = new QueryCompiler($parser, $queryVisitorFactory, $thesaurus); } /**