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/14 23:11:38 UTC

svn commit: r794066 - in /openjpa/branches/1.3.x: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestQueryParameterBinding.java

Author: ppoddar
Date: Tue Jul 14 21:11:37 2009
New Revision: 794066

URL: http://svn.apache.org/viewvc?rev=794066&view=rev
Log:
OPENJPA-1169: Allow non-contiguous positional query parameters.

Modified:
    openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestQueryParameterBinding.java

Modified: openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java?rev=794066&r1=794065&r2=794066&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java (original)
+++ openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java Tue Jul 14 21:11:37 2009
@@ -56,6 +56,7 @@
 import org.apache.openjpa.meta.JavaTypes;
 import org.apache.openjpa.meta.MetaDataRepository;
 import org.apache.openjpa.util.GeneralException;
+import org.apache.openjpa.util.InternalException;
 import org.apache.openjpa.util.InvalidStateException;
 import org.apache.openjpa.util.NonUniqueResultException;
 import org.apache.openjpa.util.NoResultException;
@@ -892,7 +893,10 @@
     private Object[] toParameterArray(LinkedMap paramTypes, Map params) {
         if (params == null || params.isEmpty())
             return StoreQuery.EMPTY_OBJECTS;
-
+        if ((paramTypes == null || paramTypes == StoreQuery.EMPTY_PARAMS) 
+           && isNumericKey(params))
+            return toParameterArray(params);
+        
         Object[] arr = new Object[params.size()];
         Map.Entry entry;
         Object key;
@@ -940,6 +944,51 @@
         }
         return low;
     }
+    
+    /**
+     * Special case of parameter handling for unparsed queries without any information
+     * on parameter types and all integer parameter keys. 
+     */
+    private Object[] toParameterArray(Map params) {
+        Object[] arr = new Object[calculateParameterSize(params)];
+        int base = 1;
+        for (Object key : params.keySet()) {
+            int idx = ((Number)key).intValue();
+            arr[idx - base] = params.get(key);
+        }
+        return arr;
+    }
+    
+    /**
+     * Affirms if all the keys in the given map is number.
+     */
+    private boolean isNumericKey(Map params) {
+        if (params == null)
+            return false;
+        for (Object key : params.keySet())
+            if (!(key instanceof Number))
+                return false;
+        return true;
+    }
+    
+    /**
+     * Calculate the maximum value of the keys in the given map.
+     *  
+     * @param all keys are assumed to be numeric.
+     */
+    private int calculateParameterSize(Map params) {
+        int max = 0;
+        if (params == null)
+            return 0;
+        for (Object key : params.keySet()) {
+            if (!(key instanceof Number))
+                throw new InternalException();
+            else {
+                max = Math.max(max, ((Number)key).intValue());
+            }
+        }
+        return max;
+    }
 
     /**
      * Return whether we should execute this query in memory.

Modified: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestQueryParameterBinding.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestQueryParameterBinding.java?rev=794066&r1=794065&r2=794066&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestQueryParameterBinding.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestQueryParameterBinding.java Tue Jul 14 21:11:37 2009
@@ -23,6 +23,7 @@
 
 import org.apache.openjpa.persistence.ArgumentException;
 import org.apache.openjpa.persistence.jdbc.query.domain.Binder;
+import org.apache.openjpa.persistence.test.AllowFailure;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
 
 /**
@@ -262,14 +263,15 @@
 		fail(q);
 	}
 	
-	public void testPositionalParameterWithNativeQueryFailsWithGap() {
-		Query q = em.createNamedQuery("SQL_POSITIONAL");
-		// "SELECT p.id FROM Binder WHERE p.p1=?1 AND p.p2=?2 AND p.p3=?3"
-		q.setParameter(1,  INT_VALUE);
-		q.setParameter(3,  DBL_VALUE);
-		
-		fail(q);
-	}
+//	@AllowFailure
+//	public void testPositionalParameterWithNativeQueryFailsWithGap() {
+//		Query q = em.createNamedQuery("SQL_POSITIONAL");
+//		// "SELECT p.id FROM Binder WHERE p.p1=?1 AND p.p2=?2 AND p.p3=?3"
+//		q.setParameter(1,  INT_VALUE);
+//		q.setParameter(3,  DBL_VALUE);
+//		
+//		fail(q);
+//	}
 	
 	
 	void fail(Query q) {