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

SQLite rewrite implementation for ZTD.

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

Compose a SQLite rewriter with caller-owned statedoctest
$parser = new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SqliteTransformer($parser, $select, new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Sqlite\Shadow\SqliteMutationResolver($store, $registry, new \ZtdQuery\Platform\Sqlite\Schema\SqliteSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter(new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard($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.

Returns transaction statement.

Parameters

$sqlstring
Recognize transaction commands independently of query classificationdoctest
$parser = new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SqliteTransformer($parser, $select, new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Sqlite\Shadow\SqliteMutationResolver($store, $registry, new \ZtdQuery\Platform\Sqlite\Schema\SqliteSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter(new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->transactionStatement('BEGIN') instanceof \ZtdQuery\Sql\TransactionStatement // => true
    $rewriter->transactionStatement('SELECT 1') // => null
Test cases 1
Calls 2
public function __construct(
    SqliteQueryGuard $guard,
    ShadowStore $shadowStore,
    TableDefinitionRegistry $registry,
    SqliteTransformer $transformer,
    SqliteMutationResolver $mutationResolver,
    SqliteParser $parser,
    ?ViewDefinitionSet $views = null,
)
Public API: explicitly declared with @visibility public.

Binds the dependencies used by this operation.

Parameters

Bind schema, shadow data and transformersdoctest
$parser = new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SqliteTransformer($parser, $select, new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Sqlite\Shadow\SqliteMutationResolver($store, $registry, new \ZtdQuery\Platform\Sqlite\Schema\SqliteSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter(new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->rewrite('SELECT 1')->kind() // => \ZtdQuery\Rewrite\QueryKind::READ
Calls 3
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.
Reject multiple statements on the single-statement APIdoctest
$parser = new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SqliteTransformer($parser, $select, new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Sqlite\Shadow\SqliteMutationResolver($store, $registry, new \ZtdQuery\Platform\Sqlite\Schema\SqliteSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter(new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->rewrite('SELECT 1; SELECT 2') // throws \ZtdQuery\Exception\UnsupportedSqlException: Multi-statement
Test cases 79
Calls 5
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.
Produce an ordered multi-statement plandoctest
$parser = new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SqliteTransformer($parser, $select, new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Sqlite\Shadow\SqliteMutationResolver($store, $registry, new \ZtdQuery\Platform\Sqlite\Schema\SqliteSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter(new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $plans = $rewriter->rewriteMultiple('SELECT 1; SELECT 2');
    $plans->count() // => 2
    $plans->get(1)?->sql() // => 'SELECT 2'
Test cases 2
Calls 5
public function splitStatements(string $sql): array
Public API: explicitly declared with @visibility public.

{@inheritDoc}

Parameters

$sqlstring

Returns

array
Split statements while preserving quoted semicolonsdoctest
$parser = new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SqliteTransformer($parser, $select, new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Sqlite\Shadow\SqliteMutationResolver($store, $registry, new \ZtdQuery\Platform\Sqlite\Schema\SqliteSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter(new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $rewriter->splitStatements("SELECT ';'; SELECT 2") // => ["SELECT ';'", 'SELECT 2']
Test cases 1
Called from 1
Calls 1
public function commitRewriteState(): void
Public API: explicitly declared with @visibility public.

Commits the transformer state after a rewrite completes.

Commit rewrite state after executiondoctest
$parser = new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SqliteTransformer($parser, $select, new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Sqlite\Shadow\SqliteMutationResolver($store, $registry, new \ZtdQuery\Platform\Sqlite\Schema\SqliteSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter(new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard($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 SELECT that produces no result rows.

Returns

string
Produce a SELECT with no rowsdoctest
$parser = new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser();
    $store = new \ZtdQuery\Shadow\ShadowStore();
    $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
    $select = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SelectTransformer();
    $transformer = new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\SqliteTransformer($parser, $select, new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\InsertTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\UpdateTransformer($parser, $select), new \ZtdQuery\Platform\Sqlite\Rewrite\Transformer\DeleteTransformer($parser, $select));
    $resolver = new \ZtdQuery\Platform\Sqlite\Shadow\SqliteMutationResolver($store, $registry, new \ZtdQuery\Platform\Sqlite\Schema\SqliteSchemaParser(), $parser);
    $rewriter = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter(new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard($parser), $store, $registry, $transformer, $resolver, $parser);
    $sql = $rewriter->emptyResultSelect();
    $pdo = new \PDO('sqlite::memory:');
    $pdo->query($sql)->fetchAll() // => []
Test cases 1

Private surface 9§

Implementation details, listed for orientation only.

private SqliteQueryGuard $guard
private ShadowStore $shadowStore
private TableDefinitionRegistry $registry
private SqliteTransformer $transformer
private SqliteMutationResolver $mutationResolver
private SqliteParser $parser
private SqliteReturningProjectionParser $returningProjectionParser
private SqliteCteShadowComposer $cteComposer
private ViewDefinitionSet $views

Test cases 87§

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

Dedicated tests 80
Other tests reaching this symbol 7

Relations§

Instantiated in 1