/** * Implements the CFML Function querysetcell */ package railo.runtime.functions.query; import railo.commons.lang.StringUtil; import railo.runtime.PageContext; import railo.runtime.exp.DatabaseException; import railo.runtime.exp.PageException; import railo.runtime.functions.BIF; import railo.runtime.op.Caster; import railo.runtime.type.KeyImpl; import railo.runtime.type.Query; import railo.runtime.type.util.ListUtil; public final class QuerySort extends BIF { private static final long serialVersionUID = -6566120440638749819L; public static boolean call(PageContext pc , Query query, String columnName) throws PageException { return call(pc,query,columnName,null); } public static boolean call(PageContext pc , Query query, String columnNames, String directions) throws PageException { // column names String[] arrColumnNames = ListUtil.trimItems(ListUtil.listToStringArray(columnNames, ',')); int[] dirs = new int[arrColumnNames.length]; // directions if(!StringUtil.isEmpty(directions)) { String[] arrDirections = ListUtil.trimItems(ListUtil.listToStringArray(directions, ',')); if(arrColumnNames.length!=arrDirections.length)throw new DatabaseException("column names and directions has not the same count",null,null,null); String direction; for(int i=0;i<dirs.length;i++){ direction=arrDirections[i].toLowerCase(); dirs[i]=0; if(direction.equals("asc"))dirs[i]=Query.ORDER_ASC; else if(direction.equals("desc"))dirs[i]=Query.ORDER_DESC; else { throw new DatabaseException("argument direction of function querySort must be \"asc\" or \"desc\", now \""+direction+"\"",null,null,null); } } } else { for(int i=0;i<dirs.length;i++){ dirs[i]=Query.ORDER_ASC; } } for(int i=arrColumnNames.length-1;i>=0;i--) query.sort(KeyImpl.init(arrColumnNames[i]),dirs[i]); return true; } @Override public Object invoke(PageContext pc, Object[] args) throws PageException { if(args.length==2)return call(pc,Caster.toQuery(args[0]),Caster.toString(args[1])); return call(pc,Caster.toQuery(args[0]),Caster.toString(args[1]),Caster.toString(args[2])); } }