From 3d878839f63e6d67b8447732f35411053eb43e3a Mon Sep 17 00:00:00 2001 From: stijnvrolijk Date: Thu, 22 Jun 2017 11:36:47 +0200 Subject: [PATCH 1/2] Create a MatchAgainst parser which allows us to use full text search in doctrine queries example usage: ``` ... WHERE MATCH_AGAINST(myContentField, :my_term 'IN NATURAL LANGUAGE MODE') > 0.3 ... ``` --- .../Extensions/Doctrine/MatchAgainst.php | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/SumoCoders/FrameworkCoreBundle/Extensions/Doctrine/MatchAgainst.php diff --git a/src/SumoCoders/FrameworkCoreBundle/Extensions/Doctrine/MatchAgainst.php b/src/SumoCoders/FrameworkCoreBundle/Extensions/Doctrine/MatchAgainst.php new file mode 100644 index 0000000..fbccd97 --- /dev/null +++ b/src/SumoCoders/FrameworkCoreBundle/Extensions/Doctrine/MatchAgainst.php @@ -0,0 +1,69 @@ +match(Lexer::T_IDENTIFIER); + $parser->match(Lexer::T_OPEN_PARENTHESIS); + + while ($parser->getLexer()->isNextToken(Lexer::T_IDENTIFIER)) { + $this->columns[] = $parser->StateFieldPathExpression(); + $parser->match(Lexer::T_COMMA); + }; + + $this->needle = $parser->InParameter(); + + while ($parser->getLexer()->isNextToken(Lexer::T_STRING)) { + $this->mode = $parser->Literal(); + } + + $parser->match(Lexer::T_CLOSE_PARENTHESIS); + } + + public function getSql(SqlWalker $sqlWalker) + { + $haystack = null; + $first = true; + foreach ($this->columns as $column) { + if (!$first) { + $haystack .= ', '; + } + + $first = false; + + $haystack .= $column->dispatch($sqlWalker); + } + + $query = "MATCH(" . $haystack . ") AGAINST (" . $this->needle->dispatch($sqlWalker); + + if ($this->mode) { + $query .= " " . $this->mode->value . " )"; + } else { + $query .= " )"; + } + + return $query; + } +} From 44967f2ba49e2308bce85a52d1054e143143a6ad Mon Sep 17 00:00:00 2001 From: stijnvrolijk Date: Thu, 22 Jun 2017 11:38:36 +0200 Subject: [PATCH 2/2] Register the MATCH_AGAINST function --- app/config/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/config/config.yml b/app/config/config.yml index f4ab39b..94fb484 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -62,6 +62,9 @@ doctrine: orm: auto_generate_proxy_classes: "%kernel.debug%" auto_mapping: true + dql: + string_functions: + MATCH_AGAINST: SumoCodersFrameworkCoreBundle\Extensions\Doctrine\MatchAgainst doctrine_migrations: dir_name: %kernel.root_dir%/migrations