EjbqlVariableVisitor.java

00001 
00025 package org.objectweb.jonas_ejb.lib;
00026 
00027 import java.util.HashMap;
00028 import java.util.HashSet;
00029 import java.util.Iterator;
00030 import java.util.Map;
00031 import java.util.Stack;
00032 
00033 import org.objectweb.jonas_ejb.container.TraceEjb;
00034 import org.objectweb.jonas_ejb.deployment.api.DeploymentDescEjb2;
00035 import org.objectweb.jonas_ejb.deployment.ejbql.ASTAbstractSchemaName;
00036 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCollectionMemberDeclaration;
00037 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCollectionValuedPathExpression;
00038 import org.objectweb.jonas_ejb.deployment.ejbql.ASTEJBQL;
00039 import org.objectweb.jonas_ejb.deployment.ejbql.ASTFromClause;
00040 import org.objectweb.jonas_ejb.deployment.ejbql.ASTIdentifier;
00041 import org.objectweb.jonas_ejb.deployment.ejbql.ASTPath;
00042 import org.objectweb.jonas_ejb.deployment.ejbql.ASTRangeVariableDeclaration;
00043 import org.objectweb.jonas_ejb.deployment.ejbql.ParseException;
00044 import org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode;
00045 import org.objectweb.jonas_ejb.deployment.ejbql.ASTSelectClause;
00046 import org.objectweb.jonas_ejb.deployment.ejbql.ASTSelectExpression;
00047 import org.objectweb.jonas_ejb.deployment.ejbql.ASTAggregateSelectExpression;
00048 import org.objectweb.jonas_ejb.deployment.ejbql.ASTIdentificationVariable;
00049 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCmpPathExpression;
00050 import org.objectweb.jonas_ejb.deployment.ejbql.ASTSingleValuedCmrPathExpression;
00051 import org.objectweb.jonas_ejb.deployment.ejbql.ASTSingleValuedPathExpression;
00052 import org.objectweb.jonas_ejb.deployment.ejbql.ASTWhereClause;
00053 import org.objectweb.jonas_ejb.deployment.ejbql.ASTConditionalExpression;
00054 import org.objectweb.jonas_ejb.deployment.ejbql.ASTConditionalTerm;
00055 import org.objectweb.jonas_ejb.deployment.ejbql.ASTConditionalFactor;
00056 import org.objectweb.jonas_ejb.deployment.ejbql.ASTBetweenExpression;
00057 import org.objectweb.jonas_ejb.deployment.ejbql.ASTInExpression;
00058 import org.objectweb.jonas_ejb.deployment.ejbql.ASTLikeExpression;
00059 import org.objectweb.jonas_ejb.deployment.ejbql.ASTNullComparisonExpression;
00060 import org.objectweb.jonas_ejb.deployment.ejbql.ASTEmptyCollectionComparisonExpression;
00061 import org.objectweb.jonas_ejb.deployment.ejbql.ASTCollectionMemberExpression;
00062 import org.objectweb.jonas_ejb.deployment.ejbql.ASTComparisonExpression;
00063 import org.objectweb.jonas_ejb.deployment.ejbql.ASTArithmeticExpression;
00064 import org.objectweb.jonas_ejb.deployment.ejbql.ASTArithmeticTerm;
00065 import org.objectweb.jonas_ejb.deployment.ejbql.ASTArithmeticFactor;
00066 import org.objectweb.jonas_ejb.deployment.ejbql.ASTStringExpression;
00067 import org.objectweb.jonas_ejb.deployment.ejbql.ASTDatetimeExpression;
00068 import org.objectweb.jonas_ejb.deployment.ejbql.ASTBooleanExpression;
00069 import org.objectweb.jonas_ejb.deployment.ejbql.ASTEntityBeanExpression;
00070 import org.objectweb.jonas_ejb.deployment.ejbql.ASTFunctionsReturningStrings;
00071 import org.objectweb.jonas_ejb.deployment.ejbql.ASTFunctionsReturningNumerics;
00072 import org.objectweb.jonas_ejb.deployment.ejbql.ASTOrderByClause;
00073 import org.objectweb.jonas_ejb.deployment.ejbql.ASTOrderByItem;
00074 import org.objectweb.jorm.metainfo.api.Class;
00075 import org.objectweb.jorm.metainfo.api.Manager;
00076 import org.objectweb.medor.api.Field;
00077 import org.objectweb.medor.api.MedorException;
00078 import org.objectweb.medor.query.api.QueryTree;
00079 import org.objectweb.medor.query.api.QueryTreeField;
00080 import org.objectweb.medor.query.jorm.lib.ClassExtent;
00081 import org.objectweb.medor.query.jorm.lib.PNameField;
00082 import org.objectweb.medor.query.jorm.lib.QueryBuilder;
00083 import org.objectweb.medor.query.lib.QueryTreePrinter;
00084 import org.objectweb.medor.filter.lib.BasicFieldOperand;
00085 import org.objectweb.util.monolog.api.BasicLevel;
00086 
00110 public class EjbqlVariableVisitor extends EjbqlAbstractVisitor {
00111 
00115     private Manager manager;
00116 
00120     private DeploymentDescEjb2 dd;
00121 
00125     private HashMap ids = new HashMap();
00126 
00130     private HashMap fields = new HashMap();
00131 
00132     private QueryBuilder qb = new QueryBuilder();
00133 
00137     private HashSet collections = new HashSet();
00138 
00147     public EjbqlVariableVisitor(ASTEJBQL ejbql, DeploymentDescEjb2 dd, QueryBuilder qb) throws Exception {
00148         this.dd = dd;
00149         this.qb = qb;
00150         manager = dd.getJormManager();
00151 
00152         // parse the ejbql and build the ids structure
00153         visit(ejbql);
00154 
00155         for (Iterator it = ids.keySet().iterator(); it.hasNext(); ) {
00156             String id = (String) it.next();
00157             IdValue idv = (IdValue) ids.get(id);
00158             fields.put(id + "." + Field.PNAMENAME, qb.project(define(id)));
00159             for (int i = 0; i < idv.getDeclaredPathLength(); i++) {
00160                 String path = idv.getMergedPath(i);
00161                 if (!collections.contains(path)) {
00162                     fields.put(path, qb.project(define(path)));
00163                 }
00164             }
00165         }
00166     }
00167 
00168     private QueryTreeField define(String id) throws ParseException, MedorException {
00169         String[] path = splitPath(id);
00170 
00171         if (!qb.contains(path[0])) {
00172             IdValue idv = (IdValue) ids.get(path[0]);
00173             String[] name = idv.getName();
00174 
00175             PNameField pnf;
00176             if (name.length == 1) {
00177                 pnf = extent(name[0], path[0]);
00178             } else {
00179                 pnf = (PNameField) define(mergePath(name));
00180             }
00181             qb.define(path[0], pnf);
00182         }
00183 
00184         return qb.navigate(path);
00185     }
00186 
00187     private PNameField extent(String schema, String alias) throws ParseException, MedorException {
00188         if (schema == null) { throw new NullPointerException("schema"); }
00189         String cn = dd.asn2BeanDesc(schema).getJormClassName();
00190         Class theClass = manager.getClass(cn);
00191         if (theClass == null) {
00192             throw new ParseException
00193                 ("Abstract schema name \"" + schema +
00194                  "\" has not been declared in the jorm meta information");
00195         }
00196         ClassExtent ext = new ClassExtent(theClass, alias, Field.PNAMENAME, false);
00197         return (PNameField) ext.getField(ext.getPNameFieldName());
00198     }
00199 
00206     public Map getFields() {
00207         return fields;
00208     }
00209 
00214     public void traceIds(HashMap idsM) {
00215         if (TraceEjb.isDebugQuery()) {
00216             TraceEjb.query.log(BasicLevel.DEBUG, "Begin of IDS structure:");
00217             // trace the ids structure
00218             for (Iterator i = idsM.keySet().iterator(); i.hasNext();) {
00219                 String id = (String) i.next();
00220                 IdValue idv = (IdValue) idsM.get(id);
00221                 TraceEjb.query.log(BasicLevel.DEBUG, "ids[" + id + "]=" + idv);
00222                 if (idv.getQueryTree() != null) {
00223                     QueryTreePrinter.printQueryTree(idv.getQueryTree(), TraceEjb.query, BasicLevel.DEBUG);
00224                 }
00225             }
00226             TraceEjb.query.log(BasicLevel.DEBUG, "End of IDS structure:");
00227         }
00228     }
00229 
00236     public Object visit(ASTFromClause node, Object data) {
00237         return visit((SimpleNode) node, data);
00238     }
00239 
00246     public Object visit(ASTCollectionMemberDeclaration node, Object data) {
00247         return visit((SimpleNode) node, data);
00248     }
00249 
00256     public Object visit(ASTRangeVariableDeclaration node, Object data) {
00257         return visit((SimpleNode) node, data);
00258     }
00259 
00266     public Object visit(ASTCollectionValuedPathExpression node, Object data) {
00267         return visit((SimpleNode) node, data);
00268     }
00269 
00276     public Object visit(ASTAbstractSchemaName node, Object data) {
00277         ((Stack) data).push(node.value);
00278         return null;
00279     }
00280 
00287     public Object visit(ASTIdentifier node, Object data) {
00288         String id = (String) node.value;
00289         String name = (String) ((Stack) data).pop();
00290         IdValue iv = (IdValue) ids.get(id);
00291         if (iv == null) {
00292             iv = new IdValue(name);
00293             ids.put(id, iv);
00294         } else {
00295             iv.setName(splitPath(name));
00296         }
00297         return null;
00298     }
00299 
00306     public Object visit(ASTPath node, Object data) {
00307         ((Stack) data).push(node.value);
00308         return null;
00309     }
00310 
00315     private void processVariable(String path) {
00316         // Common to select, where and orderby clauses
00317         String id = splitPath(path)[0];
00318         IdValue iv = (IdValue) ids.get(id);
00319         if (iv == null) {
00320             iv = new IdValue();
00321             ids.put(id, iv);
00322         }
00323         iv.addPath(path);
00324     }
00325 
00326     // -------------- select ---------------//
00333     public Object visit(ASTSelectClause node, Object data) {
00334         visit((SimpleNode) node, data);
00335         Stack st = (Stack) data;
00336         if (!st.empty()) {
00337             processVariable((String) st.pop());
00338         }
00339         return null;
00340     }
00341 
00348     public Object visit(ASTSelectExpression node, Object data) {
00349         return visit((SimpleNode) node, data);
00350     }
00351 
00358     public Object visit(ASTAggregateSelectExpression node, Object data) {
00359         return visit((SimpleNode) node, data);
00360     }
00361 
00368     public Object visit(ASTIdentificationVariable node, Object data) {
00369         return visit((SimpleNode) node, data);
00370     }
00371 
00378     public Object visit(ASTSingleValuedPathExpression node, Object data) {
00379         return visit((SimpleNode) node, data);
00380     }
00381 
00388     public Object visit(ASTSingleValuedCmrPathExpression node, Object data) {
00389         return visit((SimpleNode) node, data);
00390     }
00391 
00398     public Object visit(ASTCmpPathExpression node, Object data) {
00399         return visit((SimpleNode) node, data);
00400     }
00401 
00402     // ----------- Where -----------------//
00409     public Object visit(ASTWhereClause node, Object data) {
00410         visit((SimpleNode) node, data);
00411         Stack st = (Stack) data;
00412         while (!st.empty()) {
00413             processVariable((String) st.pop());
00414         }
00415         return null;
00416     }
00417 
00424     public Object visit(ASTConditionalExpression node, Object data) {
00425         return visit((SimpleNode) node, data);
00426     }
00427 
00434     public Object visit(ASTConditionalTerm node, Object data) {
00435         return visit((SimpleNode) node, data);
00436     }
00437 
00444     public Object visit(ASTConditionalFactor node, Object data) {
00445         return visit((SimpleNode) node, data);
00446     }
00447 
00454     public Object visit(ASTBetweenExpression node, Object data) {
00455         return visit((SimpleNode) node, data);
00456     }
00457 
00464     public Object visit(ASTInExpression node, Object data) {
00465         return visit((SimpleNode) node, data);
00466     }
00467 
00474     public Object visit(ASTLikeExpression node, Object data) {
00475         return visit((SimpleNode) node, data);
00476     }
00477 
00484     public Object visit(ASTNullComparisonExpression node, Object data) {
00485         return visit((SimpleNode) node, data);
00486     }
00487 
00494     public Object visit(ASTEmptyCollectionComparisonExpression node, Object data) {
00495         visit((SimpleNode) node, data);
00496         Stack st = (Stack) data;
00497         String path = (String) st.peek();
00498         collections.add(path);
00499         return null;
00500     }
00501 
00508     public Object visit(ASTCollectionMemberExpression node, Object data) {
00509         visit((SimpleNode) node, data);
00510         Stack st = (Stack) data;
00511         String path = (String) st.peek();
00512         collections.add(path);
00513         return null;
00514     }
00515 
00522     public Object visit(ASTComparisonExpression node, Object data) {
00523         return visit((SimpleNode) node, data);
00524     }
00525 
00532     public Object visit(ASTArithmeticExpression node, Object data) {
00533         return visit((SimpleNode) node, data);
00534     }
00535 
00542     public Object visit(ASTArithmeticTerm node, Object data) {
00543         return visit((SimpleNode) node, data);
00544     }
00545 
00552     public Object visit(ASTArithmeticFactor node, Object data) {
00553         return visit((SimpleNode) node, data);
00554     }
00555 
00562     public Object visit(ASTStringExpression node, Object data) {
00563         return visit((SimpleNode) node, data);
00564     }
00565 
00572     public Object visit(ASTDatetimeExpression node, Object data) {
00573         return visit((SimpleNode) node, data);
00574     }
00575 
00582     public Object visit(ASTBooleanExpression node, Object data) {
00583         return visit((SimpleNode) node, data);
00584     }
00585 
00592     public Object visit(ASTEntityBeanExpression node, Object data) {
00593         return visit((SimpleNode) node, data);
00594     }
00595 
00602     public Object visit(ASTFunctionsReturningStrings node, Object data) {
00603         return visit((SimpleNode) node, data);
00604     }
00605 
00612     public Object visit(ASTFunctionsReturningNumerics node, Object data) {
00613         return visit((SimpleNode) node, data);
00614     }
00615 
00616     // ----------- Order by -----------------//
00623     public Object visit(ASTOrderByClause node, Object data) {
00624         visit((SimpleNode) node, data);
00625         Stack st = (Stack) data;
00626         while (!st.empty()) {
00627             processVariable((String) st.pop());
00628         }
00629         return null;
00630     }
00631 
00638     public Object visit(ASTOrderByItem node, Object data) {
00639         return visit((SimpleNode) node, data);
00640     }
00641 
00642 }

Generated on Tue Feb 15 15:05:49 2005 for JOnAS by  doxygen 1.3.9.1