From 836c026402b4f6c04b3a6a2a5b98c6e343287442 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Tue, 10 Apr 2018 23:37:18 +0800 Subject: [PATCH] Add match against support for dql #89 --- config/packages/doctrine.yaml | 2 ++ src/Doctrine/MatchAgainst.php | 49 ++++++++++++++++++++++++++++++++++ src/Entity/CustomerVehicle.php | 2 +- 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/Doctrine/MatchAgainst.php diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 2ff608d4..b1b6d947 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -38,6 +38,8 @@ doctrine: stcollect: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STCollect stsnaptogrid: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STSnapToGrid stoverlaps: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STOverlaps + # for match against + match_against: App\Doctrine\MatchAgainst numeric_functions: # for postgresql starea: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STArea diff --git a/src/Doctrine/MatchAgainst.php b/src/Doctrine/MatchAgainst.php new file mode 100644 index 00000000..17d2a07a --- /dev/null +++ b/src/Doctrine/MatchAgainst.php @@ -0,0 +1,49 @@ +match(Lexer::T_IDENTIFIER); + $parser->match(Lexer::T_OPEN_PARENTHESIS); + do { + $this->columns[] = $parser->StateFieldPathExpression(); + $parser->match(Lexer::T_COMMA); + } while ($parser->getLexer()->isNextToken(Lexer::T_IDENTIFIER)); + $this->needle = $parser->InParameter(); + while ($parser->getLexer()->isNextToken(Lexer::T_STRING)) { + $this->mode = $parser->Literal(); + } + $parser->match(Lexer::T_CLOSE_PARENTHESIS); + } + + public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) { + $haystack = null; + $first = true; + foreach ($this->columns as $column) { + $first ? $first = false : $haystack .= ', '; + $haystack .= $column->dispatch($sqlWalker); + } + $query = "MATCH(" . $haystack . + ") AGAINST (" . $this->needle->dispatch($sqlWalker); + if ($this->mode) { + $query .= " " . $this->mode->dispatch($sqlWalker) . " )"; + } else { + $query .= " )"; + } + + return $query; + } + +} diff --git a/src/Entity/CustomerVehicle.php b/src/Entity/CustomerVehicle.php index b4c5829a..aec185b1 100644 --- a/src/Entity/CustomerVehicle.php +++ b/src/Entity/CustomerVehicle.php @@ -9,7 +9,7 @@ use DateTime; /** * @ORM\Entity - * @ORM\Table(name="customer_vehicle") + * @ORM\Table(name="customer_vehicle", indexes={@ORM\Index(columns={"plate_number"}, flags={"fulltext"})}) */ class CustomerVehicle {