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