final class PgSqlRewriter
    implements SqlRewriter, RewriteStateCommitter
Public API: explicitly declared with @visibility public.

PostgreSQL rewrite implementation for ZTD.

Orchestrates parsing, classification, transformation, and mutation resolution. Uses Result Select Query approach (not RETURNING) for consistency across platforms.

Compose a rewriter for an empty catalogdoctest
$parser = new \ZtdQuery\Platform\Postgres\Sql\PgSqlParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\PgSqlTransformer($parser, $select, new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Postgres\Shadow\PgSqlMutationResolver($store, $registry, new \ZtdQuery\Platform\Postgres\Schema\PgSqlSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlRewriter(new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->rewrite('SELECT 1')->sql() // => 'SELECT 1'

Methods§

public function transactionStatement(string $sql): ?TransactionStatement
Public API: explicitly declared with @visibility public.

Parses a transaction control statement into a shadow transaction operation.

Parameters

$sqlstring
Ignore nontransaction statementsdoctest
$parser = new \ZtdQuery\Platform\Postgres\Sql\PgSqlParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\PgSqlTransformer($parser, $select, new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Postgres\Shadow\PgSqlMutationResolver($store, $registry, new \ZtdQuery\Platform\Postgres\Schema\PgSqlSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlRewriter(new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->transactionStatement('SELECT 1') // => null
Test cases 1
Calls 2
public function __construct(
    PgSqlQueryGuard $guard,
    ShadowStore $shadowStore,
    TableDefinitionRegistry $registry,
    PgSqlTransformer $transformer,
    PgSqlMutationResolver $mutationResolver,
    PgSqlParser $parser,
    ?ViewDefinitionSet $views = null,
)

Initializes the collaborators and state used by this rewriter.

Parameters

Calls 4
public function rewrite(string $sql): RewritePlan
Public API: explicitly declared with @visibility public.

{@inheritDoc}

Parameters

$sqlstring

Throws

UnsupportedSqlException When SQL is empty, unparseable, or multi-statement.
UnknownSchemaException When SQL references unknown tables/columns.
Rewrite a constant readdoctest
$parser = new \ZtdQuery\Platform\Postgres\Sql\PgSqlParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\PgSqlTransformer($parser, $select, new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Postgres\Shadow\PgSqlMutationResolver($store, $registry, new \ZtdQuery\Platform\Postgres\Schema\PgSqlSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlRewriter(new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $plan = $rewriter->rewrite('SELECT 1');
    $plan->sql() // => 'SELECT 1'
    $plan->kind() === \ZtdQuery\Rewrite\QueryKind::READ // => true
Test cases 125
Calls 6
public function rewriteMultiple(string $sql): MultiRewritePlan
Public API: explicitly declared with @visibility public.

{@inheritDoc}

Parameters

$sqlstring

Throws

UnsupportedSqlException When SQL is empty or unparseable.
UnknownSchemaException When SQL references unknown tables/columns.
Build ordered plans for multiple readsdoctest
$parser = new \ZtdQuery\Platform\Postgres\Sql\PgSqlParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\PgSqlTransformer($parser, $select, new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Postgres\Shadow\PgSqlMutationResolver($store, $registry, new \ZtdQuery\Platform\Postgres\Schema\PgSqlSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlRewriter(new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    count($rewriter->rewriteMultiple('SELECT 1; SELECT 2')->plans()) // => 2
Test cases 13
Calls 6
public function splitStatements(string $sql): array
Public API: explicitly declared with @visibility public.

{@inheritDoc}

Parameters

$sqlstring

Returns

array
Keep statement delimiters inside stringsdoctest
$parser = new \ZtdQuery\Platform\Postgres\Sql\PgSqlParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\PgSqlTransformer($parser, $select, new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Postgres\Shadow\PgSqlMutationResolver($store, $registry, new \ZtdQuery\Platform\Postgres\Schema\PgSqlSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlRewriter(new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->splitStatements("SELECT ';'; SELECT 2") // => ["SELECT ';'", 'SELECT 2']
Test cases 1
Called from 2
Calls 1
public function commitRewriteState(): void
Public API: explicitly declared with @visibility public.

Commits staged generated identity values after a successful rewrite.

Commit after a successful readdoctest
$parser = new \ZtdQuery\Platform\Postgres\Sql\PgSqlParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\PgSqlTransformer($parser, $select, new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Postgres\Shadow\PgSqlMutationResolver($store, $registry, new \ZtdQuery\Platform\Postgres\Schema\PgSqlSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlRewriter(new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->rewrite('SELECT 1');
    $rewriter->commitRewriteState();
    $rewriter->rewrite('SELECT 2')->sql() // => 'SELECT 2'
Test cases 2
Calls 1
public function emptyResultSelect(): string
Public API: explicitly declared with @visibility public.

Returns a PostgreSQL SELECT that produces no rows.

Returns

string
Produce an empty result querydoctest
$parser = new \ZtdQuery\Platform\Postgres\Sql\PgSqlParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\PgSqlTransformer($parser, $select, new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Postgres\Shadow\PgSqlMutationResolver($store, $registry, new \ZtdQuery\Platform\Postgres\Schema\PgSqlSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlRewriter(new \ZtdQuery\Platform\Postgres\Rewrite\PgSqlQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->emptyResultSelect() // => 'SELECT 1 WHERE FALSE'
Test cases 1

Private surface 10§

Implementation details, listed for orientation only.

private PgSqlQueryGuard $guard
private ShadowStore $shadowStore
private TableDefinitionRegistry $registry
private PgSqlTransformer $transformer
private PgSqlMutationResolver $mutationResolver
private PgSqlParser $parser
private PgSqlReturningProjectionParser $returningProjectionParser
private PgSqlCteShadowComposer $cteComposer
private PgSqlPartitionPredicateRenderer $partitionPredicateRenderer
private ViewDefinitionSet $views

Test cases 144§

Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.

Dedicated tests 124
Other tests reaching this symbol 20

Relations§

Instantiated in 1