Skip to content

Commit

Permalink
Insert, Updates, and Deletes! Oh my!
Browse files Browse the repository at this point in the history
  • Loading branch information
Eric Peterson authored and Eric Peterson committed Nov 29, 2016
1 parent 0452b44 commit e19dae3
Show file tree
Hide file tree
Showing 3 changed files with 700 additions and 513 deletions.
92 changes: 89 additions & 3 deletions models/Query/Builder.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ component displayname="Builder" accessors="true" {

variables.bindings = {
"join" = [],
"where" = []
"where" = [],
"insert" = [],
"update" = []
};

public Builder function init(
Expand Down Expand Up @@ -513,12 +515,81 @@ component displayname="Builder" accessors="true" {
return this;
}

// insert

public any function insert( required any values, boolean toSql = false ) {
if ( values.isEmpty() ) {
return;
}

if ( ! isArray( values ) ) {
if ( ! isStruct( values ) ) {
throw(
type = "InvalidSQLType",
message = "Please pass a struct or an array of structs mapping columns to values"
);
}
values = [ values ];
}

var columns = values[ 1 ].keyArray();
columns.sort( "textnocase" );
var bindings = values.map( function( valueArray ) {
return columns.map( function( column ) {
return getUtils().extractBinding( valueArray[ column ] );
} )
} )
addBindings( bindings.reduce( function( allBindings, bindingsArray ) {
allBindings.append( bindingsArray, true /* merge */ );
return allBindings;
}, [] ), "insert" );

var sql = getGrammar().compileInsert( this, columns, bindings );

if ( toSql ) {
return sql;
}

return runQuery( sql );
}

public any function update( required any values, boolean toSql = false ) {
var updateArray = values.keyArray();
updateArray.sort( "textnocase" );

addBindings( updateArray.map( function( column ) {
return getUtils().extractBinding( values[ column ] );
} ), "update" );

var sql = getGrammar().compileUpdate( this, updateArray );

if ( toSql ) {
return sql;
}

return runQuery( sql );
}

public any function delete( any id, boolean toSql = false ) {
if ( ! isNull( arguments.id ) ) {
where( "id", "=", arguments.id );
}

var sql = getGrammar().compileDelete( this );

if ( toSql ) {
return sql;
}

return runQuery( sql );
}

public Builder function newQuery() {
return new Quick.models.Query.Builder( grammar = getGrammar() );
}

public array function getBindings() {
var bindingOrder = [ "join", "where" ];
var bindingOrder = [ "update", "insert", "join", "where" ];

var flatBindings = [];
for ( var key in bindingOrder ) {
Expand All @@ -534,6 +605,14 @@ component displayname="Builder" accessors="true" {
return bindings;
}

private Builder function clearBindings() {
variables.join = [];
variables.where = [];
variables.insert = [];
variables.update = [];
return this;
}

private Builder function addBindings( required any newBindings, string type = "where" ) {
if ( ! isArray( newBindings ) ) {
newBindings = [ newBindings ];
Expand All @@ -558,7 +637,14 @@ component displayname="Builder" accessors="true" {
}

public query function get( struct options = {} ) {
return queryExecute( this.toSQL(), this.getBindings(), options );
arguments.sql = toSql();
return runQuery( argumentCollection = arguments );
}

private query function runQuery( required string sql, struct options = {} ) {
var result = queryExecute( sql, getBindings(), options );
clearBindings();
return result;
}

// Unused(?)
Expand Down
23 changes: 23 additions & 0 deletions models/Query/Grammars/Grammar.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,29 @@ component displayname="Grammar" accessors="true" {
return "ORDER BY #orderBys.toList( ", " )#";
}

public string function compileInsert( required Builder query, required array columns, required array values ) {
var columnsString = columns.map( wrapColumn ).toList( ", " );

var placeholderString = values.map( function( valueArray ) {
return "(" & valueArray.map( function() {
return "?"
} ).toList( ", " ) & ")";
} ).toList( ", ");
return trim( "INSERT INTO #wrapTable( query.getFrom() )# (#columnsString#) VALUES #placeholderString#" );
}

public string function compileUpdate( required Builder query, required array columns ) {
var updateList = columns.map( function( column ) {
return "#wrapColumn( column )# = ?";
} ).toList( ", " );

return trim( "UPDATE #wrapTable( query.getFrom() )# SET #updateList# #compileWheres( query, query.getWheres() )#" );
}

public string function compileDelete( required Builder query ) {
return trim( "DELETE FROM #wrapTable( query.getFrom() )# #compileWheres( query, query.getWheres() )#" );
}

private string function concatenate( required array sql ) {
return arrayToList( arrayFilter( sql, function( item ) {
return item != "";
Expand Down
Loading

0 comments on commit e19dae3

Please sign in to comment.