You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2014/09/10 17:17:36 UTC
svn commit: r1624026 - in /openjpa/branches/2.0.x: ./
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/
openjpa-kernel/src/main/java/org/apache/openjpa/conf/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/
openjpa-proj...
Author: hthomann
Date: Wed Sep 10 15:17:35 2014
New Revision: 1624026
URL: http://svn.apache.org/r1624026
Log:
OPENJPA-1794: Return null, rather than 0, on MAX function - back ported to 2.0.x Jeremy Bauer's commit to trunk.
Added:
openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/NullableAggregateUnaryOp.java
- copied unchanged from r1529241, openjpa/branches/2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/NullableAggregateUnaryOp.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/
- copied from r1529241, openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/AggEntity.java
- copied unchanged from r1529241, openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/AggEntity.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/AggEntity_.java
- copied unchanged from r1529241, openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/AggEntity_.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
- copied unchanged from r1529241, openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestCompatAggregateFunctions.java
- copied unchanged from r1529241, openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestCompatAggregateFunctions.java
Modified:
openjpa/branches/2.0.x/ (props changed)
openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Avg.java
openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Max.java
openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Min.java
openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Sum.java
openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/UnaryOp.java
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
openjpa/branches/2.0.x/openjpa-project/src/doc/manual/migration_considerations.xml
Propchange: openjpa/branches/2.0.x/
------------------------------------------------------------------------------
Merged /openjpa/branches/2.1.x:r1529241
Modified: openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Avg.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Avg.java?rev=1624026&r1=1624025&r2=1624026&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Avg.java (original)
+++ openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Avg.java Wed Sep 10 15:17:35 2014
@@ -23,8 +23,9 @@ package org.apache.openjpa.jdbc.kernel.e
*
* @author Abe White
*/
+@SuppressWarnings("serial")
class Avg
- extends UnaryOp {
+ extends NullableAggregateUnaryOp { // OPENJPA-1794
/**
* Constructor. Provide the value to operate on.
@@ -41,4 +42,3 @@ class Avg
return true;
}
}
-
Modified: openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Max.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Max.java?rev=1624026&r1=1624025&r2=1624026&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Max.java (original)
+++ openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Max.java Wed Sep 10 15:17:35 2014
@@ -23,8 +23,9 @@ package org.apache.openjpa.jdbc.kernel.e
*
* @author Abe White
*/
+@SuppressWarnings("serial")
class Max
- extends UnaryOp {
+ extends NullableAggregateUnaryOp { // OPENJPA-1794
/**
* Constructor. Provide the value to operate on.
Modified: openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Min.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Min.java?rev=1624026&r1=1624025&r2=1624026&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Min.java (original)
+++ openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Min.java Wed Sep 10 15:17:35 2014
@@ -23,8 +23,9 @@ package org.apache.openjpa.jdbc.kernel.e
*
* @author Abe White
*/
+@SuppressWarnings("serial")
class Min
- extends UnaryOp {
+ extends NullableAggregateUnaryOp { // OPENJPA-1794
/**
* Constructor. Provide the value to operate on.
Modified: openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Sum.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Sum.java?rev=1624026&r1=1624025&r2=1624026&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Sum.java (original)
+++ openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Sum.java Wed Sep 10 15:17:35 2014
@@ -25,8 +25,9 @@ import org.apache.openjpa.kernel.Filters
*
* @author Abe White
*/
+@SuppressWarnings("serial")
class Sum
- extends UnaryOp {
+ extends NullableAggregateUnaryOp { // OPENJPA-1794
/**
* Constructor. Provide the value to operate on.
Modified: openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/UnaryOp.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/UnaryOp.java?rev=1624026&r1=1624025&r2=1624026&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/UnaryOp.java (original)
+++ openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/UnaryOp.java Wed Sep 10 15:17:35 2014
@@ -119,8 +119,13 @@ abstract class UnaryOp
throws SQLException {
Object value = res.getObject(this, JavaSQLTypes.JDBC_DEFAULT, null);
Class<?> type = getType();
- if (value == null && (type.isPrimitive() || Number.class.isAssignableFrom(type))) {
- value = Filters.getDefaultForNull(Filters.wrap(type));
+ if (value == null) {
+ if (nullableValue(ctx, state)) { // OPENJPA-1794
+ return null;
+ }
+ else if (type.isPrimitive() || Number.class.isAssignableFrom(type)) {
+ value = Filters.getDefaultForNull(Filters.wrap(type));
+ }
}
return Filters.convert(value, type);
}
@@ -171,5 +176,10 @@ abstract class UnaryOp
_val.acceptVisit(visitor);
visitor.exit(this);
}
-}
+
+ // OPENJPA-1794
+ protected boolean nullableValue(ExpContext ctx, ExpState state) {
+ return false;
+ }
+}
Modified: openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java?rev=1624026&r1=1624025&r2=1624026&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java (original)
+++ openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java Wed Sep 10 15:17:35 2014
@@ -70,6 +70,7 @@ public class Compatibility {
private boolean _parseAnnotationsForQueryMode = true;
private boolean _resetFlushFlagForCascadePersist = false;//OPENJPA-2051
private boolean _overrideContextClassloader = false; //OPENJPA-1993
+ private boolean _returnNullOnEmptyAggregateResult = false; // OPENJPA-1794
/**
* Whether to require exact identity value types when creating object
@@ -626,4 +627,38 @@ public class Compatibility {
public void setOverrideContextClassloader(boolean overrideContextClassloader) {
_overrideContextClassloader = overrideContextClassloader;
}
+
+ /**
+ * This property is used to specify whether the aggregate query functions
+ * SUM, AVG, MAX, and MIN return null if there is no query result. This will occur
+ * if no rows are returned for the specified query predicate. The default is
+ * false, meaning that 0 will be returned for functions operating on numeric
+ * data.
+ *
+ * In compliance with the JPA specification, the default value is true.
+ *
+ * @return true if the result of an aggregate with an empty query result returns null.
+ * @since
+ *
+ */
+ public boolean getReturnNullOnEmptyAggregateResult() {
+ return _returnNullOnEmptyAggregateResult;
+ }
+
+ /**
+ * This property is used to specify whether the aggregate query functions
+ * SUM, AVG, MAX, and MIN return null if there is no query result. This will occur
+ * if no rows are returned for the specified query predicate. The default is
+ * false, meaning that 0 will be returned for functions operating on numeric
+ * data.
+ *
+ * In compliance with the JPA specification, the default value is true.
+ *
+ * @since
+ * @param returnNullOnAggregate whether OpenJPA will return null for aggregate
+ * expressions when the query result is empty.
+ */
+ public void setReturnNullOnAggregateResult(boolean returnNullOnEmptyAggregateResult) {
+ _returnNullOnEmptyAggregateResult = returnNullOnEmptyAggregateResult;
+ }
}
Modified: openjpa/branches/2.0.x/openjpa-project/src/doc/manual/migration_considerations.xml
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-project/src/doc/manual/migration_considerations.xml?rev=1624026&r1=1624025&r2=1624026&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-project/src/doc/manual/migration_considerations.xml (original)
+++ openjpa/branches/2.0.x/openjpa-project/src/doc/manual/migration_considerations.xml Wed Sep 10 15:17:35 2014
@@ -353,6 +353,25 @@
</programlisting>
</para>
</section>
+ <section id="ReturnNullOnEmptyAggregateResult">
+ <title>
+ Return value of aggregate functions in SELECT clause
+ </title>
+ <!-- See OPENJPA-1794 for details. -->
+ <para>
+ The JPA specification states "If SUM, AVG, MAX, or MIN is used, and there are no values to which the aggregate function can be
+ applied, the result of the aggregate function is NULL." Prior to this update, OpenJPA incorrectly returned 0 for SUM, AVG, MIN,
+ and MAX when a state field being aggregated is numeric. This behavior affects both JPQL and Criteria queries. With this update,
+ OpenJPA will return a null result value for these aggregate functions when a query returns no result.
+ </para>
+ <para>
+ To enable the new behavior of this fix, you need to set the following persistence property in your persistence.xml or when
+ creating an EntityManagerFactory.
+ <programlisting>
+ <property name="openjpa.Compatibility" value="ReturnNullOnAggregateResult=true"/>
+ </programlisting>
+ </para>
+ </section>
</section>
</section>
</appendix>