Skip to content

Commit

Permalink
[inmemory] Fix boundaries for queries (#16563)
Browse files Browse the repository at this point in the history
Queries should include the boundaries, but the previous code did not.

Signed-off-by: Jan N. Klug <github@klug.nrw>
  • Loading branch information
J-N-K committed Mar 24, 2024
1 parent cac9e2c commit a1cef70
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -271,11 +271,11 @@ private void internalStore(String itemName, ZonedDateTime timestamp, State state
@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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,4 +211,68 @@ public void removeBetweenTimes() {
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
}
}

0 comments on commit a1cef70

Please sign in to comment.