mirror of
https://github.com/knex/knex.git
synced 2025-08-05 15:22:06 +00:00
248 lines
69 KiB
HTML
248 lines
69 KiB
HTML
<!DOCTYPE html><html lang="en"><head><title>clients/base/grammar</title></head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><meta name="groc-relative-root" content="../../"><meta name="groc-document-path" content="clients/base/grammar"><meta name="groc-project-path" content="clients/base/grammar.js"><link rel="stylesheet" type="text/css" media="all" href="../../assets/style.css"><script type="text/javascript" src="../../assets/behavior.js"></script><body><div id="meta"><div class="file-path">clients/base/grammar.js</div></div><div id="document"><div class="segment"><div class="comments"><div class="wrapper"><h2 id="grammar">Grammar</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">define</span><span class="p">)</span> <span class="p">{</span>
|
|
|
|
<span class="s2">"use strict"</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The "Grammar" is a collection of functions
|
|
which help to reliably compile the various pieces
|
|
of SQL into a valid, escaped query. These functions
|
|
are combined with dialect specific "Grammar" functions
|
|
to keep the interface database agnostic.</p></div></div><div class="code"><div class="wrapper"><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">)</span> <span class="p">{</span>
|
|
|
|
<span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'lodash'</span><span class="p">);</span>
|
|
|
|
<span class="kd">var</span> <span class="nx">Raw</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'../../lib/raw'</span><span class="p">).</span><span class="nx">Raw</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">Helpers</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'../../lib/helpers'</span><span class="p">).</span><span class="nx">Helpers</span><span class="p">;</span>
|
|
|
|
<span class="kd">var</span> <span class="nx">push</span> <span class="o">=</span> <span class="p">[].</span><span class="nx">push</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The list of different components</p></div></div><div class="code"><div class="wrapper"> <span class="kd">var</span> <span class="nx">components</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'columns'</span><span class="p">,</span> <span class="s1">'aggregates'</span><span class="p">,</span> <span class="s1">'from'</span><span class="p">,</span>
|
|
<span class="s1">'joins'</span><span class="p">,</span> <span class="s1">'wheres'</span><span class="p">,</span> <span class="s1">'groups'</span><span class="p">,</span> <span class="s1">'havings'</span><span class="p">,</span>
|
|
<span class="s1">'orders'</span><span class="p">,</span> <span class="s1">'limit'</span><span class="p">,</span> <span class="s1">'offset'</span><span class="p">,</span> <span class="s1">'unions'</span>
|
|
<span class="p">];</span>
|
|
|
|
<span class="nx">exports</span><span class="p">.</span><span class="nx">baseGrammar</span> <span class="o">=</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the current query builder.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">toSql</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">builder</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="nx">builder</span><span class="p">.</span><span class="nx">type</span> <span class="o">||</span> <span class="s1">'select'</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="nx">builder</span><span class="p">.</span><span class="nx">grammar</span><span class="p">[</span><span class="s1">'compile'</span> <span class="o">+</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">capitalize</span><span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">type</span><span class="p">)](</span><span class="nx">builder</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Gets the cleaned bindings.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getBindings</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">bindings</span> <span class="o">=</span> <span class="nx">builder</span><span class="p">.</span><span class="nx">bindings</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">cleaned</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">bindings</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>if (bindings[i] == void 0) continue;</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">bindings</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">||</span> <span class="nx">bindings</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">_source</span> <span class="o">!==</span> <span class="s1">'Raw'</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">cleaned</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">bindings</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
|
|
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
<span class="nx">push</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">cleaned</span><span class="p">,</span> <span class="nx">bindings</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">bindings</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">cleaned</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the <code>select</code> statement, or nested sub-selects
|
|
by calling each of the component compilers, trimming out
|
|
the empties, and returning a generated query string.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileSelect</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">columns</span><span class="p">)</span> <span class="o">&&</span> <span class="nx">_</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">aggregates</span><span class="p">))</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">columns</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'*'</span><span class="p">];</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">components</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">component</span> <span class="o">=</span> <span class="nx">components</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">result</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">component</span><span class="p">);</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">result</span> <span class="o">!=</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">sql</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">this</span><span class="p">[</span><span class="s1">'compile'</span> <span class="o">+</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">capitalize</span><span class="p">(</span><span class="nx">component</span><span class="p">)](</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">result</span><span class="p">));</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>If there is a transaction, and we have either <code>forUpdate</code> or <code>forShare</code> specified,
|
|
call the appropriate additions to the select statement.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">transaction</span> <span class="o">&&</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">selectMode</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">sql</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">this</span><span class="p">[</span><span class="s1">'compile'</span> <span class="o">+</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">selectMode</span><span class="p">](</span><span class="nx">qb</span><span class="p">));</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">compact</span><span class="p">(</span><span class="nx">sql</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the columns with aggregate functions.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileAggregates</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="p">[],</span> <span class="nx">segments</span><span class="p">,</span> <span class="nx">column</span><span class="p">;</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">aggregates</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">aggregate</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">aggregates</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">aggregate</span><span class="p">.</span><span class="nx">columns</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">().</span><span class="nx">indexOf</span><span class="p">(</span><span class="s1">' as '</span><span class="p">)</span> <span class="o">!==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">segments</span> <span class="o">=</span> <span class="nx">aggregate</span><span class="p">.</span><span class="nx">columns</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">' '</span><span class="p">);</span>
|
|
<span class="nx">column</span> <span class="o">=</span> <span class="nx">segments</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
|
|
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
<span class="nx">column</span> <span class="o">=</span> <span class="nx">aggregate</span><span class="p">.</span><span class="nx">columns</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">sql</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">aggregate</span><span class="p">.</span><span class="nx">type</span> <span class="o">+</span> <span class="s1">'('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span> <span class="o">+</span> <span class="p">(</span><span class="nx">segments</span> <span class="o">?</span> <span class="s1">' as '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">segments</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">:</span> <span class="s1">''</span><span class="p">));</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the columns in the query, specifying if an item was distinct.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileColumns</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">columns</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">distinct</span> <span class="o">?</span> <span class="s1">'select distinct'</span> <span class="o">:</span> <span class="s1">'select'</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">columns</span><span class="p">)</span> <span class="o">&&</span> <span class="nx">_</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">(</span><span class="nx">columns</span><span class="p">))</span> <span class="o">?</span> <span class="s1">''</span> <span class="o">:</span> <span class="s1">' '</span><span class="o">+</span><span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">columns</span><span class="p">));</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the <code>from</code> tableName portion of the query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileFrom</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">table</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'from '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">table</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles all each of the <code>join</code> clauses on the query,
|
|
including any nested join queries.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileJoins</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">joins</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">joins</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">join</span> <span class="o">=</span> <span class="nx">joins</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="kd">var</span> <span class="nx">clauses</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l2</span> <span class="o">=</span> <span class="nx">join</span><span class="p">.</span><span class="nx">clauses</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i2</span> <span class="o"><</span> <span class="nx">l2</span><span class="p">;</span> <span class="nx">i2</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">clause</span> <span class="o">=</span> <span class="nx">join</span><span class="p">.</span><span class="nx">clauses</span><span class="p">[</span><span class="nx">i2</span><span class="p">];</span>
|
|
<span class="nx">clauses</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="nx">clause</span><span class="p">[</span><span class="s1">'bool'</span><span class="p">],</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">clause</span><span class="p">[</span><span class="s1">'first'</span><span class="p">]),</span> <span class="nx">clause</span><span class="p">.</span><span class="nx">operator</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">clause</span><span class="p">[</span><span class="s1">'second'</span><span class="p">])].</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span>
|
|
<span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">clauses</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nx">clauses</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/and |or /</span><span class="p">,</span> <span class="s1">''</span><span class="p">);</span>
|
|
<span class="nx">sql</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">join</span><span class="p">.</span><span class="nx">joinType</span> <span class="o">+</span> <span class="s1">' join '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">join</span><span class="p">.</span><span class="nx">table</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' on '</span> <span class="o">+</span> <span class="nx">clauses</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">));</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles all <code>where</code> statements on the query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileWheres</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="kd">var</span> <span class="nx">wheres</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">wheres</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">wheres</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="s1">''</span><span class="p">;</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">wheres</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">where</span> <span class="o">=</span> <span class="nx">wheres</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="nx">sql</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">bool</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="k">this</span><span class="p">[</span><span class="s1">'where'</span> <span class="o">+</span> <span class="nx">where</span><span class="p">.</span><span class="nx">type</span><span class="p">](</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">));</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nx">sql</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span> <span class="o">?</span> <span class="s1">'where '</span> <span class="o">+</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">).</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/and |or /</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span> <span class="o">:</span> <span class="s1">''</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile the "union" queries attached to the main query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileUnions</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">unions</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">union</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">unions</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="nx">sql</span> <span class="o">+=</span> <span class="p">(</span><span class="nx">union</span><span class="p">.</span><span class="nx">all</span> <span class="o">?</span> <span class="s1">'union all '</span> <span class="o">:</span> <span class="s1">'union '</span><span class="p">)</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileSelect</span><span class="p">(</span><span class="nx">union</span><span class="p">.</span><span class="nx">query</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">sql</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a nested where clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereNested</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileWheres</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">query</span><span class="p">).</span><span class="nx">slice</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a nested where clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereSub</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">where</span><span class="p">.</span><span class="nx">operator</span> <span class="o">+</span> <span class="s1">' ('</span> <span class="o">+</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">compileSelect</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">query</span><span class="p">))</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a basic where clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereBasic</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">where</span><span class="p">.</span><span class="nx">operator</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameter</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a basic exists clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereExists</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'exists ('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileSelect</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">query</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a basic not exists clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereNotExists</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'not exists ('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileSelect</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">query</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a where in clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereIn</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' in ('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameterize</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">value</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a where not in clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereNotIn</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' not in ('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameterize</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">value</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a sub-where in clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereInSub</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' in ('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileSelect</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">query</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a sub-where not in clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereNotInSub</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' not in ('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileSelect</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">query</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Where between.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">whereBetween</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' between ? and ?'</span><span class="p">;</span>
|
|
<span class="p">},</span>
|
|
|
|
<span class="nx">whereNull</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' is null'</span><span class="p">;</span>
|
|
<span class="p">},</span>
|
|
|
|
<span class="nx">whereNotNull</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' is not null'</span><span class="p">;</span>
|
|
<span class="p">},</span>
|
|
|
|
<span class="nx">whereRaw</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">where</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">where</span><span class="p">.</span><span class="nx">sql</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the <code>group by</code> columns.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileGroups</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">groups</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'group by '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">groups</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the <code>having</code> statements.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileHavings</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">havings</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">havings</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">h</span> <span class="o">=</span> <span class="s1">'having '</span> <span class="o">+</span> <span class="nx">havings</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">having</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">having</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">'Raw'</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">having</span><span class="p">.</span><span class="nx">bool</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">having</span><span class="p">.</span><span class="nx">sql</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">having</span><span class="p">.</span><span class="nx">bool</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">having</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">having</span><span class="p">.</span><span class="nx">operator</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameter</span><span class="p">(</span><span class="nx">having</span><span class="p">[</span><span class="s1">'value'</span><span class="p">]);</span>
|
|
<span class="p">},</span> <span class="k">this</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="nx">h</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/and |or /</span><span class="p">,</span> <span class="s1">''</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the <code>order by</code> statements.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileOrders</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">orders</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">orders</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'order by '</span> <span class="o">+</span> <span class="nx">orders</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">order</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">''</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">order</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">order</span><span class="p">.</span><span class="nx">direction</span><span class="p">;</span>
|
|
<span class="p">},</span> <span class="k">this</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the <code>limit</code> statements.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileLimit</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">limit</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'limit '</span> <span class="o">+</span> <span class="nx">limit</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles an <code>offset</code> statement on the query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileOffset</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">offset</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'offset '</span> <span class="o">+</span> <span class="nx">offset</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles an <code>insert</code> query, allowing for multiple
|
|
inserts using a single query statement.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileInsert</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">values</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">values</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">pluck</span><span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">0</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">paramBlocks</span> <span class="o">=</span> <span class="p">[];</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>If there are any "where" clauses, we need to omit
|
|
any bindings that may have been associated with them.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">wheres</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">clearWhereBindings</span><span class="p">(</span><span class="nx">qb</span><span class="p">);</span>
|
|
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">values</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">paramBlocks</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">"("</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameterize</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">pluck</span><span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">")"</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">return</span> <span class="s2">"insert into "</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s2">" ("</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">columns</span><span class="p">)</span> <span class="o">+</span> <span class="s2">") values "</span> <span class="o">+</span> <span class="nx">paramBlocks</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Depending on the type of <code>where</code> clause, this will appropriately
|
|
remove any binding caused by "where" constraints, allowing the same
|
|
query to be used for <code>insert</code> and <code>update</code> without issue.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">clearWhereBindings</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">wheres</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">wheres</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">bindingCount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">wheres</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o"><</span><span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">where</span> <span class="o">=</span> <span class="nx">wheres</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">value</span><span class="p">))</span> <span class="p">{</span>
|
|
<span class="nx">bindingCount</span> <span class="o">+=</span> <span class="nx">where</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
|
|
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">where</span><span class="p">.</span><span class="nx">query</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">bindingCount</span> <span class="o">+=</span> <span class="nx">where</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">bindings</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
|
|
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
<span class="nx">bindingCount</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">qb</span><span class="p">.</span><span class="nx">bindings</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">bindings</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="nx">bindingCount</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles an <code>update</code> query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileUpdate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">values</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">values</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">),</span> <span class="nx">columns</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">values</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="nx">columns</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">value</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="s1">' = '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameter</span><span class="p">(</span><span class="nx">value</span><span class="p">[</span><span class="mi">1</span><span class="p">]));</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="s1">'update '</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">' set '</span> <span class="o">+</span> <span class="nx">columns</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileWheres</span><span class="p">(</span><span class="nx">qb</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a <code>delete</code> query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileDelete</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">where</span> <span class="o">=</span> <span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">wheres</span><span class="p">)</span> <span class="o">?</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileWheres</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="o">:</span> <span class="s1">''</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="s1">'delete from '</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">where</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a <code>truncate</code> query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileTruncate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'truncate '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Adds a <code>for update</code> clause to the query, relevant with transactions.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileForUpdate</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'for update'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Adds a <code>for share</code> clause to the query, relevant with transactions.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileForShare</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'for share'</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Puts the appropriate wrapper around a value depending on the database
|
|
engine, unless it's a knex.raw value, in which case it's left alone.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">wrap</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">segments</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">value</span> <span class="k">instanceof</span> <span class="nx">Raw</span><span class="p">)</span> <span class="k">return</span> <span class="nx">value</span><span class="p">.</span><span class="nx">sql</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isNumber</span><span class="p">(</span><span class="nx">value</span><span class="p">))</span> <span class="k">return</span> <span class="nx">value</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">().</span><span class="nx">indexOf</span><span class="p">(</span><span class="s1">' as '</span><span class="p">)</span> <span class="o">!==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">segments</span> <span class="o">=</span> <span class="nx">value</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">' '</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">segments</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="s1">' as '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">segments</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span>
|
|
<span class="p">}</span>
|
|
<span class="kd">var</span> <span class="nx">wrapped</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="nx">segments</span> <span class="o">=</span> <span class="nx">value</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">);</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">segments</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span> <span class="o">=</span> <span class="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">value</span> <span class="o">=</span> <span class="nx">segments</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">i</span> <span class="o">===</span> <span class="mi">0</span> <span class="o">&&</span> <span class="nx">segments</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">wrapped</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">value</span><span class="p">));</span>
|
|
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
<span class="nx">wrapped</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">wrapValue</span><span class="p">(</span><span class="nx">value</span><span class="p">));</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">wrapped</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">'.'</span><span class="p">);</span>
|
|
<span class="p">},</span>
|
|
|
|
<span class="nx">wrapArray</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">values</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
|
|
<span class="p">},</span>
|
|
|
|
<span class="nx">wrapTable</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">table</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">table</span> <span class="k">instanceof</span> <span class="nx">Raw</span><span class="p">)</span> <span class="k">return</span> <span class="nx">table</span><span class="p">.</span><span class="nx">sql</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">table</span><span class="p">);</span>
|
|
<span class="p">},</span>
|
|
|
|
<span class="nx">columnize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">columns</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">columns</span><span class="p">))</span> <span class="nx">columns</span> <span class="o">=</span> <span class="p">[</span><span class="nx">columns</span><span class="p">];</span>
|
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">columns</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">,</span> <span class="k">this</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">);</span>
|
|
<span class="p">},</span>
|
|
|
|
<span class="nx">parameterize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">values</span><span class="p">))</span> <span class="nx">values</span> <span class="o">=</span> <span class="p">[</span><span class="nx">values</span><span class="p">];</span>
|
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">values</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameter</span><span class="p">,</span> <span class="k">this</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">);</span>
|
|
<span class="p">},</span>
|
|
|
|
<span class="nx">parameter</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nx">value</span> <span class="k">instanceof</span> <span class="nx">Raw</span> <span class="o">?</span> <span class="nx">value</span><span class="p">.</span><span class="nx">sql</span> <span class="o">:</span> <span class="s1">'?'</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="p">});</span>
|
|
|
|
<span class="p">})(</span>
|
|
<span class="k">typeof</span> <span class="nx">define</span> <span class="o">===</span> <span class="s1">'function'</span> <span class="o">&&</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span> <span class="o">?</span> <span class="nx">define</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">factory</span><span class="p">)</span> <span class="p">{</span> <span class="nx">factory</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">);</span> <span class="p">}</span>
|
|
<span class="p">);</span></div></div></div></div></body></html> |