Data/src/main/java/de/ph87/data/series/varying/VaryingService.java

99 lines
4.1 KiB
Java

package de.ph87.data.series.varying;
import de.ph87.data.series.*;
import de.ph87.data.series.graph.*;
import de.ph87.data.series.varying.day.*;
import de.ph87.data.series.varying.five.*;
import de.ph87.data.series.varying.hour.*;
import de.ph87.data.series.varying.month.*;
import de.ph87.data.series.varying.week.*;
import de.ph87.data.series.varying.year.*;
import lombok.*;
import lombok.extern.slf4j.*;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.*;
import org.springframework.transaction.annotation.*;
import java.util.*;
@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
public class VaryingService {
private final SeriesService seriesService;
private final VaryingFiveRepository varyingFiveRepository;
private final VaryingHourRepository varyingHourRepository;
private final VaryingDayRepository varyingDayRepository;
private final VaryingWeekRepository varyingWeekRepository;
private final VaryingMonthRepository varyingMonthRepository;
private final VaryingYearRepository varyingYearRepository;
@EventListener(VaryingInbound.class)
public void onInbound(@NonNull final VaryingInbound inbound) {
seriesService.onInbound(inbound, SeriesType.VARYING, series -> onInbound(series, inbound));
}
@NonNull
private Series onInbound(@NonNull final Series series, @NonNull final VaryingInbound inbound) {
final Varying.Id five = new Varying.Id(series, inbound.date, Alignment.FIVE);
varyingFiveRepository.findById(five).ifPresentOrElse(existing -> existing.update(inbound.value), () -> varyingFiveRepository.save(new VaryingFive(five, inbound.value)));
final Varying.Id hour = new Varying.Id(series, inbound.date, Alignment.HOUR);
varyingHourRepository.findById(hour).ifPresentOrElse(existing -> existing.update(inbound.value), () -> varyingHourRepository.save(new VaryingHour(hour, inbound.value)));
final Varying.Id day = new Varying.Id(series, inbound.date, Alignment.DAY);
varyingDayRepository.findById(day).ifPresentOrElse(existing -> existing.update(inbound.value), () -> varyingDayRepository.save(new VaryingDay(day, inbound.value)));
final Varying.Id week = new Varying.Id(series, inbound.date, Alignment.WEEK);
varyingWeekRepository.findById(week).ifPresentOrElse(existing -> existing.update(inbound.value), () -> varyingWeekRepository.save(new VaryingWeek(week, inbound.value)));
final Varying.Id month = new Varying.Id(series, inbound.date, Alignment.MONTH);
varyingMonthRepository.findById(month).ifPresentOrElse(existing -> existing.update(inbound.value), () -> varyingMonthRepository.save(new VaryingMonth(month, inbound.value)));
final Varying.Id year = new Varying.Id(series, inbound.date, Alignment.YEAR);
varyingYearRepository.findById(year).ifPresentOrElse(existing -> existing.update(inbound.value), () -> varyingYearRepository.save(new VaryingYear(year, inbound.value)));
return series;
}
@NonNull
public List<GraphPoint> getPoints(@NonNull final SeriesDto series, @NonNull final Aligned begin, @NonNull final Aligned end) {
return findRepository(begin.alignment)
.findAllByIdSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date)
.stream()
.map(v -> new GraphPoint(v.getId().getDate(), v.getAvg()))
.toList();
}
@NonNull
public List<VaryingAggregationDto> findAllAggregations(@NonNull final Aligned date) {
return findRepository(date.alignment).findAllDeltaSum(date.date).stream().map(this::toDto).toList();
}
@NonNull
private VaryingAggregationDto toDto(@NonNull final VaryingAggregation varyingAggregation) {
return new VaryingAggregationDto(varyingAggregation, seriesService.toDto(varyingAggregation.series));
}
@NonNull
private VaryingRepository<?> findRepository(@NonNull final Alignment alignment) {
return switch (alignment) {
case FIVE -> varyingFiveRepository;
case HOUR -> varyingHourRepository;
case DAY -> varyingDayRepository;
case WEEK -> varyingWeekRepository;
case MONTH -> varyingMonthRepository;
case YEAR -> varyingYearRepository;
};
}
}