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/07/24 01:01:55 UTC

svn commit: r797257 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/ openjp...

Author: ppoddar
Date: Thu Jul 23 23:01:55 2009
New Revision: 797257

URL: http://svn.apache.org/viewvc?rev=797257&view=rev
Log:
OPENJPA-1195: Datastore function for in general usage as well as JPA 2.0. CriteriaQuery Parameter indexing during registration.

Added:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java   (with props)
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Args.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Args.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ExpressionFactory.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterExpressionImpl.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Args.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Args.java?rev=797257&r1=797256&r2=797257&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Args.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Args.java Thu Jul 23 23:01:55 2009
@@ -18,6 +18,10 @@
  */
 package org.apache.openjpa.jdbc.kernel.exps;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.openjpa.jdbc.sql.Joins;
 import org.apache.openjpa.jdbc.sql.Result;
 import org.apache.openjpa.jdbc.sql.SQLBuffer;
@@ -43,18 +47,21 @@
      * Constructor. Supply values being combined.
      */
     public Args(Val val1, Val val2) {
-        int len1 = (val1 instanceof Args) ? ((Args) val1)._args.length : 1;
-        int len2 = (val2 instanceof Args) ? ((Args) val2)._args.length : 1;
-
-        _args = new Val[len1 + len2];
-        if (val1 instanceof Args)
-            System.arraycopy(((Args) val1)._args, 0, _args, 0, len1);
-        else
-            _args[0] = val1;
-        if (val2 instanceof Args)
-            System.arraycopy(((Args) val2)._args, 0, _args, len1, len2);
-        else
-            _args[len1] = val2;
+        this(new Val[]{val1, val2});
+    }
+    
+    public Args (Val... values) {
+        List<Val> list = new ArrayList<Val>();
+        if (values != null) {
+            for (Val v : values) {
+                if (v instanceof Args) {
+                    list.addAll(Arrays.asList(((Args)v)._args));
+                } else {
+                    list.add(v);
+                }
+            }
+        }
+        _args = list.toArray(new Val[list.size()]);
     }
 
     /**
@@ -166,6 +173,12 @@
 
     public void appendTo(Select sel, ExpContext ctx, ExpState state, 
         SQLBuffer sql, int index) {
+        ArgsExpState astate = (ArgsExpState) state;
+        for (int i = 0; i < _args.length; i++) {
+            _args[i].appendTo(sel, ctx, astate.states[i], sql, index);
+            if (i < _args.length-1)
+                sql.append(", ");
+        }
     }
 
     public void appendIsEmpty(Select sel, ExpContext ctx, ExpState state, 

Added: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java?rev=797257&view=auto
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java (added)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java Thu Jul 23 23:01:55 2009
@@ -0,0 +1,44 @@
+/*
+ * 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.jdbc.kernel.exps;
+
+import org.apache.openjpa.kernel.exps.Arguments;
+
+/**
+ * A unary operator that executes a datastore specific function with zero or more arguments.
+ * 
+ * @author Pinaki Poddar
+ *
+ */
+@SuppressWarnings("serial")
+public class DatastoreFunction extends UnaryOp {
+    private final String _functionName;
+    
+    public DatastoreFunction(String name, Class<?> resultType, Arguments args) {
+        super((Val)args);
+        _functionName = name;
+        setImplicitType(resultType);
+    }
+
+    @Override
+    protected String getOperator() {
+        return _functionName;
+    }
+
+}

Propchange: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java?rev=797257&r1=797256&r2=797257&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java Thu Jul 23 23:01:55 2009
@@ -297,6 +297,17 @@
     public Arguments newArgumentList(Value v1, Value v2) {
         return new Args((Val) v1, (Val) v2);
     }
+    
+    public Arguments newArgumentList(Value... vs) {
+        if (vs == null)
+           return new Args(null);
+        Val[] vals = new Val[vs.length];
+        int i = 0;
+        for (Value v : vs) {
+            vals[i++] = (Val)v;
+        }
+        return new Args(vals);
+    }
 
     public Value newUnboundVariable(String name, Class type) {
         return new Variable(name, type);
@@ -503,4 +514,8 @@
         val2 = getLiteralRawString(val2);
         return new NullIfExpression((Val) val1, (Val) val2);
     }
