You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/06/10 02:41:38 UTC

svn commit: r783166 [3/3] - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ openjpa-kernel/src/ma...

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TransactionHistory_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TransactionHistory_.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TransactionHistory_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TransactionHistory_.java Wed Jun 10 00:41:35 2009
@@ -1,22 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
 /** 
  *  Generated by OpenJPA MetaModel Generator Tool.
 **/
@@ -26,8 +7,8 @@
 import java.sql.Timestamp;
 import javax.persistence.metamodel.Attribute;
 
-@javax.persistence.metamodel.TypesafeMetamodel(
-    value=org.apache.openjpa.persistence.criteria.TransactionHistory.class)
+@javax.persistence.metamodel.TypesafeMetamodel
+(value=org.apache.openjpa.persistence.criteria.TransactionHistory.class)
 public class TransactionHistory_ {
     public static volatile Attribute<TransactionHistory,String> details;
     public static volatile Attribute<TransactionHistory,Integer> id;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Transaction_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Transaction_.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Transaction_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Transaction_.java Wed Jun 10 00:41:35 2009
@@ -1,22 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
 /** 
  *  Generated by OpenJPA MetaModel Generator Tool.
 **/
@@ -24,7 +5,7 @@
 package org.apache.openjpa.persistence.criteria;
 
 
-@javax.persistence.metamodel.TypesafeMetamodel(
-    value=org.apache.openjpa.persistence.criteria.Transaction.class)
+@javax.persistence.metamodel.TypesafeMetamodel
+(value=org.apache.openjpa.persistence.criteria.Transaction.class)
 public class Transaction_ {
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/VideoStore_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/VideoStore_.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/VideoStore_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/VideoStore_.java Wed Jun 10 00:41:35 2009
@@ -1,22 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
 /** 
  *  Generated by OpenJPA MetaModel Generator Tool.
 **/
@@ -26,8 +7,8 @@
 import javax.persistence.metamodel.Attribute;
 import javax.persistence.metamodel.Map;
 
-@javax.persistence.metamodel.TypesafeMetamodel(
-    value=org.apache.openjpa.persistence.criteria.VideoStore.class)
+@javax.persistence.metamodel.TypesafeMetamodel
+(value=org.apache.openjpa.persistence.criteria.VideoStore.class)
 public class VideoStore_ {
     public static volatile Attribute<VideoStore,Integer> id;
     public static volatile Attribute<VideoStore,Address> location;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java Wed Jun 10 00:41:35 2009
@@ -161,7 +161,7 @@
         assertEquals(CollectionType.COLLECTION, relColl.getCollectionType());
         assertEquals(e0, relColl.getDeclaringType());
         assertEquals(r1, relColl.getElementType());
-        assertEquals(java.util.Collection.class, relColl.getMemberJavaType());
+        assertEquals(ExplicitFieldAccess.class, relColl.getMemberJavaType());
         assertEquals(BindableType.COLLECTION, relColl.getBindableType());
         assertEquals(Multiplicity.ONE_TO_MANY, relColl.getMultiplicity());
     }
@@ -175,7 +175,7 @@
         assertEquals(CollectionType.LIST, relList.getCollectionType());
         assertEquals(e0, relList.getDeclaringType());
         assertEquals(r1, relList.getElementType());
-        assertEquals(java.util.List.class, relList.getMemberJavaType());
+        assertEquals(ExplicitFieldAccess.class, relList.getMemberJavaType());
         assertEquals(BindableType.COLLECTION, relList.getBindableType());
         assertEquals(Multiplicity.ONE_TO_MANY, relList.getMultiplicity());
     }
@@ -189,7 +189,7 @@
         assertEquals(CollectionType.SET, relSet.getCollectionType());
         assertEquals(e0, relSet.getDeclaringType());
         assertEquals(r1, relSet.getElementType());
-        assertEquals(java.util.Set.class, relSet.getMemberJavaType());
+        assertEquals(ExplicitFieldAccess.class, relSet.getMemberJavaType());
         assertEquals(BindableType.COLLECTION, relSet.getBindableType());
         assertEquals(Multiplicity.ONE_TO_MANY, relSet.getMultiplicity());
     }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java Wed Jun 10 00:41:35 2009
@@ -548,8 +548,10 @@
 
         Entity entity = _cls.getAnnotation(Entity.class);
         MappedSuperclass mapped = _cls.getAnnotation(MappedSuperclass.class);
