Skip to content

Commit a814e40

Browse files
committed
Support native query return types
1 parent 49841a9 commit a814e40

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

models/Query/QueryBuilder.cfc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4310,6 +4310,10 @@ component displayname="QueryBuilder" accessors="true" {
43104310
return;
43114311
}
43124312

4313+
if ( hasExplicitReturnType( arguments.options ) ) {
4314+
return q;
4315+
}
4316+
43134317
if ( isQuery( q ) ) {
43144318
return returnFormat( q );
43154319
}
@@ -4325,6 +4329,10 @@ component displayname="QueryBuilder" accessors="true" {
43254329
return { result: q.result, query: returnFormat( q.query ) };
43264330
}
43274331

4332+
private boolean function hasExplicitReturnType( required struct options ) {
4333+
return arguments.options.keyExists( "returntype" ) && !isNull( arguments.options.returntype );
4334+
}
4335+
43284336
/**
43294337
* Run a query through the specified grammar then clear all bindings.
43304338
*

tests/specs/Query/Abstract/QueryExecutionSpec.cfc

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,6 +1287,66 @@ component extends="testbox.system.BaseSpec" {
12871287
expect( runQueryLog ).toHaveLength( 1, "runQuery should have been called once" );
12881288
expect( runQueryLog[ 1 ].sql ).toBe( "SELECT ""id"" FROM ""users""" );
12891289
} );
1290+
1291+
it( "returns native struct returntypes without applying the builder return format", function() {
1292+
var builder = getBuilder();
1293+
var expectedResults = { "jane": { "id": 1, "name": "jane" }, "john": { "id": 2, "name": "john" } };
1294+
builder
1295+
.$( "runQuery" )
1296+
.$args(
1297+
sql = "SELECT ""id"", ""name"" FROM ""users""",
1298+
options = { "returntype": "struct", "columnkey": "name", "result": "local.result" }
1299+
)
1300+
.$results( expectedResults );
1301+
builder
1302+
.$( "runQuery" )
1303+
.$args(
1304+
sql = "SELECT ""id"", ""name"" FROM ""users""",
1305+
options = { "returntype": "struct", "columnkey": "name" }
1306+
)
1307+
.$results( expectedResults );
1308+
1309+
var results = builder
1310+
.select( [ "id", "name" ] )
1311+
.from( "users" )
1312+
.get( options = { "returntype": "struct", "columnkey": "name" } );
1313+
1314+
expect( results ).toBe( expectedResults );
1315+
var runQueryLog = builder.$callLog().runQuery;
1316+
expect( runQueryLog ).toBeArray();
1317+
expect( runQueryLog ).toHaveLength( 1, "runQuery should have been called once" );
1318+
expect( runQueryLog[ 1 ].sql ).toBe( "SELECT ""id"", ""name"" FROM ""users""" );
1319+
expect( runQueryLog[ 1 ].options ).toBe( { "returntype": "struct", "columnkey": "name" } );
1320+
} );
1321+
1322+
it( "does not invoke custom return formats for native returntypes", function() {
1323+
var builder = getBuilder();
1324+
builder.setReturnFormat( function( q ) {
1325+
fail( "The builder return format should not run for native returntypes." );
1326+
} );
1327+
var expectedResults = { "jane": { "id": 1, "name": "jane" } };
1328+
builder
1329+
.$( "runQuery" )
1330+
.$args(
1331+
sql = "SELECT ""id"", ""name"" FROM ""users""",
1332+
options = { "returntype": "struct", "columnkey": "name", "result": "local.result" }
1333+
)
1334+
.$results( expectedResults );
1335+
builder
1336+
.$( "runQuery" )
1337+
.$args(
1338+
sql = "SELECT ""id"", ""name"" FROM ""users""",
1339+
options = { "returntype": "struct", "columnkey": "name" }
1340+
)
1341+
.$results( expectedResults );
1342+
1343+
var results = builder
1344+
.select( [ "id", "name" ] )
1345+
.from( "users" )
1346+
.get( options = { "returntype": "struct", "columnkey": "name" } );
1347+
1348+
expect( results ).toBe( expectedResults );
1349+
} );
12901350
} );
12911351

12921352
describe( "compiling the same builder multiple times", function() {

0 commit comments

Comments
 (0)