309 lines
5.2 KiB
JavaScript
Executable File
309 lines
5.2 KiB
JavaScript
Executable File
/** @module query-builder */
|
|
|
|
var async = require('async');
|
|
|
|
module.exports = function(driver) {
|
|
|
|
"use strict";
|
|
|
|
/**
|
|
* Variables controlling the sql building
|
|
*
|
|
* @private
|
|
* @type {{}}
|
|
*/
|
|
var state = {};
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
/**
|
|
* "Private" methods
|
|
*
|
|
* @private
|
|
*/
|
|
var _p = {
|
|
/**
|
|
* Complete the sql building based on the type provided
|
|
*
|
|
* @param {String} type
|
|
* @param {String} table
|
|
* @return {String}
|
|
*/
|
|
compile: function (type, table) {
|
|
switch(type) {
|
|
case "insert":
|
|
break;
|
|
|
|
case "update":
|
|
break;
|
|
|
|
case "delete":
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
},
|
|
compileType: function (type, table) {
|
|
|
|
}
|
|
};
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
// Set up state object
|
|
this.resetQuery();
|
|
|
|
// ------------------------------------------------------------------------
|
|
// ! Query Builder Methods
|
|
// ------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Specify rows to select in the query
|
|
*
|
|
* @param {String|Array} fields
|
|
* @returns {exports}
|
|
*/
|
|
this.select = function(fields) {
|
|
|
|
// Split/trim fields by comma
|
|
fields = (Array.isArray(fields)) ? fields : fields.split(",").map(String.trim);
|
|
|
|
// Split on 'As'
|
|
fields.forEach(function (field, index) {
|
|
if (field.match(/as/i))
|
|
{
|
|
fields[index] = field.split(/ as /i).map(String.trim);
|
|
}
|
|
});
|
|
|
|
var safeArray = driver.quoteIdentifiers(fields);
|
|
|
|
// Join the strings back together
|
|
safeArray.forEach(function (field, index) {
|
|
if (Array.isArray(field))
|
|
{
|
|
safeArray[index] = safeArray[index].join(' AS ');
|
|
}
|
|
});
|
|
|
|
state.selectString += safeArray.join(', ');
|
|
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Specify the database table to select from
|
|
*
|
|
* @param {String} tableName
|
|
* @returns {exports}
|
|
*/
|
|
this.from = function(tableName) {
|
|
// Split identifiers on spaces
|
|
var identArray = String.trim(tableName).split(' ').map(String.trim);
|
|
|
|
// Quote/prefix identifiers
|
|
identArray[0] = driver.quoteTable(identArray[0]);
|
|
identArray = driver.quoteIdentifiers(identArray);
|
|
|
|
// Put it back together
|
|
state.fromString = identArray.join(' ');
|
|
|
|
return this;
|
|
};
|
|
|
|
this.like = function(field, val, pos) {
|
|
|
|
};
|
|
|
|
this.orLike = function(field, val, pos) {
|
|
|
|
};
|
|
|
|
this.orNotLike = function(field, val, pos) {
|
|
|
|
};
|
|
|
|
this.having = function(key, val) {
|
|
|
|
};
|
|
|
|
this.orHaving = function(key, val) {
|
|
|
|
};
|
|
|
|
this.where = function(key, val) {
|
|
|
|
};
|
|
|
|
this.orWhere = function(key, val) {
|
|
|
|
};
|
|
|
|
this.whereIn = function(key, val) {
|
|
|
|
};
|
|
|
|
this.orWhereIn = function(key, val) {
|
|
|
|
};
|
|
|
|
this.whereNotIn = function(key, val) {
|
|
|
|
};
|
|
|
|
this.orWhereNotIn = function(key, val) {
|
|
|
|
};
|
|
|
|
this.set = function(key, val) {
|
|
return this;
|
|
};
|
|
|
|
this.join = function(table1, cond, table2, type) {
|
|
type = type || "inner";
|
|
|
|
return this;
|
|
};
|
|
|
|
this.groupBy = function(field) {
|
|
|
|
};
|
|
|
|
this.orderBy = function(field) {
|
|
|
|
};
|
|
|
|
this.limit = function(limit, offset) {
|
|
state.limit = limit;
|
|
state.offset = offset;
|
|
|
|
return this;
|
|
};
|
|
|
|
this.groupStart = function() {
|
|
|
|
};
|
|
|
|
this.orGroupStart = function() {
|
|
|
|
};
|
|
|
|
this.orNotGroupStart = function() {
|
|
|
|
};
|
|
|
|
this.groupEnd = function() {
|
|
|
|
};
|
|
|
|
// ------------------------------------------------------------------------
|
|
// ! Result Methods
|
|
// ------------------------------------------------------------------------
|
|
|
|
this.get = function(table, limit, offset) {
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
this.getWhere = function(table, where, limit, offset) {
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
this.insert = function(table, data) {
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
this.update = function(table, data) {
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
this['delete'] = function (table, where) {
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
// ------------------------------------------------------------------------
|
|
// ! Methods returning SQL
|
|
// ------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Return generated select query SQL
|
|
*
|
|
* @return {String}
|
|
*/
|
|
this.getCompiledSelect = function() {
|
|
// Return sql
|
|
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
this.getCompiledInsert = function() {
|
|
// Return sql
|
|
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
this.getCompiledUpdate = function() {
|
|
// Return sql
|
|
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
this.getCompiledDelete = function() {
|
|
// Return sql
|
|
|
|
// Reset state
|
|
this.resetQuery();
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// ! Miscellaneous Methods
|
|
// ----------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Reset the object state for a new query
|
|
*
|
|
* @return void
|
|
*/
|
|
this.resetQuery = function() {
|
|
state = {
|
|
// Arrays/Maps
|
|
queryMap: {},
|
|
values: [],
|
|
whereValues: [],
|
|
setArrayKeys: [],
|
|
orderArray: [],
|
|
groupArray: [],
|
|
havingMap: [],
|
|
|
|
// Partials
|
|
selectString: '',
|
|
fromString: '',
|
|
setString: '',
|
|
orderString: '',
|
|
groupString: '',
|
|
|
|
// Other various values
|
|
limit: null,
|
|
offset: null
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Returns the current class state for testing or other purposes
|
|
*
|
|
* @return {Object}
|
|
*/
|
|
this.getState = function() {
|
|
return state;
|
|
};
|
|
|
|
return this;
|
|
}; |