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 2013/04/10 08:09:59 UTC

svn commit: r1466339 [2/3] - in /openjpa/sandboxes/21: ./ openjpa-all/ openjpa-examples/ openjpa-examples/image-gallery/ openjpa-examples/openbooks/ openjpa-examples/simple/ openjpa-integration/ openjpa-integration/daytrader/ openjpa-integration/exampl...

Modified: openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java?rev=1466339&r1=1466338&r2=1466339&view=diff
==============================================================================
--- openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java (original)
+++ openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java Wed Apr 10 06:09:57 2013
@@ -18,91 +18,45 @@
  */
 package org.apache.openjpa.persistence.criteria;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
-import java.util.Stack;
 
-import javax.persistence.criteria.AbstractQuery;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Expression;
-import javax.persistence.criteria.Fetch;
-import javax.persistence.criteria.From;
-import javax.persistence.criteria.Join;
 import javax.persistence.criteria.Order;
-import javax.persistence.criteria.ParameterExpression;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import javax.persistence.criteria.Selection;
 import javax.persistence.criteria.Subquery;
 import javax.persistence.metamodel.EntityType;
 
-import org.apache.commons.collections.map.LinkedMap;
-import org.apache.openjpa.kernel.StoreQuery;
-import org.apache.openjpa.kernel.exps.Context;
-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.lib.util.Localizer;
+import org.apache.openjpa.kernel.QueryOperations;
 import org.apache.openjpa.lib.util.OrderedMap;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
-import org.apache.openjpa.persistence.meta.Types;
 
 /**
  * Criteria query implementation.
- * 
- * Collects clauses of criteria query (e.g. select projections, from/join, 
- * where conditions, order by).
- * Eventually translates these clauses to a similar form of Expression tree
- * that can be interpreted and executed against a data store by OpenJPA kernel.
+ * <br>
+ * This major functionality of this class is factored out to its 
+ * {@link {@link GenericCriteriaImpl base class since version 2.3.0.
+ * <br>
+ *  
  *   
  * @author Pinaki Poddar
  * @author Fay Wang
  *
  * @since 2.0.0
  */
