You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/07/17 08:05:04 UTC

svn commit: r794969 - in /openjpa/branches/subquery: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-kernel/src/m...

Author: faywang
Date: Fri Jul 17 06:05:03 2009
New Revision: 794969

URL: http://svn.apache.org/viewvc?rev=794969&view=rev
Log:
reset SelectImpl for subsequent query execution

Modified:
    openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
    openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java
    openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
    openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java

Modified: openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java?rev=794969&r1=794968&r2=794969&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java (original)
+++ openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java Fri Jul 17 06:05:03 2009
@@ -52,6 +52,7 @@
 import org.apache.openjpa.jdbc.sql.SQLBuffer;
 import org.apache.openjpa.jdbc.sql.SQLExceptions;
 import org.apache.openjpa.jdbc.sql.Select;
+import org.apache.openjpa.jdbc.sql.SelectImpl;
 import org.apache.openjpa.jdbc.sql.Union;
 import org.apache.openjpa.kernel.ExpressionStoreQuery;
 import org.apache.openjpa.kernel.Filters;
@@ -60,6 +61,7 @@
 import org.apache.openjpa.kernel.QueryContext;
 import org.apache.openjpa.kernel.QueryHints;
 import org.apache.openjpa.kernel.exps.Constant;
+import org.apache.openjpa.kernel.exps.Context;
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.ExpressionParser;
 import org.apache.openjpa.kernel.exps.FilterListener;
@@ -143,13 +145,28 @@
     protected ExpressionFactory getExpressionFactory(ClassMetaData meta) {
         return new JDBCExpressionFactory((ClassMapping) meta);
     }