+        Embeddable embeddable = _cls.getAnnotation(Embeddable.class);
         if (isMetaDataMode()) {
             meta.setAbstract(mapped != null);
+            if (embeddable != null) meta.setEmbeddable();
             // while the spec only provides for embedded exclusive, it doesn't
             // seem hard to support otherwise
             if (entity == null)

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java Wed Jun 10 00:41:35 2009
@@ -30,14 +30,12 @@
 public class ResultItemImpl<X> implements ResultItem<X> {
     protected String _alias;
     protected Class<X> _cls;
-    static int i = 0;
+
     protected ResultItemImpl(Class<X> cls) {
         _cls = cls;
     }
     
     public String getAlias() {
-        if (_alias == null)
-            _alias = "c"+ i++;
         return _alias;
     }
 

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java Wed Jun 10 00:41:35 2009
@@ -881,6 +881,7 @@
             meta.setEmbeddedOnly(mappedSuper || embeddable);
             
             if (embeddable) {
+                meta.setEmbeddable();
                 addDeferredEmbeddableMetaData(_cls, access);
             }
         }

Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java?rev=783166&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java Wed Jun 10 00:41:35 2009
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.criteria;
+
+import javax.persistence.criteria.Selection;
+
+import org.apache.openjpa.kernel.exps.Value;
+
+/**
+ * The context holds named variables for nodes of CriteriaQuery.
+ * Creates unique alias for the nodes.
+ *  
+ * @author Pinaki Poddar
+ *
+ */
+public interface AliasContext {
+    /**
+     * Gets the alias for the given node.
+     * If no alias is set on the given node then create an alias, assign it to
+     * the node.
+     */
+    String getAlias(Selection<?> node);
+    
+    /**
+     * Register the given variable of corresponding given value against the
+     * given node.
+     * 
+     * @param node of query tree
+     * @param variable must be a variable
+     * @param value path value
+     */
+    void registerVariable(Selection<?> node, Value variable, Value path);
+    
+    /**
+     * Affirms if the given node has been registered.
+     */
+    boolean isRegistered(Selection<?> node);   
+    
+    /**
+     * Gets the registered variable for the given node. 
+     * Return null if the node is not registered.     
+     */
+    Value getVariable(Selection<?> node);
+    
+    /**
+     * Gets the registered path value for the given node. 
+     * Return null if the node is not registered.     
+     */
+    Value getValue(Selection<?> node);
+    
+}

Propchange: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java Wed Jun 10 00:41:35 2009
@@ -390,7 +390,6 @@
     public Expression<Integer> locate(Expression<String> x,
         Expression<String> pattern) {
         return new Expressions.Locate(x, pattern);
-
     }
 
     public Expression<Integer> locate(Expression<String> x, String pattern) {

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java Wed Jun 10 00:41:35 2009
@@ -20,6 +20,7 @@
 package org.apache.openjpa.persistence.criteria;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -28,6 +29,7 @@
 import javax.persistence.criteria.Order;
 import javax.persistence.criteria.Root;
 import javax.persistence.criteria.Selection;
+import javax.persistence.metamodel.Entity;
 
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.QueryExpressions;
@@ -37,19 +39,14 @@
 import org.apache.openjpa.persistence.meta.Types;
 
 /**
- * Subquery is an expression as its selection item.
+ * Converts expressions of a CriteriaQuery to kernel Expression.
+ * 
+ * @author Fay Wang
  * 
  */
 public class CriteriaExpressionBuilder {
-    
     private int aliasCount = 0;
     
-    private CriteriaQueryImpl criteriaQuery = null;
-    
-    public CriteriaExpressionBuilder(CriteriaQueryImpl criteriaQuery) {
-        this.criteriaQuery = criteriaQuery;
-    }
-    
     public QueryExpressions getQueryExpressions(ExpressionFactory factory, 
         CriteriaQueryImpl q) {
         QueryExpressions exps = new QueryExpressions();
@@ -79,13 +76,22 @@
 
     protected void evalAccessPaths(QueryExpressions exps, 
         ExpressionFactory factory, CriteriaQueryImpl q) {
+        Set<ClassMetaData> metas = new HashSet<ClassMetaData>();
         Set<Root<?>> roots = q.getRoots();
         if (roots != null) {
-            exps.accessPath = new ClassMetaData[roots.size()];
-            int i = 0;
-            for (Root<?> r : roots)
-                exps.accessPath[i++] = ((Types.Managed<?>)r.getModel()).meta;
+            for (Root<?> root : roots) {
+                
+                metas.add(((Types.Managed<?>)root.getModel()).meta);
+                if (root.getJoins() != null) {
+                    for (Join<?,?> join : root.getJoins()) {
+                        Class<?> cls = join.getMember().getMemberJavaType();
+                        Entity<?> entity = q.getMetamodel().entity(cls);
+                        metas.add(((Types.Managed<?>)entity).meta);
+                    }
+                }
+            }
         }
+        exps.accessPath = metas.toArray(new ClassMetaData[metas.size()]);
     }
 
     protected void evalOrdering(QueryExpressions exps, 
@@ -200,7 +206,7 @@
             if (sels == null) {
                 projections.add(((ExpressionImpl<?>)s).
                     toValue(factory, model, q));
-                aliases.add(nextAlias());
+                aliases.add(q.getAlias(s));
             } else {
                 // this is for constructor expression in the selection
                 exps.resultClass = s.getJavaType();
@@ -228,8 +234,4 @@
         org.apache.openjpa.kernel.exps.Expression e2) {
         return e1 == null ? e2 : e2 == null ? e1 : factory.and(e1, e2);
     }
-   
-    protected String nextAlias() {
-        return "jpqlalias" + (++aliasCount);
-    }   
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java Wed Jun 10 00:41:35 2009
@@ -20,8 +20,10 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.persistence.Parameter;
@@ -37,6 +39,7 @@
 import org.apache.commons.collections.map.LinkedMap;
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.QueryExpressions;
+import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
 import org.apache.openjpa.persistence.meta.Types;
 
@@ -49,10 +52,11 @@
  * that can be interpreted and executed against a data store by OpenJPA kernel.
  *   
  * @author Pinaki Poddar
+ * @author Fay Wang
  *
  * @since 2.0.0
  */
-public class CriteriaQueryImpl implements CriteriaQuery {
+public class CriteriaQueryImpl implements CriteriaQuery, AliasContext {
     private final MetamodelImpl  _model;
     private Set<Root<?>>        _roots;
     private PredicateImpl       _where;
@@ -64,18 +68,28 @@
     private List<Subquery<?>>   _subqueries;
     private Boolean             _distinct;
     private LinkedMap           _parameterTypes;
-    private CriteriaExpressionBuilder _exprBuilder;
-    private SubqueryImpl        _context;
+    private SubqueryImpl<?>     _context;
+    
+    // AliasContext
+    private int aliasCount = 0;
+    private static String ALIAS_BASE = "autoAlias";
+    
+    private Map<Selection<?>,Value> _variables = 
+        new HashMap<Selection<?>, Value>();
+    private Map<Selection<?>,Value> _values = 
+        new HashMap<Selection<?>, Value>();
+    private Map<Selection<?>,String> _aliases = 
+        new HashMap<Selection<?>, String>();
     
     public CriteriaQueryImpl(MetamodelImpl model) {
         this._model = model;
     }
     
-    public void setContext(SubqueryImpl context) {
+    public void setContext(SubqueryImpl<?> context) {
         _context = context;
     }
     
-    public SubqueryImpl getContext() {
+    public SubqueryImpl<?> getContext() {
         return _context;
     }
     
@@ -150,8 +164,11 @@
         return root;
     }
 
-    public <X> Root<X> from(Class<X> entityClass) {
-        return from(_model.entity(entityClass));
+    public <X> Root<X> from(Class<X> cls) {
+        Entity<X> entity = _model.entity(cls);
+        if (entity == null)
+            throw new IllegalArgumentException(cls + " is not an entity");
+        return from(entity);
     }
 
     public List<Expression<?>> getGroupList() {
@@ -190,7 +207,7 @@
     public <U> Subquery<U> subquery(Class<U> type) {
         if (_subqueries == null)
             _subqueries = new ArrayList<Subquery<?>>();
-        Subquery<U> subquery = new SubqueryImpl(type, this);
+        Subquery<U> subquery = new SubqueryImpl<U>(type, this);
         _subqueries.add(subquery);
         return subquery;
     }
@@ -203,21 +220,85 @@
         _parameterTypes = parameterTypes;
     }
     
-    public CriteriaExpressionBuilder getExprBuilder() {
-        return _exprBuilder;
-    }
-
     /**
      * Populate a kernel expression tree by translating the components of this
      * receiver with the help of the given {@link ExpressionFactory}.
      */
     QueryExpressions getQueryExpressions(ExpressionFactory factory) {
-        _exprBuilder = new CriteriaExpressionBuilder(this);
-        return _exprBuilder.getQueryExpressions(factory, this);
+        return new CriteriaExpressionBuilder()
+              .getQueryExpressions(factory, this);
     }    
     
     public void assertRoot() {
         if (_roots == null || _roots.isEmpty())
             throw new IllegalStateException("no root is set");
     }
+    
+    //
+    // AliasContext management
+    //
+    
+    /**
+     * Gets the alias of the given node. Creates if necessary.
+     */
+    public String getAlias(Selection<?> selection) {
+        String alias = selection.getAlias();
+        if (alias != null) {
+            _aliases.put(selection, alias);
+            return alias;
+        }
+        alias = ALIAS_BASE + (++aliasCount);
+        while (_aliases.containsValue(alias))
+            alias = ALIAS_BASE + (++aliasCount);
+        selection.setAlias(alias);
+        _aliases.put(selection, alias);
+        return _aliases.get(selection);
+    }
+    
+    public Value getVariable(Selection<?> selection) {
+        return _variables.get(selection);
+    }
+    
+    public Value getValue(Selection<?> selection) {
+        return _values.get(selection);
+    }
+    
+    /**
+     * Register the given variable of given path value against the given node.
+     * If the given node has no alias then an alias is set to the given node.
+     * If the variable or the path has non-null alias, then that alias must
+     * be equal to the alias of the given node. Otherwise, the node alias is set
+     * on the variable and path.  
+     */
+    public void registerVariable(Selection<?> node, Value var, Value path) {
+        if (!var.isVariable())
+            throw new RuntimeException(var.getClass() + " is not a variable");
+        if (var.getPath() != path)
+            throw new RuntimeException(var + " and " + path);
+        String alias = getAlias(node);
+        
+        if (!alias.equals(var.getAlias())) {
+            if (var.getAlias() == null)
+                var.setAlias(alias);
+            else
+                throw new RuntimeException("Variable alias " + var.getAlias() + 
+                " does not match expected selection alias " + alias);
+        }
+        if (!alias.equals(path.getAlias())) {
+            if (path.getAlias() == null) 
+                path.setAlias(alias);
+            else
+                throw new RuntimeException("Path alias " + path.getAlias() + 
+                " does not match expected selection alias " + alias);
+        }
+        if (isRegistered(node))
+            throw new RuntimeException(node + " is already bound");
+        _variables.put(node, var);
+        _values.put(node, path);
+        _aliases.put(node, alias);
+    }
+    
+    public boolean isRegistered(Selection<?> selection) {
+        return _variables.containsKey(selection);
+    }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java Wed Jun 10 00:41:35 2009
@@ -43,15 +43,11 @@
     /**
      * Convert the given Criteria expression to a corresponding kernel value 
      * using the given ExpressionFactory.
-     * Also sets the alias of the resulting value.
+     * Handles null expression.
      */
      static Value toValue(ExpressionImpl<?> e, ExpressionFactory factory, 
         MetamodelImpl model, CriteriaQueryImpl q) {
-        Value v = e == null ? factory.getNull() : e.toValue(factory, model, q);
-        //v.setImplicitType(e.getJavaType());
-        //v.setAlias(e.getAlias());
-
-        return v;
+        return (e == null) ? factory.getNull() : e.toValue(factory, model, q);
     }
     
     /**
@@ -577,7 +573,7 @@
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q);
             JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                ((CriteriaQueryImpl)q).getParameterTypes(), null);
+                q.getParameterTypes(), null);
             return isNegated() ? factory.notEqual(val1, val2) 
                     : factory.equal(val1, val2);
         }
@@ -599,7 +595,7 @@
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q); 
             JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                ((CriteriaQueryImpl)q).getParameterTypes(), null);
+                q.getParameterTypes(), null);
             return factory.greaterThan(val1, val2);
         }
     }
@@ -620,7 +616,7 @@
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q); 
             JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                ((CriteriaQueryImpl)q).getParameterTypes(), null);
+                q.getParameterTypes(), null);
             return factory.greaterThanEqual(val1, val2);
         }
     }
@@ -662,7 +658,7 @@
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q); 
             JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                ((CriteriaQueryImpl)q).getParameterTypes(), null);
+                q.getParameterTypes(), null);
             return factory.lessThanEqual(val1, val2);
         }
     }
@@ -1192,35 +1188,31 @@
                 Expressions.toValue(e, factory, model, q));
         }
     }
-    
-    public static class Exists extends PredicateImpl {
-        SubqueryImpl<?> e;
-        public Exists(Subquery<?> x) {
+     
+    public static class Exists<X> extends PredicateImpl {
+        final SubqueryImpl<X> e;
+        public Exists(Subquery<X> x) {
             super();
-            e = (SubqueryImpl<?>)x;
+            e = (SubqueryImpl<X>)x;
         }
 
         @Override
         public PredicateImpl clone() {
-            return new Exists(e);
+            return new Exists<X>(e);
         }
         
         @Override
         org.apache.openjpa.kernel.exps.Expression toKernelExpression(
             ExpressionFactory factory, MetamodelImpl model, 
             CriteriaQueryImpl q) {
-            org.apache.openjpa.kernel.exps.Expression notEmpty = 
+            org.apache.openjpa.kernel.exps.Expression exists = 
                 factory.isNotEmpty(Expressions.toValue(e, factory, model, q));
-            if (isNegated())
-                return factory.not(notEmpty);
-            else
-                return notEmpty;
-                
+            return isNegated() ? factory.not(exists) : exists;
         }        
     }
     
     public static class All<X> extends ExpressionImpl<X> {
-        SubqueryImpl<X> e;
+        final SubqueryImpl<X> e;
         public All(Subquery<X> x) {
             super(x.getJavaType());
             e = (SubqueryImpl<X>)x;
@@ -1234,7 +1226,7 @@
     }
 
     public static class Any<X> extends ExpressionImpl<X> {
-        SubqueryImpl<X> e;
+        final SubqueryImpl<X> e;
         public Any(Subquery<X> x) {
             super(x.getJavaType());
             e = (SubqueryImpl<X>)x;
@@ -1248,7 +1240,7 @@
     }
 
     public static class Some<X> extends ExpressionImpl<X> {
-        SubqueryImpl<X> e;
+        final SubqueryImpl<X> e;
         public Some(Subquery<X> x) {
             super(x.getJavaType());
             e = (SubqueryImpl<X>)x;

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java Wed Jun 10 00:41:35 2009
@@ -33,12 +33,9 @@
 import javax.persistence.metamodel.Attribute;
 import javax.persistence.metamodel.Collection;
 import javax.persistence.metamodel.List;
-import javax.persistence.metamodel.ManagedType;
 import javax.persistence.metamodel.Map;
-import javax.persistence.metamodel.Member;
 import javax.persistence.metamodel.Set;
 
-import org.apache.openjpa.persistence.criteria.PathImpl;
 import org.apache.openjpa.persistence.meta.Members;
 import org.apache.openjpa.persistence.meta.Types;
 
@@ -71,14 +68,7 @@
     }
     
     /**
-     * Create a path from the given parent ending at the given member.
-     */
-//    protected FromImpl(PathImpl<?,Z> parent, Members.Member<? super Z, X> m) {
-//        super(parent, m);
-//    }
-    
-    /**
-     *  Return the joins that have been made from this type.
+     *  Return the joins that have been made from this receiver.
      */
     public java.util.Set<Join<X, ?>> getJoins() {
         return _joins;
@@ -175,85 +165,82 @@
     
     // String based counterparts
 
-    public Join join(String attributeName) {
-        return join(type.getAttribute(attributeName));
+    public <W,Y> Join<W,Y> join(String attr) {
+        return join(attr, JoinType.INNER);
     }
 
-    public Join join(String attributeName, JoinType jt) {
-        return join(type.getAttribute(attributeName), jt);
+    public <W,Y> Join<W,Y> join(String attr, JoinType jt) {
+        return (Join<W,Y>)join(type.getAttribute(attr), jt);
     }
 
 
-    public CollectionJoin joinCollection(String attributeName) {
-        return join(type.getCollection(attributeName));
+    public <W,Y> CollectionJoin<W, Y> joinCollection(String attr) {
+        return (CollectionJoin<W,Y>)join(attr, JoinType.INNER);
     }
 
-    public CollectionJoin joinCollection(String attributeName, JoinType jt) {
-        return join(type.getCollection(attributeName), jt);
+    public <W,Y> CollectionJoin<W, Y> joinCollection(String attr, JoinType jt) {
+        return (CollectionJoin<W,Y>)join(type.getCollection(attr), jt);
     }
 
-    public ListJoin joinList(String attributeName) {
-        return join(type.getList(attributeName));
+    public <W,Y> ListJoin<W, Y> joinList(String attr) {
+        return (ListJoin<W,Y>)join(attr, JoinType.INNER);
     }
 
-    public ListJoin joinList(String attributeName, JoinType jt) {
-        return join(type.getList(attributeName), jt);
+    public <W,Y> ListJoin<W,Y> joinList(String attr, JoinType jt) {
+        return (ListJoin<W,Y>)join(type.getList(attr), jt);
     }
 
-    public MapJoin joinMap(String attributeName) {
-        return join(type.getMap(attributeName));
+    public <W,K,V> MapJoin<W,K,V> joinMap(String attr) {
+        return (MapJoin<W,K,V>)join(type.getMap(attr));
     }
 
-    public MapJoin joinMap(String attributeName, JoinType jt) {
-        return join(type.getMap(attributeName));
+    public <W,K,V> MapJoin<W,K,V>  joinMap(String attr, JoinType jt) {
+        return (MapJoin<W,K,V>)join(type.getMap(attr));
     }
 
-    public SetJoin joinSet(String attributeName) {
-        return join(type.getSet(attributeName));
+    public <W,Y> SetJoin<W, Y>  joinSet(String attr) {
+        return (SetJoin<W, Y>)join(type.getSet(attr));
     }
 
-    public SetJoin joinSet(String attributeName, JoinType jt) {
-        return join(type.getSet(attributeName), jt);
+    public <W,Y> SetJoin<W, Y>  joinSet(String attr, JoinType jt) {
+        return (SetJoin<W, Y>)join(type.getSet(attr), jt);
     }
 
-    public Fetch fetch(Attribute assoc) {
-        // TODO Auto-generated method stub
+    private void addJoin(Join<X,?> join) {
+        if (_joins == null)
+            _joins = new HashSet<Join<X,?>>();
+         _joins.add(join);
+    }
+    
+    
+    public <Y> Fetch<X, Y> fetch(Attribute<? super X, Y> assoc, JoinType jt) {
         throw new AbstractMethodError();
     }
 
-    public Fetch fetch(AbstractCollection assoc) {
-        // TODO Auto-generated method stub
+    public <Y> Fetch<X,Y> fetch(Attribute<? super X, Y> assoc) {
         throw new AbstractMethodError();
     }
 
-    public Fetch fetch(String assocName) {
-        // TODO Auto-generated method stub
+    public <Y> Fetch<X, Y> fetch(AbstractCollection<? super X, ?, Y> assoc,
+        JoinType jt) {
         throw new AbstractMethodError();
     }
-
-    public Fetch fetch(Attribute assoc, JoinType jt) {
-        // TODO Auto-generated method stub
+    
+    public <Y> Fetch<X,Y> fetch(AbstractCollection<? super X, ?, Y> assoc) {
         throw new AbstractMethodError();
     }
 
-    public Fetch fetch(AbstractCollection assoc, JoinType jt) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+    //String-based:
+
+    public <Y> Fetch<X, Y> fetch(String assocName) {
+        return (Fetch<X, Y>)fetch(type.getAttribute(assocName));
     }
 
-    public Fetch fetch(String assocName, JoinType jt) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+    public <Y> Fetch<X, Y> fetch(String assocName, JoinType jt) {
+        return (Fetch<X, Y>)fetch(type.getAttribute(assocName), JoinType.INNER);
     }
 
     public java.util.Set<Fetch<X, ?>> getFetches() {
-        // TODO Auto-generated method stub
         throw new AbstractMethodError();
     }
-    
-    private void addJoin(Join<X,?> join) {
-        if (_joins == null)
-            _joins = new HashSet<Join<X,?>>();
-         _joins.add(join);
-    }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java Wed Jun 10 00:41:35 2009
@@ -74,6 +74,8 @@
         @Override
         public Value toValue(ExpressionFactory factory, MetamodelImpl model, 
             CriteriaQueryImpl c) {
+            if (c.isRegistered(this))
+                return c.getValue(this);
             boolean allowNull = joinType != JoinType.INNER;
             org.apache.openjpa.kernel.exps.Path path = 
                 (org.apache.openjpa.kernel.exps.Path)
@@ -92,10 +94,11 @@
             org.apache.openjpa.kernel.exps.Value path = this.toValue
                 (factory, model, c);
             ClassMetaData meta = _member.fmd.getDeclaredTypeMetaData();
-            Value var = factory.newBoundVariable(getAlias(), 
+            Value var = factory.newBoundVariable(c.getAlias(this), 
                 meta.getDescribedType());
             org.apache.openjpa.kernel.exps.Expression join = factory
                 .bindVariable(var, path);
+            c.registerVariable(this, var, path);
             return join;
         }
     }
@@ -105,15 +108,13 @@
      * 
      * @param Z type being joined from
      * @param C Java collection type of the container
-     * @param type of the element being joined to
+     * @param E type of the element being joined to
      * 
      */
     public static abstract class AbstractCollection<Z,C,E> 
         extends FromImpl<Z,E> 
         implements AbstractCollectionJoin<Z, C, E> {
         final JoinType joinType;
-//        final FromImpl<?, Z> _from;
-//        final Members.BaseCollection<? super Z, C, E> _member;
         
         public AbstractCollection(FromImpl<?,Z> from, 
             Members.BaseCollection<? super Z, C, E> member, JoinType jt) {
@@ -177,11 +178,10 @@
             ClassMetaData meta = _member.fmd.isElementCollection() 
                 ? _member.fmd.getEmbeddedMetaData()
                 : _member.fmd.getElement().getDeclaredTypeMetaData();
-            Value var = factory.newBoundVariable(getAlias(), 
+                
+            Value var = factory.newBoundVariable(c.getAlias(this), 
                 meta.getDescribedType());
-            org.apache.openjpa.kernel.exps.Expression join = factory
-                .bindVariable(var, path);
-            return join;
+            return factory.bindVariable(var, path);
         }
         
     }
@@ -291,5 +291,24 @@
         public Path<V> value() {
             throw new AbstractMethodError();
         }
+        
+        @Override
+        public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+            ExpressionFactory factory, MetamodelImpl model, 
+            CriteriaQueryImpl c) {
+            org.apache.openjpa.kernel.exps.Value path = toValue
+               (factory, model, c);
+            
+            ClassMetaData meta = _member.fmd.isElementCollection() 
+                ? _member.fmd.getEmbeddedMetaData()
+                : _member.fmd.getElement().getDeclaredTypeMetaData();
+                
+            Value var = factory.newBoundVariable(c.getAlias(this), 
+                meta.getDescribedType());
+            org.apache.openjpa.kernel.exps.Expression join = factory
+                .bindValueVariable(var, path);
+            c.registerVariable(this, var, path);
+            return join;
+        }
     }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java Wed Jun 10 00:41:35 2009
@@ -19,11 +19,8 @@
 
 package org.apache.openjpa.persistence.criteria;
 
-import java.util.Set;
-
 import javax.persistence.criteria.Expression;
 import javax.persistence.criteria.Path;
-import javax.persistence.criteria.Root;
 import javax.persistence.metamodel.AbstractCollection;
 import javax.persistence.metamodel.Attribute;
 import javax.persistence.metamodel.Bindable;
@@ -42,7 +39,8 @@
  * from another (parent) path.
  * 
  * @author Pinaki Poddar
- *
+ * @author Fay Wang
+ * 
  * @param <Z> the type of the parent path 
  * @param <X> the type of this path
  */
@@ -61,7 +59,9 @@
     }
     
     /**
-     * Create a path from the given parent representing the the given member.
+     * Create a path from the given non-null parent representing the the given 
+     * non-null member. The given class denotes the type expressed by this
+     * path.
      */
     public PathImpl(PathImpl<?,Z> parent, Members.Member<? super Z, ?> member, 
         Class<X> cls) {
@@ -72,70 +72,65 @@
             throw new NullPointerException("Null parent for member " + member);
         if (member == null)
             throw new NullPointerException("Null member for parent " + parent);
-        
     }
     
     public PathImpl<?,Z> getParentPath() {
         return _parent;
     }
     
-    public PathImpl getInnermostParentPath() {
-        if (_parent == null)
-            return this;
-        PathImpl _p = _parent.getInnermostParentPath(); 
-        if (_p == null)
-            return _parent;
-        else
-            return _p.getInnermostParentPath();
+    public PathImpl<?,?> getInnermostParentPath() {
+        return (_parent == null) ? this : _parent.getInnermostParentPath();
     }
 
     /**
-     * Convert this path to a kernel path value.
+     * Convert this path to a kernel path.
      */
     @Override
-    public Value toValue(ExpressionFactory factory, MetamodelImpl model,
-        CriteriaQueryImpl q) {
-        Value var = null;
-        SubqueryImpl subquery = q.getContext();
-        PathImpl parent = getInnermostParentPath();
-        if (subquery != null && inSubquery(parent, subquery)) {
-            org.apache.openjpa.kernel.exps.Subquery subQ = 
-                subquery.getSubQ();
-            org.apache.openjpa.kernel.exps.Path path = factory.newPath(subQ);
+    public Value toValue(
+        ExpressionFactory factory, MetamodelImpl model,  CriteriaQueryImpl q) {
+        if (q.isRegistered(this))
+            return q.getValue(this);
+        org.apache.openjpa.kernel.exps.Path path = null;
+        SubqueryImpl<?> subquery = q.getContext();
+        PathImpl<?,?> parent = getInnermostParentPath();
+        if (parent.inSubquery(subquery)) {
+            org.apache.openjpa.kernel.exps.Subquery subQ = subquery.getSubQ();
+            path = factory.newPath(subQ);
             path.setMetaData(subQ.getMetaData());
             boolean allowNull = false;
             path.get(_member.fmd, allowNull);
-            var = path;
         } else if (_parent != null) { 
-            org.apache.openjpa.kernel.exps.Path path = 
-                (org.apache.openjpa.kernel.exps.Path)
-                _parent.toValue(factory, model, q);
+            if (q.isRegistered(_parent)) {
+                path = factory.newPath(q.getVariable(_parent));
+            } else {
+                path = (org.apache.openjpa.kernel.exps.Path)
+                     _parent.toValue(factory, model, q);
+            }
             boolean allowNull = false;
             path.get(_member.fmd, allowNull);
-            var = path;
         } else {
-            var = factory.newPath();//getJavaType());
-            var.setMetaData(model.repos.getMetaData(getJavaType(), null, true));
+            path = factory.newPath();
+            path.setMetaData(model.repos.getCachedMetaData(getJavaType()));
         }
         if (_member != null) {
             int typeCode = _member.fmd.getDeclaredTypeCode();
             if (typeCode != JavaTypes.COLLECTION && typeCode != JavaTypes.MAP)
-                var.setImplicitType(getJavaType());
+                path.setImplicitType(getJavaType());
         }
-        var.setAlias(getAlias());
-        return var;
+        path.setAlias(q.getAlias(this));
+        return path;
     }
     
-    public static boolean inSubquery(PathImpl parent, SubqueryImpl subquery) {
-        Set<Root<?>> roots = subquery.getRoots();
-        for (Root<?> r : roots) {
-            if (parent == r) 
-                return true;
-        }
-        return false;
+    /**
+     * Affirms if this receiver occurs in the roots of the given subquery.
+     */
+    public boolean inSubquery(SubqueryImpl<?> subquery) {
+        return subquery != null && subquery.getRoots().contains(this);
     }
     
-
+    /**
+     * Create a new path with this path as parent.
+     */
     public <Y> Path<Y> get(Attribute<? super X, Y> attr) {
         return new PathImpl<X,Y>(this, (Members.Attribute<? super X, Y>)attr, 
             attr.getJavaType());
@@ -181,5 +176,5 @@
      */
     public Expression<Class<? extends X>> type() {
         return new Expressions.Type<X>(this);
-    }
+    }   
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java Wed Jun 10 00:41:35 2009
@@ -105,7 +105,7 @@
                 ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
                 result = _op == BooleanOperator.AND 
                 ? factory.and(result, e.toKernelExpression(factory, model, q))
-                    : factory.or(result, e.toKernelExpression(factory,model,q));
+                : factory.or(result, e.toKernelExpression(factory,model,q));
             }
             return _negated ? factory.not(result) : result;
     }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java Wed Jun 10 00:41:35 2009
@@ -22,17 +22,20 @@
 import javax.persistence.criteria.Root;
 import javax.persistence.metamodel.Entity;
 
+import org.apache.openjpa.kernel.exps.Expression;
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
+import org.apache.openjpa.kernel.exps.Path;
+import org.apache.openjpa.kernel.exps.Subquery;
 import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
 import org.apache.openjpa.persistence.meta.Types;
 
 /**
- * A path without a parent.
+ * A root path without a parent.
  * 
  * @author Pinaki Poddar
  *
- * @param <X>
+ * @param <X> the type of the entity
  */
 public class RootImpl<X> extends FromImpl<X,X> implements Root<X> {
     private final Types.Entity<X> _entity;
@@ -61,14 +64,14 @@
     @Override
     public Value toValue(ExpressionFactory factory, MetamodelImpl model, 
         CriteriaQueryImpl c) {
-        SubqueryImpl subquery = c.getContext();
-        Value var = null;
-        if (subquery != null && PathImpl.inSubquery(this, subquery)) {
-            org.apache.openjpa.kernel.exps.Subquery subQ = 
-                subquery.getSubQ();
+        SubqueryImpl<?> subquery = c.getContext();
+        Path var = null;
+        if (inSubquery(subquery)) {
+            Subquery subQ = subquery.getSubQ();
             var = factory.newPath(subQ);
-        } else 
+        } else {
             var = factory.newPath();
+        }
         var.setMetaData(_entity.meta);
         return var;
     }
@@ -80,21 +83,18 @@
     @Override
     public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
         ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl c) {
-        org.apache.openjpa.kernel.exps.Value path = toValue(factory, model, c);
-        
-        Value var = factory.newBoundVariable(getAlias(), 
+        Value path = toValue(factory, model, c);
+        Value var = factory.newBoundVariable(c.getAlias(this), 
             _entity.meta.getDescribedType());
-        org.apache.openjpa.kernel.exps.Expression exp = 
-            factory.bindVariable(var, path);
+        Expression exp = factory.bindVariable(var, path);
         
         if (_correlatedParent == null) 
             return exp;
-        org.apache.openjpa.kernel.exps.Value path1 = 
-            _correlatedParent.toValue(factory, model, c);
-        org.apache.openjpa.kernel.exps.Expression equal = 
-            factory.equal(path1, path);
-        //return factory.and(exp, equal);
-        return equal;
-        
+        Value path1 = _correlatedParent.toValue(factory, model, c);
+        return factory.equal(path1, path);
+    }
+    
+    public String toString() {
+        return _entity.toString();
     }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java Wed Jun 10 00:41:35 2009
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
 package org.apache.openjpa.persistence.criteria;
 
 import java.util.LinkedHashSet;
@@ -24,7 +42,15 @@
 import org.apache.openjpa.kernel.exps.QueryExpressions;
 import org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder;
 
-
+/**
+ * Subquery is an expression which itself is a query and always appears in the
+ * context of a parent query.
+ * 
+ * @author Pinaki Poddar
+ * @author Fay Wang
+ * 
+ * @param <T> the type selected by this subquery.
+ */
 public class SubqueryImpl<T> extends ExpressionImpl<T> implements Subquery<T> {
     private final CriteriaQueryImpl _parent;
     private final CriteriaQueryImpl _delegate;
@@ -139,12 +165,15 @@
     public <X,Y> CollectionJoin<X,Y> correlate(CollectionJoin<X,Y> join) {
         return join;
     }
+    
     public <X,Y> SetJoin<X,Y> correlate(SetJoin<X,Y> join) {
         return join;
     }
+    
     public <X,Y> ListJoin<X,Y> correlate(ListJoin<X,Y> join) {
         return join;
     }
+    
     public <X,K,V> MapJoin<X,K,V> correlate(MapJoin<X,K,V> join) {
         return join;
     }
@@ -164,14 +193,14 @@
     public Value toValue(ExpressionFactory factory, MetamodelImpl model,
         CriteriaQueryImpl q) {
         final boolean subclasses = true;
-        CriteriaExpressionBuilder queryEval = q.getExprBuilder();
-        String alias = queryEval.nextAlias();
+        CriteriaExpressionBuilder queryEval = new CriteriaExpressionBuilder();
+        String alias = q.getAlias(this);
         ClassMetaData candidate =  
             ((Types.Managed<?>)getRoot().getModel()).meta;
         _subq = factory.newSubquery(candidate, subclasses, alias);
         _subq.setMetaData(candidate);
-        QueryExpressions subexp = q.getExprBuilder().
-            getQueryExpressions(factory, _delegate);
+        QueryExpressions subexp = queryEval.getQueryExpressions(factory, 
+                _delegate);
         _subq.setQueryExpressions(subexp);
         if (subexp.projections.length > 0)
             JPQLExpressionBuilder.checkEmbeddable(subexp.projections[0], null);

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java Wed Jun 10 00:41:35 2009
@@ -164,6 +164,10 @@
         public Class<E> getJavaType() {
             return fmd.getDeclaredType();
         }
+        
+        public Class getMemberJavaType() {
+            return fmd.getElement().getDeclaredType();
+        }
     }
 
     /**

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java Wed Jun 10 00:41:35 2009
@@ -27,7 +27,6 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.TypeVariable;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -46,7 +45,6 @@
 import javax.persistence.metamodel.AbstractCollection.CollectionType;
 import javax.persistence.metamodel.Type.PersistenceType;
 
-import org.apache.openjpa.lib.util.J2DoPrivHelper;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.FieldMetaData;
@@ -61,12 +59,14 @@
  */
 public class MetamodelImpl implements Metamodel {
     public final MetaDataRepository repos;
-    Map<Class<?>, Entity<?>> _entities = new HashMap<Class<?>, Entity<?>>();
-    Map<Class<?>, Embeddable<?>> _embeddables =
+    private Map<Class<?>, Entity<?>> _entities = 
+        new HashMap<Class<?>, Entity<?>>();
+    private Map<Class<?>, Embeddable<?>> _embeddables =
         new HashMap<Class<?>, Embeddable<?>>();
-    Map<Class<?>, MappedSuperclass<?>> _mappedsupers =
+    private Map<Class<?>, MappedSuperclass<?>> _mappedsupers =
         new HashMap<Class<?>, MappedSuperclass<?>>();
-    Map<Class<?>, Type<?>> _basics = new HashMap<Class<?>, Type<?>>();
+    private Map<Class<?>, Type<?>> _basics = 
+        new HashMap<Class<?>, Type<?>>();
 
     private static Localizer _loc = Localizer.forPackage(MetamodelImpl.class);
 
@@ -141,8 +141,10 @@
     public static PersistenceType getPersistenceType(ClassMetaData meta) {
         if (meta == null)
             return BASIC;
-        if (meta.isEmbeddedOnly())
-            return meta.isAbstract() ? MAPPED_SUPERCLASS : EMBEDDABLE;
+        if (meta.isAbstract())
+            return MAPPED_SUPERCLASS;
+        if (meta.isEmbeddable())
+            return EMBEDDABLE;
         return ENTITY;
     }
 

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java Wed Jun 10 00:41:35 2009
@@ -411,11 +411,27 @@
         void assertType(String msg, FieldMetaData fmd, Class<?> actual,
             Class<?> expected) {
             if (expected != null && !expected.isAssignableFrom(actual)) {
+                if (wrap(expected) != wrap(actual)) {
                 throw new IllegalArgumentException(_loc.get(msg, fmd.getName(), 
                 	actual, expected).getMessage());
+                }
             }
         }
-
+        
+        Class<?> wrap(Class<?> c) {
+            if (c.isPrimitive()) {
+                if (c == int.class) return Integer.class;
+                if (c == long.class) return Long.class;
+                if (c == boolean.class) return Boolean.class;
+                if (c == byte.class) return Byte.class;
+                if (c == char.class) return Character.class;
+                if (c == double.class) return Double.class;
+                if (c == float.class) return Float.class;
+                if (c == short.class) return Short.class;
+            }
+            return c;
+        }
+        
         boolean isDeclared(Member<?,?> member) {
             return member.getDeclaringType() == this;
         }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java Wed Jun 10 00:41:35 2009
@@ -625,7 +625,7 @@
 		
 		public void write(PrintWriter out, int tab) {
 			tab(out, tab);
-			out.print("@"+name);
+			out.println("@"+name);
 			writeList(out, BLANK, args, BRACKET_ARGS, false);
 			out.println();
 		}