-class CriteriaQueryImpl<T> implements OpenJPACriteriaQuery<T>, AliasContext {
-    private static final Localizer _loc = Localizer.forPackage(CriteriaQueryImpl.class);
-    
-    private final MetamodelImpl  _model;
-    private Set<Root<?>>        _roots;
-    private PredicateImpl       _where;
-    private List<Order>         _orders;
-    private OrderedMap<Object, Class<?>> _params; /*<ParameterExpression<?>, Class<?>>*/ 
-    private Selection<? extends T> _selection;
-    private List<Selection<?>>  _selections;
-    private List<Expression<?>> _groups;
-    private PredicateImpl       _having;
-    private List<Subquery<?>>   _subqueries;
-    private boolean             _distinct;
-    private final SubqueryImpl<?> _delegator;
-    private final Class<T>      _resultClass;
-    private boolean             _compiled;
-
-    // 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  = null;
-    private Map<Selection<?>,Value> _rootVariables = new HashMap<Selection<?>, Value>();
-    
-    // SubqueryContext
-    private Stack<Context> _contexts = null;
+class CriteriaQueryImpl<T> extends GenericCriteriaImpl<T>  {
     
     public CriteriaQueryImpl(MetamodelImpl model, Class<T> resultClass) {
-        this._model = model;
-        this._resultClass = resultClass;
-        this._delegator = null;
-        _aliases = new HashMap<Selection<?>, String>(); 
+    	super(model, resultClass, QueryOperations.OP_SELECT);
+    	setOwner(this);
+    }
+    
+    CriteriaQueryImpl(MetamodelImpl model, Class<T> resultClass, int op) {
+    	super(model, resultClass, op);
+    	setOwner(this);
     }
     
     /**
@@ -112,38 +66,15 @@ class CriteriaQueryImpl<T> implements Op
      * @param delegator the subquery which will delegate to this receiver.
      */
     CriteriaQueryImpl(MetamodelImpl model, SubqueryImpl<T> delegator) {
-        this._model = model;
-        this._resultClass = delegator.getJavaType();
-        _delegator = delegator;
-        _aliases = getAliases();
-    }
-    
-    /**
-     * Gets the subquery, if any, which is delegating to this receiver.
-     */
-    SubqueryImpl<?> getDelegator() {
-        return _delegator;
-    }
-    
-    /**
-     * Gets the metamodel which defines the scope of all persistent entity references.
-     */
-    public MetamodelImpl getMetamodel() {
-        return _model;
-    }
-    
-    /**
-     * Gets the stack of contexts used by this query.
-     */
-    Stack<Context> getContexts() {
-        return _contexts;
+    	super(model, delegator);
     }
-    
+
     /**
      * Sets whether this query as distinct.
      */
+    @Override
     public CriteriaQuery<T> distinct(boolean distinct) {
-        _distinct = distinct;
+    	super.distinct(distinct);
         return this;
     }
 
@@ -153,16 +84,18 @@ class CriteriaQueryImpl<T> implements Op
      * @return Empty list if there is no ordering elements.
      * The returned list if mutable but mutation has no impact on this query.
      */
+    @Override
     public List<Order> getOrderList() {
-        return Expressions.returnCopy(_orders);
+        return super.getOrderList();
     }
     
     /**
      * Return the selection of the query
      * @return the item to be returned in the query result
      */
+    @Override
     public Selection<T> getSelection() {
-        return (Selection<T>)_selection;
+        return super.getSelection();
     }
     
     /**
@@ -207,97 +140,57 @@ class CriteriaQueryImpl<T> implements Op
      *        are returned in the query result
      * @return the modified query
      */
+    @Override
     public CriteriaQuery<T> multiselect(Selection<?>... selections) {
-        _selections = Arrays.asList(selections); // do not telescope
-        _selection  = new CompoundSelections.MultiSelection(_resultClass, selections);
+    	super.multiselect(selections);
         return this;
     }
 
-    /**
-     * Registers the given parameter.
-     */
-    void registerParameter(ParameterExpressionImpl<?> p) {
-        if (_params == null)
-            _params = new OrderedMap/*<ParameterExpression<?>, Class<?>*/();
-        if (!_params.containsKey(p)) {
-            p.setIndex(_params.size());
-            _params.put(p, p.getJavaType());
-        }
-    }
     
-    public Set<ParameterExpression<?>> getParameters() {
-        collectParameters(new CriteriaExpressionVisitor.ParameterVisitor(this));
-        return _params == null ? Collections.EMPTY_SET : _params.keySet();
-    }
 
     /**
      * Return the selection items of the query as a list
      * @return the selection items of the query as a list
      */
+    @Override
     public List<Selection<?>> getSelectionList() {
-        return Expressions.returnCopy(_selections);
+        return super.getSelectionList();
     }
 
+    @Override
     public CriteriaQuery<T> groupBy(Expression<?>... grouping) {
-    	if (grouping == null) {
-    	    _groups = null;
-    	    return this;
-    	}
-        _groups = new ArrayList<Expression<?>>();
-    	for (Expression<?> e : grouping)
-    		_groups.add(e);
+    	super.groupBy(grouping);
         return this;
     }
     
+    @Override
     public CriteriaQuery<T> groupBy(List<Expression<?>> grouping) {
-        if (grouping == null) {
-            _groups = null;
-            return this;
-        }
-        _groups = new ArrayList<Expression<?>>();
-        for (Expression<?> e : grouping)
-            _groups.add(e);
+        super.groupBy(grouping);
         return this;
     }
 
 
+    @Override
     public CriteriaQuery<T> having(Expression<Boolean> restriction) {
-        _having = (PredicateImpl)restriction;
+        super.having(restriction);
         return this;
     }
 
+    @Override
     public CriteriaQuery<T> having(Predicate... restrictions) {
-        if (restrictions == null) {
-            _having = null;
-            return this;
-        }
-        _having = new PredicateImpl.And();
-        for (Predicate p : restrictions)
-        	_having.add(p);
+       super.having(restrictions);
         return this;
     }
 
+    @Override
     public CriteriaQuery<T> orderBy(Order... orders) {
-        if (orders == null) {
-            _orders = null;
-            return this;
-        }
-        _orders = new ArrayList<Order>();
-        for (Order o : orders) {
-            _orders.add(o);
-        }
+        super.orderBy(orders);
         return this;
     }
     
+    @Override
     public CriteriaQuery<T> orderBy(List<Order> orders) {
-        if (orders == null) {
-            _orders = null;
-            return this;
-        }
-        _orders = new ArrayList<Order>();
-        for (Order o : orders) {
-            _orders.add(o);
-        }
+        super.orderBy(orders);
         return this;
     }
     
@@ -308,95 +201,77 @@ class CriteriaQueryImpl<T> implements Op
      *        is to be returned in the query result
      * @return the modified query
      */
+    @Override
     public CriteriaQuery<T> select(Selection<? extends T> selection) {
-        _selection = selection;
-        _selections = new ArrayList<Selection<?>>();
-        _selections.add(selection);
+        super.select(selection);
         return this;
     }
 
+    @Override
     public CriteriaQuery<T> where(Expression<Boolean> restriction) {
-        invalidateCompilation();
-        if (restriction == null) {
-            _where = null;
-            return this;
-        }
-        _where = (PredicateImpl)restriction;
+        super.where(restriction);
         return this;
     }
 
+    @Override
     public CriteriaQuery<T> where(Predicate... restrictions) {
-        invalidateCompilation();
-        if (restrictions == null) {
-            _where = null;
-            return this;
-        }
-        _where = new PredicateImpl.And(restrictions);
+        super.where(restrictions);
         return this;
     }
 
-    public <X> Root<X> from(EntityType<X> entity) {
-        RootImpl<X> root = new RootImpl<X>((Types.Entity<X>)entity);
-        addRoot(root);
-        return root;
+    @Override
+    public <X> RootImpl<X> from(EntityType<X> entity) {
+        return super.from(entity);
     }
 
-    
-    public <X> Root<X> from(Class<X> cls) {
-        EntityType<X> entity = _model.entity(cls);
-        if (entity == null)
-            throw new IllegalArgumentException(_loc.get("root-non-entity", cls).getMessage());
-        return from(entity);
+    @Override
+    public <X> RootImpl<X> from(Class<X> cls) {
+        return super.from(cls);
     }
 
+    @Override
     public List<Expression<?>> getGroupList() {
-        return Expressions.returnCopy(_groups);
+        return super.getGroupList();
     }
 
+    @Override
     public PredicateImpl getGroupRestriction() {
-        return _having;
+        return super.getGroupRestriction();
     }
 
+    @Override
     public PredicateImpl getRestriction() {
-        return _where;
+        return super.getRestriction();
     }
 
+    @Override
     public Set<Root<?>> getRoots() {
-        return Expressions.returnCopy(_roots);
+        return super.getRoots();
     }
 
+    @Override
     public Root<?> getRoot() {
-        assertRoot();
-        return _roots.iterator().next();
+       return super.getRoot();
     }
     
+    @Override
     Root<?> getRoot(boolean mustExist) {
-        if (mustExist) {
-            return getRoot();
-        }
-        return _roots == null || _roots.isEmpty() ? null : _roots.iterator().next();
+        return super.getRoot(mustExist);
     }
     
+    @Override
     void addRoot(RootImpl<?> root) {
-        if (_roots == null) {
-            _roots = new LinkedHashSet<Root<?>>();
-        }
-        _roots.add(root);
+        super.addRoot(root);
     }
     
-    /**
-     * Affirms if selection of this query is distinct.
-     */
+    @Override
     public boolean isDistinct() {
-        return _distinct;
+        return super.isDistinct();
     }
 
+    @Override
     public <U> Subquery<U> subquery(Class<U> type) {
-        if (_subqueries == null)
-            _subqueries = new ArrayList<Subquery<?>>();
-        Subquery<U> subquery = new SubqueryImpl<U>(type, this);
-        _subqueries.add(subquery);
-        return subquery;
+        return super.subquery(type);
     }
     
     /**
@@ -404,327 +279,22 @@ class CriteriaQueryImpl<T> implements Op
      * Empty map if no parameter has been declared. 
      */
     public OrderedMap<Object, Class<?>> getParameterTypes() {
-        collectParameters(new CriteriaExpressionVisitor.ParameterVisitor(this));
-        return _params == null ? StoreQuery.EMPTY_ORDERED_PARAMS : _params;
+        return super.getParameterTypes();
     }
     
-    /**
-     * Populate a kernel expression tree by translating the components of this
-     * receiver with the help of the given {@link ExpressionFactory}.
-     */
-    QueryExpressions getQueryExpressions(ExpressionFactory factory) {
-        _contexts = new Stack<Context>();
-        Context context = new Context(null, null, null);
-        _contexts.push(context);
-        return new CriteriaExpressionBuilder().getQueryExpressions(factory, this);
-    }    
-    
-    public void assertRoot() {
-        if (_roots == null || _roots.isEmpty())
-            throw new IllegalStateException(_loc.get("root-undefined").getMessage());
-    }
     
-    public void assertSelection() {
-        if (_selection == null && !isDefaultProjection())
-            throw new IllegalStateException(_loc.get("select-undefined").getMessage());
-    }
+    
     
     //
     // SubqueryContext
     //
-    void setContexts(Stack<Context> contexts) {
-        _contexts = contexts;
-    }
-    
     /**
      * Gets either this query itself if this is not a captive query for
      * a subquery. Otherwise gets the parent query of the delegating
      * subquery.
      */
     CriteriaQueryImpl<?> getAncestor() {
-        if (_delegator == null)
-            return this;
-        AbstractQuery<?> parent = _delegator.getParent();
-        if (parent instanceof CriteriaQueryImpl) 
-            return (CriteriaQueryImpl<?>)parent;
-        // parent is a SubqueryImpl    
-        return ((SubqueryImpl<?>)parent).getDelegate().getAncestor();
-    }
-    
-    public Map<Selection<?>,String> getAliases() {
-        CriteriaQueryImpl<?> c = getAncestor();
-        if (c._aliases == null)
-            c._aliases = new HashMap<Selection<?>, String>();
-        return c._aliases;
-    }
-    
-    /**
-     * Gets the current context.
-     */
-    Context ctx() {
-        return _contexts == null || _contexts.isEmpty() ? null :  _contexts.peek();
-    }
-    
-    //
-    // AliasContext management
-    //
-    
-    /**
-     * Gets the alias of the given node. Creates an automatic alias, 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);
-        ((SelectionImpl<?>)selection).setAutoAlias(alias);
-        _aliases.put(selection, alias);
-        return _aliases.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 (isRegistered(node)) {
-            return;
-            //throw new RuntimeException(node + " is already bound");
-        }
-        if (!var.isVariable())
-            throw new RuntimeException(var.getClass() + " is not a variable");
-        if (var.getPath() != path)
-            throw new RuntimeException(var + " does not match given " + path + " Variable path is " + var.getPath());
-        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);
-        }
-        _variables.put(node, var);
-        _values.put(node, path);
-        _aliases.put(node, alias);
-        // add to context
-        ctx().addSchema(alias, var.getMetaData());
-        ctx().addVariable(alias, var);
-    }
-    
-    public boolean isRegistered(Selection<?> selection) {
-        if (_variables.containsKey(selection))
-            return true;
-        SubqueryImpl<?> delegator = getDelegator();
-        return (delegator == null) ? false : getDelegatorParent().isRegistered(selection);
-    }
-
-    public Value getRegisteredVariable(Selection<?> selection) {
-        Value var = _variables.get(selection);
-        if (var != null)
-            return var;
-        SubqueryImpl<?> delegator = getDelegator();
-        return (delegator == null) ? null : getDelegatorParent().getRegisteredVariable(selection);
-    }
-
-    public Value getRegisteredValue(Selection<?> selection) {
-        Value val = _values.get(selection);
-        if (val != null)
-            return val;
-        SubqueryImpl<?> delegator = getDelegator();
-        return (delegator == null) ? null : getDelegatorParent().getRegisteredValue(selection);
-    }
-
-    /**
-     * Registers a variable for the given root expression.
-     * A root expression is registered only for cross join.  
-     * @param root
-     * @param var
-     */
-    void registerRoot(Root<?> root, Value var) {
-        if (var == null || !var.isVariable())
-            throw new IllegalArgumentException("Attempt to register non-variable " + var);
-        _rootVariables.put(root, var);
-        String alias = var.getName();
-        ctx().addSchema(alias, var.getMetaData());
-        ctx().addVariable(alias, var);
-    }
-    
-    /**
-     * Gets the registered variable for the given root. 
-     */
-    public Value getRegisteredRootVariable(Root<?> root) {
-        Value var = _rootVariables.get(root);
-        if (var != null)
-            return var;
-        SubqueryImpl<?> delegator = getDelegator();
-        return (delegator == null) ? null : getDelegatorParent().getRegisteredRootVariable(root);
-    }
-    
-    CriteriaQueryImpl<?> getDelegatorParent() {
-        AbstractQuery<?> parent = _delegator.getParent();
-        if (parent instanceof CriteriaQueryImpl) 
-            return ((CriteriaQueryImpl<?>)parent);
-        // parent is a SubqueryImpl    
-        return ((SubqueryImpl<?>)parent).getDelegate();
-    }
-    
-    public Class<T> getResultType() {
-        return _resultClass;
-    }
-
-    public CriteriaQuery<T> multiselect(List<Selection<?>> list) {
-        return multiselect(list.toArray(new Selection<?>[list.size()]));
-    }
-    
-    boolean isMultiselect() {
-        return _selection instanceof CompoundSelections.MultiSelection;
-    }
-    
-    protected boolean isDefaultProjection() {
-        if (_selections == null) {
-            return getRoots().size() == 1 
-               && (getRoot().getModel().getJavaType() == _resultClass ||
-                   _resultClass == Object.class);
-        } 
-        if (_selections.size() != 1) {
-            return false;
-        }
-        Selection<?> sel = _selections.get(0);
-        if (!getRoots().isEmpty() && sel == getRoot()) {
-            return true;
-        }
-        if ((sel instanceof From<?,?>) && ((From<?,?>)sel).isCorrelated()) {
-            return true;
-        }
-        return false;
-    }
-    
-    void invalidateCompilation() {
-        _compiled = false;
-        _params   = null;
-    }
-    
-    /**
-     * Compiles to verify that at least one root is defined, a selection term is present
-     * and, most importantly, collects all the parameters so that they can be bound to
-     * the executable query. 
-     */
-    public OpenJPACriteriaQuery<T> compile() {
-        if (_compiled)
-            return this;
-        assertRoot();
-        assertSelection();
-        collectParameters(new CriteriaExpressionVisitor.ParameterVisitor(this));
-        _compiled = true;
-        return this;
-    }
-    
-    private void collectParameters(CriteriaExpressionVisitor visitor) {
-        if (_compiled)
-            return;
-        if (_where != null) {
-            _where.acceptVisit(visitor);
-        }
-        if (_having != null) {
-            _having.acceptVisit(visitor);
-        }
-        
-        if (_subqueries != null) {
-            for (Subquery<?> subq : _subqueries) {
-                ((SubqueryImpl<?>)subq).getDelegate().collectParameters(visitor);
-            }
-        }
-    }
-    
-    /**
-     * Gets the string representation of the query.
-     */
-    public String toCQL() {
-        StringBuilder buffer = new StringBuilder();
-        render(buffer, _roots, null);
-        return buffer.toString().trim();
-    }
-    
-    void render(StringBuilder buffer, Set<Root<?>> roots, List<Join<?,?>> correlatedJoins) {
-        buffer.append("SELECT ");
-        if (isDistinct()) buffer.append(" DISTINCT ");
-        buffer.append(_selection != null ? ((CriteriaExpression)_selection).asProjection(this) : "*");
-        buffer.append(" FROM ");
-        renderRoots(buffer, roots);
-        renderJoins(buffer, correlatedJoins);
-        if (_where != null) {
-            buffer.append(" WHERE ").append(_where.asValue(this));
-        }
-        renderList(buffer, " ORDER BY ", getOrderList());
-        renderList(buffer, " GROUP BY ", getGroupList());
-        if (_having != null) {
-            buffer.append(" HAVING ");
-            buffer.append(_having.asValue(this));
-        }
-    }
-    
-    private void renderList(StringBuilder buffer, String clause, Collection<?> coll) {
-    	if (coll == null || coll.isEmpty())
-    		return;
-    	
-    	buffer.append(clause);
-    	for (Iterator<?> i = coll.iterator(); i.hasNext(); ) {
-    		buffer.append(((CriteriaExpression)i.next()).asValue(this));
-    		if (i.hasNext()) buffer.append(", ");
-    	}
-    }
-    
-    private void renderJoins(StringBuilder buffer, Collection<Join<?,?>> joins) {
-        if (joins == null) return;
-        for (Join j : joins) {
-            buffer.append(((CriteriaExpression)j).asVariable(this)).append(" ");
-            renderJoins(buffer, j.getJoins());
-            renderFetches(buffer, j.getFetches());
-        }
-    }
-    
-    private void renderRoots(StringBuilder buffer, Collection<Root<?>> roots) {
-        if (roots == null) return;
-        int i = 0;
-        for (Root r : roots) {
-            buffer.append(((ExpressionImpl<?>)r).asVariable(this));
-            if (++i != roots.size()) buffer.append(", ");
-            renderJoins(buffer, r.getJoins());
-            renderFetches(buffer, r.getFetches());
-        }
-    }
-    private void renderFetches(StringBuilder buffer, Set<Fetch> fetches) {
-        if (fetches == null) return;
-        for (Fetch j : fetches) {
-            buffer.append(((ExpressionImpl<?>)j).asValue(this)).append(" ");
-        }
-    }
-    
-    /**
-     * Returns a JPQL-like string, if this receiver is populated. Otherwise 
-     * returns <code>Object.toString()</code>.
-     */
-    public String toString() {
-        try {
-            return toCQL();
-        } catch (Throwable t) {
-            return super.toString();
-        }
+    	return (CriteriaQueryImpl<?>)super.getAncestor();
     }
     
     public boolean equals(Object other) {

Added: openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaUpdateImpl.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaUpdateImpl.java?rev=1466339&view=auto
==============================================================================
--- openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaUpdateImpl.java (added)
+++ openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaUpdateImpl.java Wed Apr 10 06:09:57 2013
@@ -0,0 +1,126 @@
+/*
+ * 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.HashMap;
+import java.util.Map;
+
+import javax.persistence.criteria.CriteriaUpdate;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.ParameterExpression;
+import javax.persistence.criteria.Path;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Subquery;
+import javax.persistence.metamodel.Attribute;
+import javax.persistence.metamodel.EntityType;
+import javax.persistence.metamodel.SingularAttribute;
+
+import org.apache.openjpa.kernel.QueryOperations;
+import org.apache.openjpa.persistence.meta.Members;
+import org.apache.openjpa.persistence.meta.MetamodelImpl;
+import org.apache.openjpa.persistence.meta.Types;
+
+public class CriteriaUpdateImpl<T> extends ExecutableCriteriaImpl<T> implements CriteriaUpdate<T> {
+	private Map<PathImpl<?,?>, ExpressionImpl<?>> _values = new HashMap<PathImpl<?,?>, ExpressionImpl<?>>();
+	public CriteriaUpdateImpl(MetamodelImpl model, Class<T> target) {
+		super(model, target, QueryOperations.OP_UPDATE);
+		delegate.setOwner(this);
+	}
+
+
+	@Override
+	public CriteriaUpdateImpl<T> where(Expression<Boolean> restriction) {
+		// TODO JPA 2.1 Method
+		super.where(restriction);
+        return this;
+	}
+
+	@Override
+	public CriteriaUpdateImpl<T> where(Predicate... restrictions) {
+		// TODO JPA 2.1 Method
+		super.where(restrictions);
+        return this;
+	}
+
+	/**
+	 * Gets the values to be updated as expression indexed by the corresponding path variable.
+	 * The kernel query execution requires a non-empty map of updated values to distinguish 
+	 * the query from a delete operation.
+	 * @see CriteriaExpressionBuilder#getQueryExpressions(org.apache.openjpa.kernel.exps.ExpressionFactory, 
+	 * GenericCriteriaImpl)
+	 */
+	public Map<PathImpl<?,?>,ExpressionImpl<?>> getUpdates() {
+		return _values;
+	}
+	// --------------------------------------------------------------------------
+	// Sets parameter values
+	// --------------------------------------------------------------------------
+	@Override
+	public <Y, X extends Y> CriteriaUpdate<T> set(SingularAttribute<? super T, Y> attribute, X value) {
+		// TODO JPA 2.1 Method
+		PathImpl<T, X> path = new PathImpl<T, X>((RootImpl<T>)getRoot(), 
+				(Members.SingularAttributeImpl<? super T,Y>)attribute, 
+				(Class<X>)value.getClass());
+		 putValue(path, value);
+		 return this;
+	}
+
+	@Override
+	public <Y> CriteriaUpdate<T> set(SingularAttribute<? super T, Y> attribute, Expression<? extends Y> value) {
+		// TODO JPA 2.1 Method
+		PathImpl<T, Y> path = new PathImpl<T, Y>((RootImpl<T>)getRoot(), 
+				(Members.SingularAttributeImpl<? super T,Y>)attribute, 
+				(Class<Y>)value.getJavaType());
+		 putValue(path, value);
+		 return this;
+	}
+
+	@Override
+	public <Y, X extends Y> CriteriaUpdate<T> set(Path<Y> attribute, X value) {
+		// TODO JPA 2.1 Method
+		 putValue((PathImpl<?,?>)attribute, value);
+		 return this;
+	}
+
+	@Override
+	public <Y> CriteriaUpdate<T> set(Path<Y> attribute, Expression<? extends Y> value) {
+		// TODO JPA 2.1 Method
+		 putValue((PathImpl<?,?>)attribute, value);
+		 return this;
+	}
+
+	@Override
+	public CriteriaUpdate<T> set(String attributeName, Object value) {
+		// TODO JPA 2.1 Method
+		 putValue((PathImpl<?,?>)getRoot().get(attributeName), value);
+		 return this;
+	}
+	
+	private void putValue(PathImpl<?,?> path, Object value) {
+		if (value instanceof ExpressionImpl) {
+			_values.put(path, (ExpressionImpl<?>)value);
+			if (value instanceof ParameterExpressionImpl) {
+				getDelegate().registerParameter((ParameterExpressionImpl<?>)value);
+			}
+		 } else {
+			 _values.put(path, new Expressions.Constant(value));
+		 }
+	}
+}

Propchange: openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaUpdateImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExecutableCriteriaImpl.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExecutableCriteriaImpl.java?rev=1466339&view=auto
==============================================================================
--- openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExecutableCriteriaImpl.java (added)
+++ openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExecutableCriteriaImpl.java Wed Apr 10 06:09:57 2013
@@ -0,0 +1,115 @@
+/*
+ * 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.io.Serializable;
+import java.util.Set;
+
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.ParameterExpression;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Subquery;
+import javax.persistence.metamodel.EntityType;
+
+import org.apache.openjpa.persistence.meta.MetamodelImpl;
+
+/**
+ * Base class for Update and Delete criteria.
+ * <br>
+ * This class delegates to a {@linkplain CriteriaQueryImpl generic query} 
+ * (instead of inheriting from it). This is done to avoid some tricky
+ * method signature issues with type erasure dictated by the JPA specification 
+ * interfaces.
+ * 
+ * @author Pinaki Poddar
+ *
+ * @param <T> the type of object to be updated or deleted
+ * 
+ * @since 3.0
+ */
+public class ExecutableCriteriaImpl<T> implements Serializable {
+	protected final GenericCriteriaImpl<T> delegate;
+
+	public ExecutableCriteriaImpl(MetamodelImpl model, Class<T> target, int op) {
+		delegate = new GenericCriteriaImpl<T>(model, target, op);
+		delegate.from(target);
+	}
+	
+	/**
+	 * Gets the query implementation that this receiver delegates to. 
+	 */
+	public GenericCriteriaImpl<T> getDelegate() {
+		return delegate;
+	}
+	
+	public <U> Subquery<U> subquery(Class<U> type) {
+		// TODO JPA 2.1 Method
+		return delegate.subquery(type);
+	}
+	
+	public PredicateImpl getRestriction() {
+		// TODO JPA 2.1 Method
+		return delegate.getRestriction();
+	}
+	
+	
+	public RootImpl<T> from(Class<T> entityClass) {
+		// TODO JPA 2.1 Method
+		return delegate.from(entityClass);
+	}
+
+	
+	public Root<T> from(EntityType<T> entity) {
+		// TODO JPA 2.1 Method
+		return delegate.from(entity);
+	}
+
+	
+	public final Root<T> getRoot() {
+		// TODO JPA 2.1 Method
+		return (Root<T>)delegate.getRoot();
+	}
+
+	
+	public ExecutableCriteriaImpl<T> where(Expression<Boolean> restriction) {
+		// TODO JPA 2.1 Method
+		delegate.where(restriction);
+		return this;
+	}
+
+	
+	public ExecutableCriteriaImpl<T> where(Predicate... restrictions) {
+		// TODO JPA 2.1 Method
+		delegate.where(restrictions);
+		return this;
+	}
+	
+	public final Set<ParameterExpression<?>> getParameters() {
+		return delegate.getParameters();
+	}
+	
+	public final OpenJPACriteriaQuery<T> compile() {
+		return delegate.compile();
+	}
+	
+	public final String toString() {
+		return delegate.toCQL();
+	}
+}

Propchange: openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExecutableCriteriaImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java?rev=1466339&r1=1466338&r2=1466339&view=diff
==============================================================================
--- openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java (original)
+++ openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java Wed Apr 10 06:09:57 2013
@@ -115,7 +115,7 @@ abstract class ExpressionImpl<X> extends
      * @param q the query definition context of this expression
      * @return an equivalent kernel value
      */
-    abstract org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q);
+    abstract org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q);
     
     /**
      * Bridge contract to convert this facade expression to a kernel expression.
@@ -123,7 +123,8 @@ abstract class ExpressionImpl<X> extends
      * @param q the query definition context of this expression
      * @return an equivalent kernel expression
      */
-    org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+    org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, 
+    		GenericCriteriaImpl<?> q) {
         return factory.asExpression(toValue(factory, q));
     }
 }

