From: joerg1985 <16140691+joerg1985@users.noreply.github.com> Date: Mon, 5 Feb 2024 09:38:56 +0000 (+0100) Subject: Improved querying the RRD4jPersistenceService (#16360) X-Git-Url: https://git.basschouten.com/?a=commitdiff_plain;h=e3d5e5d999c97fbac470d0e38c1e474b298fbbed;p=openhab-addons.git Improved querying the RRD4jPersistenceService (#16360) Signed-off-by: Jörg Sautter --- diff --git a/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java b/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java index f77dc6e6b5..0fedb56922 100644 --- a/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java +++ b/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java @@ -33,6 +33,7 @@ import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.function.DoubleFunction; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -443,6 +444,8 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { long end = filterEndDate == null ? System.currentTimeMillis() / 1000 : filterEndDate.toInstant().getEpochSecond(); + DoubleFunction toState = toStateMapper(item, unit); + try { if (filterBeginDate == null) { // as rrd goes back for years and gets more and more inaccurate, we only support descending order @@ -455,8 +458,8 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { // we are asked only for the most recent value! double lastValue = db.getLastDatasourceValue(DATASOURCE_STATE); if (!Double.isNaN(lastValue)) { - HistoricItem rrd4jItem = new RRD4jItem(itemName, mapToState(lastValue, item, unit), - ZonedDateTime.ofInstant(Instant.ofEpochMilli(db.getLastArchiveUpdateTime() * 1000), + HistoricItem rrd4jItem = new RRD4jItem(itemName, toState.apply(lastValue), + ZonedDateTime.ofInstant(Instant.ofEpochSecond(db.getLastArchiveUpdateTime()), ZoneId.systemDefault())); return List.of(rrd4jItem); } else { @@ -486,13 +489,14 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { List items = new ArrayList<>(); long ts = result.getFirstTimestamp(); + ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochSecond(ts), ZoneId.systemDefault()); long step = result.getRowCount() > 1 ? result.getStep() : 0; for (double value : result.getValues(DATASOURCE_STATE)) { if (!Double.isNaN(value) && (((ts >= start) && (ts <= end)) || (start == end))) { - RRD4jItem rrd4jItem = new RRD4jItem(itemName, mapToState(value, item, unit), - ZonedDateTime.ofInstant(Instant.ofEpochSecond(ts), ZoneId.systemDefault())); + RRD4jItem rrd4jItem = new RRD4jItem(itemName, toState.apply(value), zdt); items.add(rrd4jItem); } + zdt = zdt.plusSeconds(step); ts += step; } return items; @@ -603,25 +607,24 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { } } - @SuppressWarnings({ "unchecked", "rawtypes" }) - private State mapToState(double value, @Nullable Item item, @Nullable Unit unit) { + private > DoubleFunction toStateMapper(@Nullable Item item, @Nullable Unit unit) { if (item instanceof GroupItem groupItem) { item = groupItem.getBaseItem(); } if (item instanceof SwitchItem && !(item instanceof DimmerItem)) { - return OnOffType.from(value != 0.0d); + return (value) -> OnOffType.from(value != 0.0d); } else if (item instanceof ContactItem) { - return value == 0.0d ? OpenClosedType.CLOSED : OpenClosedType.OPEN; + return (value) -> value == 0.0d ? OpenClosedType.CLOSED : OpenClosedType.OPEN; } else if (item instanceof DimmerItem || item instanceof RollershutterItem || item instanceof ColorItem) { // make sure Items that need PercentTypes instead of DecimalTypes do receive the right information - return new PercentType((int) Math.round(value * 100)); + return (value) -> new PercentType((int) Math.round(value * 100)); } else if (item instanceof NumberItem) { if (unit != null) { - return new QuantityType(value, unit); + return (value) -> new QuantityType<>(value, unit); } } - return new DecimalType(value); + return DecimalType::new; } private boolean isSupportedItemType(Item item) {