packages/ztd-query-mysql/bench/RewriterBench.php

1<?php
2
3declare(strict_types=1);
4
5namespace Bench;
6
7use LogicException;
8use PhpBench\Attributes as Bench;
9use ZtdQuery\Platform\MySql\Rewrite\MySqlQueryGuard;
10use ZtdQuery\Platform\MySql\Rewrite\MySqlRewriter;
11use ZtdQuery\Platform\MySql\Rewrite\Transformer\DeleteTransformer;
12use ZtdQuery\Platform\MySql\Rewrite\Transformer\InsertTransformer;
13use ZtdQuery\Platform\MySql\Rewrite\Transformer\MySqlTransformer;
14use ZtdQuery\Platform\MySql\Rewrite\Transformer\ReplaceTransformer;
15use ZtdQuery\Platform\MySql\Rewrite\Transformer\SelectTransformer;
16use ZtdQuery\Platform\MySql\Rewrite\Transformer\UpdateTransformer;
17use ZtdQuery\Platform\MySql\Schema\MySqlSchemaParser;
18use ZtdQuery\Platform\MySql\Shadow\MySqlMutationResolver;
19use ZtdQuery\Platform\MySql\Sql\MySqlParser;
20use ZtdQuery\Schema\TableDefinitionRegistry;
21use ZtdQuery\Shadow\ShadowStore;
22
23/**
24 * Implements the Rewriter Bench contract for MySQL.
25 */
26final class RewriterBench
27{
28    private MySqlRewriter $rewriter;
29
30    private string $selectSql = 'SELECT id, name, email FROM users WHERE id = 1';
31
32    private string $insertSql = "INSERT INTO users (id, name, email) VALUES (1, 'Alice', 'alice@example.com')";
33
34    /**
35     * Set Up for the supplied MySQL input.
36     * @throws LogicException
37     */
38    public function setUp(): void
39    {
40        $parser = new MySqlParser();
41        $schemaParser = new MySqlSchemaParser($parser);
42        $definition = $schemaParser->parse('CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(255), email VARCHAR(255))');
43        if ($definition === null) {
44            throw new LogicException('Failed to parse benchmark schema.');
45        }
46
47        $registry = new TableDefinitionRegistry();
48        $registry->register('users', $definition);
49
50        $store = new ShadowStore();
51        $selectTransformer = new SelectTransformer();
52        $insertTransformer = new InsertTransformer($parser, $selectTransformer);
53        $updateTransformer = new UpdateTransformer($parser, $selectTransformer);
54        $deleteTransformer = new DeleteTransformer($parser, $selectTransformer);
55        $replaceTransformer = new ReplaceTransformer($parser, $selectTransformer);
56        $transformer = new MySqlTransformer(
57            $parser,
58            $selectTransformer,
59            $insertTransformer,
60            $updateTransformer,
61            $deleteTransformer,
62            $replaceTransformer,
63        );
64        $mutationResolver = new MySqlMutationResolver(
65            $store,
66            $registry,
67            $schemaParser,
68            $updateTransformer,
69            $deleteTransformer,
70        );
71
72        $this->rewriter = new MySqlRewriter(
73            new MySqlQueryGuard($parser),
74            $store,
75            $registry,
76            $transformer,
77            $mutationResolver,
78            $parser,
79        );
80    }
81
82    /**
83     * Bench Rewrite Select for the supplied MySQL input.
84     */
85    #[Bench\BeforeMethods('setUp')]
86    #[Bench\Revs(1000)]
87    public function benchRewriteSelect(): void
88    {
89        $this->rewriter->rewrite($this->selectSql);
90    }
91
92    /**
93     * Bench Rewrite Insert for the supplied MySQL input.
94     */
95    #[Bench\BeforeMethods('setUp')]
96    #[Bench\Revs(1000)]
97    public function benchRewriteInsert(): void
98    {
99        $this->rewriter->rewrite($this->insertSql);
100    }
101}
102