Index: topia/src/java/org/codelutin/topia/persistence/TopiaCollectionQueryHelper.java diff -u topia/src/java/org/codelutin/topia/persistence/TopiaCollectionQueryHelper.java:1.5 topia/src/java/org/codelutin/topia/persistence/TopiaCollectionQueryHelper.java:1.6 --- topia/src/java/org/codelutin/topia/persistence/TopiaCollectionQueryHelper.java:1.5 Tue Jun 28 14:08:34 2005 +++ topia/src/java/org/codelutin/topia/persistence/TopiaCollectionQueryHelper.java Tue Jun 28 17:37:21 2005 @@ -24,7 +24,7 @@ * Created: 13 juin 2005 * * @author Arnaud Thimel -* @version $Revision: 1.5 $ +* @version $Revision: 1.6 $ */ @@ -119,7 +119,7 @@ // pas de doublon lorsque l'on demande distinct result =new LinkedHashSet(); } else { - result = new ArrayList(); + result = new LinkedList(); } @@ -135,20 +135,59 @@ } } - // si on veut le nombre, ca ne sert a rien de trier + // si on veut un nombre, ca ne sert a rien de trier if(queryBuilder.isCount()){ int size = result.size(); result.clear(); result.add(Integer.valueOf(size)); + } else if(queryBuilder.isMax()){ + Object o = Collections.max(result); + result.clear(); + result.add(o); + } else if(queryBuilder.isMin()){ + Object o = Collections.min(result); + result.clear(); + result.add(o); + } else if(queryBuilder.isSum() || queryBuilder.isAvg()){ + double sum = 0; + int count = 0; + for(Iterator i=result.iterator(); i.hasNext();){ + Object o = i.next(); + // si ce n'est pas un nombre on passe au suivant et c tout + if(o instanceof Number){ + Number n = (Number)o; + sum += n.doubleValue(); + count++; + } + } + result.clear(); + if(queryBuilder.isAvg()){ + sum = sum / count; + } + result.add(new Double(sum)); } else { // OrderBy - Collections.sort(result, new TopiaCollectionQueryComparator( + Collections.sort(toList(result), new TopiaCollectionQueryComparator( queryBuilder.getOrderBy(), inter)); } + if(queryBuilder.getFirst() != queryBuilder.getLast()){ + int first = queryBuilder.getFirst(); + int last = queryBuilder.getLast(); + result = toList(result).subList(first, last); + } + return result; } + protected List toList(Collection c){ + Collection result = c; + if(! (result instanceof List)){ + result = new LinkedList(result); + } + return (List)result; + } + /** * Génère pour l'interprêteur spécifié différentes méthode utiles */ @@ -268,6 +307,12 @@ protected Map orderBy = new LinkedHashMap(); protected boolean distinct = false; protected boolean count = false; + protected boolean max = false; + protected boolean min = false; + protected boolean avg = false; + protected boolean sum = false; + protected int first = 0; + protected int last = 0; protected Collection argCollection = new LinkedList(); @@ -301,6 +346,29 @@ return count; } + public boolean isMax(){ + return max; + } + + public boolean isMin(){ + return min; + } + + public boolean isAvg(){ + return avg; + } + + public boolean isSum(){ + return sum; + } + + public int getFirst(){ + return first; + } + + public int getLast(){ + return last; + } public void visitFrom(From from) { } @@ -330,8 +398,7 @@ public void visitSelect(Select select) { } public void visitSelectAvg(Select select) { - // TODO Arno : Auto-generated method stub - System.out.println("\"selectAvg\" " + select); + avg = true; } public void visitSelectCount(Select select) { count = true; @@ -350,20 +417,17 @@ className = query.getFrom().getSource(className); } public void visitSelectLimit(Select select, int first, int last) { - // TODO Arno : Auto-generated method stub - System.out.println("\"selectLimit\" " + select + " - " + first + " - " + last); + this.first = first; + this.last = last; } public void visitSelectMax(Select select) { - // TODO Arno : Auto-generated method stub - System.out.println("\"selectMax\" " + select); + max = true; } public void visitSelectMin(Select select) { - // TODO Arno : Auto-generated method stub - System.out.println("\"selectMin\" " + select); + min = true; } public void visitSelectSum(Select select) { - // TODO Arno : Auto-generated method stub - System.out.println("\"selectSum\" " + select); + sum = true; } //Visite récursivement l'opérande spécifiée