packages/ztd-query-mysql/tests/Unit/Rewrite/Partition/SelectionReaderTest.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\SelectionReader;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
12#[CoversClass(SelectionReader::class)]
13final class SelectionReaderTest extends TestCase
14{
15    public function testTokenIndexAtOrAfter(): void
16    {
17        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize('t PARTITION (p0)', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
18        $reader = new SelectionReader();
19        self::assertSame(1, $reader->tokenIndexAtOrAfter($tokens, 1));
20        self::assertSame(count($tokens), $reader->tokenIndexAtOrAfter($tokens, 999));
21    }
22
23    public function testClosingParenthesisIndex(): void
24    {
25        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize('(p0, (p1))', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
26        $reader = new SelectionReader();
27        self::assertSame(6, $reader->closingParenthesisIndex($tokens, $tokens[0]));
28        self::assertNull($reader->closingParenthesisIndex([$tokens[0]], $tokens[0]));
29    }
30
31    public function testPartitionNames(): void
32    {
33        $sql = '(`p0`, p1)';
34        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
35        self::assertSame(['p0', 'p1'], (new SelectionReader())->partitionNames($sql, $tokens[0], $tokens[4]));
36    }
37
38    public function testHasAlias(): void
39    {
40        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize('a WHERE `JOIN` +', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
41        $reader = new SelectionReader();
42        self::assertTrue($reader->hasAlias($tokens, 0));
43        self::assertFalse($reader->hasAlias($tokens, 1));
44        self::assertTrue($reader->hasAlias($tokens, 2));
45        self::assertFalse($reader->hasAlias($tokens, 3));
46        self::assertFalse($reader->hasAlias($tokens, 4));
47    }
48
49    public function testPartitionSelection(): void
50    {
51        $sql = 't PARTITION (p0, p1)';
52        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
53        self::assertSame(['names' => ['p0', 'p1'], 'closeIndex' => 6], (new SelectionReader())->partitionSelection($sql, $tokens, 1));
54    }
55
56    public function testRequireNoIndexHint(): void
57    {
58        $sql = 't PARTITION (p0) USE INDEX (idx)';
59        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
60        $this->expectException(\ZtdQuery\Exception\UnsupportedSqlException::class);
61        $this->expectExceptionMessage('index hint');
62        (new SelectionReader())->requireNoIndexHint($sql, $tokens, 4);
63    }
64
65}
66