packages/ztd-query-mysql/tests/Unit/Rewrite/Transformer/Set/OrderRewriterTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Transformer\Set;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\Transformer\Set\OrderRewriter;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Transformer\Set\ValueNormalizer::class)]
12#[CoversClass(OrderRewriter::class)]
13final class OrderRewriterTest extends TestCase
14{
15 public function testRewriteSetOrderBy(): void
16 {
17 $tables = ['t' => ['columnTypes' => ['colors' => new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::STRING, "SET('red','blue')")]]];
18 $rewriter = new OrderRewriter();
19 self::assertSame("SELECT * FROM t ORDER BY (IF(FIND_IN_SET('red', `colors`) > 0, 1, 0) + IF(FIND_IN_SET('blue', `colors`) > 0, 2, 0)) DESC LIMIT 2", $rewriter->rewriteSetOrderBy('SELECT * FROM t ORDER BY `colors` DESC LIMIT 2', $tables));
20 self::assertSame('SELECT * FROM t', $rewriter->rewriteSetOrderBy('SELECT * FROM t', $tables));
21 }
22
23 public function testColumnMaps(): void
24 {
25 $tables = ['t' => ['columnTypes' => ['colors' => new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::STRING, "SET('red','blue')")]]];
26 self::assertSame([['`t`.`colors`' => ['red', 'blue']], ['colors' => ['red', 'blue']]], (new OrderRewriter())->columnMaps('SELECT * FROM t', $tables));
27 }
28
29 public function testRewriteItems(): void
30 {
31 $rewriter = new OrderRewriter();
32 self::assertSame("ORDER BY (IF(FIND_IN_SET('red', `colors`) > 0, 1, 0)) DESC, id LIMIT 1", $rewriter->rewriteItems(['ORDER BY `colors` DESC, id LIMIT 1', '`colors` DESC, id', ' LIMIT 1'], [], ['colors' => ['red']]));
33 self::assertSame('ORDER BY `colors`', $rewriter->rewriteItems(['ORDER BY `colors`', '`colors`', ''], [], ['colors' => null]));
34 }
35
36 public function testRankExpression(): void
37 {
38 self::assertSame("(IF(FIND_IN_SET('it''s', `colors`) > 0, 1, 0) + IF(FIND_IN_SET('blue', `colors`) > 0, 2, 0))", (new OrderRewriter())->rankExpression(["it's", 'blue'], '`colors`'));
39 }
40
41}
42