Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. <?php
  2.  
  3. namespace App\DQL;
  4.  
  5. use Doctrine\ORM\Query\AST\Functions\FunctionNode;
  6. use Doctrine\ORM\Query\AST\Literal;
  7. use Doctrine\ORM\Query\AST\OrderByClause;
  8. use Doctrine\ORM\Query\AST\PathExpression;
  9. use Doctrine\ORM\Query\Lexer;
  10. use Doctrine\ORM\Query\Parser;
  11. use Doctrine\ORM\Query\SqlWalker;
  12.  
  13. /**
  14. * StringAgg.
  15. */
  16. class StringAgg extends FunctionNode
  17. {
  18. /**
  19. * @var PathExpression|null
  20. */
  21. private $expression = null;
  22.  
  23. /**
  24. * @var Literal|null
  25. */
  26. private $delimiter = null;
  27.  
  28. /**
  29. * @var bool
  30. */
  31. private $isDistinct = false;
  32.  
  33. /**
  34. * @var OrderByClause|null
  35. */
  36. public $orderBy = null;
  37.  
  38. /**
  39. * @param Parser $parser
  40. */
  41. public function parse(Parser $parser): void
  42. {
  43. $parser->match(Lexer::T_IDENTIFIER);
  44. $parser->match(Lexer::T_OPEN_PARENTHESIS);
  45.  
  46. $lexer = $parser->getLexer();
  47. if ($lexer->isNextToken(Lexer::T_DISTINCT)) {
  48. $parser->match(Lexer::T_DISTINCT);
  49.  
  50. $this->isDistinct = true;
  51. }
  52.  
  53. $this->expression = $parser->PathExpression(PathExpression::TYPE_STATE_FIELD);
  54. $parser->match(Lexer::T_COMMA);
  55. $this->delimiter = $parser->StringPrimary();
  56.  
  57. if ($lexer->isNextToken(Lexer::T_ORDER)) {
  58. $this->orderBy = $parser->OrderByClause();
  59. }
  60.  
  61. $parser->match(Lexer::T_CLOSE_PARENTHESIS);
  62. }
  63.  
  64. /**
  65. * @param SqlWalker $sqlWalker
  66. *
  67. * @return string
  68. */
  69. public function getSql(SqlWalker $sqlWalker): string
  70. {
  71. return \sprintf('string_agg(%s%s, %s%s)',
  72. ($this->isDistinct ? 'DISTINCT ' : ''),
  73. $sqlWalker->walkPathExpression($this->expression),
  74. $sqlWalker->walkStringPrimary($this->delimiter),
  75. ($this->orderBy ? $sqlWalker->walkOrderByClause($this->orderBy) : '')
  76. );
  77. }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement