001    /**
002     * Implements the Cold Fusion Function querysetcell
003     */
004    package railo.runtime.functions.query;
005    
006    import railo.commons.lang.StringUtil;
007    import railo.runtime.PageContext;
008    import railo.runtime.exp.DatabaseException;
009    import railo.runtime.exp.PageException;
010    import railo.runtime.ext.function.Function;
011    import railo.runtime.type.KeyImpl;
012    import railo.runtime.type.List;
013    import railo.runtime.type.Query;
014    
015    public final class QuerySort implements Function {
016            public static boolean call(PageContext pc , Query query, String columnName) throws PageException {
017                    return call(pc,query,columnName,null);
018            }
019            public static boolean call(PageContext pc , Query query, String columnNames, String directions) throws PageException {
020                    // column names
021                    String[] arrColumnNames = List.trimItems(List.listToStringArray(columnNames, ','));
022                    int[] dirs = new int[arrColumnNames.length];
023                    
024                    // directions
025                    if(!StringUtil.isEmpty(directions)) {
026                            String[] arrDirections = List.trimItems(List.listToStringArray(directions, ','));
027                            if(arrColumnNames.length!=arrDirections.length)throw new DatabaseException("column names and directions has not the same count",null,null,null);
028                            
029                            String direction;
030                            for(int i=0;i<dirs.length;i++){
031                                    direction=arrDirections[i].toLowerCase();
032                                    dirs[i]=0;
033                                    if(direction.equals("asc"))dirs[i]=Query.ORDER_ASC;
034                                    else if(direction.equals("desc"))dirs[i]=Query.ORDER_DESC;
035                                    else {          
036                                            throw new DatabaseException("argument direction of function querySort must be \"asc\" or \"desc\", now \""+direction+"\"",null,null,null);
037                                    }
038                            }
039                    }
040                    else {
041                            for(int i=0;i<dirs.length;i++){
042                                    dirs[i]=Query.ORDER_ASC;
043                            }
044                    }
045                    
046                    
047                    for(int i=arrColumnNames.length-1;i>=0;i--)
048                            query.sort(KeyImpl.init(arrColumnNames[i]),dirs[i]);
049                    
050                    
051                    
052                    return true;            
053            }
054    }