Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
DateDiff
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 2
6
0.00% covered (danger)
0.00%
0 / 1
 parse
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
 getSql
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace Satag\AmicronEntityBundle\DQL;
6
7use Doctrine\ORM\Query\AST\Functions\FunctionNode;
8use Doctrine\ORM\Query\Parser;
9use Doctrine\ORM\Query\SqlWalker;
10use Doctrine\ORM\Query\TokenType;
11
12/**
13 * Firebird DQL function: DATEDIFF(unit, date1, date2)
14 *
15 * Generates: DATEDIFF(<unit>, <date1>, <date2>)
16 *
17 * Supported Firebird units: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND
18 *
19 * Usage in DQL:
20 *   SELECT DATEDIFF('DAY', e.startDate, e.endDate) FROM ...
21 *
22 * Note: The unit is passed as a DQL string literal (e.g. 'DAY') and emitted
23 * as an unquoted Firebird keyword in the generated SQL.
24 */
25final class DateDiff extends FunctionNode
26{
27    private mixed $unit = null;
28
29    private mixed $firstDate = null;
30
31    private mixed $secondDate = null;
32
33    public function parse(Parser $parser): void
34    {
35        $parser->match(TokenType::T_IDENTIFIER);
36        $parser->match(TokenType::T_OPEN_PARENTHESIS);
37        $this->unit = $parser->ArithmeticPrimary();
38        $parser->match(TokenType::T_COMMA);
39        $this->firstDate = $parser->ArithmeticPrimary();
40        $parser->match(TokenType::T_COMMA);
41        $this->secondDate = $parser->ArithmeticPrimary();
42        $parser->match(TokenType::T_CLOSE_PARENTHESIS);
43    }
44
45    public function getSql(SqlWalker $sqlWalker): string
46    {
47        // Retrieve unit SQL — a string literal like 'DAY' — and strip surrounding quotes
48        // Firebird DATEDIFF requires an unquoted unit keyword: DATEDIFF(DAY, d1, d2)
49        $unitSql = $sqlWalker->walkArithmeticPrimary($this->unit);
50        $unit = trim($unitSql, '\'"');
51
52        return \sprintf(
53            'DATEDIFF(%s, %s, %s)',
54            $unit,
55            $sqlWalker->walkArithmeticPrimary($this->firstDate),
56            $sqlWalker->walkArithmeticPrimary($this->secondDate),
57        );
58    }
59}