packages/ztd-query-core/tests/Fake/QueryExecutorBuilder.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Fake;
6
7use ZtdQuery\Config\ZtdConfig;
8use ZtdQuery\Connection\ConnectionInterface;
9use ZtdQuery\Platform;
10use ZtdQuery\Platform\CopySupport;
11use ZtdQuery\Platform\MissingResultColumnTypeResolver;
12use ZtdQuery\Platform\ParameterBindingCompiler;
13use ZtdQuery\Platform\ResultColumnTypeResolver;
14use ZtdQuery\QueryExecutor;
15use ZtdQuery\ResultSelectRunner;
16use ZtdQuery\Rewrite\SqlRewriter;
17use ZtdQuery\Schema\TableDefinitionRegistry;
18use ZtdQuery\Session;
19use ZtdQuery\Shadow\ShadowStore;
20
21/**
22 * Constructs the core executor with controlled dialect behavior for unit tests.
23 */
24final class QueryExecutorBuilder
25{
26    /**
27     * Bind controlled dialect services to caller-supplied state.
28     */
29    public static function create(
30        SqlRewriter $rewriter,
31        ShadowStore $shadowStore,
32        ResultSelectRunner $resultSelectRunner,
33        ZtdConfig $config,
34        ConnectionInterface $connection,
35        ?TableDefinitionRegistry $registry = null,
36        ?CopySupport $copySupport = null,
37        ?ParameterBindingCompiler $parameterBindingCompiler = null,
38        ResultColumnTypeResolver $resultColumnTypeResolver = new MissingResultColumnTypeResolver(),
39    ): QueryExecutor {
40        $platform = new StubPlatform($rewriter, $copySupport, $parameterBindingCompiler, $resultColumnTypeResolver);
41        return new QueryExecutor($connection, $platform, $config, new Session($shadowStore, $registry ?? new TableDefinitionRegistry()), $resultSelectRunner);
42    }
43    /**
44     * Supply controlled SQL behavior while letting core allocate the session.
45     * @param-out ShadowStore $store
46     */
47    public static function platform(SqlRewriter $rewriter, ?ShadowStore &$store = null): Platform
48    {
49        $store ??= new ShadowStore();
50        return new StubPlatform($rewriter, store: $store);
51    }
52}
53