2014-05-05 22:59:11 -04:00

74 lines
15 KiB
HTML

<!DOCTYPE html><html lang="en"><head><title>lib/dialects/postgres/query</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/dialects/postgres/query"><meta name="groc-project-path" content="lib/dialects/postgres/query.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/dialects/postgres/query.js</div></div><div id="document"><div class="segment"><div class="comments "><div class="wrapper"><h2 id="postgresql-query-builder-amp-compiler">PostgreSQL Query Builder &amp; Compiler</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">client</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;lodash&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">inherits</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;inherits&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">QueryBuilder</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../../query/builder&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">QueryCompiler</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../../query/compiler&#39;</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><h2 id="query-builder">Query Builder</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="kd">function</span> <span class="nx">QueryBuilder_PG</span><span class="p">()</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">client</span> <span class="o">=</span> <span class="nx">client</span><span class="p">;</span>
<span class="nx">QueryBuilder</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">arguments</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">inherits</span><span class="p">(</span><span class="nx">QueryBuilder_PG</span><span class="p">,</span> <span class="nx">QueryBuilder</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><h2 id="query-compiler">Query Compiler</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="kd">function</span> <span class="nx">QueryCompiler_PG</span><span class="p">()</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">formatter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">client</span><span class="p">.</span><span class="nx">Formatter</span><span class="p">();</span>
<span class="nx">QueryCompiler</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">arguments</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">inherits</span><span class="p">(</span><span class="nx">QueryCompiler_PG</span><span class="p">,</span> <span class="nx">QueryCompiler</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Compiles a truncate query.</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">truncate</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;truncate &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">tableName</span> <span class="o">+</span> <span class="s1">&#39; restart identity&#39;</span><span class="p">;</span>
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Used when the insert call is empty.</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_emptyInsertValue</span> <span class="o">=</span> <span class="s1">&#39;default values&#39;</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">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">insert</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">sql</span> <span class="o">=</span> <span class="nx">QueryCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">insert</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">returning</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">returning</span><span class="p">;</span>
<span class="k">return</span> <span class="p">{</span>
<span class="nx">sql</span><span class="o">:</span> <span class="nx">sql</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_returning</span><span class="p">(</span><span class="nx">returning</span><span class="p">),</span>
<span class="nx">returning</span><span class="o">:</span> <span class="nx">returning</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, allowing for a return value.</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">update</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">updateData</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_prepUpdate</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">update</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">wheres</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">where</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">returning</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">returning</span><span class="p">;</span>
<span class="k">return</span> <span class="p">{</span>
<span class="nx">sql</span><span class="o">:</span> <span class="s1">&#39;update &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">tableName</span> <span class="o">+</span> <span class="s1">&#39; set &#39;</span> <span class="o">+</span> <span class="nx">updateData</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="p">(</span><span class="nx">wheres</span> <span class="o">?</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">wheres</span> <span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">+</span>
<span class="k">this</span><span class="p">.</span><span class="nx">_returning</span><span class="p">(</span><span class="nx">returning</span><span class="p">),</span>
<span class="nx">returning</span><span class="o">:</span> <span class="nx">returning</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, allowing for a return value.</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">del</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">sql</span> <span class="o">=</span> <span class="nx">QueryCompiler</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">del</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">arguments</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">returning</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">returning</span><span class="p">;</span>
<span class="k">return</span> <span class="p">{</span>
<span class="nx">sql</span><span class="o">:</span> <span class="nx">sql</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_returning</span><span class="p">(</span><span class="nx">returning</span><span class="p">),</span>
<span class="nx">returning</span><span class="o">:</span> <span class="nx">returning</span>
<span class="p">};</span>
<span class="p">};</span>
<span class="nx">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_returning</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="nx">value</span> <span class="o">?</span> <span class="s1">&#39; returning &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">formatter</span><span class="p">.</span><span class="nx">columnize</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>
<span class="nx">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">forUpdate</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>
<span class="nx">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">forShare</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>
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Compiles a columnInfo query</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">columnInfo</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="p">{</span>
<span class="nx">sql</span><span class="o">:</span> <span class="s1">&#39;select * from information_schema.columns where table_name = ? and table_catalog = ?&#39;</span><span class="p">,</span>
<span class="nx">bindings</span><span class="o">:</span> <span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">table</span><span class="p">,</span> <span class="nx">client</span><span class="p">.</span><span class="nx">database</span><span class="p">()],</span>
<span class="nx">output</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</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">reduce</span><span class="p">(</span><span class="nx">resp</span><span class="p">.</span><span class="nx">rows</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">columns</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">columns</span><span class="p">[</span><span class="nx">val</span><span class="p">.</span><span class="nx">column_name</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
<span class="nx">type</span><span class="o">:</span> <span class="nx">val</span><span class="p">.</span><span class="nx">data_type</span><span class="p">,</span>
<span class="nx">maxLength</span><span class="o">:</span> <span class="nx">val</span><span class="p">.</span><span class="nx">character_maximum_length</span><span class="p">,</span>
<span class="nx">nullable</span><span class="o">:</span> <span class="p">(</span><span class="nx">val</span><span class="p">.</span><span class="nx">is_nullable</span> <span class="o">===</span> <span class="s1">&#39;YES&#39;</span><span class="p">),</span>
<span class="nx">defaultValue</span><span class="o">:</span> <span class="nx">val</span><span class="p">.</span><span class="nx">column_default</span>
<span class="p">};</span>
<span class="k">return</span> <span class="nx">columns</span><span class="p">;</span>
<span class="p">},</span> <span class="p">{});</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">};</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">QueryBuilder</span> <span class="o">=</span> <span class="nx">QueryBuilder_PG</span><span class="p">;</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">QueryCompiler</span> <span class="o">=</span> <span class="nx">QueryCompiler_PG</span><span class="p">;</span>
<span class="p">};</span></div></div></div></div></body></html>