You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by st...@apache.org on 2021/04/01 20:00:23 UTC

[openjpa] branch master updated: OPENJPA-2851 fix CURRENT_DATE with LocalDate and LocalDateTime

This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git


The following commit(s) were added to refs/heads/master by this push:
     new 6db4db7  OPENJPA-2851 fix CURRENT_DATE with LocalDate and LocalDateTime
6db4db7 is described below

commit 6db4db7f512e67b7ea1e3aeb124a4e0343df79d8
Author: Mark Struberg <st...@apache.org>
AuthorDate: Thu Apr 1 21:59:36 2021 +0200

    OPENJPA-2851 fix CURRENT_DATE with LocalDate and LocalDateTime
---
 .../java/org/apache/openjpa/kernel/Filters.java    |   7 +-
 .../persistence/simple/TestJava8TimeTypes.java     | 205 +++++++++++++--------
 2 files changed, 131 insertions(+), 81 deletions(-)

diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java
index a63ae1a..ac6091f 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java
@@ -1074,7 +1074,12 @@ public class Filters {
             && (Date.class.isAssignableFrom(c)
              || Time.class.isAssignableFrom(c)
              || Timestamp.class.isAssignableFrom(c)
-             || Calendar.class.isAssignableFrom(c));
+             || Calendar.class.isAssignableFrom(c)
+             || LocalDate.class.isAssignableFrom(c)
+             || LocalDateTime.class.isAssignableFrom(c)
+             || LocalTime.class.isAssignableFrom(c)
+             || OffsetTime.class.isAssignableFrom(c)
+             || OffsetDateTime.class.isAssignableFrom(c));
     }
 
     public static Object getDefaultForNull(Class<?> nType) {
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java
index 6b56aba..94eac11 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java
@@ -29,7 +29,6 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.OffsetDateTime;
 import java.time.OffsetTime;
-import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.util.Date;
 import java.util.List;
@@ -42,30 +41,33 @@ public class TestJava8TimeTypes extends SingleEMFTestCase {
     private static String VAL_LOCAL_TIME = "04:57:15";
     private static String VAL_LOCAL_DATETIME = "2019-01-01T01:00:00";
 
+    private Java8TimeTypes insertedEntity = new Java8TimeTypes();
 
     @Override
     public void setUp() {
         setUp(CLEAR_TABLES, Java8TimeTypes.class);
-    }
 
-    public void testJava8Types() {
         EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
-        Java8TimeTypes e = new Java8TimeTypes();
-        e.setId(1);
-        e.setOldDateField(new Date());
-        e.setLocalTimeField(LocalTime.parse(VAL_LOCAL_TIME));
-        e.setLocalDateField(LocalDate.parse(VAL_LOCAL_DATE));
-        e.setLocalDateTimeField(LocalDateTime.parse(VAL_LOCAL_DATETIME));
-        e.setOffsetTimeField(e.getLocalTimeField().atOffset(ZoneOffset.ofHours(-9)));
-        e.setOffsetDateTimeField(e.getLocalDateTimeField().atOffset(ZoneOffset.ofHours(-9)));
-
-        em.persist(e);
+        
+        insertedEntity.setId(1);
+        insertedEntity.setOldDateField(new Date());
+        insertedEntity.setLocalTimeField(LocalTime.parse(VAL_LOCAL_TIME));
+        insertedEntity.setLocalDateField(LocalDate.parse(VAL_LOCAL_DATE));
+        insertedEntity.setLocalDateTimeField(LocalDateTime.parse(VAL_LOCAL_DATETIME));
+        insertedEntity.setOffsetTimeField(insertedEntity.getLocalTimeField().atOffset(ZoneOffset.ofHours(-9)));
+        insertedEntity.setOffsetDateTimeField(insertedEntity.getLocalDateTimeField().atOffset(ZoneOffset.ofHours(-9)));
+
+        em.persist(insertedEntity);
         em.getTransaction().commit();
         em.close();
 
+    }
+
+    public void testReadJava8Types() {
+
         // now read it back.
-        em = emf.createEntityManager();
+        EntityManager em = emf.createEntityManager();
         Java8TimeTypes eRead = em.find(Java8TimeTypes.class, 1);
 
         assertEquals(LocalTime.parse(VAL_LOCAL_TIME), eRead.getLocalTimeField());
@@ -75,80 +77,123 @@ public class TestJava8TimeTypes extends SingleEMFTestCase {
 
         // Many databases do not support WITH TIMEZONE syntax.
         // Thus we can only portably ensure tha the same instant is used at least.
-        assertEquals(Instant.from(e.getOffsetDateTimeField()),
+        assertEquals(Instant.from(insertedEntity.getOffsetDateTimeField()),
                 Instant.from(eRead.getOffsetDateTimeField()));
 
-        assertEquals(e.getOffsetTimeField().withOffsetSameInstant(eRead.getOffsetTimeField().getOffset()),
+        assertEquals(insertedEntity.getOffsetTimeField().withOffsetSameInstant(eRead.getOffsetTimeField().getOffset()),
                 eRead.getOffsetTimeField());
-
+        em.close();
+    }
+    
         // we've got reports from various functions not properly working with Java8 Dates.
+    public void testReadLocalDate() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<LocalDate> qry = em.createQuery("select t.localDateField from Java8TimeTypes AS t", LocalDate.class);
+        final LocalDate date = qry.getSingleResult();
+        assertNotNull(date);
+        em.close();
+    }
+
+    // max function
+    public void testMaxLocalDate() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<LocalDate> qry = em.createQuery("select max(t.localDateField) from Java8TimeTypes AS t", LocalDate.class);
+        final LocalDate max = qry.getSingleResult();
+        assertEquals(LocalDate.parse(VAL_LOCAL_DATE), max);
+        em.close();
+    }
+
+    public void testMaxLocalDateTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<LocalDateTime> qry = em.createQuery("select max(t.localDateTimeField) from Java8TimeTypes AS t", LocalDateTime.class);
+        final LocalDateTime max = qry.getSingleResult();
+        assertEquals(LocalDateTime.parse(VAL_LOCAL_DATETIME), max);
+        em.close();
+    }
+
+    public void testMaxLocalTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<LocalTime> qry = em.createQuery("select max(t.localTimeField) from Java8TimeTypes AS t", LocalTime.class);
+        final LocalTime max = qry.getSingleResult();
+        assertEquals(LocalTime.parse(VAL_LOCAL_TIME), max);
+        em.close();
+    }
+
+    public void testMaxOffsetTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<OffsetTime> qry = em.createQuery("select max(t.offsetTimeField) from Java8TimeTypes AS t", OffsetTime.class);
+        final OffsetTime max = qry.getSingleResult();
+        assertEquals(insertedEntity.getOffsetTimeField().withOffsetSameInstant(insertedEntity.getOffsetTimeField().getOffset()),
+                max.withOffsetSameInstant(insertedEntity.getOffsetTimeField().getOffset()));
+        em.close();
+    }
 
