packages/ztd-query-mysql/tests/Unit/Rewrite/Partition/SourceProjectionTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Partition;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\Partition\SourceProjection;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Partition\SelectionReader::class)]
13#[CoversClass(SourceProjection::class)]
14final class SourceProjectionTest extends TestCase
15{
16    public function testEdit(): void
17    {
18        $sql = 'db.t PARTITION (p0)';
19        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
20        $reference = ['name' => 't', 'start' => 0, 'unqualifiedStart' => 3, 'end' => 4];
21        self::assertSame(['start' => 0, 'end' => 19, 'replacement' => '(SELECT * FROM t WHERE id < 10) AS t'], (new SourceProjection())->edit($sql, $reference, $tokens, 6, 'id < 10'));
22    }
23
24    public function testEditPreservesExistingAlias(): void
25    {
26        $sql = 't PARTITION (p0) alias';
27        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
28        $reference = ['name' => 't', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 1];
29        self::assertSame(['start' => 0, 'end' => 16, 'replacement' => '(SELECT * FROM t WHERE TRUE)'], (new SourceProjection())->edit($sql, $reference, $tokens, 4, 'TRUE'));
30    }
31
32}
33