knex/docs/clients/base/grammar.html

248 lines
69 KiB
HTML
Raw Normal View History

2013-09-13 13:50:41 -04:00
<!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">&quot;use strict&quot;</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>
2013-11-25 02:06:42 -05:00
<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">&#39;lodash&#39;</span><span class="p">);</span>
2013-09-13 13:50:41 -04:00
<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">&#39;../../lib/raw&#39;</span><span class="p">).</span><span class="nx">Raw</span><span class="p">;</span>
2013-09-24 09:15:50 -04:00
<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">&#39;../../lib/helpers&#39;</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>
2013-11-25 02:06:42 -05:00
<span class="s1">&#39;columns&#39;</span><span class="p">,</span> <span class="s1">&#39;aggregates&#39;</span><span class="p">,</span> <span class="s1">&#39;from&#39;</span><span class="p">,</span>
2013-09-13 13:50:41 -04:00
<span class="s1">&#39;joins&#39;</span><span class="p">,</span> <span class="s1">&#39;wheres&#39;</span><span class="p">,</span> <span class="s1">&#39;groups&#39;</span><span class="p">,</span> <span class="s1">&#39;havings&#39;</span><span class="p">,</span>
<span class="s1">&#39;orders&#39;</span><span class="p">,</span> <span class="s1">&#39;limit&#39;</span><span class="p">,</span> <span class="s1">&#39;offset&#39;</span><span class="p">,</span> <span class="s1">&#39;unions&#39;</span>
<span class="p">];</span>
2013-09-17 07:15:18 -04:00
<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>
2013-09-13 13:50:41 -04:00
<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">&#39;select&#39;</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">&#39;compile&#39;</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>
2013-09-24 09:15:50 -04:00
<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">&lt;</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">&#39;Raw&#39;</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>
2013-09-13 13:50:41 -04:00
<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>
2013-11-25 02:06:42 -05:00
<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">&amp;&amp;</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">&#39;*&#39;</span><span class="p">];</span>
2013-09-13 13:50:41 -04:00
<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">&lt;</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">&#39;compile&#39;</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>
2013-09-13 13:50:41 -04:00
<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">&amp;&amp;</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">&#39;compile&#39;</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>
2013-09-13 13:50:41 -04:00
<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">&#39; &#39;</span><span class="p">);</span>
2013-11-25 02:06:42 -05:00
<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">&lt;</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">&#39; as &#39;</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">&#39; &#39;</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">&#39;(&#39;</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">&#39;)&#39;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">segments</span> <span class="o">?</span> <span class="s1">&#39; as &#39;</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">&#39;&#39;</span><span class="p">));</span>
2013-09-13 13:50:41 -04:00
<span class="p">}</span>
2013-11-25 02:06:42 -05:00
<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">&#39;, &#39;</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">&#39;select distinct&#39;</span> <span class="o">:</span> <span class="s1">&#39;select&#39;</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">&amp;&amp;</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">&#39;&#39;</span> <span class="o">:</span> <span class="s1">&#39; &#39;</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>
2013-09-13 13:50:41 -04:00
<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">&#39;from &#39;</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">&lt;</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">&lt;</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">&#39;bool&#39;</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">&#39;first&#39;</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">&#39;second&#39;</span><span class="p">])].</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39; &#39;</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">&#39;&#39;</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">&#39; join &#39;</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">&#39; on &#39;</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">&#39; &#39;</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">&#39; &#39;</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">&#39;&#39;</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">&lt;</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">&#39; &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">[</span><span class="s1">&#39;where&#39;</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">&gt;</span> <span class="mi">0</span> <span class="o">?</span> <span class="s1">&#39;where &#39;</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">&#39; &#39;</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">&#39;&#39;</span><span class="p">)</span> <span class="o">:</span> <span class="s1">&#39;&#39;</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">&#39;&#39;</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">&lt;</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">&#39;union all &#39;</span> <span class="o">:</span> <span class="s1">&#39;union &#39;</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">&#39;(&#39;</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">&#39;)&#39;</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">&#39; &#39;</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">&#39; (&#39;</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">&#39;)&#39;</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">&#39; &#39;</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">&#39; &#39;</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">&#39;exists (&#39;</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">&#39;)&#39;</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">&#39;not exists (&#39;</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">&#39;)&#39;</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">&#39; in (&#39;</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">&#39;)&#39;</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">&#39; not in (&#39;</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">&#39;)&#39;</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">&#39; in (&#39;</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">&#39;)&#39;</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">&#39; not in (&#39;</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">&#39;)&#39;</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">&#39; between ? and ?&#39;</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">&#39; is null&#39;</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">&#39; is not null&#39;</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">&#39;group by &#39;</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>
2013-11-25 02:06:42 -05:00
<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">&#39;having &#39;</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>
2013-09-13 13:50:41 -04:00
<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">&#39;Raw&#39;</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">&#39; &#39;</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">&#39; &#39;</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">&#39; &#39;</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">&#39; &#39;</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">&#39;value&#39;</span><span class="p">]);</span>
2013-11-25 02:06:42 -05:00
<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">&#39;&#39;</span><span class="p">);</span>
2013-09-13 13:50:41 -04:00
<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">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;order by &#39;</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">&#39;&#39;</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">&#39; &#39;</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">&#39;, &#39;</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">&#39;limit &#39;</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">&#39;offset &#39;</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">&gt;</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">&lt;</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">&quot;(&quot;</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">&quot;)&quot;</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="s2">&quot;insert into &quot;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</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">&quot;) values &quot;</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">&#39;, &#39;</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">&lt;</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">&lt;</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">&#39; = &#39;</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">&#39;update &#39;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">&#39; set &#39;</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">&#39;, &#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</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">&#39;&#39;</span><span class="p">;</span>
<span class="k">return</span> <span class="s1">&#39;delete from &#39;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">&#39; &#39;</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">&#39;truncate &#39;</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">&#39;for update&#39;</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">&#39;for share&#39;</span><span class="p">;</span>
2013-09-13 13:50:41 -04:00
<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">&#39; as &#39;</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">&#39; &#39;</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">&#39; as &#39;</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">&#39;.&#39;</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">&lt;</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">&amp;&amp;</span> <span class="nx">segments</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</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">&#39;.&#39;</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">&#39;, &#39;</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">&#39;, &#39;</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">&#39;?&#39;</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">&#39;function&#39;</span> <span class="o">&amp;&amp;</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>