-
Notifications
You must be signed in to change notification settings - Fork 49
/
Cast.php
39 lines (32 loc) · 1.17 KB
/
Cast.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
declare(strict_types=1);
namespace Oro\ORM\Query\AST\Platform\Functions\Mysql;
use Doctrine\ORM\Query\AST\Node;
use Doctrine\ORM\Query\SqlWalker;
use Oro\ORM\Query\AST\Functions\Cast as DqlFunction;
use Oro\ORM\Query\AST\Platform\Functions\PlatformFunctionNode;
class Cast extends PlatformFunctionNode
{
public function getSql(SqlWalker $sqlWalker): string
{
/** @var Node $value */
$value = $this->parameters[DqlFunction::PARAMETER_KEY];
$type = $this->parameters[DqlFunction::TYPE_KEY];
$type = \strtolower($type);
$isBoolean = $type === 'bool' || $type === 'boolean';
if ($type === 'char') {
$type = 'char(1)';
} elseif ($type === 'string' || $type === 'text' || $type === 'uuid') {
$type = 'char';
} elseif ($type === 'int' || $type === 'integer' || $isBoolean) {
$type = 'signed';
} elseif ($type === 'bigint') {
$type = 'unsigned';
}
$expression = 'CAST(' . $this->getExpressionValue($value, $sqlWalker) . ' AS ' . $type . ')';
if ($isBoolean) {
$expression .= ' <> 0';
}
return $expression;
}
}