137748cd8SNickeau<?php 237748cd8SNickeau 337748cd8SNickeau 437748cd8SNickeaunamespace ComboStrap; 537748cd8SNickeau 637748cd8SNickeau 737748cd8SNickeauuse Antlr\Antlr4\Runtime\CommonTokenStream; 837748cd8SNickeauuse Antlr\Antlr4\Runtime\Error\Listeners\DiagnosticErrorListener; 937748cd8SNickeauuse Antlr\Antlr4\Runtime\InputStream; 1037748cd8SNickeauuse Antlr\Antlr4\Runtime\Tree\ParseTreeWalker; 1137748cd8SNickeauuse ComboStrap\PageSqlParser\PageSqlLexer; 1237748cd8SNickeauuse ComboStrap\PageSqlParser\PageSqlParser; 1337748cd8SNickeau 1437748cd8SNickeau 1537748cd8SNickeaurequire_once(__DIR__ . '/PluginUtility.php'); 1637748cd8SNickeau 1737748cd8SNickeauclass PageSql 1837748cd8SNickeau{ 191fa8c418SNickeau const CANONICAL = "sql"; 201fa8c418SNickeau 2137748cd8SNickeau private $sql; 2237748cd8SNickeau /** 2337748cd8SNickeau * @var PageSqlTreeListener 2437748cd8SNickeau */ 2537748cd8SNickeau private $listener; 2637748cd8SNickeau 2737748cd8SNickeau 2837748cd8SNickeau public function __construct($text) 2937748cd8SNickeau { 3037748cd8SNickeau $this->sql = $text; 3137748cd8SNickeau } 3237748cd8SNickeau 33*04fd306cSNickeau /** 34*04fd306cSNickeau * @param string $string 35*04fd306cSNickeau * @param MarkupPath|null $contextualPage - the page where the sql applies to 36*04fd306cSNickeau * @return PageSql 37*04fd306cSNickeau */ 38*04fd306cSNickeau public static function create(string $string, MarkupPath $contextualPage = null): PageSql 3937748cd8SNickeau { 4037748cd8SNickeau $parser = new PageSql($string); 41*04fd306cSNickeau $parser->parse($contextualPage); 4237748cd8SNickeau return $parser; 4337748cd8SNickeau } 4437748cd8SNickeau 45*04fd306cSNickeau /** 46*04fd306cSNickeau * @param MarkupPath|null $contextualPage - for the page 47*04fd306cSNickeau * @return $this 48*04fd306cSNickeau */ 49*04fd306cSNickeau function parse(MarkupPath $contextualPage = null): PageSql 5037748cd8SNickeau { 5137748cd8SNickeau $input = InputStream::fromString($this->sql); 5237748cd8SNickeau $lexer = new PageSqlLexer($input); 5337748cd8SNickeau $tokens = new CommonTokenStream($lexer); 5437748cd8SNickeau $parser = new PageSqlParser($tokens); 5537748cd8SNickeau $parser->addErrorListener(new DiagnosticErrorListener()); 5637748cd8SNickeau $parser->setBuildParseTree(true); 5737748cd8SNickeau $tree = $parser->pageSql(); 5837748cd8SNickeau 5937748cd8SNickeau /** 6037748cd8SNickeau * Performs a walk on the given parse tree starting at the root 6137748cd8SNickeau * and going down recursively with depth-first search. 6237748cd8SNickeau */ 63*04fd306cSNickeau $this->listener = new PageSqlTreeListener($lexer, $parser, $this->sql, $contextualPage); 6437748cd8SNickeau ParseTreeWalker::default()->walk($this->listener, $tree); 6537748cd8SNickeau return $this; 6637748cd8SNickeau } 6737748cd8SNickeau 6837748cd8SNickeau public function getExecutableSql(): string 6937748cd8SNickeau { 7037748cd8SNickeau return $this->listener->getPhysicalSql(); 7137748cd8SNickeau } 7237748cd8SNickeau 7337748cd8SNickeau public function getParameters(): array 7437748cd8SNickeau { 7537748cd8SNickeau return $this->listener->getParameters(); 7637748cd8SNickeau } 7737748cd8SNickeau 781fa8c418SNickeau public function getColumns(): array 7937748cd8SNickeau { 8037748cd8SNickeau return $this->listener->getColumns(); 8137748cd8SNickeau } 8237748cd8SNickeau 8337748cd8SNickeau public function __toString() 8437748cd8SNickeau { 8537748cd8SNickeau return $this->sql; 8637748cd8SNickeau } 8737748cd8SNickeau 884cadd4f8SNickeau public function getTable(): ?string 894cadd4f8SNickeau { 904cadd4f8SNickeau return $this->listener->getTable(); 914cadd4f8SNickeau } 924cadd4f8SNickeau 9337748cd8SNickeau} 94