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