diff --git a/models/Query/QueryUtils.cfc b/models/Query/QueryUtils.cfc index 90b7424..c1f6f88 100644 --- a/models/Query/QueryUtils.cfc +++ b/models/Query/QueryUtils.cfc @@ -323,6 +323,10 @@ component singleton displayname="QueryUtils" accessors="true" { * @return array */ public array function queryToArrayOfStructs( required any q ) { + if ( arguments.q.recordCount == 0 ) { + return []; + } + try { var queryColumns = getMetadata( arguments.q ).map( function( item ) { return item.name; @@ -332,18 +336,16 @@ component singleton displayname="QueryUtils" accessors="true" { rethrow; } - return queryReduce( - arguments.q, - function( results, row ) { - var rowData = structNew( "ordered" ); - for ( var column in queryColumns ) { - rowData[ column ] = row[ column ]; - } - results.append( rowData ); - return results; - }, - [] - ); + var results = []; + arrayResize( results, arguments.q.recordCount ); + for ( var row in arguments.q ) { + var rowData = structNew( "ordered" ); + for ( var column in queryColumns ) { + rowData[ column ] = row[ column ]; + } + results[ arguments.q.currentRow ] = rowData; + } + return results; } /** diff --git a/tests/specs/Query/Abstract/PaginationSpec.cfc b/tests/specs/Query/Abstract/PaginationSpec.cfc index f4a352c..119c0a5 100644 --- a/tests/specs/Query/Abstract/PaginationSpec.cfc +++ b/tests/specs/Query/Abstract/PaginationSpec.cfc @@ -130,6 +130,25 @@ component extends="testbox.system.BaseSpec" { expect( results.results ).toBe( expectedResults ); } ); + it( "can handle empty datasets", function() { + var builder = getBuilder(); + var expectedResults = []; + var expectedQuery = queryNew( "id", "integer", expectedResults ); + builder.$( "count", 0 ); + builder.$( "runQuery", expectedQuery ); + + var results = builder.from( "users" ).paginate( page = 1, maxRows = 0 ); + + expect( results.pagination ).toBe( { + "maxRows": 0, + "offset": 0, + "page": 1, + "totalPages": 0, + "totalRecords": 0 + } ); + expect( results.results ).toBe( expectedResults ); + } ); + it( "can provide a custom paginator shell", function() { var builder = getBuilder(); builder.setPaginationCollector( {