Skip to content

Commit

Permalink
fix(QueryBuilder): 'value' and 'values' now work with column formatters
Browse files Browse the repository at this point in the history
  • Loading branch information
elpete committed Jun 19, 2020
1 parent 977edcf commit da60695
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 4 deletions.
10 changes: 6 additions & 4 deletions models/Query/QueryBuilder.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -2528,7 +2528,8 @@ component displayname="QueryBuilder" accessors="true" {
struct options = {}
) {
return withReturnFormat( "query", function() {
select( column );
var formattedColumn = applyColumnFormatter( column );
select( formattedColumn );
var data = first( options = options );
if ( structIsEmpty( data ) ) {
if ( throwWhenNotFound ) {
Expand All @@ -2540,7 +2541,7 @@ component displayname="QueryBuilder" accessors="true" {
return defaultValue;
}
} else {
return data[ listLast( column, "." ) ];
return data[ listLast( formattedColumn, "." ) ];
}
} );
}
Expand All @@ -2555,9 +2556,10 @@ component displayname="QueryBuilder" accessors="true" {
*/
public array function values( required string column, struct options = {} ) {
return withReturnFormat( "query", function() {
var columnName = listLast( column, "." );
select( column );
var formattedColumn = applyColumnFormatter( column );
select( formattedColumn );
var result = get( options = options );
var columnName = listLast( formattedColumn, "." );
var results = [];
for ( var row in result ) {
results.append( row[ columnName ] );
Expand Down
46 changes: 46 additions & 0 deletions tests/specs/Query/Abstract/QueryExecutionSpec.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,30 @@ component extends="testbox.system.BaseSpec" {
expect( runQueryLog[ 1 ] ).toBe( { sql: "SELECT ""some_table"".""name"" FROM ""users"" LIMIT 1", options: {} } );
} );

it( "returns the first value when the column is changed by a column formatter", function() {
var builder = getBuilder();
var expectedQuery = queryNew( "name", "varchar", [ { name: "foo" } ] );
// writeDump( var = expectedQuery, abort = true );
builder
.$( "runQuery" )
.$args( sql = "SELECT ""some_table"".""name"" FROM ""users"" LIMIT 1", options = {} )
.$results( expectedQuery );

var results = builder
.setColumnFormatter( function( column ) {
return "some_table.name";
} )
.from( "users" )
.value( "different" );

expect( results ).toBe( "foo" );

var runQueryLog = builder.$callLog().runQuery;
expect( runQueryLog ).toBeArray();
expect( runQueryLog ).toHaveLength( 1, "runQuery should have been called once" );
expect( runQueryLog[ 1 ] ).toBe( { sql: "SELECT ""some_table"".""name"" FROM ""users"" LIMIT 1", options: {} } );
} );

it( "returns the defaultValue when calling value with an empty query", function() {
var builder = getBuilder();
var expectedQuery = queryNew( "name", "varchar", [] );
Expand Down Expand Up @@ -281,6 +305,28 @@ component extends="testbox.system.BaseSpec" {
expect( runQueryLog ).toHaveLength( 1, "runQuery should have been called once" );
expect( runQueryLog[ 1 ] ).toBe( { sql: "SELECT ""some_table"".""name"" FROM ""users""", options: {} } );
} );

it( "can return an array of values when the column formatter changes the column name", function() {
var builder = getBuilder();
var expectedQuery = queryNew( "name", "varchar", [ { name: "foo" }, { name: "bar" } ] );
builder
.$( "runQuery" )
.$args( sql = "SELECT ""some_table"".""name"" FROM ""users""", options = {} )
.$results( expectedQuery );

var results = builder
.setColumnFormatter( function( column ) {
return "some_table.name";
} )
.from( "users" )
.values( "different" );
expect( results ).toBe( [ "foo", "bar" ] );

var runQueryLog = builder.$callLog().runQuery;
expect( runQueryLog ).toBeArray();
expect( runQueryLog ).toHaveLength( 1, "runQuery should have been called once" );
expect( runQueryLog[ 1 ] ).toBe( { sql: "SELECT ""some_table"".""name"" FROM ""users""", options: {} } );
} );
} );

describe( "implode", function() {
Expand Down

0 comments on commit da60695

Please sign in to comment.