Skip to content

Commit

Permalink
[persistence] Implement HistoricItem.getInstant
Browse files Browse the repository at this point in the history
Signed-off-by: Jörg Sautter <[email protected]>
  • Loading branch information
joerg1985 committed Oct 17, 2024
1 parent b77458d commit 2f1c724
Show file tree
Hide file tree
Showing 16 changed files with 106 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ public static DynamoDBItem<?> fromStateNew(Item item, ZonedDateTime time, @Nulla
if (deserializedState == null) {
return null;
}
return new DynamoDBHistoricItem(getName(), deserializedState, getTime());
return new DynamoDBHistoricItem(getName(), deserializedState, getTime().toInstant());
} catch (Exception e) {
logger.trace("Failed to convert state '{}' to item {} {}: {} {}. Data persisted with incompatible item.",
this.state, item.getClass().getSimpleName(), item.getName(), e.getClass().getSimpleName(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
*/
package org.openhab.persistence.dynamodb.internal;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
Expand All @@ -33,12 +34,12 @@ public class DynamoDBHistoricItem implements HistoricItem {

private final String name;
private final State state;
private final ZonedDateTime timestamp;
private final Instant instant;

public DynamoDBHistoricItem(String name, State state, ZonedDateTime timestamp) {
public DynamoDBHistoricItem(String name, State state, Instant instant) {
this.name = name;
this.state = state;
this.timestamp = timestamp;
this.instant = instant;
}

@Override
Expand All @@ -48,7 +49,12 @@ public String getName() {

@Override
public ZonedDateTime getTimestamp() {
return timestamp;
return instant.atZone(ZoneId.systemDefault());
}

@Override
public Instant getInstant() {
return instant;
}

@Override
Expand All @@ -58,6 +64,6 @@ public State getState() {

@Override
public String toString() {
return name + ": " + DATEFORMATTER.format(timestamp) + ": " + state.toString();
return name + ": " + DATEFORMATTER.format(getTimestamp()) + ": " + state.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import static org.openhab.persistence.influxdb.internal.InfluxDBConstants.*;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.HashMap;
Expand Down Expand Up @@ -255,8 +254,7 @@ public Iterable<HistoricItem> query(FilterCriteria filter) {

private HistoricItem mapRowToHistoricItem(InfluxDBRepository.InfluxRow row) {
State state = InfluxDBStateConvertUtils.objectToState(row.value(), row.itemName(), itemRegistry);
return new InfluxDBHistoricItem(row.itemName(), state,
ZonedDateTime.ofInstant(row.time(), ZoneId.systemDefault()));
return new InfluxDBHistoricItem(row.itemName(), state, row.time());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
package org.openhab.persistence.influxdb.internal;

import java.text.DateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

import org.eclipse.jdt.annotation.NonNullByDefault;
Expand All @@ -30,12 +32,12 @@ public class InfluxDBHistoricItem implements HistoricItem {

private String name = "";
private final State state;
private final ZonedDateTime timestamp;
private final Instant instant;

public InfluxDBHistoricItem(String name, State state, ZonedDateTime timestamp) {
public InfluxDBHistoricItem(String name, State state, Instant instant) {
this.name = name;
this.state = state;
this.timestamp = timestamp;
this.instant = instant;
}

@Override
Expand All @@ -54,11 +56,16 @@ public State getState() {

@Override
public ZonedDateTime getTimestamp() {
return timestamp;
return instant.atZone(ZoneId.systemDefault());
}

@Override
public Instant getInstant() {
return instant;
}

@Override
public String toString() {
return DateFormat.getDateTimeInstance().format(timestamp) + ": " + name + " -> " + state.toString();
return DateFormat.getDateTimeInstance().format(getTimestamp()) + ": " + name + " -> " + state.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ public List<HistoricItem> doGetHistItemFilterQuery(Item item, FilterCriteria fil
String itemName = item.getName();
Unit<? extends Quantity<?>> unit = item instanceof NumberItem numberItem ? numberItem.getUnit() : null;
return m.stream()
.map(o -> new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsZonedDateTime(o[0])))
.map(o -> new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsInstant(o[0])))
.collect(Collectors.<HistoricItem> toList());
}

Expand Down Expand Up @@ -678,7 +678,7 @@ protected State objectAsState(Item item, @Nullable Unit<? extends Quantity<?>> u
}
return unit == null ? DecimalType.valueOf(objectAsString(v)) : QuantityType.valueOf(objectAsString(v));
} else if (item instanceof DateTimeItem) {
return new DateTimeType(objectAsZonedDateTime(v));
return new DateTimeType(objectAsInstant(v).atZone(ZoneId.systemDefault()));
} else if (item instanceof ColorItem) {
return HSBType.valueOf(objectAsString(v));
} else if (item instanceof DimmerItem || item instanceof RollershutterItem) {
Expand All @@ -704,20 +704,19 @@ protected State objectAsState(Item item, @Nullable Unit<? extends Quantity<?>> u
}
}

protected ZonedDateTime objectAsZonedDateTime(Object v) {
protected Instant objectAsInstant(Object v) {
if (v instanceof Long) {
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(((Number) v).longValue()), ZoneId.systemDefault());
return Instant.ofEpochMilli(((Number) v).longValue());
} else if (v instanceof java.sql.Date objectAsDate) {
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(objectAsDate.getTime()), ZoneId.systemDefault());
return Instant.ofEpochMilli(objectAsDate.getTime());
} else if (v instanceof LocalDateTime objectAsLocalDateTime) {
return objectAsLocalDateTime.atZone(ZoneId.systemDefault());
return objectAsLocalDateTime.atZone(ZoneId.systemDefault()).toInstant();
} else if (v instanceof Instant objectAsInstant) {
return objectAsInstant.atZone(ZoneId.systemDefault());
return objectAsInstant;
} else if (v instanceof java.sql.Timestamp objectAsTimestamp) {
return objectAsTimestamp.toInstant().atZone(ZoneId.systemDefault());
return objectAsTimestamp.toInstant();
} else if (v instanceof java.lang.String objectAsString) {
return ZonedDateTime.ofInstant(java.sql.Timestamp.valueOf(objectAsString).toInstant(),
ZoneId.systemDefault());
return java.sql.Timestamp.valueOf(objectAsString).toInstant();
}
throw new UnsupportedOperationException("Date of type '" + v.getClass().getName() + "' is not supported");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ public List<HistoricItem> doGetHistItemFilterQuery(Item item, FilterCriteria fil
Unit<? extends Quantity<?>> unit = item instanceof NumberItem ni ? ni.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]), objectAsZonedDateTime(o[0]));
return new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsInstant(o[0]));
}).collect(Collectors.<HistoricItem> toList());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
package org.openhab.persistence.jdbc.internal.db;

import java.sql.SQLException;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
Expand Down Expand Up @@ -288,16 +289,16 @@ protected String resolveTimeFilter(FilterCriteria filter, ZoneId timeZone) {
}

@Override
protected ZonedDateTime objectAsZonedDateTime(Object v) {
protected Instant objectAsInstant(Object v) {
if (v instanceof TIMESTAMP objectAsOracleTimestamp) {
try {
return objectAsOracleTimestamp.timestampValue().toInstant().atZone(ZoneId.systemDefault());
return objectAsOracleTimestamp.timestampValue().toInstant();
} catch (SQLException e) {
throw new UnsupportedOperationException("Date of type '" + v.getClass().getName()
+ "', no Timestamp representation exists for '" + objectAsOracleTimestamp.toString() + "'");
}
} else {
return super.objectAsZonedDateTime(v);
return super.objectAsInstant(v);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
*/
package org.openhab.persistence.jdbc.internal.dto;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

import org.eclipse.jdt.annotation.NonNullByDefault;
Expand All @@ -28,12 +30,12 @@ public class JdbcHistoricItem implements HistoricItem {

private final String name;
private final State state;
private final ZonedDateTime timestamp;
private final Instant instant;

public JdbcHistoricItem(String name, State state, ZonedDateTime timestamp) {
public JdbcHistoricItem(String name, State state, Instant instant) {
this.name = name;
this.state = state;
this.timestamp = timestamp;
this.instant = instant;
}

@Override
Expand All @@ -48,7 +50,12 @@ public State getState() {

@Override
public ZonedDateTime getTimestamp() {
return timestamp;
return instant.atZone(ZoneId.systemDefault());
}

@Override
public Instant getInstant() {
return instant;
}

@Override
Expand All @@ -59,7 +66,7 @@ public String toString() {
builder.append(", state=");
builder.append(state);
builder.append(", timestamp=");
builder.append(timestamp);
builder.append(getTimestamp());
builder.append("]");
return builder.toString();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,12 @@ public class JpaHistoricItem implements HistoricItem {

private final String name;
private final State state;
private final ZonedDateTime timestamp;
private final Instant instant;

public JpaHistoricItem(String name, State state, ZonedDateTime timestamp) {
public JpaHistoricItem(String name, State state, Instant instant) {
this.name = name;
this.state = state;
this.timestamp = timestamp;
this.instant = instant;
}

@Override
Expand All @@ -76,7 +76,12 @@ public String getName() {

@Override
public ZonedDateTime getTimestamp() {
return timestamp;
return instant.atZone(ZoneId.systemDefault());
}

@Override
public Instant getInstant() {
return instant;
}

@Override
Expand All @@ -86,7 +91,7 @@ public State getState() {

@Override
public String toString() {
return DateFormat.getDateTimeInstance().format(timestamp) + ": " + name + " -> " + state.toString();
return DateFormat.getDateTimeInstance().format(getTimestamp()) + ": " + name + " -> " + state;
}

/**
Expand Down Expand Up @@ -156,6 +161,6 @@ public static List<HistoricItem> fromResultList(List<JpaPersistentItem> jpaQuery
state = new StringType(pItem.getValue());
}

return new JpaHistoricItem(item.getName(), state, pItem.getTimestamp());
return new JpaHistoricItem(item.getName(), state, pItem.getInstant());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
package org.openhab.persistence.jpa.internal.model;

import java.text.DateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
Expand Down Expand Up @@ -88,6 +89,11 @@ public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}

@Override
public Instant getInstant() {
return timestamp.toInstant();
}

public String getValue() {
return value;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
package org.openhab.persistence.mapdb.internal;

import java.text.DateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
Expand Down Expand Up @@ -64,6 +65,11 @@ public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}

@Override
public Instant getInstant() {
return timestamp.toInstant();
}

@Override
public String toString() {
return DateFormat.getDateTimeInstance().format(timestamp) + ": " + name + " -> " + state.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
package org.openhab.persistence.mongodb.internal;

import java.text.DateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

Expand All @@ -30,12 +32,12 @@ public class MongoDBItem implements HistoricItem {

private final String name;
private final State state;
private final ZonedDateTime timestamp;
private final Instant instant;

public MongoDBItem(String name, State state, ZonedDateTime timestamp) {
public MongoDBItem(String name, State state, Instant instant) {
this.name = name;
this.state = state;
this.timestamp = timestamp;
this.instant = instant;
}

@Override
Expand All @@ -50,12 +52,17 @@ public State getState() {

@Override
public ZonedDateTime getTimestamp() {
return timestamp;
return instant.atZone(ZoneId.systemDefault());
}

@Override
public Instant getInstant() {
return instant;
}

@Override
public String toString() {
Date date = Date.from(timestamp.toInstant());
return DateFormat.getDateTimeInstance().format(date) + ": " + name + " -> " + state.toString();
Date date = Date.from(instant);
return DateFormat.getDateTimeInstance().format(date) + ": " + name + " -> " + state;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
*/
package org.openhab.persistence.mongodb.internal;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -287,8 +286,7 @@ public Iterable<HistoricItem> query(FilterCriteria filter) {

final State state = MongoDBTypeConversions.getStateFromDocument(item, obj);

items.add(new MongoDBItem(realItemName, state, ZonedDateTime
.ofInstant(obj.getDate(MongoDBFields.FIELD_TIMESTAMP).toInstant(), ZoneId.systemDefault())));
items.add(new MongoDBItem(realItemName, state, obj.getDate(MongoDBFields.FIELD_TIMESTAMP).toInstant()));
}
} finally {
if (cursor != null) {
Expand Down
Loading

0 comments on commit 2f1c724

Please sign in to comment.