-        {
-            final TypedQuery<LocalDate> qry = em.createQuery("select t.localDateField from Java8TimeTypes AS t", LocalDate.class);
-            final LocalDate date = qry.getSingleResult();
-            assertNotNull(date);
-        }
-
-        // max function
-        {
-            final TypedQuery<LocalDate> qry = em.createQuery("select max(t.localDateField) from Java8TimeTypes AS t", LocalDate.class);
-            final LocalDate max = qry.getSingleResult();
-            assertEquals(LocalDate.parse(VAL_LOCAL_DATE), max);
-        }
-        {
-            final TypedQuery<LocalDateTime> qry = em.createQuery("select max(t.localDateTimeField) from Java8TimeTypes AS t", LocalDateTime.class);
-            final LocalDateTime max = qry.getSingleResult();
-            assertEquals(LocalDateTime.parse(VAL_LOCAL_DATETIME), max);
-        }
-        {
-            final TypedQuery<LocalTime> qry = em.createQuery("select max(t.localTimeField) from Java8TimeTypes AS t", LocalTime.class);
-            final LocalTime max = qry.getSingleResult();
-            assertEquals(LocalTime.parse(VAL_LOCAL_TIME), max);
-        }
-        {
-            final TypedQuery<OffsetTime> qry = em.createQuery("select max(t.offsetTimeField) from Java8TimeTypes AS t", OffsetTime.class);
-            final OffsetTime max = qry.getSingleResult();
-            assertEquals(e.getOffsetTimeField().withOffsetSameInstant(eRead.getOffsetTimeField().getOffset()),
-                    max.withOffsetSameInstant(eRead.getOffsetTimeField().getOffset()));
-        }
-        {
-            final TypedQuery<OffsetDateTime> qry = em.createQuery("select max(t.offsetDateTimeField) from Java8TimeTypes AS t", OffsetDateTime.class);
-            final OffsetDateTime max = qry.getSingleResult();
-            assertEquals(Instant.from(e.getOffsetDateTimeField()),
-                    Instant.from(max));
-        }
-
-        // min function
-        {
-            final TypedQuery<LocalDate> qry = em.createQuery("select min(t.localDateField) from Java8TimeTypes AS t", LocalDate.class);
-            final LocalDate min = qry.getSingleResult();
-            assertEquals(LocalDate.parse(VAL_LOCAL_DATE), min);
-        }
-        {
-            final TypedQuery<LocalDateTime> qry = em.createQuery("select min(t.localDateTimeField) from Java8TimeTypes AS t", LocalDateTime.class);
-            final LocalDateTime min = qry.getSingleResult();
-            assertEquals(LocalDateTime.parse(VAL_LOCAL_DATETIME), min);
-        }
-        {
-            final TypedQuery<LocalTime> qry = em.createQuery("select min(t.localTimeField) from Java8TimeTypes AS t", LocalTime.class);
-            final LocalTime min = qry.getSingleResult();
-            assertEquals(LocalTime.parse(VAL_LOCAL_TIME), min);
-        }
-        {
-            final TypedQuery<OffsetTime> qry = em.createQuery("select min(t.offsetTimeField) from Java8TimeTypes AS t", OffsetTime.class);
-            final OffsetTime min = qry.getSingleResult();
-            assertEquals(e.getOffsetTimeField().withOffsetSameInstant(eRead.getOffsetTimeField().getOffset()),
-                    min.withOffsetSameInstant(eRead.getOffsetTimeField().getOffset()));
-        }
-        {
-            final TypedQuery<OffsetDateTime> qry = em.createQuery("select min(t.offsetDateTimeField) from Java8TimeTypes AS t", OffsetDateTime.class);
-            final OffsetDateTime min = qry.getSingleResult();
-            assertEquals(Instant.from(e.getOffsetDateTimeField()),
-                    Instant.from(min));
-        }
+    public void testMaxOffsetDateTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<OffsetDateTime> qry = em.createQuery("select max(t.offsetDateTimeField) from Java8TimeTypes AS t", OffsetDateTime.class);
+        final OffsetDateTime max = qry.getSingleResult();
+        assertEquals(Instant.from(insertedEntity.getOffsetDateTimeField()),
+                Instant.from(max));
+        em.close();
+    }
+
+    // min function
+    public void testMinLocalDate() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<LocalDate> qry = em.createQuery("select min(t.localDateField) from Java8TimeTypes AS t", LocalDate.class);
+        final LocalDate min = qry.getSingleResult();
+        assertEquals(LocalDate.parse(VAL_LOCAL_DATE), min);
+    }
+
+    public void testMinLocalDateTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<LocalDateTime> qry = em.createQuery("select min(t.localDateTimeField) from Java8TimeTypes AS t", LocalDateTime.class);
+        final LocalDateTime min = qry.getSingleResult();
+        assertEquals(LocalDateTime.parse(VAL_LOCAL_DATETIME), min);
+        em.close();
+    }
+
+    public void testMinLocalTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<LocalTime> qry = em.createQuery("select min(t.localTimeField) from Java8TimeTypes AS t", LocalTime.class);
+        final LocalTime min = qry.getSingleResult();
+        assertEquals(LocalTime.parse(VAL_LOCAL_TIME), min);
+        em.close();
+    }
 
