Series.lastValue + lastDate
This commit is contained in:
parent
0926e949fa
commit
45dfaf5f5c
@ -5,4 +5,4 @@ spring.datasource.driverClassName=org.h2.Driver
|
|||||||
spring.datasource.username=sa
|
spring.datasource.username=sa
|
||||||
spring.datasource.password=password
|
spring.datasource.password=password
|
||||||
#-
|
#-
|
||||||
spring.jpa.hibernate.ddl-auto=create
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import jakarta.annotation.Nullable;
|
|||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.time.ZonedDateTime;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@ -36,14 +37,25 @@ public class Series {
|
|||||||
@ToString.Exclude
|
@ToString.Exclude
|
||||||
private Period period;
|
private Period period;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@NonNull
|
||||||
|
@Column(nullable = false)
|
||||||
|
private ZonedDateTime lastDate;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@Column(nullable = false)
|
||||||
|
private double lastValue;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@ElementCollection
|
@ElementCollection
|
||||||
private Set<String> aliases = new HashSet<>();
|
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.name = name;
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
this.unit = unit;
|
this.unit = unit;
|
||||||
|
this.lastDate = date;
|
||||||
|
this.lastValue = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,21 +5,29 @@ import lombok.NonNull;
|
|||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
|
|
||||||
public enum SeriesMode {
|
public enum SeriesMode {
|
||||||
MEASURE((first, second) -> second - first),
|
MEASURE((first, second) -> second - first, (last, value) -> value),
|
||||||
COUNTER((first, second) -> second - first),
|
COUNTER((first, second) -> second - first, Double::sum),
|
||||||
INCREASING((first, second) -> second - first),
|
INCREASING((first, second) -> second - first, (last, value) -> value),
|
||||||
DECREASING((first, second) -> first - second),
|
DECREASING((first, second) -> first - second, (last, value) -> value),
|
||||||
;
|
;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final BiFunction<Double, Double, Double> delta;
|
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.delta = delta;
|
||||||
|
this.add = add;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getDelta(final double first, final double second) {
|
public double getDelta(final double first, final double second) {
|
||||||
return delta.apply(first, second);
|
return delta.apply(first, second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double update(final double series, final double value) {
|
||||||
|
return add.apply(series, value);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,8 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.ZonedDateTime;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@Transactional
|
@Transactional
|
||||||
@ -15,8 +17,8 @@ public class SeriesService {
|
|||||||
private final SeriesRepository seriesRepository;
|
private final SeriesRepository seriesRepository;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public Series getOrCreateByName(@NonNull final String name, @NonNull final SeriesMode mode, @NonNull final String 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, unit)));
|
final Series series = seriesRepository.findByNameOrAliasesContains(name, name).orElseGet(() -> seriesRepository.save(new Series(name, mode, date, value, unit)));
|
||||||
if (series.getMode() != mode) {
|
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));
|
throw new RuntimeException("'mode' argument for getOrCreateByName does not match 'mode' of existing Series: mode=%s, series=%s".formatted(mode, series));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,10 +31,15 @@ public class ConsumptionService {
|
|||||||
@EventListener(ConsumptionEvent.class)
|
@EventListener(ConsumptionEvent.class)
|
||||||
public void onConsumptionEvent(@NonNull final ConsumptionEvent event) {
|
public void onConsumptionEvent(@NonNull final ConsumptionEvent event) {
|
||||||
log.debug("Handling 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);
|
final Period period = periodService.getOrCreatePeriod(series, event);
|
||||||
period.setLastDate(event.getDate());
|
period.setLastDate(event.getDate());
|
||||||
period.setLastValue(event.getValue());
|
period.setLastValue(series.getMode().update(period.getLastValue(), event.getValue()));
|
||||||
|
|
||||||
for (final Unit unit : Unit.values()) {
|
for (final Unit unit : Unit.values()) {
|
||||||
final ZonedDateTime aligned = unit.align(event.getDate());
|
final ZonedDateTime aligned = unit.align(event.getDate());
|
||||||
final Optional<Consumption> existingOptional = consumptionRepository.findByIdPeriodAndIdUnitAndIdAligned(period, unit, aligned);
|
final Optional<Consumption> existingOptional = consumptionRepository.findByIdPeriodAndIdUnitAndIdAligned(period, unit, aligned);
|
||||||
|
|||||||
@ -24,7 +24,12 @@ public class CounterService {
|
|||||||
|
|
||||||
@EventListener(CounterEvent.class)
|
@EventListener(CounterEvent.class)
|
||||||
public void onCounterEvent(@NonNull final CounterEvent event) {
|
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()) {
|
for (final Unit unit : Unit.values()) {
|
||||||
final SeriesIntervalKey id = new SeriesIntervalKey(series, unit, event.getDate());
|
final SeriesIntervalKey id = new SeriesIntervalKey(series, unit, event.getDate());
|
||||||
counterRepository.findById(id)
|
counterRepository.findById(id)
|
||||||
|
|||||||
@ -24,7 +24,12 @@ public class MeasureService {
|
|||||||
|
|
||||||
@EventListener(MeasureEvent.class)
|
@EventListener(MeasureEvent.class)
|
||||||
public void onMeasureEvent(@NonNull final MeasureEvent event) {
|
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()) {
|
for (final Unit unit : Unit.values()) {
|
||||||
final SeriesIntervalKey id = new SeriesIntervalKey(series, unit, event.getDate());
|
final SeriesIntervalKey id = new SeriesIntervalKey(series, unit, event.getDate());
|
||||||
measureRepository.findById(id)
|
measureRepository.findById(id)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user