Series.lastValue + lastDate

This commit is contained in:
Patrick Haßel 2024-10-16 14:36:08 +02:00
parent 0926e949fa
commit 45dfaf5f5c
7 changed files with 50 additions and 13 deletions

View File

@ -5,4 +5,4 @@ spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
#-
spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.ddl-auto=update

View File

@ -5,6 +5,7 @@ import jakarta.annotation.Nullable;
import jakarta.persistence.*;
import lombok.*;
import java.time.ZonedDateTime;
import java.util.HashSet;
import java.util.Set;
@ -36,14 +37,25 @@ public class Series {
@ToString.Exclude
private Period period;
@Setter
@NonNull
@Column(nullable = false)
private ZonedDateTime lastDate;
@Setter
@Column(nullable = false)
private double lastValue;
@NonNull
@ElementCollection
private Set<String> aliases = new HashSet<>();
public Series(@NonNull final String name, @NonNull final SeriesMode mode, @NonNull final String unit) {
public Series(@NonNull final String name, @NonNull final SeriesMode mode, @NonNull final ZonedDateTime date, final double value, String unit) {
this.name = name;
this.mode = mode;
this.unit = unit;
this.lastDate = date;
this.lastValue = value;
}
}

View File

@ -5,21 +5,29 @@ import lombok.NonNull;
import java.util.function.BiFunction;
public enum SeriesMode {
MEASURE((first, second) -> second - first),
COUNTER((first, second) -> second - first),
INCREASING((first, second) -> second - first),
DECREASING((first, second) -> first - second),
MEASURE((first, second) -> second - first, (last, value) -> value),
COUNTER((first, second) -> second - first, Double::sum),
INCREASING((first, second) -> second - first, (last, value) -> value),
DECREASING((first, second) -> first - second, (last, value) -> value),
;
@NonNull
private final BiFunction<Double, Double, Double> delta;
SeriesMode(@NonNull final BiFunction<Double, Double, Double> delta) {
@NonNull
private final BiFunction<Double, Double, Double> add;
SeriesMode(@NonNull final BiFunction<Double, Double, Double> delta, @NonNull final BiFunction<Double, Double, Double> add) {
this.delta = delta;
this.add = add;
}
public double getDelta(final double first, final double second) {
return delta.apply(first, second);
}
public double update(final double series, final double value) {
return add.apply(series, value);
}
}

View File

@ -6,6 +6,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.ZonedDateTime;
@Slf4j
@Service
@Transactional
@ -15,8 +17,8 @@ public class SeriesService {
private final SeriesRepository seriesRepository;
@NonNull
public Series getOrCreateByName(@NonNull final String name, @NonNull final SeriesMode mode, @NonNull final String unit) {
final Series series = seriesRepository.findByNameOrAliasesContains(name, name).orElseGet(() -> seriesRepository.save(new Series(name, mode, unit)));
public Series getOrCreateByName(@NonNull final String name, @NonNull final SeriesMode mode, @NonNull final ZonedDateTime date, final double value, @NonNull final String unit) {
final Series series = seriesRepository.findByNameOrAliasesContains(name, name).orElseGet(() -> seriesRepository.save(new Series(name, mode, date, value, unit)));
if (series.getMode() != mode) {
throw new RuntimeException("'mode' argument for getOrCreateByName does not match 'mode' of existing Series: mode=%s, series=%s".formatted(mode, series));
}

View File

@ -31,10 +31,15 @@ public class ConsumptionService {
@EventListener(ConsumptionEvent.class)
public void onConsumptionEvent(@NonNull final ConsumptionEvent event) {
log.debug("Handling ConsumptionEvent: {}", event);
final Series series = seriesService.getOrCreateByName(event.getName(), event.isIncreasing() ? SeriesMode.INCREASING : SeriesMode.DECREASING, event.getUnit());
final Series series = seriesService.getOrCreateByName(event.getName(), event.isIncreasing() ? SeriesMode.INCREASING : SeriesMode.DECREASING, event.getDate(), event.getValue(), event.getUnit());
series.setLastDate(event.getDate());
series.setLastValue(series.getMode().update(series.getLastValue(), event.getValue()));
final Period period = periodService.getOrCreatePeriod(series, event);
period.setLastDate(event.getDate());
period.setLastValue(event.getValue());
period.setLastValue(series.getMode().update(period.getLastValue(), event.getValue()));
for (final Unit unit : Unit.values()) {
final ZonedDateTime aligned = unit.align(event.getDate());
final Optional<Consumption> existingOptional = consumptionRepository.findByIdPeriodAndIdUnitAndIdAligned(period, unit, aligned);

View File

@ -24,7 +24,12 @@ public class CounterService {
@EventListener(CounterEvent.class)
public void onCounterEvent(@NonNull final CounterEvent event) {
final Series series = seriesService.getOrCreateByName(event.getName(), SeriesMode.COUNTER, event.getUnit());
log.debug("Handling CounterEvent: {}", event);
final Series series = seriesService.getOrCreateByName(event.getName(), SeriesMode.COUNTER, event.getDate(), event.getCount(), event.getUnit());
series.setLastDate(event.getDate());
series.setLastValue(series.getMode().update(series.getLastValue(), event.getCount()));
for (final Unit unit : Unit.values()) {
final SeriesIntervalKey id = new SeriesIntervalKey(series, unit, event.getDate());
counterRepository.findById(id)

View File

@ -24,7 +24,12 @@ public class MeasureService {
@EventListener(MeasureEvent.class)
public void onMeasureEvent(@NonNull final MeasureEvent event) {
final Series series = seriesService.getOrCreateByName(event.getName(), SeriesMode.MEASURE, event.getUnit());
log.debug("Handling MeasureEvent: {}", event);
final Series series = seriesService.getOrCreateByName(event.getName(), SeriesMode.MEASURE, event.getDate(), event.getValue(), event.getUnit());
series.setLastDate(event.getDate());
series.setLastValue(series.getMode().update(series.getLastValue(), event.getValue()));
for (final Unit unit : Unit.values()) {
final SeriesIntervalKey id = new SeriesIntervalKey(series, unit, event.getDate());
measureRepository.findById(id)