+    
+    private void resetSelect(Context ctx) {
+        List<Context> subselCtxs = ctx.getSubselContexts();
+        if (subselCtxs != null) {
+            for (Context subselCtx : subselCtxs) {
+                SelectImpl sel = (SelectImpl)subselCtx.getSelect();
+                sel.reset();
+                resetSelect(subselCtx);
+            }
+        }
+    }
 
     protected ResultObjectProvider executeQuery(Executor ex,
         ClassMetaData base, ClassMetaData[] metas, boolean subclasses,
         ExpressionFactory[] facts, QueryExpressions[] exps, Object[] params,
         Range range) {
-        if (exps[0].ctx() != null)
-            exps[0].ctx().resetAliasCount();
+        Context expCtx = exps[0].ctx(); 
+        if (expCtx != null) {
+            expCtx.resetAliasCount();
+            expCtx.setSelect(null);
+            resetSelect(expCtx);
+        }
         if (metas.length > 1 && exps[0].isAggregate())
             throw new UserException(Localizer.forPackage(JDBCStoreQuery.class).
                 get("mult-mapping-aggregate", Arrays.asList(metas)));
@@ -449,8 +466,13 @@
     private Number executeBulkOperation(ClassMetaData[] metas,
         boolean subclasses, ExpressionFactory[] facts, QueryExpressions[] exps,
         Object[] params, Map updates) {
-        if (exps[0].ctx() != null)
-            exps[0].ctx().resetAliasCount();
+        Context expCtx = exps[0].ctx(); 
+        if (ctx != null) {
+            expCtx.resetAliasCount();
+            expCtx.setSelect(null);
+            resetSelect(expCtx);
+        }
+        
         // we cannot execute a bulk delete statement when have mappings in
         // multiple tables, so indicate we want to use in-memory with null
         ClassMapping[] mappings = (ClassMapping[]) metas;

Modified: openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java?rev=794969&r1=794968&r2=794969&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java (original)
+++ openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java Fri Jul 17 06:05:03 2009
@@ -20,6 +20,7 @@
 
 import java.io.Serializable;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.openjpa.jdbc.meta.ClassMapping;
@@ -29,6 +30,7 @@
 import org.apache.openjpa.jdbc.sql.Select;
 import org.apache.openjpa.kernel.exps.AbstractExpressionVisitor;
 import org.apache.openjpa.kernel.exps.Constant;
+import org.apache.openjpa.kernel.exps.Context;
 import org.apache.openjpa.kernel.exps.Expression;
 import org.apache.openjpa.kernel.exps.QueryExpressions;
 import org.apache.openjpa.kernel.exps.Subquery;
@@ -129,11 +131,14 @@
         if (sel.ctx() == null)
             sel.setContext(exps.ctx());
 
-        if (parent == null && exps.ctx().getSubselContext() != null) {
+        if (parent == null && exps.ctx().getSubselContexts() != null) {
             // this is the case subselect was created before parent got created
-            Select subsel = (Select) exps.ctx().getSubselContext().getSelect();
-            Subquery subquery = exps.ctx().getSubselContext().getSubquery();
-            subsel.setParent(sel, subquery.getCandidateAlias());
+            List<Context> subselCtxs = exps.ctx().getSubselContexts();
+            for (Context subselCtx : subselCtxs) {
+                Select subsel = (Select) subselCtx.getSelect();
+                Subquery subquery = subselCtx.getSubquery();
+                subsel.setParent(sel, subquery.getCandidateAlias());
+            }
         }
      
         initialize(sel, ctx, exps, state);

Modified: openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?rev=794969&r1=794968&r2=794969&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java (original)
+++ openjpa/branches/subquery/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Fri Jul 17 06:05:03 2009
@@ -2213,6 +2213,37 @@
      */
     private static class Placeholder {
     }
+    
+    public void reset() {
+        _aliases = null;
+        _eager = null;
+        _eagerKeys = null;
+        _expectedResultCount = 0;
+        _flags = 0;
+        _from = null;
+        _grouped = null;
+        _grouping = null;
+        _having = null;
+        _joins = null;
+        _joinSyntax = 0;
+        _nullIds = 0;
+        _ordered = null;
+        _ordering = null;
+        _orders = 0;
+        _outer = null;
+        _parent = null;
+        _placeholders = 0;
+        _preJoins = null;
+        _schemaAlias = null;
+        _selects._aliases = null;
+        _selects._ids = null;
+        _subPath = null;
+        _subsels = null;
+        _tables = null;
+        _where = null;
+        
+    }
+    
 
     /**
      * Key type used for aliases.
@@ -2921,6 +2952,8 @@
         }
 
         private void addJoinsToParent(SelectImpl parent, Join join) {
+            if (parent._aliases == null)
+                return;
             Object aliases[] = parent._aliases.values().toArray();
             boolean found1 = false;
             boolean found2 = false;

Modified: openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java
URL: http://svn.apache.org/viewvc/openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java?rev=794969&r1=794968&r2=794969&view=diff
==============================================================================
--- openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java (original)
+++ openjpa/branches/subquery/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Context.java Fri Jul 17 06:05:03 2009
@@ -19,7 +19,9 @@
 package org.apache.openjpa.kernel.exps;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.ParsedJPQL;
@@ -38,7 +40,7 @@
     public Subquery subquery;
     public Expression from = null;
     private Context parent = null;
-    private Context subsel = null;
+    private List<Context> subsels = null;
     private Object select = null;
     private int aliasCount = -1; 
     private Map<String,Value> variables = new HashMap<String,Value>();
@@ -51,14 +53,14 @@
         this.parent = parent;
         if (subquery != null) {
             this.select = subquery.getSelect();
-            parent.setSubselContext(this);
+            parent.addSubselContext(this);
         }
     }
 
     public void setSubquery(Subquery subquery) {
         this.subquery = subquery;
         this.select = subquery.getSelect();
-        parent.setSubselContext(this);
+        parent.addSubselContext(this);
     }
     
     public ClassMetaData meta() {
@@ -118,16 +120,18 @@
      * Register the subquery context in this context.
      * @param sub
      */
-    private void setSubselContext(Context sub) {
-        subsel = sub;
+    private void addSubselContext(Context sub) {
+        if (subsels == null)
+            subsels = new ArrayList<Context>();
+        subsels.add(sub);
     }
 
     /**
      * Returns the subquery context.
      * @return
      */
-    public Context getSubselContext() {
-        return subsel;
+    public List<Context> getSubselContexts() {
+        return subsels;
     }
 
     /**
@@ -187,10 +191,14 @@
                 return p;
             p = p.parent;
         }
-        if (subsel != null) {
-            var = subsel.getVariable(alias);
-            if (var != null)
-                return subsel;
+        if (subsels != null) {
+            for (Context subsel : subsels) {
+                if (subsel != null) {
+                    var = subsel.getVariable(alias);
+                    if (var != null)
+                        return subsel;
+                }
+            }
         }
         return null;
     }