knex/docs/lib/schema/columncompiler.html
2014-05-05 22:59:11 -04:00

105 lines
25 KiB
HTML

<!DOCTYPE html><html lang="en"><head><title>lib/schema/columncompiler</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="lib/schema/columncompiler"><meta name="groc-project-path" content="lib/schema/columncompiler.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">lib/schema/columncompiler.js</div></div><div id="document"><div class="segment"><div class="comments "><div class="wrapper"><p>Column Compiler
Used for designating column definitions</p>
<h2 id="during-the-table-create--alter-statements">during the table "create" / "alter" statements.</h2></div></div><div class="code"><div class="wrapper"><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>
<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;../raw&#39;</span><span class="p">);</span>
<span class="kd">function</span> <span class="nx">ColumnCompiler</span><span class="p">(</span><span class="nx">tableCompiler</span><span class="p">,</span> <span class="nx">columnBuilder</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">tableCompiler</span> <span class="o">=</span> <span class="nx">tableCompiler</span><span class="p">;</span>
<span class="k">this</span><span class="p">.</span><span class="nx">args</span> <span class="o">=</span> <span class="nx">columnBuilder</span><span class="p">.</span><span class="nx">_args</span><span class="p">;</span>
<span class="k">this</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="nx">columnBuilder</span><span class="p">.</span><span class="nx">_type</span><span class="p">;</span>
<span class="k">this</span><span class="p">.</span><span class="nx">grouped</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">groupBy</span><span class="p">(</span><span class="nx">columnBuilder</span><span class="p">.</span><span class="nx">_statements</span><span class="p">,</span> <span class="s1">&#39;grouping&#39;</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">modified</span> <span class="o">=</span> <span class="nx">columnBuilder</span><span class="p">.</span><span class="nx">_modifiers</span><span class="p">;</span>
<span class="k">this</span><span class="p">.</span><span class="nx">isIncrements</span> <span class="o">=</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">type</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;increments&#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="k">this</span><span class="p">.</span><span class="nx">initCompiler</span><span class="p">();</span>
<span class="p">}</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>To convert to sql, we first go through and build the
column as it would be in the insert statement</p></div></div><div class="code"><div class="wrapper"><span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">toSQL</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">pushQuery</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">compileColumn</span><span class="p">());</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">sequence</span><span class="p">;</span>
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Compiles a column.</p></div></div><div class="code"><div class="wrapper"><span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">compileColumn</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="k">this</span><span class="p">.</span><span class="nx">formatter</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">getColumnName</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">getColumnType</span><span class="p">()</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">getModifiers</span><span class="p">();</span>
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Assumes the autoincrementing key is named <code>id</code> if not otherwise specified.</p></div></div><div class="code"><div class="wrapper"><span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">getColumnName</span> <span class="o">=</span> <span class="kd">function</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">_</span><span class="p">.</span><span class="nx">first</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">args</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="k">return</span> <span class="nx">value</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">isIncrements</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;id&#39;</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;You did not specify a column name for the &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">type</span> <span class="o">+</span> <span class="s1">&#39;column.&#39;</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">getColumnType</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">type</span> <span class="o">=</span> <span class="k">this</span><span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">type</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">()];</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="o">?</span> <span class="nx">type</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">_</span><span class="p">.</span><span class="nx">rest</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">args</span><span class="p">))</span> <span class="o">:</span> <span class="nx">type</span><span class="p">;</span>
<span class="p">};</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">getModifiers</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">modifiers</span> <span class="o">=</span> <span class="p">[];</span>
<span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">type</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="s1">&#39;increments&#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="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="k">this</span><span class="p">.</span><span class="nx">modifiers</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">modifier</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">modifiers</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">has</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">modified</span><span class="p">,</span> <span class="nx">modifier</span><span class="p">))</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="k">this</span><span class="p">[</span><span class="nx">modifier</span><span class="p">].</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">modified</span><span class="p">[</span><span class="nx">modifier</span><span class="p">]);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="nx">modifiers</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">val</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">modifiers</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; &#39;</span> <span class="o">+</span> <span class="nx">modifiers</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="p">;</span>
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><h2 id="types">Types</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">increments</span> <span class="o">=</span> <span class="s1">&#39;integer not null primary key autoincrement&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">bigincrements</span> <span class="o">=</span> <span class="s1">&#39;integer not null primary key autoincrement&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">integer</span> <span class="o">=</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">smallint</span> <span class="o">=</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">mediumint</span> <span class="o">=</span> <span class="s1">&#39;integer&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">biginteger</span> <span class="o">=</span> <span class="s1">&#39;bigint&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">varchar</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;varchar(&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_num</span><span class="p">(</span><span class="nx">length</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">;</span>
<span class="p">};</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;text&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">tinyint</span> <span class="o">=</span> <span class="s1">&#39;tinyint&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">floating</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">precision</span><span class="p">,</span> <span class="nx">scale</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;float(&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_num</span><span class="p">(</span><span class="nx">precision</span><span class="p">,</span> <span class="mi">8</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">_num</span><span class="p">(</span><span class="nx">scale</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>
<span class="p">};</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">decimal</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">precision</span><span class="p">,</span> <span class="nx">scale</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;decimal(&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_num</span><span class="p">(</span><span class="nx">precision</span><span class="p">,</span> <span class="mi">8</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">_num</span><span class="p">(</span><span class="nx">scale</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>
<span class="p">};</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">binary</span> <span class="o">=</span> <span class="s1">&#39;blob&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">bool</span> <span class="o">=</span> <span class="s1">&#39;boolean&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">date</span> <span class="o">=</span> <span class="s1">&#39;date&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">datetime</span> <span class="o">=</span> <span class="s1">&#39;datetime&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">time</span> <span class="o">=</span> <span class="s1">&#39;time&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">timestamp</span> <span class="o">=</span> <span class="s1">&#39;timestamp&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">enu</span> <span class="o">=</span> <span class="s1">&#39;varchar&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">bit</span> <span class="o">=</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">json</span> <span class="o">=</span> <span class="s1">&#39;text&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">uuid</span> <span class="o">=</span> <span class="s1">&#39;char(36)&#39;</span><span class="p">;</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">specificType</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">type</span><span class="p">;</span>
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><h2 id="modifiers">Modifiers</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">nullable</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">nullable</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">nullable</span> <span class="o">===</span> <span class="kc">false</span> <span class="o">?</span> <span class="s1">&#39;not null&#39;</span> <span class="o">:</span> <span class="s1">&#39;null&#39;</span><span class="p">;</span>
<span class="p">};</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">notNullable</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="k">this</span><span class="p">.</span><span class="nx">nullable</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="p">};</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">defaultTo</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">if</span> <span class="p">(</span><span class="nx">value</span> <span class="o">===</span> <span class="k">void</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</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">value</span> <span class="k">instanceof</span> <span class="nx">Raw</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">value</span> <span class="o">=</span> <span class="nx">value</span><span class="p">.</span><span class="nx">toQuery</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="k">this</span><span class="p">.</span><span class="nx">method</span> <span class="o">===</span> <span class="s1">&#39;bool&#39;</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">value</span> <span class="o">===</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span> <span class="nx">value</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">value</span> <span class="o">=</span> <span class="p">(</span><span class="nx">value</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</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">value</span> <span class="o">===</span> <span class="kc">true</span> <span class="o">||</span> <span class="nx">value</span> <span class="o">===</span> <span class="kc">false</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">value</span> <span class="o">=</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">value</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">value</span> <span class="o">=</span> <span class="s2">&quot;&#39;&quot;</span> <span class="o">+</span> <span class="nx">value</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="s1">&#39;default &#39;</span> <span class="o">+</span> <span class="nx">value</span><span class="p">;</span>
<span class="p">};</span>
<span class="nx">ColumnCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_num</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">val</span><span class="p">,</span> <span class="nx">fallback</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">val</span> <span class="o">==</span> <span class="kc">null</span><span class="p">)</span> <span class="k">return</span> <span class="nx">fallback</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">val</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
<span class="k">return</span> <span class="nb">isNaN</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="o">?</span> <span class="nx">fallback</span> <span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
<span class="p">};</span>
<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">ColumnCompiler</span><span class="p">;</span></div></div></div></div></body></html>