]> git.basschouten.com Git - openhab-addons.git/commitdiff
Consolidate and optimize datetime conversions (#13483)
authorJacob Laursen <jacob-github@vindvejr.dk>
Tue, 4 Oct 2022 06:59:59 +0000 (08:59 +0200)
committerGitHub <noreply@github.com>
Tue, 4 Oct 2022 06:59:59 +0000 (08:59 +0200)
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcBaseDAO.java
bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcDerbyDAO.java
bundles/org.openhab.persistence.jdbc/src/test/java/org/openhab/persistence/jdbc/db/JdbcBaseDAOTest.java

index 61d0a12ae42b66c765d41f20bf31ebf67a2bfd66..6ba364dafb45e3a0526af178be0fc7be598ee201 100644 (file)
@@ -348,7 +348,8 @@ public class JdbcBaseDAO {
         // we already retrieve the unit here once as it is a very costly operation
         String itemName = item.getName();
         Unit<? extends Quantity<?>> unit = item instanceof NumberItem ? ((NumberItem) item).getUnit() : null;
-        return m.stream().map(o -> new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsDate(o[0])))
+        return m.stream()
+                .map(o -> new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsZonedDateTime(o[0])))
                 .collect(Collectors.<HistoricItem> toList());
     }
 
@@ -541,8 +542,7 @@ public class JdbcBaseDAO {
             }
             return unit == null ? DecimalType.valueOf(objectAsString(v)) : QuantityType.valueOf(objectAsString(v));
         } else if (item instanceof DateTimeItem) {
-            return new DateTimeType(
-                    ZonedDateTime.ofInstant(Instant.ofEpochMilli(objectAsLong(v)), ZoneId.systemDefault()));
+            return new DateTimeType(objectAsZonedDateTime(v));
         } else if (item instanceof ColorItem) {
             return HSBType.valueOf(objectAsString(v));
         } else if (item instanceof DimmerItem || item instanceof RollershutterItem) {
@@ -564,31 +564,20 @@ public class JdbcBaseDAO {
         }
     }
 
-    protected ZonedDateTime objectAsDate(Object v) {
-        if (v instanceof LocalDateTime) {
-            return ZonedDateTime.of((LocalDateTime) v, ZoneId.systemDefault());
-        } else if (v instanceof java.sql.Timestamp) {
-            return ZonedDateTime.ofInstant(((java.sql.Timestamp) v).toInstant(), ZoneId.systemDefault());
-        } else if (v instanceof Instant) {
-            return ZonedDateTime.ofInstant((Instant) v, ZoneId.systemDefault());
-        } else if (v instanceof java.lang.String) {
-            return ZonedDateTime.ofInstant(java.sql.Timestamp.valueOf(v.toString()).toInstant(),
-                    ZoneId.systemDefault());
-        }
-        throw new UnsupportedOperationException("Date of type " + v.getClass().getName() + " is not supported");
-    }
-
-    protected Long objectAsLong(Object v) {
+    protected ZonedDateTime objectAsZonedDateTime(Object v) {
         if (v instanceof Long) {
-            return ((Number) v).longValue();
+            return ZonedDateTime.ofInstant(Instant.ofEpochMilli(((Number) v).longValue()), ZoneId.systemDefault());
         } else if (v instanceof java.sql.Date) {
-            return ((java.sql.Date) v).getTime();
+            return ZonedDateTime.ofInstant(Instant.ofEpochMilli(((java.sql.Date) v).getTime()), ZoneId.systemDefault());
         } else if (v instanceof LocalDateTime) {
-            return ((LocalDateTime) v).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+            return ((LocalDateTime) v).atZone(ZoneId.systemDefault());
         } else if (v instanceof Instant) {
-            return ((Instant) v).toEpochMilli();
+            return ((Instant) v).atZone(ZoneId.systemDefault());
         } else if (v instanceof java.sql.Timestamp) {
-            return ((java.sql.Timestamp) v).getTime();
+            return ((java.sql.Timestamp) v).toInstant().atZone(ZoneId.systemDefault());
+        } else if (v instanceof java.lang.String) {
+            return ZonedDateTime.ofInstant(java.sql.Timestamp.valueOf(v.toString()).toInstant(),
+                    ZoneId.systemDefault());
         }
         throw new UnsupportedOperationException("Date of type " + v.getClass().getName() + " is not supported");
     }
index 5c2262f60086d3c8718154c099f4c38eaafdfde4..431ee56db64c76793ee7419c0b3c80a8d0d28ad3 100644 (file)
@@ -174,7 +174,7 @@ public class JdbcDerbyDAO extends JdbcBaseDAO {
         Unit<? extends Quantity<?>> unit = item instanceof NumberItem ? ((NumberItem) item).getUnit() : null;
         return m.stream().map(o -> {
             logger.debug("JDBC::doGetHistItemFilterQuery 0='{}' 1='{}'", o[0], o[1]);
-            return new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsDate(o[0]));
+            return new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsZonedDateTime(o[0]));
         }).collect(Collectors.<HistoricItem> toList());
     }
 