+    
+    public Value newFunction(String functionName, Class<?> resultType, Value... args) {
+        return new DatastoreFunction(functionName, resultType, newArgumentList(args));
+    }
 }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Args.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Args.java?rev=797257&r1=797256&r2=797257&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Args.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Args.java Thu Jul 23 23:01:55 2009
@@ -32,24 +32,30 @@
     extends Val
     implements Arguments {
 
-    private final List _args = new ArrayList(3);
+    private final List<Value> _args = new ArrayList<Value>(3);
 
     /**
      * Constructor. Supply values being combined.
      */
     public Args(Value val1, Value val2) {
-        if (val1 instanceof Args)
-            _args.addAll(((Args) val1)._args);
-        else
-            _args.add(val1);
-        if (val2 instanceof Args)
-            _args.addAll(((Args) val2)._args);
-        else
-            _args.add(val2);
+        this(new Value[]{val1, val2});
+    }
+    
+    public Args(Value...values) {
+        if (values == null) {
+           return;
+        }
+        for (Value v : values) {
+            if (v instanceof Args) {
+                _args.addAll(((Args)v)._args);
+            } else {
+                _args.add(v);
+            }
+        }
     }
 
     public Value[] getValues() {
-        return (Value[]) _args.toArray(new Value[_args.size()]);
+        return _args.toArray(new Value[_args.size()]);
     }
 
     public Class getType() {

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ExpressionFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ExpressionFactory.java?rev=797257&r1=797256&r2=797257&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ExpressionFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ExpressionFactory.java Thu Jul 23 23:01:55 2009
@@ -269,6 +269,12 @@
      * of which may itself be an argument list.
      */
     public Arguments newArgumentList(Value arg1, Value arg2);
+    
+    /**
+     * Return a function argument list consisting of the given values, any
+     * of which may itself be an argument list.
+     */
+    public Arguments newArgumentList(Value... values);
 
     /**
      * Return an unbound variable. This method will only be called once for
@@ -481,4 +487,9 @@
      * a {@link Number}, {@link String}, or {@link Boolean} instance.
      */
     public Literal newTypeLiteral(Object val, int parseType);
+    
+    /**
+     * Return a value representing the given datastore function with the given arguments.
+     */
+    public Value newFunction(String functionName, Class<?> resultType, Value... args);
 }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java?rev=797257&r1=797256&r2=797257&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java Thu Jul 23 23:01:55 2009
@@ -525,6 +525,10 @@
     public Arguments newArgumentList(Value val1, Value val2) {
         return new Args(val1, val2);
     }
+    
+    public Arguments newArgumentList(Value... values) {
+        return new Args(values);
+    }
 
     public Value newUnboundVariable(String name, Class type) {
         UnboundVariable var = new UnboundVariable(type);
@@ -788,4 +792,8 @@
     public Value nullIfExpression(Value val1, Value val2) {
         return new NullIf((Val) val1, (Val) val2);
     }
+
+    public Value newFunction(String functionName, Class<?> resultType, Value... args) {
+        throw new AbstractMethodError();
+    }
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java?rev=797257&r1=797256&r2=797257&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java Thu Jul 23 23:01:55 2009
@@ -328,6 +328,10 @@
         assertFalse(auditor.getSQLs().isEmpty());
         return auditor.getSQLs();
     }
+    
+    void executeAndCompareSQL(CriteriaQuery<?> q, String expectedSQL) {
+        executeAndCompareSQL(em.createQuery(q), expectedSQL);
+    }
 
     String extractSQL(Exception e) {
         Throwable t = e.getCause();

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java?rev=797257&r1=797256&r2=797257&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java Thu Jul 23 23:01:55 2009
@@ -802,4 +802,58 @@
 
         assertEquivalence(q, jpql);
     }
+    
+    /**
+     * 0-arg function works only if there is a other projection items to determine the table to select from. 
+     */
+    public void testFunctionWithNoArgument() {
+        String jpql = "SELECT c.balanceOwed FROM Customer c";
+        String sql = "SELECT CURRENT_USER(), t0.balanceOwed FROM CR_CUST t0";
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
+        Root<Customer> c = q.from(Customer.class);
+        q.multiselect(cb.function("CURRENT_USER", String.class, (Expression<?>[])null), c.get(Customer_.balanceOwed));
+        
+        executeAndCompareSQL(q, sql);
+//        assertEquivalence(q, jpql);
+    }
+
+    public void testFunctionWithOneArgument() {
+        String jpql = "SELECT MAX(c.balanceOwed) FROM Customer c";
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
+        Root<Customer> c = q.from(Customer.class);
+        q.multiselect(cb.function("MAX", Integer.class, c.get(Customer_.balanceOwed)));
+        
+        assertEquivalence(q, jpql);
+
+    }
+    
+    public void testFunctionWithTwoArgument() {
+        String jpql = "SELECT MOD(c.balanceOwed,10) FROM Customer c";
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
+        Root<Customer> c = q.from(Customer.class);
+        q.multiselect(cb.function("MOD", Integer.class, c.get(Customer_.balanceOwed), cb.literal(10)));
+        
+        assertEquivalence(q, jpql);
+
+    }
+    
+    public void testFunctionWithFunctionArgumentInOrderBy() {
+        String jpql = "SELECT MOD(c.balanceOwed,10) FROM Customer c WHERE LENGTH(c.name)>3 ORDER BY LENGTH(c.name)";
+        String sql = "SELECT MOD(t0.balanceOwed, ?), LENGTH(t0.name) FROM CR_CUST t0 WHERE (LENGTH(t0.name) > ?) " +
+                     "ORDER BY LENGTH(t0.name) ASC";
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
+        Root<Customer> c = q.from(Customer.class);
+        Expression<Integer> nameLength = cb.function("LENGTH", Integer.class, c.get(Customer_.name));
+        q.multiselect(cb.function("MOD", Integer.class, c.get(Customer_.balanceOwed), cb.literal(10)));
+        q.where(cb.greaterThan(nameLength, 3));
+        q.orderBy(cb.asc(nameLength));
+        
+        executeAndCompareSQL(q, sql);
+
+    }
+
 }

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=797257&r1=797256&r2=797257&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 Thu Jul 23 23:01:55 2009
@@ -246,7 +246,7 @@
 
     public <T> Expression<T> function(String name, Class<T> type,
         Expression<?>... args) {
-        throw new AbstractMethodError();
+        return new Expressions.DatabaseFunction(name, type, args);
     }
 
     public Predicate ge(Expression<? extends Number> x,

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=797257&r1=797256&r2=797257&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 Thu Jul 23 23:01:55 2009
@@ -81,8 +81,7 @@
     private static String ALIAS_BASE = "autoAlias";
     
     // Auto-generated Parameter name 
-    private int autoParameterCount = 0;
-    private static String PARAM_BASE = "autoParam";
+    private static String PARAM_BASE = "*autoParam";
     
     private Map<Selection<?>,Value> _variables = new HashMap<Selection<?>, Value>();
     private Map<Selection<?>,Value> _values    = new HashMap<Selection<?>, Value>();
@@ -194,9 +193,13 @@
         if (_paramTypes == null) {
             _paramTypes = new LinkedHashMap<ParameterExpression<?>, Class<?>>();
         }
+        if (_paramTypes.containsKey(p)) {
+            return;
+        }
+        p.setIndex(_paramTypes.size());
         _paramTypes.put(p, p.getJavaType());
         if (p.getName() == null)
-            p.assignAutoName(PARAM_BASE + (++autoParameterCount));
+            p.assignAutoName(PARAM_BASE + p.getIndex());
     }
     
     public Set<ParameterExpression<?>> getParameters() {

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=797257&r1=797256&r2=797257&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 Thu Jul 23 23:01:55 2009
@@ -47,12 +47,12 @@
      * Handles null expression.
      */
      static Value toValue(ExpressionImpl<?> e, ExpressionFactory factory, 
-        MetamodelImpl model, CriteriaQueryImpl q) {
+        MetamodelImpl model, CriteriaQueryImpl<?> q) {
         return (e == null) ? factory.getNull() : e.toValue(factory, model, q);
     }
      
      static void setImplicitTypes(Value v1, Value v2, Class<?> expected, 
-             CriteriaQueryImpl q) {
+             CriteriaQueryImpl<?> q) {
          JPQLExpressionBuilder.setImplicitTypes(v1, v2, expected, 
              q.getMetamodel(), q.getParameterTypes(), q.toString());
      }
@@ -96,9 +96,27 @@
             e2 = (ExpressionImpl<?>)y;
         }
     }