Modified: openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=1466339&r1=1466338&r2=1466339&view=diff
==============================================================================
--- openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java (original)
+++ openjpa/sandboxes/21/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java Wed Apr 10 06:09:57 2013
@@ -62,11 +62,11 @@ class Expressions {
      * using the given ExpressionFactory.
      * Handles null expression.
      */
-     static Value toValue(ExpressionImpl<?> e, ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+     static Value toValue(ExpressionImpl<?> e, ExpressionFactory factory, GenericCriteriaImpl<?> q) {
         return (e == null) ? factory.getNull() : e.toValue(factory, q);
     }
      
-     static void setImplicitTypes(Value v1, Value v2, Class<?> expected, CriteriaQueryImpl<?> q) {
+     static void setImplicitTypes(Value v1, Value v2, Class<?> expected, GenericCriteriaImpl<?> q) {
          JPQLExpressionBuilder.setImplicitTypes(v1, v2, expected, q.getMetamodel(), 
              q.getParameterTypes(), q.toString());
      }
@@ -280,7 +280,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value = factory.abs(Expressions.toValue(e, factory, q));
             value.setImplicitType(getJavaType());
             return value;
@@ -304,7 +304,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value v = Expressions.toValue(e, factory, q);
             return _distinct ? factory.count(factory.distinct(v)) : factory.count(v);
         }
@@ -322,7 +322,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value = factory.avg(Expressions.toValue(e, factory, q));
             value.setImplicitType(getJavaType());
             return value;
@@ -340,7 +340,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value = factory.sqrt(Expressions.toValue(e, factory, q));
             value.setImplicitType(getJavaType());
             return value;
@@ -357,7 +357,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value = factory.max(Expressions.toValue(e, factory, q));
             value.setImplicitType(getJavaType());
             return value;
@@ -374,7 +374,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value = factory.min(Expressions.toValue(e, factory, q));
             value.setImplicitType(getJavaType());
             return value;
@@ -395,7 +395,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value val = Expressions.toValue(e, factory, q);
             Value result;
             if (val instanceof Literal && ((Literal)val).getParseType() == Literal.TYPE_COLLECTION)
@@ -423,7 +423,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.newFunction(functionName, getJavaType(), 
                 new Expressions.ListArgument(resultType, args).toValue(factory, q));
         }
@@ -440,7 +440,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.type(Expressions.toValue(e, factory, q));
         }
         
