makeCase($sqlWalker, $this->firstPeriodStart, 'start'), $this->makeCase($sqlWalker, $this->firstPeriodEnd, 'end'), $this->makeCase($sqlWalker, $this->secondPeriodStart, 'start'), $this->makeCase($sqlWalker, $this->secondPeriodEnd, 'end') ); } public function parse(Parser $parser): void { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $this->firstPeriodStart = $parser->StringPrimary(); $parser->match(Lexer::T_COMMA); $this->firstPeriodEnd = $parser->StringPrimary(); $parser->match(Lexer::T_CLOSE_PARENTHESIS); $parser->match(Lexer::T_COMMA); $parser->match(Lexer::T_OPEN_PARENTHESIS); $this->secondPeriodStart = $parser->StringPrimary(); $parser->match(Lexer::T_COMMA); $this->secondPeriodEnd = $parser->StringPrimary(); $parser->match(Lexer::T_CLOSE_PARENTHESIS); } protected function makeCase($sqlWalker, $part, string $position): string { switch ($position) { case 'start': $p = '-infinity'; break; case 'end': $p = 'infinity'; break; default: throw new Exception('Unexpected position value.'); } if ($part instanceof PathExpression) { return sprintf( "COALESCE(%s, '%s'::date)", $part->dispatch($sqlWalker), $p ); } return sprintf( "COALESCE(%s::date, '%s'::date)", $part->dispatch($sqlWalker), $p ); } }