CFLib.org – Common Function Library Project

maketree(query, unique, parent)

Last updated February 17, 2005

Version: 1 | Requires: ColdFusion 5 | Library: DataManipulationLib

 
Rated 0 time(s). Average Rating: 0

Description:
This function will take a query that is in a LEGAL parent/child relationship and sort it. The entire query will be sorted and an additional field called "sortlevel" will be added to specify the level of a particular item.

Return Values:
Returns a query.

Example:

view plain print about
<cfscript>
    q = querynew( 'id,text,parent' );
    queryaddrow( q );
    querysetcell( q, 'id', 1 );
    querysetcell( q, 'text', 'One' );
    querysetcell( q, 'parent', 0 );
    queryaddrow( q );
    querysetcell( q, 'id', 2 );
    querysetcell( q, 'text', 'Two' );
    querysetcell( q, 'parent', 1 );
    queryaddrow( q );
    querysetcell( q, 'id', 3 );
    querysetcell( q, 'text', 'Three' );
    querysetcell( q, 'parent', 0 );
</cfscript>
<cfset temp = maketree( q, 'id', 'parent' )>
<cfdump var="#temp#">

Parameters:

Name Description Required
query Query to be sorted. Yes
unique Name of the column containing the primary key. Yes
parent Name of the column containing the parent. Yes

Full UDF Source:

view plain print about
<cfscript>
/**
 * This function is a UDF for maketree custom tag developed by Michael Dinowitz.
 * 
 * @param query      Query to be sorted. (Required)
 * @param unique      Name of the column containing the primary key. (Required)
 * @param parent      Name of the column containing the parent. (Required)
 * @return Returns a query. 
 * @author Qasim Rasheed (qasimrasheed@hotmail.com) 
 * @version 1, February 17, 2005 
 */

function maketree( query, unique, parent ){
    var current = 0;
    var path = 0;
    var i = 0;
    var j = 0;
    var items = "";
    var parents = "";
    var position = "";
    var column = "";
    var retQuery = querynew( query.columnlist & ',sortlevel' );
    for (i=1;i lte query.recordcount;i=i+1)
        items = listappend( items, query[unique][i] );
    for (i=1;i lte query.recordcount;i=i+1)
        parents = listappend( parents, query[parent][i] );
    
    for (i=1;i lte query.recordcount;i=i+1){
        queryaddrow( retQuery );
        position = listfind( parents, current );
        while (not position){
            path= listrest( path );
            current = listfirst( path );
            position = listfind( parents, current );
        }
        for (j=1;j lte listlen( query.columnlist ); j=j+1){
            column = listgetat( query.columnlist, j );
            querysetcell( retQuery, column, evaluate( 'query.'&column&'[position]') );
        }
        querysetcell( retQuery, 'sortlevel', listlen( path ) );
        current = listgetat( items, position );
        parents = listsetat( parents, position, '-' );
        path = listprepend( path, current);
    }
    return retQuery;
}
</cfscript>
blog comments powered by Disqus

Search CFLib.org


Latest Additions

Tayo Akinmade Tayo Akinmade added
arrayTrim
3 day(s) ago

Will Belden Will Belden added
longTime
9 day(s) ago

James Sleeman James Sleeman added
quickSort
19 day(s) ago

Ben Forta Ben Forta added
GetHostAddress
22 day(s) ago

Top Rated

Darwan Leonardo Sitepu EksporSQLData
Rated 5.0, 16 time(s)

Darwan Leonardo Sitepu backupDatabase
Rated 5.0, 13 time(s)

Barney Boisvert indentXml
Rated 5.0, 10 time(s)

Kevin Pepperman generateSsccAsn
Rated 5.0, 4 time(s)

Created by Raymond Camden / Design by Justin Johnson