index 37146ad07b88505d54068db939517afe120ce4a9..dfa4d162a2b79b29d0a15f8272f45f69b3c7971d 100644 (file)
@@ -17,6 +17,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 
+import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
@@ -85,16 +86,6 @@ public class JdbcBaseDAOTest {
         assertInstanceOf(QuantityType.class, quantityType);
         assertEquals(QuantityType.valueOf("7.3 °C"), quantityType);
 
-        State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
-                java.sql.Timestamp.valueOf("2021-02-01 23:30:02.049"));
-        assertInstanceOf(DateTimeType.class, dateTimeType);
-        assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
-
-        dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
-                LocalDateTime.parse("2021-02-01T23:30:02.049"));
-        assertInstanceOf(DateTimeType.class, dateTimeType);
-        assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
-
         State hsbType = jdbcBaseDAO.objectAsState(new ColorItem("testColorItem"), null, "184,100,52");
         assertInstanceOf(HSBType.class, hsbType);
         assertEquals(HSBType.valueOf("184,100,52"), hsbType);
@@ -140,6 +131,60 @@ public class JdbcBaseDAOTest {
         assertEquals(StringType.valueOf("String"), stringType);
     }
 
+    @Test
+    public void objectAsStateReturnsValiDateTimeTypeForTimestamp() {
+        State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+                java.sql.Timestamp.valueOf("2021-02-01 23:30:02.049"));
+        assertInstanceOf(DateTimeType.class, dateTimeType);
+        assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
+    }
+
+    @Test
+    public void objectAsStateReturnsValidDateTimeTypeForLocalDateTime() {
+        State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+                LocalDateTime.parse("2021-02-01T23:30:02.049"));
+        assertInstanceOf(DateTimeType.class, dateTimeType);
+        assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
+    }
+
+    @Test
+    public void objectAsStateReturnsValidDateTimeTypeForLong() {
+        State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+                Long.valueOf("1612222202049"));
+        assertInstanceOf(DateTimeType.class, dateTimeType);
+        assertEquals(
+                new DateTimeType(
+                        ZonedDateTime.ofInstant(Instant.parse("2021-02-01T23:30:02.049Z"), ZoneId.systemDefault())),
+                dateTimeType);
+    }
+
+    @Test
+    public void objectAsStateReturnsValidDateTimeTypeForSqlDate() {
+        State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+                java.sql.Date.valueOf("2021-02-01"));
+        assertInstanceOf(DateTimeType.class, dateTimeType);
+        assertEquals(DateTimeType.valueOf("2021-02-01T00:00:00.000"), dateTimeType);
+    }
+
+    @Test
+    public void objectAsStateReturnsValidDateTimeTypeForInstant() {
+        State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+                Instant.parse("2021-02-01T23:30:02.049Z"));
+        assertInstanceOf(DateTimeType.class, dateTimeType);
+        assertEquals(
+                new DateTimeType(
+                        ZonedDateTime.ofInstant(Instant.parse("2021-02-01T23:30:02.049Z"), ZoneId.systemDefault())),
+                dateTimeType);
+    }
+
+    @Test
+    public void objectAsStateReturnsValidDateTimeTypeForString() {
+        State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+                "2021-02-01 23:30:02.049");
+        assertInstanceOf(DateTimeType.class, dateTimeType);
+        assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
+    }
+
     @Test
     public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrder() {
         String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);