makeCase($sqlWalker, $this->firstPeriodStart, 'start'), $this->makeCase($sqlWalker, $this->firstPeriodEnd, 'end'), $this->makeCase($sqlWalker, $this->secondPeriodStart, 'start'), $this->makeCase($sqlWalker, $this->secondPeriodEnd, 'end') ); } 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( "CASE WHEN %s IS NOT NULL THEN %s ELSE '%s'::date END", $part->dispatch($sqlWalker), $part->dispatch($sqlWalker), $p ); } return sprintf( "CASE WHEN %s::date IS NOT NULL THEN %s::date ELSE '%s'::date END", $part->dispatch($sqlWalker), $part->dispatch($sqlWalker), $p ); } 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); } }