Index: topia/src/java/org/codelutin/topia/TopiaMapQueryHelper.java diff -u /dev/null topia/src/java/org/codelutin/topia/TopiaMapQueryHelper.java:1.1 --- /dev/null Tue Jun 14 17:03:15 2005 +++ topia/src/java/org/codelutin/topia/TopiaMapQueryHelper.java Tue Jun 14 17:03:10 2005 @@ -0,0 +1,402 @@ +/* *##% +* 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; + +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 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 TopiaMapQueryHelper extends QueryHelper{ + + protected TopiaMapQueryBuilder queryBuilder; + protected Map dataMap; + protected Interpreter interpreter; + + public TopiaMapQueryHelper(Map datas) { + dataMap = 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 { + + if (queryBuilder == null) { //Préparation de la requete pour BSH + queryBuilder = new TopiaMapQueryBuilder(); + 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 += ")"; + } + + } +}