May 26
Recordset: Create Iterating Domain Objects via Inheritance
Composition , Iterator , Inheritance , ColdFusion Add comments
Now bundled with its distant cousin, the composite Iterator, Recordset provides methods and properties for list traversal via inheritance. Recordset is not a query, but rather a query that is converted to an array of structs. Extending Recordset is useful as an alternative to maintaining an array of objects, or if you want to display a list with calculated fields (an employee has
a startdate, but display format is "years of service").I chose Recordset as the name, because it provides similar methods to an ADO Recordset.
Recordset has the following public methods:
currentRow():numeric - the index of the current record.
next():boolean - the next record is set.
previous():boolean - the previous record is set.
reset():void - reset the index.
end():void - set the index to the last record
pageCount():numeric - if pagination is desired, returns the number of pages in the Recordset.
recordCount():numeric - total number of records.
loadQuery():void - accepts a ColdFusion query
setPage():void - set desired page for next iteration (used only with pagination).
How to use Recordset:
If your transient objects do not extend another class, you can simply extend Recordset.
<cfcomponent displayname="User" extends="com.fancybread.util.list.Recordset" output="false">
<cfset variables.instance = StructNew() />
...
</cfcomponent>
To display a list of users by role, first instantiate the user list and set the user role and load the list in your controller.
<cfset userList = variables.UserService.getUser() />
<cfset usersByRoleQuery = variables.UserService.getUsersByRole() />
<cfset userList.loadQuery(usersByRoleQuery) />
Loop through the list in your display view while next() returns true.
<cfloop condition="userList.next()">
{display code}
</cfloop>
Many thanks go out to Aaron Roberson for recommending inheritable iteration among other excellent suggestions that are implemented
with this release.
May 28, 2007 at 11:54 AM Great job Paul! The code is clean and though it may be less than 200 lines of code, it has soo much potential!