xref: /plugin/combo/ComboStrap/PageSql.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
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
2937748cd8SNickeau    public function __construct($text)
3037748cd8SNickeau    {
3137748cd8SNickeau        $this->sql = $text;
3237748cd8SNickeau    }
3337748cd8SNickeau
3437748cd8SNickeau    public static function create(string $string): PageSql
3537748cd8SNickeau    {
3637748cd8SNickeau        $parser = new PageSql($string);
3737748cd8SNickeau        $parser->parse();
3837748cd8SNickeau        return $parser;
3937748cd8SNickeau    }
4037748cd8SNickeau
4137748cd8SNickeau    function parse(): PageSql
4237748cd8SNickeau    {
4337748cd8SNickeau        $input = InputStream::fromString($this->sql);
4437748cd8SNickeau        $lexer = new PageSqlLexer($input);
4537748cd8SNickeau        $tokens = new CommonTokenStream($lexer);
4637748cd8SNickeau        $parser = new PageSqlParser($tokens);
4737748cd8SNickeau        $parser->addErrorListener(new DiagnosticErrorListener());
4837748cd8SNickeau        $parser->setBuildParseTree(true);
4937748cd8SNickeau        $tree = $parser->pageSql();
5037748cd8SNickeau
5137748cd8SNickeau        /**
5237748cd8SNickeau         * Performs a walk on the given parse tree starting at the root
5337748cd8SNickeau         * and going down recursively with depth-first search.
5437748cd8SNickeau         */
551fa8c418SNickeau        $this->listener = new PageSqlTreeListener($lexer, $parser,$this->sql);
5637748cd8SNickeau        ParseTreeWalker::default()->walk($this->listener, $tree);
5737748cd8SNickeau        return $this;
5837748cd8SNickeau    }
5937748cd8SNickeau
6037748cd8SNickeau    public function getExecutableSql(): string
6137748cd8SNickeau    {
6237748cd8SNickeau        return $this->listener->getPhysicalSql();
6337748cd8SNickeau    }
6437748cd8SNickeau
6537748cd8SNickeau    public function getParameters(): array
6637748cd8SNickeau    {
6737748cd8SNickeau        return $this->listener->getParameters();
6837748cd8SNickeau    }
6937748cd8SNickeau
701fa8c418SNickeau    public function getColumns(): array
7137748cd8SNickeau    {
7237748cd8SNickeau        return $this->listener->getColumns();
7337748cd8SNickeau    }
7437748cd8SNickeau
7537748cd8SNickeau    public function __toString()
7637748cd8SNickeau    {
7737748cd8SNickeau        return $this->sql;
7837748cd8SNickeau    }
7937748cd8SNickeau
80*4cadd4f8SNickeau    public function getTable(): ?string
81*4cadd4f8SNickeau    {
82*4cadd4f8SNickeau        return $this->listener->getTable();
83*4cadd4f8SNickeau    }
84*4cadd4f8SNickeau
8537748cd8SNickeau}
86