99 lines
4.1 KiB
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;
|
|
};
|
|
}
|
|
|
|
}
|