Skip to content

Commit

Permalink
Deployed cb25d52 with MkDocs version: 1.3.1
Browse files Browse the repository at this point in the history
  • Loading branch information
jonatas committed Nov 17, 2023
1 parent d10bd50 commit 92ceab1
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 31 deletions.
2 changes: 1 addition & 1 deletion search/search_index.json

Large diffs are not rendered by default.

28 changes: 14 additions & 14 deletions sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,72 +2,72 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2023-11-10</lastmod>
<lastmod>2023-11-17</lastmod>
<changefreq>daily</changefreq>
</url>
</urlset>
Binary file modified sitemap.xml.gz
Binary file not shown.
61 changes: 46 additions & 15 deletions sql-support/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -458,17 +458,20 @@
<h1 id="sql-support">SQL Support<a class="headerlink" href="#sql-support" title="Permanent link">&para;</a></h1>
<p>Fast is partially supporting SQL syntax. Behind the scenes it parses SQL using
<a href="https://github.com/pganalyze/pg_query">pg_query</a> and simplifies it to AST Nodes
using the same Ruby interface. It's using Postgresql parser behind the scenes,
but probably could be useful for other SQL similar diallects .</p>
<p>The plan is that Fast would auto-detect file extensions and choose the sql path
in case the file relates to sql.</p>
<p>By default, this module is not included into the main library as it still very
experimental.</p>
<div class="codehilite"><pre><span></span><code><span class="nb">require</span><span class="w"> </span><span class="s1">&#39;fast/sql&#39;</span>
</code></pre></div>

