001    /**
002     * Implements the CFML 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.functions.BIF;
011    import railo.runtime.op.Caster;
012    import railo.runtime.type.KeyImpl;
013    import railo.runtime.type.Query;
014    import railo.runtime.type.util.ListUtil;
015    
016    public final class QuerySort extends BIF {
017    
018            private static final long serialVersionUID = -6566120440638749819L;
019    
020            public static boolean call(PageContext pc , Query query, String columnName) throws PageException {
021                    return call(pc,query,columnName,null);
022            }
023            public static boolean call(PageContext pc , Query query, String columnNames, String directions) throws PageException {
024                    // column names
025                    String[] arrColumnNames = ListUtil.trimItems(ListUtil.listToStringArray(columnNames, ','));
026                    int[] dirs = new int[arrColumnNames.length];
027                    
028                    // directions
029                    if(!StringUtil.isEmpty(directions)) {
030                            String[] arrDirections = ListUtil.trimItems(ListUtil.listToStringArray(directions, ','));
031                            if(arrColumnNames.length!=arrDirections.length)throw new DatabaseException("column names and directions has not the same count",null,null,null);
032                            
033                            String direction;
034                            for(int i=0;i<dirs.length;i++){
035                                    direction=arrDirections[i].toLowerCase();
036                                    dirs[i]=0;
037                                    if(direction.equals("asc"))dirs[i]=Query.ORDER_ASC;
038                                    else if(direction.equals("desc"))dirs[i]=Query.ORDER_DESC;
039                                    else {          
040                                            throw new DatabaseException("argument direction of function querySort must be \"asc\" or \"desc\", now \""+direction+"\"",null,null,null);
041                                    }
042                            }
043                    }
044                    else {
045                            for(int i=0;i<dirs.length;i++){
046                                    dirs[i]=Query.ORDER_ASC;
047                            }
048                    }
049                    
050                    
051                    for(int i=arrColumnNames.length-1;i>=0;i--)
052                            query.sort(KeyImpl.init(arrColumnNames[i]),dirs[i]);
053                    
054                    
055                    
056                    return true;            
057            }
058            
059            @Override
060            public Object invoke(PageContext pc, Object[] args) throws PageException {
061                    if(args.length==2)return call(pc,Caster.toQuery(args[0]),Caster.toString(args[1]));
062                    return call(pc,Caster.toQuery(args[0]),Caster.toString(args[1]),Caster.toString(args[2]));
063            }
064    }