+    public void testMinOffsetTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<OffsetTime> qry = em.createQuery("select min(t.offsetTimeField) from Java8TimeTypes AS t", OffsetTime.class);
+        final OffsetTime min = qry.getSingleResult();
+        assertEquals(insertedEntity.getOffsetTimeField().withOffsetSameInstant(insertedEntity.getOffsetTimeField().getOffset()),
+                min.withOffsetSameInstant(insertedEntity.getOffsetTimeField().getOffset()));
+        em.close();
     }
 
+    public void testMinOffsetDateTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<OffsetDateTime> qry = em.createQuery("select min(t.offsetDateTimeField) from Java8TimeTypes AS t", OffsetDateTime.class);
+        final OffsetDateTime min = qry.getSingleResult();
+        assertEquals(Instant.from(insertedEntity.getOffsetDateTimeField()),
+                Instant.from(min));
+        em.close();
+    }
 
+    public void testCurrentDateLocalDate() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<Java8TimeTypes> qry = em.createQuery("select j from Java8TimeTypes AS j where j.localDateField < CURRENT_DATE", Java8TimeTypes.class);
+        final List<Java8TimeTypes> times = qry.getResultList();
+        assertNotNull(times);
+        assertTrue(!times.isEmpty());
+        em.close();
+    }
+    public void testCurrentDateLocalDateTime() {
+        EntityManager em = emf.createEntityManager();
+        final TypedQuery<Java8TimeTypes> qry = em.createQuery("select j from Java8TimeTypes AS j where j.localDateTimeField < CURRENT_DATE", Java8TimeTypes.class);
+        final List<Java8TimeTypes> times = qry.getResultList();
+        assertNotNull(times);
+        assertTrue(!times.isEmpty());
+        em.close();
+    }
 
 }