packages/ztd-query-core/tests/Fake/FakeCastRenderer.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Fake;
6
7use ZtdQuery\Platform\CastRenderer;
8use ZtdQuery\Schema\ColumnDeclaration;
9use ZtdQuery\Schema\ColumnTypeFamily;
10
11/**
12 * Fake CastRenderer that produces generic CAST expressions.
13 */
14final class FakeCastRenderer implements CastRenderer
15{
16 /**
17 * Writes cast.
18 *
19 * @param string $expression
20 * @param ColumnDeclaration $type
21 * @return string
22 */
23 public function renderCast(string $expression, ColumnDeclaration $type): string
24 {
25 return sprintf('CAST(%s AS %s)', $expression, $this->mapType($type));
26 }
27
28 /**
29 * Writes null cast.
30 *
31 * @param ColumnDeclaration $type
32 * @return string
33 */
34 public function renderNullCast(ColumnDeclaration $type): string
35 {
36 return sprintf('CAST(NULL AS %s)', $this->mapType($type));
37 }
38
39 /**
40 * Map type.
41 *
42 * @param ColumnDeclaration $type
43 * @return string
44 */
45 public function mapType(ColumnDeclaration $type): string
46 {
47 return match ($type->family) {
48 ColumnTypeFamily::INTEGER => 'INTEGER',
49 ColumnTypeFamily::FLOAT => 'REAL',
50 ColumnTypeFamily::DOUBLE => 'REAL',
51 ColumnTypeFamily::DECIMAL => 'NUMERIC',
52 ColumnTypeFamily::STRING => 'TEXT',
53 ColumnTypeFamily::TEXT => 'TEXT',
54 ColumnTypeFamily::BOOLEAN => 'INTEGER',
55 ColumnTypeFamily::DATE => 'TEXT',
56 ColumnTypeFamily::TIME => 'TEXT',
57 ColumnTypeFamily::DATETIME => 'TEXT',
58 ColumnTypeFamily::TIMESTAMP => 'TEXT',
59 ColumnTypeFamily::BINARY => 'BLOB',
60 ColumnTypeFamily::JSON => 'TEXT',
61 ColumnTypeFamily::UNKNOWN => $type->nativeType !== '' ? $type->nativeType : 'TEXT',
62 };
63 }
64}
65