]> git.basschouten.com Git - openhab-addons.git/commitdiff
[jdbc] Consider local timezone to create time filter (#9445)
authorChristoph Weitkamp <github@christophweitkamp.de>
Thu, 24 Dec 2020 01:19:08 +0000 (02:19 +0100)
committerGitHub <noreply@github.com>
Thu, 24 Dec 2020 01:19:08 +0000 (17:19 -0800)
* Consider local timezone to create time filter
* Use user-defined timeZone

Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
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/main/java/org/openhab/persistence/jdbc/db/JdbcPostgresqlDAO.java
bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcMapper.java
bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcPersistenceService.java

index 661880457bf649dc305cb09bb599dec2d4601a7f..382ed002d3a1e70b1fbe6ac56c05ec0f7d739c01 100644 (file)
@@ -330,8 +330,8 @@ public class JdbcBaseDAO {
     }
 
     public List<HistoricItem> doGetHistItemFilterQuery(Item item, FilterCriteria filter, int numberDecimalcount,
-            String table, String name) {
-        String sql = histItemFilterQueryProvider(filter, numberDecimalcount, table, name);
+            String table, String name, ZoneId timeZone) {
+        String sql = histItemFilterQueryProvider(filter, numberDecimalcount, table, name, timeZone);
         logger.debug("JDBC::doGetHistItemFilterQuery sql={}", sql);
         List<Object[]> m = Yank.queryObjectArrays(sql, null);
 
@@ -348,7 +348,7 @@ public class JdbcBaseDAO {
     static final DateTimeFormatter JDBC_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
     private String histItemFilterQueryProvider(FilterCriteria filter, int numberDecimalcount, String table,
-            String simpleName) {
+            String simpleName, ZoneId timeZone) {
         logger.debug(
                 "JDBC::getHistItemFilterQueryProvider filter = {}, numberDecimalcount = {}, table = {}, simpleName = {}",
                 filter.toString(), numberDecimalcount, table, simpleName);
@@ -356,11 +356,13 @@ public class JdbcBaseDAO {
         String filterString = "";
         if (filter.getBeginDate() != null) {
             filterString += filterString.isEmpty() ? " WHERE" : " AND";
-            filterString += " TIME>'" + JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'";
+            filterString += " TIME>'" + JDBC_DATE_FORMAT.format(filter.getBeginDate().withZoneSameInstant(timeZone))
+                    + "'";
         }
         if (filter.getEndDate() != null) {
             filterString += filterString.isEmpty() ? " WHERE" : " AND";
-            filterString += " TIME<'" + JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'";
+            filterString += " TIME<'" + JDBC_DATE_FORMAT.format(filter.getEndDate().withZoneSameInstant(timeZone))
+                    + "'";
         }
         filterString += (filter.getOrdering() == Ordering.ASCENDING) ? " ORDER BY time ASC" : " ORDER BY time DESC ";
         if (filter.getPageSize() != 0x7fffffff) {
index 369da5ce91f5c977b215b08e6821d2db65e26b12..8e2091748b4bba2591d13dffde51281dbacd230a 100644 (file)
@@ -12,6 +12,7 @@
  */
 package org.openhab.persistence.jdbc.db;
 
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
@@ -156,8 +157,8 @@ public class JdbcDerbyDAO extends JdbcBaseDAO {
 
     @Override
     public List<HistoricItem> doGetHistItemFilterQuery(Item item, FilterCriteria filter, int numberDecimalcount,
-            String table, String name) {
-        String sql = histItemFilterQueryProvider(filter, numberDecimalcount, table, name);
+            String table, String name, ZoneId timeZone) {
+        String sql = histItemFilterQueryProvider(filter, numberDecimalcount, table, name, timeZone);
         List<Object[]> m = Yank.queryObjectArrays(sql, null);
 
         logger.debug("JDBC::doGetHistItemFilterQuery got Array length={}", m.size());
@@ -175,14 +176,8 @@ public class JdbcDerbyDAO extends JdbcBaseDAO {
      ****************************/
     static final DateTimeFormatter JDBC_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
-    /**
-     * @param filter
-     * @param numberDecimalcount
-     * @param table
-     * @return
-     */
     private String histItemFilterQueryProvider(FilterCriteria filter, int numberDecimalcount, String table,
-            String simpleName) {
+            String simpleName, ZoneId timeZone) {
         logger.debug(
                 "JDBC::getHistItemFilterQueryProvider filter = {}, numberDecimalcount = {}, table = {}, simpleName = {}",
                 StringUtilsExt.filterToString(filter), numberDecimalcount, table, simpleName);
@@ -190,11 +185,13 @@ public class JdbcDerbyDAO extends JdbcBaseDAO {
         String filterString = "";
         if (filter.getBeginDate() != null) {
             filterString += filterString.isEmpty() ? " WHERE" : " AND";
-            filterString += " TIME>'" + JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'";
+            filterString += " TIME>'" + JDBC_DATE_FORMAT.format(filter.getBeginDate().withZoneSameInstant(timeZone))
+                    + "'";
         }
         if (filter.getEndDate() != null) {
             filterString += filterString.isEmpty() ? " WHERE" : " AND";
-            filterString += " TIME<'" + JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'";
+            filterString += " TIME<'" + JDBC_DATE_FORMAT.format(filter.getEndDate().withZoneSameInstant(timeZone))
+                    + "'";
         }
         filterString += (filter.getOrdering() == Ordering.ASCENDING) ? " ORDER BY time ASC" : " ORDER BY time DESC";
         if (filter.getPageSize() != 0x7fffffff) {
index d7292cae1b5683688d3d925a53450d3062623a81..0cfd700917475101fd5065589e9355ad4bce8126 100644 (file)
@@ -12,6 +12,7 @@
  */
 package org.openhab.persistence.jdbc.db;
 
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
@@ -146,8 +147,8 @@ public class JdbcPostgresqlDAO extends JdbcBaseDAO {
 
     @Override
     public List<HistoricItem> doGetHistItemFilterQuery(Item item, FilterCriteria filter, int numberDecimalcount,
-            String table, String name) {
-        String sql = histItemFilterQueryProvider(filter, numberDecimalcount, table, name);
+            String table, String name, ZoneId timeZone) {
+        String sql = histItemFilterQueryProvider(filter, numberDecimalcount, table, name, timeZone);
         logger.debug("JDBC::doGetHistItemFilterQuery sql={}", sql);
         List<Object[]> m = Yank.queryObjectArrays(sql, null);
 
@@ -163,14 +164,8 @@ public class JdbcPostgresqlDAO extends JdbcBaseDAO {
      ****************************/
     static final DateTimeFormatter JDBC_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
-    /**
-     * @param filter
-     * @param numberDecimalcount
-     * @param table
-     * @return
-     */
     private String histItemFilterQueryProvider(FilterCriteria filter, int numberDecimalcount, String table,
-            String simpleName) {
+            String simpleName, ZoneId timeZone) {
         logger.debug(
                 "JDBC::getHistItemFilterQueryProvider filter = {}, numberDecimalcount = {}, table = {}, simpleName = {}",
                 filter.toString(), numberDecimalcount, table, simpleName);
@@ -178,11 +173,13 @@ public class JdbcPostgresqlDAO extends JdbcBaseDAO {
         String filterString = "";
         if (filter.getBeginDate() != null) {
             filterString += filterString.isEmpty() ? " WHERE" : " AND";
-            filterString += " TIME>'" + JDBC_DATE_FORMAT.format(filter.getBeginDate()) + "'";
+            filterString += " TIME>'" + JDBC_DATE_FORMAT.format(filter.getBeginDate().withZoneSameInstant(timeZone))
+                    + "'";
         }
         if (filter.getEndDate() != null) {
             filterString += filterString.isEmpty() ? " WHERE" : " AND";
-            filterString += " TIME<'" + JDBC_DATE_FORMAT.format(filter.getEndDate()) + "'";
+            filterString += " TIME<'" + JDBC_DATE_FORMAT.format(filter.getEndDate().withZoneSameInstant(timeZone))
+                    + "'";
         }
         filterString += (filter.getOrdering() == Ordering.ASCENDING) ? " ORDER BY time ASC" : " ORDER BY time DESC";
         if (filter.getPageSize() != 0x7fffffff) {
index dc5c25d92f5a406d30278aec4d58167f5e4f2ce8..a20124bdfd8ae2179d99293c1415d792d5d25d44 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.knowm.yank.Yank;
+import org.openhab.core.i18n.TimeZoneProvider;
 import org.openhab.core.items.Item;
 import org.openhab.core.persistence.FilterCriteria;
 import org.openhab.core.persistence.HistoricItem;
@@ -38,6 +39,8 @@ import org.slf4j.LoggerFactory;
 public class JdbcMapper {
     private final Logger logger = LoggerFactory.getLogger(JdbcMapper.class);
 
+    private final TimeZoneProvider timeZoneProvider;
+
     // Error counter - used to reconnect to database on error
     protected int errCnt;
     protected boolean initialized = false;
@@ -47,6 +50,10 @@ public class JdbcMapper {
     private long afterAccessMax = 0;
     private static final String ITEM_NAME_PATTERN = "[^a-zA-Z_0-9\\-]";
 
+    public JdbcMapper(TimeZoneProvider timeZoneProvider) {
+        this.timeZoneProvider = timeZoneProvider;
+    }
+
     /*****************
      * MAPPER ITEMS *
      *****************/
@@ -160,7 +167,7 @@ public class JdbcMapper {
         if (table != null) {
             long timerStart = System.currentTimeMillis();
             List<HistoricItem> r = conf.getDBDAO().doGetHistItemFilterQuery(item, filter, numberDecimalcount, table,
-                    item.getName());
+                    item.getName(), timeZoneProvider.getTimeZone());
             logTime("insertItemValue", timerStart, System.currentTimeMillis());
             return r;
         } else {
index e80bc4c63940a3745d02fbef6ca65a4b937faa92..996c6a60f360892be937f27c61eea6803c206c52 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Set;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.core.config.core.ConfigurableService;
+import org.openhab.core.i18n.TimeZoneProvider;
 import org.openhab.core.items.GroupItem;
 import org.openhab.core.items.Item;
 import org.openhab.core.items.ItemNotFoundException;
@@ -60,7 +61,9 @@ public class JdbcPersistenceService extends JdbcMapper implements QueryablePersi
     private final ItemRegistry itemRegistry;
 
     @Activate
-    public JdbcPersistenceService(final @Reference ItemRegistry itemRegistry) {
+    public JdbcPersistenceService(final @Reference ItemRegistry itemRegistry,
+            final @Reference TimeZoneProvider timeZoneProvider) {
+        super(timeZoneProvider);
         this.itemRegistry = itemRegistry;
     }