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 110
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 1
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 128§

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 4

Relations§

Instantiated in 1