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 }