Consolidate and optimize datetime conversions (#13483)
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
This commit is contained in:
parent
6835c278e1
commit
12389f083d
|
@ -348,7 +348,8 @@ public class JdbcBaseDAO {
|
||||||
// we already retrieve the unit here once as it is a very costly operation
|
// we already retrieve the unit here once as it is a very costly operation
|
||||||
String itemName = item.getName();
|
String itemName = item.getName();
|
||||||
Unit<? extends Quantity<?>> unit = item instanceof NumberItem ? ((NumberItem) item).getUnit() : null;
|
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());
|
.collect(Collectors.<HistoricItem> toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -541,8 +542,7 @@ public class JdbcBaseDAO {
|
||||||
}
|
}
|
||||||
return unit == null ? DecimalType.valueOf(objectAsString(v)) : QuantityType.valueOf(objectAsString(v));
|
return unit == null ? DecimalType.valueOf(objectAsString(v)) : QuantityType.valueOf(objectAsString(v));
|
||||||
} else if (item instanceof DateTimeItem) {
|
} else if (item instanceof DateTimeItem) {
|
||||||
return new DateTimeType(
|
return new DateTimeType(objectAsZonedDateTime(v));
|
||||||
ZonedDateTime.ofInstant(Instant.ofEpochMilli(objectAsLong(v)), ZoneId.systemDefault()));
|
|
||||||
} else if (item instanceof ColorItem) {
|
} else if (item instanceof ColorItem) {
|
||||||
return HSBType.valueOf(objectAsString(v));
|
return HSBType.valueOf(objectAsString(v));
|
||||||
} else if (item instanceof DimmerItem || item instanceof RollershutterItem) {
|
} else if (item instanceof DimmerItem || item instanceof RollershutterItem) {
|
||||||
|
@ -564,13 +564,17 @@ public class JdbcBaseDAO {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ZonedDateTime objectAsDate(Object v) {
|
protected ZonedDateTime objectAsZonedDateTime(Object v) {
|
||||||
if (v instanceof LocalDateTime) {
|
if (v instanceof Long) {
|
||||||
return ZonedDateTime.of((LocalDateTime) v, ZoneId.systemDefault());
|
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(((Number) v).longValue()), ZoneId.systemDefault());
|
||||||
} else if (v instanceof java.sql.Timestamp) {
|
} else if (v instanceof java.sql.Date) {
|
||||||
return ZonedDateTime.ofInstant(((java.sql.Timestamp) v).toInstant(), ZoneId.systemDefault());
|
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(((java.sql.Date) v).getTime()), ZoneId.systemDefault());
|
||||||
|
} else if (v instanceof LocalDateTime) {
|
||||||
|
return ((LocalDateTime) v).atZone(ZoneId.systemDefault());
|
||||||
} else if (v instanceof Instant) {
|
} else if (v instanceof Instant) {
|
||||||
return ZonedDateTime.ofInstant((Instant) v, ZoneId.systemDefault());
|
return ((Instant) v).atZone(ZoneId.systemDefault());
|
||||||
|
} else if (v instanceof java.sql.Timestamp) {
|
||||||
|
return ((java.sql.Timestamp) v).toInstant().atZone(ZoneId.systemDefault());
|
||||||
} else if (v instanceof java.lang.String) {
|
} else if (v instanceof java.lang.String) {
|
||||||
return ZonedDateTime.ofInstant(java.sql.Timestamp.valueOf(v.toString()).toInstant(),
|
return ZonedDateTime.ofInstant(java.sql.Timestamp.valueOf(v.toString()).toInstant(),
|
||||||
ZoneId.systemDefault());
|
ZoneId.systemDefault());
|
||||||
|
@ -578,21 +582,6 @@ public class JdbcBaseDAO {
|
||||||
throw new UnsupportedOperationException("Date of type " + v.getClass().getName() + " is not supported");
|
throw new UnsupportedOperationException("Date of type " + v.getClass().getName() + " is not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Long objectAsLong(Object v) {
|
|
||||||
if (v instanceof Long) {
|
|
||||||
return ((Number) v).longValue();
|
|
||||||
} else if (v instanceof java.sql.Date) {
|
|
||||||
return ((java.sql.Date) v).getTime();
|
|
||||||
} else if (v instanceof LocalDateTime) {
|
|
||||||
return ((LocalDateTime) v).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
|
|
||||||
} else if (v instanceof Instant) {
|
|
||||||
return ((Instant) v).toEpochMilli();
|
|
||||||
} else if (v instanceof java.sql.Timestamp) {
|
|
||||||
return ((java.sql.Timestamp) v).getTime();
|
|
||||||
}
|
|
||||||
throw new UnsupportedOperationException("Date of type " + v.getClass().getName() + " is not supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Integer objectAsInteger(Object v) {
|
protected Integer objectAsInteger(Object v) {
|
||||||
if (v instanceof Byte) {
|
if (v instanceof Byte) {
|
||||||
return ((Byte) v).intValue();
|
return ((Byte) v).intValue();
|
||||||
|
|
|
@ -174,7 +174,7 @@ public class JdbcDerbyDAO extends JdbcBaseDAO {
|
||||||
Unit<? extends Quantity<?>> unit = item instanceof NumberItem ? ((NumberItem) item).getUnit() : null;
|
Unit<? extends Quantity<?>> unit = item instanceof NumberItem ? ((NumberItem) item).getUnit() : null;
|
||||||
return m.stream().map(o -> {
|
return m.stream().map(o -> {
|
||||||
logger.debug("JDBC::doGetHistItemFilterQuery 0='{}' 1='{}'", o[0], o[1]);
|
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());
|
}).collect(Collectors.<HistoricItem> toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
|
@ -85,16 +86,6 @@ public class JdbcBaseDAOTest {
|
||||||
assertInstanceOf(QuantityType.class, quantityType);
|
assertInstanceOf(QuantityType.class, quantityType);
|
||||||
assertEquals(QuantityType.valueOf("7.3 °C"), 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");
|
State hsbType = jdbcBaseDAO.objectAsState(new ColorItem("testColorItem"), null, "184,100,52");
|
||||||
assertInstanceOf(HSBType.class, hsbType);
|
assertInstanceOf(HSBType.class, hsbType);
|
||||||
assertEquals(HSBType.valueOf("184,100,52"), hsbType);
|
assertEquals(HSBType.valueOf("184,100,52"), hsbType);
|
||||||
|
@ -140,6 +131,60 @@ public class JdbcBaseDAOTest {
|
||||||
assertEquals(StringType.valueOf("String"), stringType);
|
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
|
@Test
|
||||||
public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrder() {
|
public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrder() {
|
||||||
String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
|
String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);
|
||||||
|
|
Loading…
Reference in New Issue