packages/ztd-query-postgres/src/Sql/Sampling/PgSqlTableSampleParser.php
1<?php
2
3declare(strict_types=1);
4
5namespace ZtdQuery\Platform\Postgres\Sql\Sampling;
6
7use ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile;
8use ZtdQuery\Platform\Postgres\Sql\Relation\PgSqlSelectRelationParser;
9use ZtdQuery\Sql\SqlTokenStream;
10
11/**
12 * Table sample parser for PostgreSQL queries.
13 */
14final class PgSqlTableSampleParser
15{
16 /**
17 * @return list<PgSqlTableSample>
18 */
19 public function parse(string $sql): array
20 {
21 $stream = SqlTokenStream::tokenize($sql, PgSqlLexerProfile::create());
22 $tokens = $stream->significantTokens();
23 $samples = [];
24
25 foreach ((new PgSqlSelectRelationParser())->references($sql) as $reference) {
26 $referenceToken = (new SampleTokens())->tokenAtOffset($tokens, $reference['unqualifiedStart']);
27 if ($referenceToken === null) {
28 continue;
29 }
30 $sampleIndex = (new SampleTokens())->sampleIndexAfter($tokens, $referenceToken);
31 if ($sampleIndex === null) {
32 continue;
33 }
34 $samples[] = (new SampleClause())->parseSample($sql, $tokens, $reference, $sampleIndex, $referenceToken);
35 }
36
37 return $samples;
38 }
39}
40