1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeau 4*37748cd8SNickeaunamespace ComboStrap; 5*37748cd8SNickeau 6*37748cd8SNickeau 7*37748cd8SNickeauuse Antlr\Antlr4\Runtime\CommonTokenStream; 8*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Error\Listeners\DiagnosticErrorListener; 9*37748cd8SNickeauuse Antlr\Antlr4\Runtime\InputStream; 10*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Tree\ParseTreeWalker; 11*37748cd8SNickeauuse ComboStrap\PageSqlParser\PageSqlLexer; 12*37748cd8SNickeauuse ComboStrap\PageSqlParser\PageSqlParser; 13*37748cd8SNickeau 14*37748cd8SNickeau 15*37748cd8SNickeaurequire_once(__DIR__ . '/PluginUtility.php'); 16*37748cd8SNickeau 17*37748cd8SNickeauclass PageSql 18*37748cd8SNickeau{ 19*37748cd8SNickeau private $sql; 20*37748cd8SNickeau /** 21*37748cd8SNickeau * @var PageSqlTreeListener 22*37748cd8SNickeau */ 23*37748cd8SNickeau private $listener; 24*37748cd8SNickeau 25*37748cd8SNickeau 26*37748cd8SNickeau 27*37748cd8SNickeau public function __construct($text) 28*37748cd8SNickeau { 29*37748cd8SNickeau $this->sql = $text; 30*37748cd8SNickeau } 31*37748cd8SNickeau 32*37748cd8SNickeau public static function create(string $string): PageSql 33*37748cd8SNickeau { 34*37748cd8SNickeau $parser = new PageSql($string); 35*37748cd8SNickeau $parser->parse(); 36*37748cd8SNickeau return $parser; 37*37748cd8SNickeau } 38*37748cd8SNickeau 39*37748cd8SNickeau function parse(): PageSql 40*37748cd8SNickeau { 41*37748cd8SNickeau $input = InputStream::fromString($this->sql); 42*37748cd8SNickeau $lexer = new PageSqlLexer($input); 43*37748cd8SNickeau $tokens = new CommonTokenStream($lexer); 44*37748cd8SNickeau $parser = new PageSqlParser($tokens); 45*37748cd8SNickeau $parser->addErrorListener(new DiagnosticErrorListener()); 46*37748cd8SNickeau $parser->setBuildParseTree(true); 47*37748cd8SNickeau $tree = $parser->pageSql(); 48*37748cd8SNickeau 49*37748cd8SNickeau /** 50*37748cd8SNickeau * Performs a walk on the given parse tree starting at the root 51*37748cd8SNickeau * and going down recursively with depth-first search. 52*37748cd8SNickeau */ 53*37748cd8SNickeau $this->listener = new PageSqlTreeListener($lexer, $parser); 54*37748cd8SNickeau ParseTreeWalker::default()->walk($this->listener, $tree); 55*37748cd8SNickeau return $this; 56*37748cd8SNickeau } 57*37748cd8SNickeau 58*37748cd8SNickeau public function getExecutableSql(): string 59*37748cd8SNickeau { 60*37748cd8SNickeau return $this->listener->getPhysicalSql(); 61*37748cd8SNickeau } 62*37748cd8SNickeau 63*37748cd8SNickeau public function getParameters(): array 64*37748cd8SNickeau { 65*37748cd8SNickeau return $this->listener->getParameters(); 66*37748cd8SNickeau } 67*37748cd8SNickeau 68*37748cd8SNickeau public function getColumns() 69*37748cd8SNickeau { 70*37748cd8SNickeau return $this->listener->getColumns(); 71*37748cd8SNickeau } 72*37748cd8SNickeau 73*37748cd8SNickeau public function __toString() 74*37748cd8SNickeau { 75*37748cd8SNickeau return $this->sql; 76*37748cd8SNickeau } 77*37748cd8SNickeau 78*37748cd8SNickeau} 79