xref: /plugin/combo/ComboStrap/PageSql.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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    public function __construct($text)
2937748cd8SNickeau    {
3037748cd8SNickeau        $this->sql = $text;
3137748cd8SNickeau    }
3237748cd8SNickeau
33*04fd306cSNickeau    /**
34*04fd306cSNickeau     * @param string $string
35*04fd306cSNickeau     * @param MarkupPath|null $contextualPage - the page where the sql applies to
36*04fd306cSNickeau     * @return PageSql
37*04fd306cSNickeau     */
38*04fd306cSNickeau    public static function create(string $string, MarkupPath $contextualPage = null): PageSql
3937748cd8SNickeau    {
4037748cd8SNickeau        $parser = new PageSql($string);
41*04fd306cSNickeau        $parser->parse($contextualPage);
4237748cd8SNickeau        return $parser;
4337748cd8SNickeau    }
4437748cd8SNickeau
45*04fd306cSNickeau    /**
46*04fd306cSNickeau     * @param MarkupPath|null $contextualPage - for the page
47*04fd306cSNickeau     * @return $this
48*04fd306cSNickeau     */
49*04fd306cSNickeau    function parse(MarkupPath $contextualPage = null): PageSql
5037748cd8SNickeau    {
5137748cd8SNickeau        $input = InputStream::fromString($this->sql);
5237748cd8SNickeau        $lexer = new PageSqlLexer($input);
5337748cd8SNickeau        $tokens = new CommonTokenStream($lexer);
5437748cd8SNickeau        $parser = new PageSqlParser($tokens);
5537748cd8SNickeau        $parser->addErrorListener(new DiagnosticErrorListener());
5637748cd8SNickeau        $parser->setBuildParseTree(true);
5737748cd8SNickeau        $tree = $parser->pageSql();
5837748cd8SNickeau
5937748cd8SNickeau        /**
6037748cd8SNickeau         * Performs a walk on the given parse tree starting at the root
6137748cd8SNickeau         * and going down recursively with depth-first search.
6237748cd8SNickeau         */
63*04fd306cSNickeau        $this->listener = new PageSqlTreeListener($lexer, $parser, $this->sql, $contextualPage);
6437748cd8SNickeau        ParseTreeWalker::default()->walk($this->listener, $tree);
6537748cd8SNickeau        return $this;
6637748cd8SNickeau    }
6737748cd8SNickeau
6837748cd8SNickeau    public function getExecutableSql(): string
6937748cd8SNickeau    {
7037748cd8SNickeau        return $this->listener->getPhysicalSql();
7137748cd8SNickeau    }
7237748cd8SNickeau
7337748cd8SNickeau    public function getParameters(): array
7437748cd8SNickeau    {
7537748cd8SNickeau        return $this->listener->getParameters();
7637748cd8SNickeau    }
7737748cd8SNickeau
781fa8c418SNickeau    public function getColumns(): array
7937748cd8SNickeau    {
8037748cd8SNickeau        return $this->listener->getColumns();
8137748cd8SNickeau    }
8237748cd8SNickeau
8337748cd8SNickeau    public function __toString()
8437748cd8SNickeau    {
8537748cd8SNickeau        return $this->sql;
8637748cd8SNickeau    }
8737748cd8SNickeau
884cadd4f8SNickeau    public function getTable(): ?string
894cadd4f8SNickeau    {
904cadd4f8SNickeau        return $this->listener->getTable();
914cadd4f8SNickeau    }
924cadd4f8SNickeau
9337748cd8SNickeau}
94