From baa72a2c36bf8f17ee2115fda5e4959047dc868f Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Mon, 28 Nov 2016 07:47:35 -0700 Subject: [PATCH] Implement select methods --- models/Query/Builder.cfc | 4 ++++ models/Query/Expression.cfc | 11 +++++++++++ models/Query/Grammars/Grammar.cfc | 28 ++++++++++++++++++++++++++-- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 models/Query/Expression.cfc diff --git a/models/Query/Builder.cfc b/models/Query/Builder.cfc index eca089c1..fb4c1cda 100644 --- a/models/Query/Builder.cfc +++ b/models/Query/Builder.cfc @@ -198,6 +198,10 @@ component displayname="Builder" { return where( argumentCollection = arguments ); } + public Expression function raw( required string sql ) { + return new quick.models.Query.Expression( sql ); + } + // Accessors public boolean function getDistinct() { diff --git a/models/Query/Expression.cfc b/models/Query/Expression.cfc new file mode 100644 index 00000000..ba931503 --- /dev/null +++ b/models/Query/Expression.cfc @@ -0,0 +1,11 @@ +component displayname="Expression" { + + function init( required string sql ) { + variables.sql = arguments.sql; + } + + function getSQL() { + return sql; + } + +} \ No newline at end of file diff --git a/models/Query/Grammars/Grammar.cfc b/models/Query/Grammars/Grammar.cfc index 9fbfbf38..409c97c7 100644 --- a/models/Query/Grammars/Grammar.cfc +++ b/models/Query/Grammars/Grammar.cfc @@ -23,11 +23,11 @@ component displayname="Grammar" implements="Quick.models.Query.Grammars.GrammarI private string function compileColumns( required Quick.models.Query.Builder query, required array columns ) { var select = query.getDistinct() ? "SELECT DISTINCT " : "SELECT "; - return select & arrayToList( columns ); + return select & columns.map( wrapColumn ).toList( ", " ); } private string function compileFrom( required Quick.models.Query.Builder query, required string from ) { - return "FROM " & from; + return "FROM " & wrapTable( from ); } private string function compileJoins( required Quick.models.Query.Builder query, required array joins ) { @@ -97,4 +97,28 @@ component displayname="Grammar" implements="Quick.models.Query.Grammars.GrammarI return item != ""; } ), " " ); } + + private string function wrapTable( required any table ) { + return table.listToArray( "." ).map( wrapValue ).toList( "." ); + } + + private string function wrapColumn( required any column ) { + if ( isInstanceOf( column, "quick.models.Query.Expression" ) ) { + return column.getSQL(); + } + var alias = ""; + if ( column.find( "as" ) ) { + alias = column.listToArray( " as ", false, true )[ 2 ]; + column = column.listToArray( " as ", false, true )[ 1 ]; + } + column = column.listToArray( "." ).map( wrapValue ).toList( "." ); + return alias == "" ? column : column & " AS " & wrapValue( alias ); + } + + private string function wrapValue( required any value ) { + if ( value == "*" ) { + return value; + } + return """#value#"""; + } } \ No newline at end of file