-
     
     /**
+     * Functional Expression applies a function on a list of input Expressions.
+     * 
+     *
+     * @param <X> the type of the resultant expression
+     */
+    public abstract static class FunctionalExpression<X> extends ExpressionImpl<X>{
+        protected final ExpressionImpl<?>[] args;
+        
+        public FunctionalExpression(Class<X> t, Expression<?>... args) {
+            super(t);
+            int len = args == null ? 0 : args.length;
+            this.args = new ExpressionImpl<?>[len];
+            for (int i = 0; args != null && i < args.length; i++) {
+                this.args[i] = (ExpressionImpl<?>)args[i];
+            }
+        }
+    }
+   
+    /**
      * Binary Logical Expression applies a binary function on a pair of
      * input Expression to generate a Predicate.
      *
@@ -216,6 +234,24 @@
         }
     }
     
+    public static class DatabaseFunction<T> extends FunctionalExpression<T> {
+        private final String functionName;
+        private final Class<T> resultType;
+        public  DatabaseFunction(String name, Class<T> resultType, Expression<?>... exps) {
+            super(resultType, exps);
+            functionName = name;
+            this.resultType = resultType;
+        }
+        
+        @Override
+        public Value toValue(ExpressionFactory factory, MetamodelImpl model,
+            CriteriaQueryImpl<?> q) {
+            return factory.newFunction(functionName, getJavaType(), 
+                new Expressions.ListArgument(resultType, args).toValue(factory, model, q));
+        }
+    }
+
+    
     public static class Type<X> 
         extends UnaryFunctionalExpression<Class<? extends X>> {
         public Type(PathImpl<?, X> path) {
@@ -1345,5 +1381,31 @@
             return e;
         }
     }
+    
+    /**
+     * An expression that is composed of one or more expressions.
+     *
+     * @param <T>
+     */
+    public static class ListArgument<T> extends ExpressionImpl<T> {
+        private final ExpressionImpl<?>[] _args;
+        public ListArgument(Class<T> cls, ExpressionImpl<?>... args) {
+            super(cls);
+            _args = args;
+        }
+        
+        @Override
+        public org.apache.openjpa.kernel.exps.Arguments toValue(
+          ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl<?> q) {
+            org.apache.openjpa.kernel.exps.Value[] kvs = new org.apache.openjpa.kernel.exps.Value[_args.length];
+            int i = 0;
+            for (ExpressionImpl<?> arg : _args) {
+                kvs[i++] = arg.toValue(factory, model, q);
+            }
+            org.apache.openjpa.kernel.exps.Arguments e = factory.newArgumentList(kvs);
+            e.setImplicitType(getJavaType());
+            return e;
+        }
+    }
 
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterExpressionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterExpressionImpl.java?rev=797257&r1=797256&r2=797257&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterExpressionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterExpressionImpl.java Thu Jul 23 23:01:55 2009
@@ -51,6 +51,7 @@
     implements ParameterExpression<T>, QueryParameter<T> {
     
     private String _autoName = null;
+    private int _index = 0; // index of the parameter as seen by the kernel
 	private final ParameterImpl<T> _delegate;
 	
 	/**
@@ -127,6 +128,14 @@
     public final boolean isPositional() {
         return false;
     }
+    
+    void setIndex(int index) {
+        _index = index;
+    }
+    
+    public int getIndex() {
+        return _index;
+    }
 
     public final boolean isValueAssignable(Object v) {
         return _delegate.isValueAssignable(v);
@@ -155,6 +164,7 @@
             ? factory.newCollectionValuedParameter(paramKey, clzz) 
             : factory.newParameter(paramKey, clzz);
         param.setMetaData(meta);
+        param.setIndex(_index);
         
         return param;
     }