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