using the same interface. It's using Postgresql parser behind the scenes,
but probably could be useful for other SQL similar diallects.</p>
<div class="admonition info">
<p class="admonition-title">fast auto detects SQL files in the command line</p>
<p>By default, this module is not included into the main library.
Fast can auto-detect file extensions and choose the sql path in case the
file relates to sql.</p>
<p>Use <code>fast --sql</code> in case you want to force the usage of the SQL parser.</p>
<p>```</p>
<p>```</p>
</div>
<h1 id="parsing-a-sql-content">Parsing a sql content<a class="headerlink" href="#parsing-a-sql-content" title="Permanent link">&para;</a></h1>
<div class="codehilite"><pre><span></span><code><span class="n">ast</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Fast</span><span class="o">.</span><span class="n">parse_sql</span><span class="p">(</span><span class="s1">&#39;select 1&#39;</span><span class="p">)</span>
<div class="codehilite"><pre><span></span><code><span class="nb">require</span><span class="w"> </span><span class="s1">&#39;fast/sql&#39;</span>
<span class="n">ast</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Fast</span><span class="o">.</span><span class="n">parse_sql</span><span class="p">(</span><span class="s1">&#39;select 1&#39;</span><span class="p">)</span>
<span class="c1"># =&gt; s(:select_stmt,</span>
<span class="c1"># s(:target_list,</span>
<span class="c1"># s(:res_target,</span>
Expand All @@ -479,6 +482,21 @@ <h1 id="parsing-a-sql-content">Parsing a sql content<a class="headerlink" href="
<span class="c1"># s(:ival, 1))))))))</span>
</code></pre></div>

<h2 id="why-its-interesting-to-use-ast-for-sql">Why it's interesting to use AST for SQL?<a class="headerlink" href="#why-its-interesting-to-use-ast-for-sql" title="Permanent link">&para;</a></h2>
<p>Both SQL are available and do the same thing:</p>
<div class="codehilite"><pre><span></span><code><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">customers</span>
</code></pre></div>

<p>or</p>
<div class="codehilite"><pre><span></span><code><span class="k">table</span><span class="w"> </span><span class="n">customers</span>
</code></pre></div>

<p>they have exactly the same objective but written down in very different syntax.</p>
<p>Give a try:</p>
<div class="codehilite"><pre><span></span><code><span class="no">Fast</span><span class="o">.</span><span class="n">parse_sql</span><span class="p">(</span><span class="s2">&quot;select * from customers&quot;</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="no">Fast</span><span class="o">.</span><span class="n">parse_sql</span><span class="p">(</span><span class="s2">&quot;table customers&quot;</span><span class="p">)</span><span class="w"> </span><span class="c1"># =&gt; true</span>
</code></pre></div>

<h2 id="match">Match<a class="headerlink" href="#match" title="Permanent link">&para;</a></h2>
<p>Use <code>match?</code> with your node pattern to traverse the abstract syntax tree.</p>
<div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="no">Fast</span><span class="o">.</span><span class="n">match?</span><span class="p">(</span><span class="s2">&quot;(select_stmt ...)&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ast</span><span class="p">)</span><span class="w"> </span><span class="c1"># =&gt; true</span>
</code></pre></div>
Expand Down Expand Up @@ -510,10 +528,24 @@ <h1 id="parsing-a-sql-content">Parsing a sql content<a class="headerlink" href="
<span class="c1"># s(:ival, 1))))]</span>
</code></pre></div>

<h2 id="search-directly-from-the-ast">Search directly from the AST<a class="headerlink" href="#search-directly-from-the-ast" title="Permanent link">&para;</a></h2>
<p>You can also search directly from nodes and keep digging:</p>
<div class="codehilite"><pre><span></span><code><span class="n">ast</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Fast</span><span class="o">.</span><span class="n">parse_sql</span><span class="p">(</span><span class="s1">&#39;select 1&#39;</span><span class="p">);</span>
<span class="n">ast</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s1">&#39;ival&#39;</span><span class="p">)</span><span class="w"> </span><span class="c1"># =&gt; [s(:ival, s(:ival, 1))]</span>
</code></pre></div>

<p>Use first to return the node directly:</p>
<div class="codehilite"><pre><span></span><code><span class="n">ast</span><span class="o">.</span><span class="n">first</span><span class="p">(</span><span class="s1">&#39;(ival (ival _))&#39;</span><span class="p">)</span><span class="w"> </span><span class="c1">#=&gt; s(:ival, s(:ival, 1))</span>
</code></pre></div>

<p>Combine the <code>capture</code> method with <code>$</code>:</p>
<div class="codehilite"><pre><span></span><code><span class="n">ast</span><span class="o">.</span><span class="n">capture</span><span class="p">(</span><span class="s1">&#39;(ival (ival $_))&#39;</span><span class="p">)</span><span class="w"> </span><span class="c1"># =&gt; [1]</span>
</code></pre></div>

<h1 id="examples">Examples<a class="headerlink" href="#examples" title="Permanent link">&para;</a></h1>
<h2 id="capturing-fields-and-where-clause">Capturing fields and where clause<a class="headerlink" href="#capturing-fields-and-where-clause" title="Permanent link">&para;</a></h2>
<p>Let's dive into a more complex example capturing fields and from clause of a
condition. Let's start parsing the sql:</p>
<h2 id="capturing-fields-and-where-clause">Capturing fields and where clause<a class="headerlink" href="#capturing-fields-and-where-clause" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code><span class="n">ast</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Fast</span><span class="o">.</span><span class="n">parse_sql</span><span class="p">(</span><span class="s1">&#39;select name from customer&#39;</span><span class="p">)</span>
<span class="c1"># =&gt; s(:select_stmt,</span>
<span class="c1"># s(:target_list,</span>
Expand Down Expand Up @@ -599,13 +631,12 @@ <h2 id="replace">Replace<a class="headerlink" href="#replace" title="Permanent l
<span class="c1"># s(:res_target,</span>
<span class="c1"># s(:val,</span>
<span class="c1"># s(:a_const,</span>
<span class="c1"># s(:val,</span>
<span class="c1"># s(:integer,</span>
<span class="c1"># s(:ival, 1))))))))</span>
<span class="c1"># s(:ival,</span>
<span class="c1"># s(:ival, 1)))))))</span>
</code></pre></div>

<p>The pattern is simply matching node type that is <code>ival</code> but it could be a complex expression
like <code>(val (a_const (val (integer (ival _)))))</code>.</p>
like <code>(val (a_const (val (ival (ival _)))))</code>.</p>
<p>Completing the example:</p>
<div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="no">Fast</span><span class="o">.</span><span class="n">replace_sql</span><span class="p">(</span><span class="s2">&quot;ival&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ast</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;-&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">replace</span><span class="p">(</span><span class="n">n</span><span class="o">.</span><span class="n">loc</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;3&quot;</span><span class="p">)</span><span class="w"> </span><span class="p">})</span>
<span class="w"> </span><span class="c1"># =&gt; &quot;select 3&quot;</span>
Expand Down
2 changes: 1 addition & 1 deletion stylesheets/custom.css
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
:root {
--md-primary-fg-color: #355E3B; /* Primary text color to match the green in the logo */
--md-primary-bg-color: #FAFAFA; /* Light background, can be adjusted to your preference */
--md-primary-bg-color: #FAFAFA; /* Light background */
--md-accent-fg-color: #58A55C; /* Accent color for buttons and other elements */
--md-accent-bg-color: #E8F5E9; /* Light accent background, for elements like badges or tags */
}
Expand Down

0 comments on commit 92ceab1

Please sign in to comment.