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 }