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