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/12/01 23:51:01 UTC
svn commit: r885989 - 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-kernel/src/main/java/org/apache/openjpa/kernel/jpql/
openjpa-persistence-jdbc/...
Author: ppoddar
Date: Tue Dec 1 22:51:01 2009
New Revision: 885989
URL: http://svn.apache.org/viewvc?rev=885989&view=rev
Log:
OPENJPA-1409: Preserve type for currentDate/Time expressions
Modified:
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/CurrentDate.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-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.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/Expressions.java
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=885989&r1=885988&r2=885989&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 Tue Dec 1 22:51:01 2009
@@ -19,6 +19,7 @@
package org.apache.openjpa.jdbc.kernel.exps;
import java.io.Serializable;
+import java.util.Date;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
@@ -49,13 +50,8 @@
implements ExpressionFactory, Serializable {
private static final Val NULL = new Null();
- private static final Val CURRENT_DATE = new CurrentDate(JavaSQLTypes.DATE);
- private static final Val CURRENT_TIME = new CurrentDate(JavaSQLTypes.TIME);
- private static final Val CURRENT_TIMESTAMP =
- new CurrentDate(JavaSQLTypes.TIMESTAMP);
- private static final Localizer _loc = Localizer.forPackage
- (JDBCExpressionFactory.class);
+ private static final Localizer _loc = Localizer.forPackage(JDBCExpressionFactory.class);
private final ClassMapping _type;
private final SelectConstructor _cons = new SelectConstructor();
@@ -263,16 +259,16 @@
return NULL;
}
- public Value getCurrentDate() {
- return CURRENT_DATE;
+ public <T extends Date> Value getCurrentDate(Class<T> dateType) {
+ return new CurrentDate(dateType);
}
- public Value getCurrentTime() {
- return CURRENT_TIME;
+ public <T extends Date> Value getCurrentTime(Class<T> dateType) {
+ return new CurrentDate(dateType);
}
- public Value getCurrentTimestamp() {
- return CURRENT_TIMESTAMP;
+ public <T extends Date> Value getCurrentTimestamp(Class<T> dateType) {
+ return new CurrentDate(dateType);
}
public Parameter newParameter(Object name, Class type) {
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/CurrentDate.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/CurrentDate.java?rev=885989&r1=885988&r2=885989&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/CurrentDate.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/CurrentDate.java Tue Dec 1 22:51:01 2009
@@ -29,16 +29,25 @@
*/
class CurrentDate
extends Val {
-
+ private final Class<? extends Date> _type;
+
+ public CurrentDate(Class<? extends Date> type) {
+ _type = type;
+ }
+
public Class getType() {
- return Date.class;
+ return _type;
}
public void setImplicitType(Class type) {
}
- protected Object eval(Object candidate, Object orig,
- StoreContext ctx, Object[] params) {
- return new Date();
+ protected Object eval(Object candidate, Object orig, StoreContext ctx, Object[] params) {
+ try {
+ _type.getConstructor(long.class).newInstance(System.currentTimeMillis());
+ } catch (Exception e) {
+ return new Date();
+ }
+ return null;
}
}
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=885989&r1=885988&r2=885989&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 Tue Dec 1 22:51:01 2009
@@ -18,6 +18,10 @@
*/
package org.apache.openjpa.kernel.exps;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Date;
+
import org.apache.openjpa.meta.ClassMetaData;
/**
@@ -229,17 +233,17 @@
/**
* Return a value representing the current date.
*/
- public Value getCurrentDate();
+ public <T extends Date> Value getCurrentDate(Class<T> dateType);
/**
* Return a value representing the current time.
*/
- public Value getCurrentTime();
+ public <T extends Date> Value getCurrentTime(Class<T> timeType);
/**
* Return a value representing the current timestamp.
*/
- public Value getCurrentTimestamp();
+ public <T extends Date> Value getCurrentTimestamp(Class<T> timestampType);
/**
* Return a value representing a parameter for the given value. The
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=885989&r1=885988&r2=885989&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 Tue Dec 1 22:51:01 2009
@@ -23,6 +23,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
+import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -49,7 +50,6 @@
implements ExpressionFactory {
private static final Value NULL = new Null();
- private static final Value CURRENT_DATE = new CurrentDate();
private static final Object UNIQUE = new Object();
// list of unbound variables in this query
@@ -493,16 +493,16 @@
return NULL;
}
- public Value getCurrentDate() {
- return CURRENT_DATE;
+ public <T extends Date> Value getCurrentDate(Class<T> dateType) {
+ return new CurrentDate(dateType);
}
- public Value getCurrentTime() {
- return CURRENT_DATE;
+ public <T extends Date> Value getCurrentTime(Class<T> dateType) {
+ return new CurrentDate(dateType);
}
- public Value getCurrentTimestamp() {
- return CURRENT_DATE;
+ public <T extends Date> Value getCurrentTimestamp(Class<T> dateType) {
+ return new CurrentDate(dateType);
}
public Parameter newParameter(Object name, Class type) {
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=885989&r1=885988&r2=885989&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Tue Dec 1 22:51:01 2009
@@ -22,9 +22,12 @@
import java.io.Serializable;
import java.lang.reflect.Field;
import java.math.BigDecimal;
+import java.sql.Time;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
@@ -1367,13 +1370,13 @@
return evalNot(not, factory.contains(val2, val1));
case JJTCURRENTDATE:
- return factory.getCurrentDate();
+ return factory.getCurrentDate(Date.class);
case JJTCURRENTTIME:
- return factory.getCurrentTime();
+ return factory.getCurrentTime(Time.class);
case JJTCURRENTTIMESTAMP:
- return factory.getCurrentTimestamp();
+ return factory.getCurrentTimestamp(Timestamp.class);
case JJTSELECTEXTENSION:
assertQueryExtensions("SELECT");
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=885989&r1=885988&r2=885989&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 Tue Dec 1 22:51:01 2009
@@ -19,6 +19,7 @@
package org.apache.openjpa.persistence.criteria;
import java.math.BigDecimal;
+import java.sql.Time;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -27,6 +28,7 @@
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.Tuple;
+import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
@@ -1456,4 +1458,23 @@
List result = q.getResultList();
}
+
+ public void testCurrentTimeReturnsSQLTypes() {
+ em.getTransaction().begin();
+ Product pc = new Product();
+ em.persist(pc);
+ em.getTransaction().commit();
+
+ int pid = pc.getPid();
+
+ CriteriaQuery<Time> cquery = cb.createQuery(Time.class);
+ Root<Product> product = cquery.from(Product.class);
+ cquery.select(cb.currentTime());
+ cquery.where(cb.equal(product.get(Product_.pid), pid));
+
+ TypedQuery<Time> tq = em.createQuery(cquery);
+ Object result = tq.getSingleResult();
+ assertTrue(result.getClass() + " not instance of Time", result instanceof Time);
+
+ }
}
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=885989&r1=885988&r2=885989&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 Tue Dec 1 22:51:01 2009
@@ -792,7 +792,7 @@
@Override
public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
- return factory.getCurrentDate();
+ return factory.getCurrentDate(getJavaType());
}
@Override
@@ -808,7 +808,7 @@
@Override
public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
- return factory.getCurrentTime();
+ return factory.getCurrentTime(getJavaType());
}
@Override
@@ -824,7 +824,7 @@
@Override
public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
- return factory.getCurrentTimestamp();
+ return factory.getCurrentTimestamp(getJavaType());
}
@Override