@@ -456,7 +456,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.cast(Expressions.toValue(e, factory, q), getJavaType());
         }
         
@@ -480,7 +480,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.concat(
                 Expressions.toValue(e1, factory, q), 
                 Expressions.toValue(e2, factory, q));
@@ -519,7 +519,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return JPQLExpressionBuilder.convertSubstringArguments(factory, 
                 Expressions.toValue(e, factory, q), 
                 from == null ? null : from.toValue(factory, q), 
@@ -566,7 +566,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value locateSearch = path.toValue(factory, q);
             Value locateFromIndex = (from == null ? null : Expressions.toValue(from, factory, q));
             Value locatePath = Expressions.toValue(pattern, factory, q);
@@ -617,7 +617,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Boolean spec = null;
             if (ts != null) {
                 switch (ts) {
@@ -657,7 +657,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value= (e2 == null) 
             ?   factory.sum(Expressions.toValue(e1, factory, q))
             :   factory.add(
@@ -689,7 +689,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.multiply(
                 Expressions.toValue(e1, factory, q), 
                 Expressions.toValue(e2, factory, q));
@@ -715,7 +715,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value = factory.subtract(
                 Expressions.toValue(e1, factory, q), 
                 Expressions.toValue(e2, factory, q));
@@ -744,7 +744,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value = factory.divide(
                 Expressions.toValue(e1, factory, q), 
                 Expressions.toValue(e2, factory, q));
@@ -770,7 +770,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value = factory.mod(
                 Expressions.toValue(e1, factory, q), 
                 Expressions.toValue(e2, factory, q));
@@ -790,7 +790,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.getCurrentDate(getJavaType());
         }
         
@@ -806,7 +806,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.getCurrentTime(getJavaType());
         }
         
@@ -822,7 +822,7 @@ class Expressions {
         }
 
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.getCurrentTimestamp(getJavaType());
         }
         
@@ -847,7 +847,8 @@ class Expressions {
         }
         
         @Override
-        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
+        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, 
+        		GenericCriteriaImpl<?> q){
             Value val1 = Expressions.toValue(e1, factory, q);
             Value val2 = Expressions.toValue(e2, factory, q);
             Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q);
