xref: /plugin/combo/ComboStrap/PageSql.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
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