From 133df3aa4089804618ea246d579be2b0ec25ec1b Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Thu, 24 Dec 2020 02:19:08 +0100 Subject: [PATCH] [jdbc] Consider local timezone to create time filter (#9445) * Consider local timezone to create time filter * Use user-defined timeZone Signed-off-by: Christoph Weitkamp --- .../persistence/jdbc/db/JdbcBaseDAO.java | 12 +++++++----- .../persistence/jdbc/db/JdbcDerbyDAO.java | 19 ++++++++----------- .../jdbc/db/JdbcPostgresqlDAO.java | 19 ++++++++----------- .../persistence/jdbc/internal/JdbcMapper.java | 9 ++++++++- .../jdbc/internal/JdbcPersistenceService.java | 5 ++++- 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcBaseDAO.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcBaseDAO.java index 661880457..382ed002d 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcBaseDAO.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcBaseDAO.java @@ -330,8 +330,8 @@ public class JdbcBaseDAO { } public List 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 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) { diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcDerbyDAO.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcDerbyDAO.java index 369da5ce9..8e2091748 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcDerbyDAO.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcDerbyDAO.java @@ -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 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 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) { diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcPostgresqlDAO.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcPostgresqlDAO.java index d7292cae1..0cfd70091 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcPostgresqlDAO.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcPostgresqlDAO.java @@ -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 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 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) { diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcMapper.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcMapper.java index dc5c25d92..a20124bdf 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcMapper.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcMapper.java @@ -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 r = conf.getDBDAO().doGetHistItemFilterQuery(item, filter, numberDecimalcount, table, - item.getName()); + item.getName(), timeZoneProvider.getTimeZone()); logTime("insertItemValue", timerStart, System.currentTimeMillis()); return r; } else { diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcPersistenceService.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcPersistenceService.java index e80bc4c63..996c6a60f 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcPersistenceService.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcPersistenceService.java @@ -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; }