[inmemory] Fix boundaries for queries (#16563)

Queries should include the boundaries, but the previous code did not.

Signed-off-by: Jan N. Klug <github@klug.nrw>
This commit is contained in:
J-N-K 2024-03-24 10:31:47 +01:00 committed by GitHub
parent cac9e2ccda
commit a1cef70277
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 66 additions and 2 deletions

View File

@ -271,11 +271,11 @@ public class InMemoryPersistenceService implements ModifiablePersistenceService
@SuppressWarnings({ "rawType", "unchecked" }) @SuppressWarnings({ "rawType", "unchecked" })
private boolean applies(PersistEntry entry, FilterCriteria filter) { private boolean applies(PersistEntry entry, FilterCriteria filter) {
ZonedDateTime beginDate = filter.getBeginDate(); ZonedDateTime beginDate = filter.getBeginDate();
if (beginDate != null && entry.timestamp().isBefore(beginDate)) { if (beginDate != null && beginDate.isAfter(entry.timestamp())) {
return false; return false;
} }
ZonedDateTime endDate = filter.getEndDate(); ZonedDateTime endDate = filter.getEndDate();
if (endDate != null && entry.timestamp().isAfter(endDate)) { if (endDate != null && endDate.isBefore(entry.timestamp())) {
return false; return false;
} }

View File

@ -211,4 +211,68 @@ public class InMemoryPersistenceTests {
assertThat(storedStates.last().getState(), is(historicState3)); assertThat(storedStates.last().getState(), is(historicState3));
assertThat(storedStates.last().getTimestamp(), is(expectedTime.plusHours(4))); 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
}
} }