]> git.basschouten.com Git - openhab-addons.git/commitdiff
[inmemory] Fix boundaries for queries (#16563)
authorJ-N-K <github@klug.nrw>
Sun, 24 Mar 2024 09:31:47 +0000 (10:31 +0100)
committerGitHub <noreply@github.com>
Sun, 24 Mar 2024 09:31:47 +0000 (10:31 +0100)
Queries should include the boundaries, but the previous code did not.

Signed-off-by: Jan N. Klug <github@klug.nrw>
bundles/org.openhab.persistence.inmemory/src/main/java/org/openhab/persistence/inmemory/internal/InMemoryPersistenceService.java
bundles/org.openhab.persistence.inmemory/src/test/java/org/openhab/persistence/inmemory/internal/InMemoryPersistenceTests.java

index 14af3f72f71717320b9948c9df2b90a6820bc272..0caf9721fb520ec2a56a4dd0b5e23c5f03f367fe 100644 (file)
@@ -271,11 +271,11 @@ public class InMemoryPersistenceService implements ModifiablePersistenceService
     @SuppressWarnings({ "rawType", "unchecked" })
     private boolean applies(PersistEntry entry, FilterCriteria filter) {
         ZonedDateTime beginDate = filter.getBeginDate();
-        if (beginDate != null && entry.timestamp().isBefore(beginDate)) {
+        if (beginDate != null && beginDate.isAfter(entry.timestamp())) {
             return false;
         }
         ZonedDateTime endDate = filter.getEndDate();
-        if (endDate != null && entry.timestamp().isAfter(endDate)) {
+        if (endDate != null && endDate.isBefore(entry.timestamp())) {
             return false;
         }
 
index ce945a6b6daac108939ee5b221304a70da137c66..ef00db6ef76ab0f9a53ed3b87cfdfb02cc071c2e 100644 (file)
@@ -211,4 +211,68 @@ public class InMemoryPersistenceTests {
         assertThat(storedStates.last().getState(), is(historicState3));
         assertThat(storedStates.last().getTimestamp(), is(expectedTime.plusHours(4)));
     }
+
+    @Test
+    public void endDateProperlyObserved() {
+        TreeSet<HistoricItem> storedStates = new TreeSet<>(Comparator.comparing(HistoricItem::getTimestamp));
+
+        State historicState1 = new StringType("value1");
+        State historicState2 = new StringType("value2");
+
+        ZonedDateTime historicTime1 = ZonedDateTime.of(2022, 05, 31, 10, 0, 0, 0, ZoneId.systemDefault());
+        ZonedDateTime historicTime2 = historicTime1.plusHours(2);
+        service.store(item, historicTime1, historicState1);
+        service.store(item, historicTime2, historicState2);
+
+        // end date is between first and second date, only return one dataset
+        filterCriteria = new FilterCriteria();
+        filterCriteria.setItemName(ITEM_NAME);
+        filterCriteria.setEndDate(historicTime1.plusHours(1));
+
+        service.query(filterCriteria).forEach(storedStates::add);
+        assertThat(storedStates.size(), is(1));
+
+        // end date is exactly second date, return both dataset
+        storedStates.clear();
+        filterCriteria = new FilterCriteria();
+        filterCriteria.setItemName(ITEM_NAME);
+        filterCriteria.setEndDate(historicTime2);
+
+        service.query(filterCriteria).forEach(storedStates::add);
+        assertThat(storedStates.size(), is(2));
+
+        // end date is after second date is already covered by case #1
+    }
+
+    @Test
+    public void beginDateProperlyObserved() {
+        TreeSet<HistoricItem> storedStates = new TreeSet<>(Comparator.comparing(HistoricItem::getTimestamp));
+
+        State historicState1 = new StringType("value1");
+        State historicState2 = new StringType("value2");
+
+        ZonedDateTime historicTime1 = ZonedDateTime.of(2022, 05, 31, 10, 0, 0, 0, ZoneId.systemDefault());
+        ZonedDateTime historicTime2 = historicTime1.plusHours(2);
+        service.store(item, historicTime1, historicState1);
+        service.store(item, historicTime2, historicState2);
+
+        // begin date is between first and second date, only return one dataset
+        filterCriteria = new FilterCriteria();
+        filterCriteria.setItemName(ITEM_NAME);
+        filterCriteria.setEndDate(historicTime2.minusHours(1));
+
+        service.query(filterCriteria).forEach(storedStates::add);
+        assertThat(storedStates.size(), is(1));
+
+        // begin date is exactly first date, return both dataset
+        storedStates.clear();
+        filterCriteria = new FilterCriteria();
+        filterCriteria.setItemName(ITEM_NAME);
+        filterCriteria.setBeginDate(historicTime1);
+
+        service.query(filterCriteria).forEach(storedStates::add);
+        assertThat(storedStates.size(), is(2));
+
+        // begin date is before first date is already covered by case #1
+    }
 }