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) {