<spanclass="s2">"use strict"</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>The "SchemaGrammar" is a layer which helps in compiling
valid data definition language (DDL) statements in
to create, alter, or destroy the various tables, columns,
and metadata in our database schema. These functions
are combined with dialect specific "SchemaGrammar"
functions to keep the interface database agnostic.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">define</span><spanclass="p">(</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">require</span><spanclass="p">,</span><spanclass="nx">exports</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="nx">exports</span><spanclass="p">.</span><spanclass="nx">baseSchemaGrammar</span><spanclass="o">=</span><spanclass="p">{</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>The toSql on the "schema" is different than that on the "builder",
on the same connection.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">toSql</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">builder</span><spanclass="p">)</span><spanclass="p">{</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Clone the builder, before we go about working with the columns & commands.
TODO: Clean this up.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">builder</span><spanclass="o">=</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">clone</span><spanclass="p">();</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Add the commands that are implied by the blueprint.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">columns</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">></span><spanclass="mi">0</span><spanclass="o">&&</span><spanclass="o">!</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">creating</span><spanclass="p">())</span><spanclass="p">{</span>
<spanclass="p">}</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Add an "additional" command, for any extra dialect-specific logic.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">commands</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">({</span><spanclass="nx">name</span><spanclass="o">:</span><spanclass="s1">'additional'</span><spanclass="p">});</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Add indicies</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">for</span><spanclass="p">(</span><spanclass="kd">var</span><spanclass="nx">i</span><spanclass="o">=</span><spanclass="mi">0</span><spanclass="p">,</span><spanclass="nx">l</span><spanclass="o">=</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">columns</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o"><</span><spanclass="nx">l</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o">++</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">indexVar</span><spanclass="o">=</span><spanclass="s1">'is'</span><spanclass="o">+</span><spanclass="nx">Helpers</span><spanclass="p">.</span><spanclass="nx">capitalize</span><spanclass="p">(</span><spanclass="nx">index</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>If the index has been specified on the given column, but is simply
equal to "true" (boolean), no name has been specified for this
index, so we will simply call the index methods without one.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">column</span><spanclass="p">[</span><spanclass="nx">indexVar</span><spanclass="p">]</span><spanclass="o">===</span><spanclass="kc">true</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">continue</span><spanclass="nx">continueIndex</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>If the index has been specified on the column and it is something
other than boolean true, we will assume a name was provided on
the index specification, and pass in the name to the method.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="p">}</span><spanclass="k">else</span><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">has</span><spanclass="p">(</span><spanclass="nx">column</span><spanclass="p">,</span><spanclass="nx">indexVar</span><spanclass="p">))</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">statements</span><spanclass="o">=</span><spanclass="p">[];</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Each type of command has a corresponding compiler function on the schema
grammar which is used to build the necessary SQL statements to build
the blueprint element, so we'll just call that compilers function.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">for</span><spanclass="p">(</span><spanclass="nx">i</span><spanclass="o">=</span><spanclass="mi">0</span><spanclass="p">,</span><spanclass="nx">l</span><spanclass="o">=</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">commands</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o"><</span><spanclass="nx">l</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o">++</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a foreign key command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileForeign</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">command</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="nx">sql</span><spanclass="o">+=</span><spanclass="s2">"foreign key ("</span><spanclass="o">+</span><spanclass="nx">column</span><spanclass="o">+</span><spanclass="s2">") references "</span><spanclass="o">+</span><spanclass="nx">foreignTable</span><spanclass="o">+</span><spanclass="s2">" ("</span><spanclass="o">+</span><spanclass="nx">foreignColumn</span><spanclass="o">+</span><spanclass="s2">")"</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Once we have the basic foreign key creation statement constructed we can
build out the syntax for what should happen on an update or delete of
the affected columns, which will get something like "cascade", etc.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">commandOnDelete</span><spanclass="p">)</span><spanclass="nx">sql</span><spanclass="o">+=</span><spanclass="s2">" on delete "</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">commandOnDelete</span><spanclass="p">;</span>
<spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">commandOnUpdate</span><spanclass="p">)</span><spanclass="nx">sql</span><spanclass="o">+=</span><spanclass="s2">" on update "</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">commandOnUpdate</span><spanclass="p">;</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Each of the column types have their own compiler functions which are
responsible for turning the column definition into its SQL format
for the platform. Then column modifiers are compiled and added.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getColumns</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Add the column modifiers to the definition.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">addModifiers</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">sql</span><spanclass="p">,</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">column</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get the SQL for the column data type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getType</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">column</span><spanclass="p">,</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Add a prefix to an array of values, utilized in the client libs.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">prefixArray</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">prefix</span><spanclass="p">,</span><spanclass="nx">values</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Wrap a table in keyword identifiers.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">wrapTable</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">table</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Wrap a value in keyword identifiers.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">wrap</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">value</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Format a value so that it can be used in "default" clauses.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getDefaultValue</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">value</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get the primary key command if it exists on the blueprint.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getCommandByName</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">name</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get all of the commands with a given name.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getCommandsByName</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">name</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Used to compile any database specific items.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileAdditional</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a create table command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileCreateTable</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a drop table command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileDropTable</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a drop table (if exists) command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileDropTableIfExists</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s1">'drop table if exists '</span><spanclass="o">+</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">wrapTable</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">);</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a drop index command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileDropIndex</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">command</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s1">'drop index '</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">index</span><spanclass="p">;</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Default for a biginteger type in database in other databases.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeBigInteger</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">column</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a string type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeString</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">column</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a text type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeText</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a tiny integer type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeTinyInteger</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a time type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeTime</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a date type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeDate</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a binary type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeBinary</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a json type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeJson</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a uuid type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeUuid</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create a specific type</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeSpecificType</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">column</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get the SQL for a nullable column modifier.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">modifyNullable</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">column</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s1">' not null'</span><spanclass="p">;</span>
<spanclass="p">}</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get the SQL for a default column modifier.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">modifyDefault</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">column</span><spanclass="p">)</span><spanclass="p">{</span>