packages/ztd-query-postgres/tests/Unit/Sql/Sampling/SampleClauseTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Sampling;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Sql\Sampling\SampleClause::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Sampling\PgSqlTableSample::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Sampling\PgSqlTableSampleMethod::class)]
15final class SampleClauseTest extends TestCase
16{
17 public function testParseSample(): void
18 {
19 $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
20 $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
21 $reference = ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5];
22
23 self::assertEquals(new \ZtdQuery\Platform\Postgres\Sql\Sampling\PgSqlTableSample(tableName: 'users', sourceSql: 'users', aliasSql: '', method: \ZtdQuery\Platform\Postgres\Sql\Sampling\PgSqlTableSampleMethod::System, percentageSql: '10', seedSql: '7', startOffset: 0, endOffset: 44), (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleClause())->parseSample($sql, $tokens, $reference, 1, $tokens[0]));
24 }
25 public function testRepeatablePreservesTheSeedAndClosingOffset(): void
26 {
27 $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
28 $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
29 self::assertSame(['seed' => '7', 'end' => strlen($sql)], (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleClause())->repeatable($sql, $tokens, $tokens[0], 5));
30 }
31
32 public function testAliasSqlPreservesTheRelationAlias(): void
33 {
34 $sql = 'users u TABLESAMPLE SYSTEM (10)';
35 $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
36 self::assertSame('u', (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleClause())->aliasSql($sql, $tokens, ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5], $tokens[0], $tokens[2]));
37 }
38}
39