packages/ztd-query-mysql/tests/Unit/Rewrite/FullText/ExpressionEditorTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\FullText;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\FullText\ExpressionEditor;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
12#[CoversClass(ExpressionEditor::class)]
13final class ExpressionEditorTest extends TestCase
14{
15 public function testQueryExpression(): void
16 {
17 $editor = new ExpressionEditor();
18 self::assertSame("'hello'", $editor->queryExpression("'hello' IN BOOLEAN MODE"));
19 self::assertSame("'hello'", $editor->queryExpression("'hello' IN NATURAL LANGUAGE MODE"));
20 self::assertSame("'hello'", $editor->queryExpression("'hello' WITH QUERY EXPANSION"));
21 self::assertSame("CONCAT('IN BOOLEAN', ' mode')", $editor->queryExpression(" CONCAT('IN BOOLEAN', ' mode') "));
22 }
23
24 public function testExpressionEdit(): void
25 {
26 $sql = "MATCH(title) AGAINST ('hello' IN BOOLEAN MODE)";
27 $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create());
28 $edit = (new ExpressionEditor())->expressionEdit($sql, $stream, $stream->significantTokens()[0]);
29 self::assertSame(['start' => 0, 'end' => strlen($sql), 'replacement' => "(CASE WHEN LOCATE(LOWER(NULLIF(TRIM(CAST(('hello') AS CHAR)), '')), LOWER(CONCAT_WS(' ', COALESCE(CAST((title) AS CHAR), '')))) > 0 THEN 1.0 ELSE 0.0 END)"], $edit);
30 }
31
32}
33