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