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 2011/06/09 01:50:30 UTC
svn commit: r1133605 - in /openjpa/trunk:
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/
openjpa-slice/src/main/resources/org/apache/openjpa/slice/jdbc/
Author: ppoddar
Date: Wed Jun 8 23:50:30 2011
New Revision: 1133605
URL: http://svn.apache.org/viewvc?rev=1133605&view=rev
Log:
OPENJPA-2012: Support in-memory MIN()/MAX() on non-numeric types
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/UniqueResultObjectProvider.java
openjpa/trunk/openjpa-slice/src/main/resources/org/apache/openjpa/slice/jdbc/localizer.properties
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java?rev=1133605&r1=1133604&r2=1133605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java Wed Jun 8 23:50:30 2011
@@ -364,6 +364,8 @@ public class Filters {
return Short.valueOf(((Number) o).shortValue());
} else if (type == Byte.class && allowNumericConversion(o.getClass(), type, strictNumericConversion)) {
return Byte.valueOf(((Number) o).byteValue());
+ } else if (type == Character.class) {
+ return (char) ((Number) o).intValue();
} else if (!strictNumericConversion) {
return ((Number) o).intValue();
} else {
Modified: openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/UniqueResultObjectProvider.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/UniqueResultObjectProvider.java?rev=1133605&r1=1133604&r2=1133605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/UniqueResultObjectProvider.java (original)
+++ openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/UniqueResultObjectProvider.java Wed Jun 8 23:50:30 2011
@@ -18,6 +18,10 @@
*/
package org.apache.openjpa.slice.jdbc;
+import java.util.Date;
+
+import org.apache.openjpa.jdbc.kernel.exps.Val;
+import org.apache.openjpa.kernel.Filters;
import org.apache.openjpa.kernel.StoreQuery;
import org.apache.openjpa.kernel.exps.QueryExpressions;
import org.apache.openjpa.kernel.exps.Value;
@@ -86,6 +90,7 @@ public class UniqueResultObjectProvider
for (int i=0; i<values.length; i++) {
Value v = values[i];
boolean isAggregate = v.isAggregate();
+
String op = v.getClass().getSimpleName();
for (ResultObjectProvider rop:_rops) {
if (i == 0)
@@ -107,6 +112,7 @@ public class UniqueResultObjectProvider
} else {
single[i] = row[i];
}
+ single[i] = Filters.convert(single[i], v.getType());
}
}
_single = single;
@@ -126,8 +132,21 @@ public class UniqueResultObjectProvider
return other;
if (other == null)
return current;
- return Math.max(((Number)current).doubleValue(),
+ if (current instanceof Number) {
+ return Math.max(((Number)current).doubleValue(),
((Number)other).doubleValue());
+ }
+ if (current instanceof String) {
+ return ((String)current).compareTo((String)other) > 0 ? current : other;
+ }
+ if (current instanceof Date) {
+ return ((Date)current).compareTo((Date)other) > 0 ? current : other;
+ }
+ if (current instanceof Character) {
+ return ((Character)current).compareTo((Character)other) > 0 ? current : other;
+ }
+ throw new UnsupportedOperationException(_loc.get("aggregate-unsupported-on-type",
+ "MAX()", (current == null ? other : current).getClass().getName()).toString());
}
Object min(Object current, Object other) {
@@ -135,8 +154,21 @@ public class UniqueResultObjectProvider
return other;
if (other == null)
return current;
- return Math.min(((Number)current).doubleValue(),
- ((Number)other).doubleValue());
+ if (current instanceof Number) {
+ return Math.min(((Number)current).doubleValue(),
+ ((Number)other).doubleValue());
+ }
+ if (current instanceof String) {
+ return ((String)current).compareTo((String)other) < 0 ? current : other;
+ }
+ if (current instanceof Date) {
+ return ((Date)current).compareTo((Date)other) < 0 ? current : other;
+ }
+ if (current instanceof Character) {
+ return ((Character)current).compareTo((Character)other) < 0 ? current : other;
+ }
+ throw new UnsupportedOperationException(_loc.get("aggregate-unsupported-on-type",
+ "MIN()", (current == null ? other : current).getClass().getName()).toString());
}
Object sum(Object current, Object other) {
@@ -144,12 +176,14 @@ public class UniqueResultObjectProvider
return other;
if (other == null)
return current;
- return (((Number)current).doubleValue() +
+ if (current instanceof Number) {
+ return (((Number)current).doubleValue() +
((Number)other).doubleValue());
+ }
+ throw new UnsupportedOperationException(_loc.get("aggregate-unsupported-on-type",
+ "SUM()", (current == null ? other : current).getClass().getName()).toString());
}
-
-
-
+
public void open() throws Exception {
for (ResultObjectProvider rop:_rops)
rop.open();
Modified: openjpa/trunk/openjpa-slice/src/main/resources/org/apache/openjpa/slice/jdbc/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/main/resources/org/apache/openjpa/slice/jdbc/localizer.properties?rev=1133605&r1=1133604&r2=1133605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-slice/src/main/resources/org/apache/openjpa/slice/jdbc/localizer.properties (original)
+++ openjpa/trunk/openjpa-slice/src/main/resources/org/apache/openjpa/slice/jdbc/localizer.properties Wed Jun 8 23:50:30 2011
@@ -64,4 +64,5 @@ resource-not-xa-tm-2pc: One or more slic
but the configured "{0}" transaction manager can only enlist XA-aware \
resource.
not-open: The underlying result sets are not open.
-aggregate-unsupported: The query uses unsupported aggregate operation "{0}".
+aggregate-unsupported: The query uses unsupported aggregate operation {0}.
+aggregate-unsupported-on-type: Aggregate operation {0} not supported on {1}