@@ -875,7 +876,7 @@ class Expressions {
         }
         
         @Override
-        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
+        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, GenericCriteriaImpl<?> q){
             Value val1 = Expressions.toValue(e1, factory, q);
             Value val2 = Expressions.toValue(e2, factory, q);
             Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q);
@@ -903,7 +904,7 @@ class Expressions {
         }
         
         @Override
-        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
+        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, GenericCriteriaImpl<?> q){
             Value val1 = Expressions.toValue(e1, factory, q);
             Value val2 = Expressions.toValue(e2, factory, q); 
             Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q); 
@@ -931,7 +932,7 @@ class Expressions {
         }
         
         @Override
-        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
+        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, GenericCriteriaImpl<?> q){
             Value val1 = Expressions.toValue(e1, factory, q);
             Value val2 = Expressions.toValue(e2, factory, q); 
             Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q); 
@@ -959,7 +960,7 @@ class Expressions {
         }
         
         @Override
-        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
+        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, GenericCriteriaImpl<?> q){
             Value val1 = Expressions.toValue(e1, factory, q);
             Value val2 = Expressions.toValue(e2, factory, q); 
             Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q); 
@@ -987,7 +988,7 @@ class Expressions {
         }
         
         @Override
-        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
+        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, GenericCriteriaImpl<?> q){
             Value val1 = Expressions.toValue(e1, factory, q);
             Value val2 = Expressions.toValue(e2, factory, q); 
             Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q); 
