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