Index: topia/src/java/org/codelutin/topia/persistence/TopiaCollectionQueryHelper.java diff -u /dev/null topia/src/java/org/codelutin/topia/persistence/TopiaCollectionQueryHelper.java:1.1 --- /dev/null Wed Jun 15 15:14:59 2005 +++ topia/src/java/org/codelutin/topia/persistence/TopiaCollectionQueryHelper.java Wed Jun 15 15:14:54 2005 @@ -0,0 +1,412 @@ +/* *##% +* Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, +* Cédric Pineau, Benjamin Poussin, +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*##%*/ + +/* * +* TopiaMapQueryHelper.java +* +* Created: 13 juin 2005 +* +* @author Arnaud Thimel +* @version $Revision: 1.1 $ +*/ + + +package org.codelutin.topia.persistence; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Map; +import java.util.logging.Logger; + +import org.codelutin.queryparser.Constraint; +import org.codelutin.queryparser.DefaultQueryVisitorUnsupportedOperation; +import org.codelutin.queryparser.FieldPath; +import org.codelutin.queryparser.From; +import org.codelutin.queryparser.OrderBy; +import org.codelutin.queryparser.QMark; +import org.codelutin.queryparser.Query; +import org.codelutin.queryparser.QueryHelper; +import org.codelutin.queryparser.QueryHelperException; +import org.codelutin.queryparser.Select; +import org.codelutin.queryparser.Where; + +import bsh.EvalError; +import bsh.Interpreter; + + +public class TopiaCollectionQueryHelper extends QueryHelper { + + /** to use log facility, just put in your code: log.info("..."); */ + static private Logger log = Logger.getLogger("org.codelutin.topia.TopiaCollectionQueryHelper"); + + protected TopiaCollectionQueryBuilder queryBuilder; + protected Collection datas; + protected Interpreter interpreter; + + public TopiaCollectionQueryHelper(Collection datas) { + this.datas = datas; + } + + public void setQuery(Query query) { + super.setQuery(query); + queryBuilder = null; + HashMap fields = getQuery().getSelect().getFields(); + if(fields.size() != 1) + throw new IllegalArgumentException("Select statement must have one field only. "+fields); + } + + /* (non-Javadoc) + * @see org.codelutin.queryparser.QueryHelper#execute() + */ + public Collection execute() throws QueryHelperException { + + //System.out.println("Query : " + query + " - Args : " + args); + + if (queryBuilder == null) { //Préparation de la requete pour BSH + queryBuilder = new TopiaCollectionQueryBuilder(); + getQuery().visit(queryBuilder); + //System.out.println(queryBuilder.getClassName()); + //System.out.println(queryBuilder.getFrom()); + //System.out.println(queryBuilder.getFilter()); + interpreter = new Interpreter(); + try { + for(int i=0; i .*? (to be used with matches(...)) + if(op2 instanceof String){ + String likeValue = (String)op2; + if(likeValue.startsWith("%")){ + visitOperand(op1); + filter += ".endsWith("; + op2 = likeValue.substring(1); + }else if(likeValue.endsWith("%")){ + visitOperand(op1); + filter += ".startsWith("; + op2 = likeValue.substring(0, likeValue.length() - 1); + } + }else{ + filter += "("; + visitOperand(op1); + filter += "=="; + } + visitOperand(op2); + filter += ")"; + } + public void visitWhereNot(Constraint constraint, Object op2) { + filter += "(!"; + visitOperand(op2); + filter += ")"; + } + public void visitWhereNotIn(Constraint constraint, Object op1, + Object op2) { + filter += "(!"; + visitOperand(op2); + filter += ".contains("; + visitOperand(op1); + filter += "))"; + } + public void visitWhereNotLike(Constraint constraint, Object op1, + Object op2) { + //TODO Arno : A verif ! + String likeValue = (String)op2; + if(likeValue.startsWith("%")){ + filter += "!"; + visitOperand(op1); + filter += ".endsWith("; + }else if(likeValue.endsWith("%")){ + filter += "!"; + visitOperand(op1); + filter += ".startsWith("; + }else{ + filter += "("; + visitOperand(op1); + filter += "!="; + } + visitOperand(op2); + filter += ")"; + } + public void visitWhereOr(Constraint constraint, Object op1, Object op2) { + filter += "("; + visitOperand(op1); + filter += " || "; + visitOperand(op2); + filter += ")"; + } + public void visitWhereSmaller(Constraint constraint, Object op1, + Object op2) { + filter += "("; + visitOperand(op1); + filter += " < "; + visitOperand(op2); + filter += ")"; + } + public void visitWhereSmallerOrEqual(Constraint constraint, Object op1, + Object op2) { + filter += "("; + visitOperand(op1); + filter += " <= "; + visitOperand(op2); + filter += ")"; + } + + } //TopiaCollectionQueryBuilder +} //TopiaCollectionQueryHelper