@@ -1035,7 +1036,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Object value = arg;
             Class<?> literalClass = getJavaType();
             if (arg instanceof ParameterExpressionImpl) {
@@ -1107,12 +1108,12 @@ class Expressions {
         }
         
         @Override
-        Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return Expressions.toValue(collection, factory, q);
         }
         
         @Override
-        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
+        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, GenericCriteriaImpl<?> q){
             Value val = Expressions.toValue(collection, factory, q);
             return factory.isEmpty(val);
         }
@@ -1141,12 +1142,12 @@ class Expressions {
         }
         
         @Override
-        Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return Expressions.toValue(collection, factory, q);
         }
         
         @Override
-        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
+        org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, GenericCriteriaImpl<?> q){
             Value val = Expressions.toValue(collection, factory, q);
             // factory.isNotEmpty() not used to match JPQL
             return factory.not(factory.isEmpty(val));
@@ -1170,7 +1171,7 @@ class Expressions {
         }
         
         @Override
-        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value v = Expressions.toValue(e, factory, q);
             ClassMetaData meta = ((PathImpl<?,?>)e)._member.fmd.getElement().getTypeMetaData();
             v.setMetaData(meta);
@@ -1199,7 +1200,7 @@ class Expressions {
         
         @Override
         public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-            ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+            ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             org.apache.openjpa.kernel.exps.Expression contains = factory.contains(
                 Expressions.toValue(collection, factory, q), 
                 Expressions.toValue(element, factory, q));
@@ -1255,7 +1256,7 @@ class Expressions {
 
         @Override
         public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-            ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+            ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             String escapeStr = escapeChar == null ? null :
                 ((Character)((Literal)Expressions.toValue(
                     escapeChar, factory, q)).getValue()).toString();
@@ -1294,7 +1295,7 @@ class Expressions {
         }
         
         @Override
-        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value[] vs = new Value[values.size()];
             int i = 0;
             for (Expression<?> e : values)
@@ -1328,7 +1329,7 @@ class Expressions {
         }
 
         @Override
-        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value value1 = Expressions.toValue((ExpressionImpl<?>)val1, factory, q); 
             Value value2 = Expressions.toValue((ExpressionImpl<?>)val2, factory, q); 
             return factory.nullIfExpression(value1, value2);
@@ -1358,7 +1359,7 @@ class Expressions {
         
         @Override
         org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-            ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+            ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.equal(
                 Expressions.toValue(e, factory, q), 
                 factory.getNull());
@@ -1389,7 +1390,7 @@ class Expressions {
         
         @Override
         org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-            ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+            ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.notEqual(
                 Expressions.toValue(e, factory, q), 
                 factory.getNull());
@@ -1440,7 +1441,7 @@ class Expressions {
         
         @Override
         org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-            ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+            ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             org.apache.openjpa.kernel.exps.Expression inExpr = null;
             if (_exps.size() == 1) {
                 Expressions.Equal e = (Expressions.Equal)_exps.get(0);
@@ -1510,7 +1511,7 @@ class Expressions {
         }
 
         @Override
-        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             int size = whens.size();
             org.apache.openjpa.kernel.exps.Expression[] exps = new org.apache.openjpa.kernel.exps.Expression[size];
             for (int i = 0; i < size; i++) {
@@ -1589,7 +1590,7 @@ class Expressions {
         }
 
         @Override
-        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             Value caseOperandExpr = Expressions.toValue((ExpressionImpl<?>)caseOperand, factory, q);
             int size = whens.size();
             org.apache.openjpa.kernel.exps.Expression[] exps = new org.apache.openjpa.kernel.exps.Expression[size];
@@ -1632,7 +1633,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.toLowerCase(Expressions.toValue(e, factory, q));
         }
         
@@ -1648,7 +1649,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.toUpperCase(Expressions.toValue(e, factory, q));
         }
         
@@ -1664,7 +1665,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.stringLength(Expressions.toValue(e, factory, q));
         }
         
@@ -1707,7 +1708,7 @@ class Expressions {
 
         @Override
         org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-            ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+            ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             org.apache.openjpa.kernel.exps.Expression exists = 
                 factory.isNotEmpty(Expressions.toValue(e, factory, q));
             return exists;
@@ -1725,7 +1726,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.all(Expressions.toValue(e, factory, q));
         }
         
@@ -1741,7 +1742,7 @@ class Expressions {
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.any(Expressions.toValue(e, factory, q));
         }
         
@@ -1760,7 +1761,7 @@ class Expressions {
         
         @Override
         public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-          ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+          ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             return factory.not(e.toKernelExpression(factory, q));
         }        
         
@@ -1782,7 +1783,7 @@ class Expressions {
         }
         
         @Override
-        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             org.apache.openjpa.kernel.exps.Value e = actual.toValue(factory, q);
             e.setImplicitType(getJavaType());
             return e;
@@ -1811,7 +1812,7 @@ class Expressions {
         }
         
         @Override
-        public org.apache.openjpa.kernel.exps.Arguments toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
+        public org.apache.openjpa.kernel.exps.Arguments toValue(ExpressionFactory factory, GenericCriteriaImpl<?> q) {
             org.apache.openjpa.kernel.exps.Value[] kvs = new org.apache.openjpa.kernel.exps.Value[_args.length];
             int i = 0;
             for (ExpressionImpl<?> arg : _args) {