From 685436a31633378f14e174139bd18ee07fb209fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Tue, 25 Feb 2025 10:19:50 +0100 Subject: [PATCH] accumulating Meter periods + code clean --- .../java/de/ph87/data/series/Aligned.java | 10 ++++---- .../java/de/ph87/data/series/graph/Graph.java | 5 ++-- .../data/series/graph/GraphController.java | 8 +++--- .../de/ph87/data/series/graph/GraphPoint.java | 8 ++++++ .../ph87/data/series/meter/MeterService.java | 25 +++++++++++++------ .../de/ph87/data/series/meter/MeterValue.java | 4 +-- .../series/meter/MeterValueRepository.java | 2 +- .../de/ph87/data/series/varying/Varying.java | 4 +-- .../data/series/varying/VaryingService.java | 2 +- 9 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/main/java/de/ph87/data/series/Aligned.java b/src/main/java/de/ph87/data/series/Aligned.java index 6af060c..ab718d7 100644 --- a/src/main/java/de/ph87/data/series/Aligned.java +++ b/src/main/java/de/ph87/data/series/Aligned.java @@ -8,19 +8,19 @@ import java.time.*; public class Aligned { @NonNull - public final Alignment interval; + public final Alignment alignment; @NonNull public final ZonedDateTime date; - public Aligned(@NonNull final Alignment interval, @NonNull final ZonedDateTime date) { - this.interval = interval; - this.date = interval.align.apply(date); + public Aligned(@NonNull final Alignment alignment, @NonNull final ZonedDateTime date) { + this.alignment = alignment; + this.date = alignment.align.apply(date); } @NonNull public Aligned minus(final long offset) { - return new Aligned(interval, interval.plus.apply(date, -offset)); + return new Aligned(alignment, alignment.plus.apply(date, -offset)); } } diff --git a/src/main/java/de/ph87/data/series/graph/Graph.java b/src/main/java/de/ph87/data/series/graph/Graph.java index 06316d6..56d3b26 100644 --- a/src/main/java/de/ph87/data/series/graph/Graph.java +++ b/src/main/java/de/ph87/data/series/graph/Graph.java @@ -59,7 +59,7 @@ public class Graph { public final int maxLabelWidth; - public Graph(@NonNull final SeriesDto series, @NonNull final List points, final @NonNull Aligned begin, final @NonNull Aligned end, final int width, final int height, final int border) { + public Graph(@NonNull final SeriesDto series, @NonNull final List points, @NonNull final Aligned begin, @NonNull final Aligned end, final int width, final int height, final int border) { this.series = series; this.begin = begin; this.end = end; @@ -129,7 +129,7 @@ public class Graph { return image; } - private void yLabel(final Graphics2D g, final double value, @Nullable final Stroke stroke, @Nullable final Color color) { + private void yLabel(@NonNull final Graphics2D g, final double value, @Nullable final Stroke stroke, @Nullable final Color color) { final String string = series.format(value); final int offset = maxLabelWidth - g.getFontMetrics().stringWidth(string); final int y = height - ((int) Math.round((value - valueMin) * valueScale) + border); @@ -141,6 +141,7 @@ public class Graph { } } + @NonNull private Function toPoint(final long minuteMin, final double minuteScale, final double valueMin, final double valueScale) { return point -> { final long minuteEpoch = point.getDate().toEpochSecond() / 60; diff --git a/src/main/java/de/ph87/data/series/graph/GraphController.java b/src/main/java/de/ph87/data/series/graph/GraphController.java index 427e5ac..33e9384 100644 --- a/src/main/java/de/ph87/data/series/graph/GraphController.java +++ b/src/main/java/de/ph87/data/series/graph/GraphController.java @@ -19,10 +19,10 @@ public class GraphController { private final GraphService graphService; - @GetMapping(path = "{seriesId}/{width}/{height}/{intervalName}/{offset}/{duration}", produces = "image/png") - public void graph(@PathVariable final long seriesId, final HttpServletResponse response, @PathVariable final int width, @PathVariable final int height, @PathVariable final String intervalName, @PathVariable final long offset, @PathVariable final long duration) throws IOException { - final Alignment interval = Alignment.valueOf(intervalName); - final Aligned end = interval.align(ZonedDateTime.now()).minus(offset); + @GetMapping(path = "{seriesId}/{width}/{height}/{alignmentName}/{offset}/{duration}", produces = "image/png") + public void graph(@PathVariable final long seriesId, final HttpServletResponse response, @PathVariable final int width, @PathVariable final int height, @PathVariable final String alignmentName, @PathVariable final long offset, @PathVariable final long duration) throws IOException { + final Alignment alignment = Alignment.valueOf(alignmentName); + final Aligned end = alignment.align(ZonedDateTime.now()).minus(offset); final Aligned begin = end.minus(duration); final Graph graph = graphService.getGraph(seriesId, begin, end, width, height, 10); final BufferedImage image = graph.draw(); diff --git a/src/main/java/de/ph87/data/series/graph/GraphPoint.java b/src/main/java/de/ph87/data/series/graph/GraphPoint.java index 1ea041f..c5228c7 100644 --- a/src/main/java/de/ph87/data/series/graph/GraphPoint.java +++ b/src/main/java/de/ph87/data/series/graph/GraphPoint.java @@ -11,4 +11,12 @@ public class GraphPoint { public final double value; + @NonNull + public GraphPoint plus(@NonNull final GraphPoint other) { + if (this.date.compareTo(other.date) != 0) { + throw new RuntimeException(); + } + return new GraphPoint(date, value + other.value); + } + } diff --git a/src/main/java/de/ph87/data/series/meter/MeterService.java b/src/main/java/de/ph87/data/series/meter/MeterService.java index baeba21..0b3891e 100644 --- a/src/main/java/de/ph87/data/series/meter/MeterService.java +++ b/src/main/java/de/ph87/data/series/meter/MeterService.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.*; import org.springframework.transaction.annotation.*; import java.util.*; +import java.util.stream.*; @Slf4j @Service @@ -71,15 +72,23 @@ public class MeterService { @NonNull public List getPoints(@NonNull final SeriesDto series, @NonNull final Aligned begin, @NonNull final Aligned end) { - final List graphPoints = switch (begin.interval) { - case FIVE -> meterFiveRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date); - case HOUR -> meterHourRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date); - case DAY -> meterDayRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date); - case WEEK -> meterWeekRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date); - case MONTH -> meterMonthRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date); - case YEAR -> meterYearRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date); + final List graphPoints = switch (begin.alignment) { + case FIVE -> meterFiveRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(series.id, begin.date, end.date); + case HOUR -> meterHourRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(series.id, begin.date, end.date); + case DAY -> meterDayRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(series.id, begin.date, end.date); + case WEEK -> meterWeekRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(series.id, begin.date, end.date); + case MONTH -> meterMonthRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(series.id, begin.date, end.date); + case YEAR -> meterYearRepository.findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(series.id, begin.date, end.date); }; - return graphPoints.stream().map(v -> new GraphPoint(v.getId().getDate(), v.getMax() - v.getMin())).toList(); + final List points = graphPoints.stream().map(v -> new GraphPoint(v.getId().getDate(), v.getMax() - v.getMin())).collect(Collectors.toCollection(LinkedList::new)); + for (int i = 0; i < points.size() - 1; i++) { + if (points.get(i).date.compareTo(points.get(i + 1).date) == 0) { + final GraphPoint first = points.remove(i); + final GraphPoint second = points.remove(i + 1); + points.add(i, first.plus(second)); + } + } + return points; } } diff --git a/src/main/java/de/ph87/data/series/meter/MeterValue.java b/src/main/java/de/ph87/data/series/meter/MeterValue.java index d16f41c..26484f7 100644 --- a/src/main/java/de/ph87/data/series/meter/MeterValue.java +++ b/src/main/java/de/ph87/data/series/meter/MeterValue.java @@ -50,9 +50,9 @@ public abstract class MeterValue { @Column(nullable = false) private ZonedDateTime date; - public Id(@NonNull final Meter meter, @NonNull final ZonedDateTime date, @NonNull final Alignment interval) { + public Id(@NonNull final Meter meter, @NonNull final ZonedDateTime date, @NonNull final Alignment alignment) { this.meter = meter; - this.date = interval.align(date).date; + this.date = alignment.align(date).date; } } diff --git a/src/main/java/de/ph87/data/series/meter/MeterValueRepository.java b/src/main/java/de/ph87/data/series/meter/MeterValueRepository.java index b665bf4..cfd632d 100644 --- a/src/main/java/de/ph87/data/series/meter/MeterValueRepository.java +++ b/src/main/java/de/ph87/data/series/meter/MeterValueRepository.java @@ -9,6 +9,6 @@ import java.util.*; @NoRepositoryBean public interface MeterValueRepository extends ListCrudRepository { - List findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(long id, @NonNull ZonedDateTime begin, @NonNull ZonedDateTime end); + List findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(long id, @NonNull ZonedDateTime begin, @NonNull ZonedDateTime end); } diff --git a/src/main/java/de/ph87/data/series/varying/Varying.java b/src/main/java/de/ph87/data/series/varying/Varying.java index 95c1f02..6e41c8b 100644 --- a/src/main/java/de/ph87/data/series/varying/Varying.java +++ b/src/main/java/de/ph87/data/series/varying/Varying.java @@ -57,9 +57,9 @@ public abstract class Varying { @Column(nullable = false) private ZonedDateTime date; - public Id(@NonNull final Series series, @NonNull final ZonedDateTime date, @NonNull final Alignment interval) { + public Id(@NonNull final Series series, @NonNull final ZonedDateTime date, @NonNull final Alignment alignment) { this.series = series; - this.date = interval.align(date).date; + this.date = alignment.align(date).date; } } diff --git a/src/main/java/de/ph87/data/series/varying/VaryingService.java b/src/main/java/de/ph87/data/series/varying/VaryingService.java index 0fd99e1..e6387cd 100644 --- a/src/main/java/de/ph87/data/series/varying/VaryingService.java +++ b/src/main/java/de/ph87/data/series/varying/VaryingService.java @@ -61,7 +61,7 @@ public class VaryingService { @NonNull public List getPoints(@NonNull final SeriesDto series, @NonNull final Aligned begin, @NonNull final Aligned end) { - final List graphPoints = switch (begin.interval) { + final List graphPoints = switch (begin.alignment) { case FIVE -> varyingFiveRepository.findAllByIdSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date); case HOUR -> varyingHourRepository.findAllByIdSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date); case DAY -> varyingDayRepository.findAllByIdSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date);