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