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