From 0327fa9509e616d27f37d2d85f23c196a10bcc49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anett=20H=C3=BCbner?= Date: Mon, 16 Mar 2026 15:58:10 +0100 Subject: [PATCH 1/6] feat: ab#2146 correct ganglinien --- .../muenchen/dave/domain/Zeitintervall.java | 103 +++++++++++++++++- .../domain/dtos/laden/LadeZaehldatumDTO.java | 17 +++ .../relationaldb/ZeitintervallRepository.java | 15 +++ .../ladezaehldaten/LadeZaehldatenService.java | 36 +++++- 4 files changed, 164 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/muenchen/dave/domain/Zeitintervall.java b/src/main/java/de/muenchen/dave/domain/Zeitintervall.java index 3c1cc0f35..18149e420 100644 --- a/src/main/java/de/muenchen/dave/domain/Zeitintervall.java +++ b/src/main/java/de/muenchen/dave/domain/Zeitintervall.java @@ -4,19 +4,26 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; + +import de.muenchen.dave.domain.dtos.laden.LadeZaehldatumDTO; import de.muenchen.dave.domain.enums.TypeZeitintervall; import de.muenchen.dave.util.dataimport.ZeitintervallSortingIndexUtil; import jakarta.persistence.AttributeOverride; import jakarta.persistence.AttributeOverrides; import jakarta.persistence.Column; +import jakarta.persistence.ColumnResult; +import jakarta.persistence.ConstructorResult; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.Index; +import jakarta.persistence.NamedNativeQuery; +import jakarta.persistence.SqlResultSetMapping; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; @@ -28,7 +35,87 @@ import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; -@Entity +@NamedNativeQuery(name = "Zeitintervall.findWeekdayAverageByZaehlungIdZIAsc", + query = "select \n" + // + "\tround(sum(pkw)/count(startuhrzeit::time)) as pkw, \n" + // + "\tround(sum(lkw)/count(startuhrzeit::time)) as lkw,\n" + // + "\tround(sum (lastzuege)/count(startuhrzeit::time)) as lastzuege,\n" + // + "\tround(sum(busse)/count(startuhrzeit::time)) as busse,\n" + // + "\tround(sum(kraftraeder)/count(startuhrzeit::time)) as kraftraeder,\n" + // + "\tround(sum(fahrradfahrer)/count(startuhrzeit::time)) as fahrradfahrer,\n" + // + "\tround(sum(fussgaenger)/count(startuhrzeit::time)) as fussgaenger, \n" + // + "\tCURRENT_DATE + startuhrzeit::time as startUhrzeit, \n" + // + "\tCURRENT_DATE + endeuhrzeit::time as endeUhrzeit \n" + // + "from (\n" + // + "select \n" + // + "\tsum(pkw) as pkw, \n" + // + "\tsum(lkw) as lkw,\n" + // + "\tsum (lastzuege) as lastzuege,\n" + // + "\tsum(busse) as busse,\n" + // + "\tsum(kraftraeder) as kraftraeder,\n" + // + "\tsum(fahrradfahrer) as fahrradfahrer,\n" + // + "\tsum(fussgaenger) as fussgaenger, \n" + // + "\tstartuhrzeit, \n" + // + "\tendeuhrzeit\n" + // + "FROM public.zeitintervall \n" + // + "where startuhrzeit between :start and :ende and EXTRACT(DOW FROM startuhrzeit) IN (1, 2, 3, 4, 5) \n" + // + "and zaehlung_id = :zaehlungId group by startuhrzeit, endeuhrzeit)\n" + // + "group by startuhrzeit::time, endeuhrzeit::time order by startuhrzeit::time ASC", + resultSetMapping = "Mapping.Zeitintervall") +@SqlResultSetMapping(name = "Mapping.Zeitintervall", + classes = @ConstructorResult(targetClass = Zeitintervall.class, + columns = { + @ColumnResult(name = "pkw", type = Integer.class), + @ColumnResult(name = "lkw", type = Integer.class), + @ColumnResult(name = "lastzuege", type = Integer.class), + @ColumnResult(name = "busse", type = Integer.class), + @ColumnResult(name = "kraftraeder", type = Integer.class), + @ColumnResult(name = "fahrradfahrer", type = Integer.class), + @ColumnResult(name = "fussgaenger", type = Integer.class), + @ColumnResult(name = "startUhrzeit", type = LocalDateTime.class), + @ColumnResult(name = "endeUhrzeit", type = LocalDateTime.class) + })) +@NamedNativeQuery(name = "Zeitintervall.findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc", + query = "select \n" + // + "\tround(sum(pkw)/count(startuhrzeit::time)) as pkw, \n" + // + "\tround(sum(lkw)/count(startuhrzeit::time)) as lkw,\n" + // + "\tround(sum (lastzuege)/count(startuhrzeit::time)) as lastzuege,\n" + // + "\tround(sum(busse)/count(startuhrzeit::time)) as busse,\n" + // + "\tround(sum(kraftraeder)/count(startuhrzeit::time)) as kraftraeder,\n" + // + "\tround(sum(fahrradfahrer)/count(startuhrzeit::time)) as fahrradfahrer,\n" + // + "\tround(sum(fussgaenger)/count(startuhrzeit::time)) as fussgaenger, \n" + // + "\tstartuhrzeit::time, \n" + // + "\tendeuhrzeit::time \n" + // + "from (\n" + // + "select \n" + // + "\tsum(pkw) as pkw, \n" + // + "\tsum(lkw) as lkw,\n" + // + "\tsum (lastzuege) as lastzuege,\n" + // + "\tsum(busse) as busse,\n" + // + "\tsum(kraftraeder) as kraftraeder,\n" + // + "\tsum(fahrradfahrer) as fahrradfahrer,\n" + // + "\tsum(fussgaenger) as fussgaenger, \n" + // + "\tstartuhrzeit, \n" + // + "\tendeuhrzeit\n" + // + "FROM public.zeitintervall \n" + // + "where startuhrzeit between :start and :ende and EXTRACT(DOW FROM startuhrzeit) IN (1, 2, 3, 4, 5) \n" + // + "and zaehlung_id = :zaehlungId group by startuhrzeit, endeuhrzeit)\n" + // + "group by startuhrzeit::time, endeuhrzeit::time order by startuhrzeit::time ASC", + resultSetMapping = "Mapping.LadeZaehldatumDTO") +@SqlResultSetMapping(name = "Mapping.LadeZaehldatumDTO", + classes = @ConstructorResult(targetClass = LadeZaehldatumDTO.class, + columns = { + @ColumnResult(name = "pkw", type = Integer.class), + @ColumnResult(name = "lkw", type = Integer.class), + @ColumnResult(name = "lastzuege", type = Integer.class), + @ColumnResult(name = "busse", type = Integer.class), + @ColumnResult(name = "kraftraeder", type = Integer.class), + @ColumnResult(name = "fahrradfahrer", type = Integer.class), + @ColumnResult(name = "fussgaenger", type = Integer.class), + @ColumnResult(name = "startuhrzeit", type = LocalTime.class), + @ColumnResult(name = "endeuhrzeit", type = LocalTime.class) + })) + @Entity // Definition of getter, setter, ... @Getter @Setter @@ -51,6 +138,20 @@ ) public class Zeitintervall extends BaseEntity { + public Zeitintervall(UUID zaehlungId, Integer pkw, Integer lkw, Integer lastzuege, Integer busse, Integer kraftraeder, + Integer fahrradfahrer, Integer fussgaenger, LocalDateTime startUhrzeit, LocalDateTime endeUhrzeit) { + this.zaehlungId = zaehlungId; + this.pkw = pkw; + this.lkw = lkw; + this.lastzuege = lastzuege; + this.busse = busse; + this.kraftraeder = kraftraeder; + this.fahrradfahrer = fahrradfahrer; + this.fussgaenger = fussgaenger; + this.startUhrzeit = startUhrzeit; + this.endeUhrzeit = endeUhrzeit; + } + @Column(name = "zaehlung_id", nullable = false) @JdbcTypeCode(SqlTypes.VARCHAR) private UUID zaehlungId; diff --git a/src/main/java/de/muenchen/dave/domain/dtos/laden/LadeZaehldatumDTO.java b/src/main/java/de/muenchen/dave/domain/dtos/laden/LadeZaehldatumDTO.java index 2e9c1208b..d788c1244 100644 --- a/src/main/java/de/muenchen/dave/domain/dtos/laden/LadeZaehldatumDTO.java +++ b/src/main/java/de/muenchen/dave/domain/dtos/laden/LadeZaehldatumDTO.java @@ -15,6 +15,23 @@ @Data public class LadeZaehldatumDTO implements Serializable { + public LadeZaehldatumDTO() { + // Default-Konstruktor für die Deserialisierung + } + + public LadeZaehldatumDTO(Integer pkw, Integer lkw, Integer lastzuege, Integer busse, Integer kraftraeder, Integer fahrradfahrer, + Integer fussgaenger, LocalTime startUhrzeit, LocalTime endeUhrzeit) { + this.pkw = pkw; + this.lkw = lkw; + this.lastzuege = lastzuege; + this.busse = busse; + this.kraftraeder = kraftraeder; + this.fahrradfahrer = fahrradfahrer; + this.fussgaenger = fussgaenger; + this.startUhrzeit = startUhrzeit; + this.endeUhrzeit = endeUhrzeit; + } + private String type; @JsonDeserialize(using = LocalTimeDeserializer.class) diff --git a/src/main/java/de/muenchen/dave/repositories/relationaldb/ZeitintervallRepository.java b/src/main/java/de/muenchen/dave/repositories/relationaldb/ZeitintervallRepository.java index d87468581..0bf111a65 100644 --- a/src/main/java/de/muenchen/dave/repositories/relationaldb/ZeitintervallRepository.java +++ b/src/main/java/de/muenchen/dave/repositories/relationaldb/ZeitintervallRepository.java @@ -1,6 +1,7 @@ package de.muenchen.dave.repositories.relationaldb; import de.muenchen.dave.domain.Zeitintervall; +import de.muenchen.dave.domain.dtos.laden.LadeZaehldatumDTO; import de.muenchen.dave.domain.enums.FahrbewegungKreisverkehr; import de.muenchen.dave.domain.enums.TypeZeitintervall; import java.time.LocalDateTime; @@ -10,6 +11,7 @@ import java.util.UUID; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface ZeitintervallRepository extends JpaRepository { //NOSONAR @@ -70,6 +72,19 @@ List findByZaehlungIdAndStartUhrzeitGreaterThanEqualAndEndeUhrzei final LocalDateTime endeUhrzeit, final FahrbewegungKreisverkehr fahrbewegungKreisverkehr); + @Query(nativeQuery = true) + List findWeekdayAverageByZaehlungIdZIAsc( + final String zaehlungId, + final LocalDateTime start, + final LocalDateTime ende); + + @Query(nativeQuery = true) + List findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc( + final String zaehlungId, + final LocalDateTime start, + final LocalDateTime ende); + + Zeitintervall findByZaehlungIdAndTypeAndFahrbeziehungVonAndFahrbeziehungNachAndStartUhrzeitGreaterThanEqualAndEndeUhrzeitLessThanEqualAndFahrbeziehungFahrbewegungKreisverkehrIsNull( final UUID zaehlungId, final TypeZeitintervall type, diff --git a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java index f4cfed88b..61cca9797 100644 --- a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java +++ b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java @@ -324,22 +324,46 @@ public LadeZaehldatenTableDTO ladeZaehldaten(final UUID zaehlungId, final OptionsDTO options) throws DataNotFoundException { final LadeZaehldatenTableDTO ladeZaehldatenTable = new LadeZaehldatenTableDTO(); - final List zeitintervalle; + List ladeZaehldaten; final Zaehlung zaehlung = indexService.getZaehlung(zaehlungId.toString()); + final PkwEinheit pkwEinheit = zaehlung.getPkwEinheit(); if (StringUtils.contains(options.getZeitauswahl(), ZEITAUSWAHL_SPITZENSTUNDE)) { - zeitintervalle = extractZeitintervalleForSpitzenstunde(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), options); + List zeitintervalle = extractZeitintervalleForSpitzenstunde(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), options); + ladeZaehldaten = zeitintervalle.stream() + .map(zeitintervall -> mapToZaehldatum(zeitintervall, pkwEinheit, options)) + .collect(Collectors.toList()); + } else if (zaehlung.getDauerzaehlung() && options.getZeitraum().size() == 2 + && StringUtils.equals(options.getZeitauswahl(), LadeZaehldatenService.ZEITAUSWAHL_ZEITRAUM)) { + ladeZaehldaten = extractZeitintervalleWochentagsdurchschnitt(zaehlungId, options, pkwEinheit); } else { - zeitintervalle = extractZeitintervalle(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), options); - } - final PkwEinheit pkwEinheit = zaehlung.getPkwEinheit(); - List ladeZaehldaten = zeitintervalle.stream() + List zeitintervalle = extractZeitintervalle(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), options); + ladeZaehldaten = zeitintervalle.stream() .map(zeitintervall -> mapToZaehldatum(zeitintervall, pkwEinheit, options)) .collect(Collectors.toList()); + } + ladeZaehldatenTable.setZaehldaten(ladeZaehldaten); log.debug("Anzahl der Zaehldaten: {}", ladeZaehldatenTable.getZaehldaten().size()); return ladeZaehldatenTable; } + private List extractZeitintervalleWochentagsdurchschnitt(final UUID zaehlungId, + final OptionsDTO options, PkwEinheit pkwEinheit) throws DataNotFoundException { + LocalDateTime start = options.getZeitraum().get(0).atTime(0, 0, 0); + LocalDateTime end = options.getZeitraum().get(1).atTime(23, 59, 59); + final List zaehldatumDTOs = zeitintervallRepository.findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc( + zaehlungId.toString(), + start, + end); + log.debug("Size of extracted Zeitintervalle for Wochentagsdurchschnitt: {}", zaehldatumDTOs.size()); + zaehldatumDTOs.forEach(zaehldatum -> { + zaehldatum.setPkwEinheiten( + CalculationUtil.calculatePkwEinheiten(zaehldatum, pkwEinheit)); + zaehldatum.setType(null); + }); + return zaehldatumDTOs; + } + private List extractZeitintervalle(final UUID zaehlungId, final String zaehldauer, final Boolean isKreisverkehr, From 6091a6b4c457f4a8f8a11e906745868dd8da45a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anett=20H=C3=BCbner?= Date: Wed, 18 Mar 2026 11:55:32 +0100 Subject: [PATCH 2/6] feat: ab#2146 show Wochentagsdurchschnitt for time range selection --- docs/development.md | 94 +++++++++ .../controller/LadeZaehldatenController.java | 1 - .../muenchen/dave/domain/Zeitintervall.java | 181 ++++++++---------- .../domain/dtos/laden/LadeZaehldatumDTO.java | 17 -- .../relationaldb/ZeitintervallRepository.java | 15 +- .../ladezaehldaten/LadeZaehldatenService.java | 65 ++++--- .../ZeitintervallPersistierungsService.java | 8 +- .../domain/mapper/StadtbezirkMapperTest.java | 12 ++ 8 files changed, 240 insertions(+), 153 deletions(-) create mode 100644 docs/development.md diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 000000000..d423ee06a --- /dev/null +++ b/docs/development.md @@ -0,0 +1,94 @@ +# Development hints + +## SQL Statements + +SELECT sum(pkw), count(pkw), max(pkw), startuhrzeit::time FROM public.zeitintervall +where startuhrzeit between '2026-03-05' and '2026-03-06' +group by startuhrzeit::time order by startuhrzeit::time ASC limit 300; + +SELECT sum(pkw)/(DATE_PART('day', '2026-03-06'::timestamp - '2026-03-05'::timestamp) + 1), +startuhrzeit::time +FROM public.zeitintervall +where startuhrzeit between '2026-03-05' and '2026-03-07' group by startuhrzeit::time +order by startuhrzeit::time ASC; + +SELECT pkw, startuhrzeit::time, startuhrzeit::date, +DATE_PART('day', '2026-03-06'::timestamp - '2026-03-05'::timestamp)+1 FROM public.zeitintervall +where startuhrzeit between '2026-03-05' and '2026-03-07' +order by startuhrzeit::time ASC; + +select sum(sumpkw),count(startuhrzeit::time), startuhrzeit::time from ( +select sum(pkw) as sumpkw, startuhrzeit +FROM public.zeitintervall +where startuhrzeit between '2026-03-05' and '2026-03-12' and EXTRACT(DOW FROM startuhrzeit) IN (1, 2, 3, 4, 5) +and zaehlung_id = '339f992e-0925-4f6d-9e75-099bc520ad2c' group by startuhrzeit) +group by startuhrzeit::time order by startuhrzeit::time ASC; + +select sum(sumpkw),count(startuhrzeit::time), startuhrzeit::time from ( +select sum(pkw) as sumpkw, startuhrzeit +FROM public.zeitintervall +where startuhrzeit between '2026-03-05' and '2026-03-12' and EXTRACT(DOW FROM startuhrzeit) IN (1, 2, 3, 4, 5) and type = 'STUNDE_VIERTEL' +and zaehlung_id = '339f992e-0925-4f6d-9e75-099bc520ad2c' group by startuhrzeit) +group by startuhrzeit::time order by startuhrzeit::time ASC; + +select + round(sum(pkw)/count(startuhrzeit::time)) as pkw, + round(sum(lkw)/count(startuhrzeit::time)) as lkw, + round(sum (lastzuege)/count(startuhrzeit::time)) as lastzuege, + round(sum(busse)/count(startuhrzeit::time)) as busse, + round(sum(kraftraeder)/count(startuhrzeit::time)) as kraftraeder, + round(sum(fahrradfahrer)/count(startuhrzeit::time)) as fahrradfahrer, + round(sum(fussgaenger)/count(startuhrzeit::time)) as fussgaenger, + startuhrzeit::time, + endeuhrzeit::time +from ( +select + sum(pkw) as pkw, + sum(lkw) as lkw, + sum (lastzuege) as lastzuege, + sum(busse) as busse, + sum(kraftraeder) as kraftraeder, + sum(fahrradfahrer) as fahrradfahrer, + sum(fussgaenger) as fussgaenger, + startuhrzeit, + endeuhrzeit +FROM public.zeitintervall +where startuhrzeit between '2026-03-05 00:00:00' and '2026-03-06 23:59:59' and EXTRACT(DOW FROM startuhrzeit) IN (1, 2, 3, 4, 5) and type = 'STUNDE_VIERTEL' +and zaehlung_id = '339f992e-0925-4f6d-9e75-099bc520ad2c' group by startuhrzeit, endeuhrzeit) +group by startuhrzeit::time, endeuhrzeit::time order by startuhrzeit::time ASC + +select + zaehlung_id, + round(sum(pkw)/count(startuhrzeit::time)) as pkw, + round(sum(lkw)/count(startuhrzeit::time)) as lkw, + round(sum (lastzuege)/count(startuhrzeit::time)) as lastzuege, + round(sum(busse)/count(startuhrzeit::time)) as busse, + round(sum(kraftraeder)/count(startuhrzeit::time)) as kraftraeder, + round(sum(fahrradfahrer)/count(startuhrzeit::time)) as fahrradfahrer, + round(sum(fussgaenger)/count(startuhrzeit::time)) as fussgaenger, + round(sum(hochrechnung_hochrechnungkfz)/count(startuhrzeit::time),2) as hochrechnungkfz, + round(sum(hochrechnung_hochrechnunggv)/count(startuhrzeit::time),2) as hochrechnunggv, + round(sum(hochrechnung_hochrechnungsv)/count(startuhrzeit::time),2) as hochrechnungsv, + round(sum(hochrechnungrad)/count(startuhrzeit::time)) as hochrechnungrad, + (CURRENT_DATE + startuhrzeit::time) as startUhrzeit, + (CURRENT_DATE + endeuhrzeit::time) as endeUhrzeit +from ( +select + zaehlung_id, + sum(pkw) as pkw, + sum(lkw) as lkw, + sum (lastzuege) as lastzuege, + sum(busse) as busse, + sum(kraftraeder) as kraftraeder, + sum(fahrradfahrer) as fahrradfahrer, + sum(fussgaenger) as fussgaenger, + sum(hochrechnung_hochrechnungkfz) as hochrechnung_hochrechnungkfz, + sum(hochrechnung_hochrechnunggv) as hochrechnung_hochrechnunggv, + sum(hochrechnung_hochrechnungsv) as hochrechnung_hochrechnungsv, + sum(hochrechnungrad) as hochrechnungrad, + startuhrzeit, + endeuhrzeit +FROM public.zeitintervall +where startuhrzeit between '2026-03-05 00:00:00' and '2026-03-06 23:59:59' and EXTRACT(DOW FROM startuhrzeit) IN (1, 2, 3, 4, 5) and type = 'STUNDE_VIERTEL' +and zaehlung_id = '339f992e-0925-4f6d-9e75-099bc520ad2c' group by startuhrzeit, endeuhrzeit, zaehlung_id) +group by startuhrzeit::time, endeuhrzeit::time, zaehlung_id order by startUhrzeit ASC \ No newline at end of file diff --git a/src/main/java/de/muenchen/dave/controller/LadeZaehldatenController.java b/src/main/java/de/muenchen/dave/controller/LadeZaehldatenController.java index 92e5a39d6..cb0dba1f5 100644 --- a/src/main/java/de/muenchen/dave/controller/LadeZaehldatenController.java +++ b/src/main/java/de/muenchen/dave/controller/LadeZaehldatenController.java @@ -53,7 +53,6 @@ public ResponseEntity ladeZaehldatenProcessed( zaehlungId, options); log.info("laden der Daten abgeschlossen."); - log.debug("Zähldaten: {}", processedZaehldaten.toString()); return ResponseEntity.ok(processedZaehldaten); } catch (final DataNotFoundException exception) { throw new ResponseStatusException(HttpStatus.NOT_FOUND, exception.getMessage()); diff --git a/src/main/java/de/muenchen/dave/domain/Zeitintervall.java b/src/main/java/de/muenchen/dave/domain/Zeitintervall.java index 18149e420..bf65a5063 100644 --- a/src/main/java/de/muenchen/dave/domain/Zeitintervall.java +++ b/src/main/java/de/muenchen/dave/domain/Zeitintervall.java @@ -4,8 +4,6 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; - -import de.muenchen.dave.domain.dtos.laden.LadeZaehldatumDTO; import de.muenchen.dave.domain.enums.TypeZeitintervall; import de.muenchen.dave.util.dataimport.ZeitintervallSortingIndexUtil; import jakarta.persistence.AttributeOverride; @@ -22,8 +20,8 @@ import jakarta.persistence.SqlResultSetMapping; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; +import java.math.BigDecimal; import java.time.LocalDateTime; -import java.time.LocalTime; import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; @@ -35,87 +33,69 @@ import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; -@NamedNativeQuery(name = "Zeitintervall.findWeekdayAverageByZaehlungIdZIAsc", - query = "select \n" + // - "\tround(sum(pkw)/count(startuhrzeit::time)) as pkw, \n" + // - "\tround(sum(lkw)/count(startuhrzeit::time)) as lkw,\n" + // - "\tround(sum (lastzuege)/count(startuhrzeit::time)) as lastzuege,\n" + // - "\tround(sum(busse)/count(startuhrzeit::time)) as busse,\n" + // - "\tround(sum(kraftraeder)/count(startuhrzeit::time)) as kraftraeder,\n" + // - "\tround(sum(fahrradfahrer)/count(startuhrzeit::time)) as fahrradfahrer,\n" + // - "\tround(sum(fussgaenger)/count(startuhrzeit::time)) as fussgaenger, \n" + // - "\tCURRENT_DATE + startuhrzeit::time as startUhrzeit, \n" + // - "\tCURRENT_DATE + endeuhrzeit::time as endeUhrzeit \n" + // - "from (\n" + // - "select \n" + // - "\tsum(pkw) as pkw, \n" + // - "\tsum(lkw) as lkw,\n" + // - "\tsum (lastzuege) as lastzuege,\n" + // - "\tsum(busse) as busse,\n" + // - "\tsum(kraftraeder) as kraftraeder,\n" + // - "\tsum(fahrradfahrer) as fahrradfahrer,\n" + // - "\tsum(fussgaenger) as fussgaenger, \n" + // - "\tstartuhrzeit, \n" + // - "\tendeuhrzeit\n" + // - "FROM public.zeitintervall \n" + // - "where startuhrzeit between :start and :ende and EXTRACT(DOW FROM startuhrzeit) IN (1, 2, 3, 4, 5) \n" + // - "and zaehlung_id = :zaehlungId group by startuhrzeit, endeuhrzeit)\n" + // - "group by startuhrzeit::time, endeuhrzeit::time order by startuhrzeit::time ASC", - resultSetMapping = "Mapping.Zeitintervall") -@SqlResultSetMapping(name = "Mapping.Zeitintervall", - classes = @ConstructorResult(targetClass = Zeitintervall.class, - columns = { - @ColumnResult(name = "pkw", type = Integer.class), - @ColumnResult(name = "lkw", type = Integer.class), - @ColumnResult(name = "lastzuege", type = Integer.class), - @ColumnResult(name = "busse", type = Integer.class), - @ColumnResult(name = "kraftraeder", type = Integer.class), - @ColumnResult(name = "fahrradfahrer", type = Integer.class), - @ColumnResult(name = "fussgaenger", type = Integer.class), - @ColumnResult(name = "startUhrzeit", type = LocalDateTime.class), - @ColumnResult(name = "endeUhrzeit", type = LocalDateTime.class) - })) -@NamedNativeQuery(name = "Zeitintervall.findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc", - query = "select \n" + // - "\tround(sum(pkw)/count(startuhrzeit::time)) as pkw, \n" + // - "\tround(sum(lkw)/count(startuhrzeit::time)) as lkw,\n" + // - "\tround(sum (lastzuege)/count(startuhrzeit::time)) as lastzuege,\n" + // - "\tround(sum(busse)/count(startuhrzeit::time)) as busse,\n" + // - "\tround(sum(kraftraeder)/count(startuhrzeit::time)) as kraftraeder,\n" + // - "\tround(sum(fahrradfahrer)/count(startuhrzeit::time)) as fahrradfahrer,\n" + // - "\tround(sum(fussgaenger)/count(startuhrzeit::time)) as fussgaenger, \n" + // - "\tstartuhrzeit::time, \n" + // - "\tendeuhrzeit::time \n" + // - "from (\n" + // - "select \n" + // - "\tsum(pkw) as pkw, \n" + // - "\tsum(lkw) as lkw,\n" + // - "\tsum (lastzuege) as lastzuege,\n" + // - "\tsum(busse) as busse,\n" + // - "\tsum(kraftraeder) as kraftraeder,\n" + // - "\tsum(fahrradfahrer) as fahrradfahrer,\n" + // - "\tsum(fussgaenger) as fussgaenger, \n" + // - "\tstartuhrzeit, \n" + // - "\tendeuhrzeit\n" + // - "FROM public.zeitintervall \n" + // - "where startuhrzeit between :start and :ende and EXTRACT(DOW FROM startuhrzeit) IN (1, 2, 3, 4, 5) \n" + // - "and zaehlung_id = :zaehlungId group by startuhrzeit, endeuhrzeit)\n" + // - "group by startuhrzeit::time, endeuhrzeit::time order by startuhrzeit::time ASC", - resultSetMapping = "Mapping.LadeZaehldatumDTO") -@SqlResultSetMapping(name = "Mapping.LadeZaehldatumDTO", - classes = @ConstructorResult(targetClass = LadeZaehldatumDTO.class, - columns = { - @ColumnResult(name = "pkw", type = Integer.class), - @ColumnResult(name = "lkw", type = Integer.class), - @ColumnResult(name = "lastzuege", type = Integer.class), - @ColumnResult(name = "busse", type = Integer.class), - @ColumnResult(name = "kraftraeder", type = Integer.class), - @ColumnResult(name = "fahrradfahrer", type = Integer.class), - @ColumnResult(name = "fussgaenger", type = Integer.class), - @ColumnResult(name = "startuhrzeit", type = LocalTime.class), - @ColumnResult(name = "endeuhrzeit", type = LocalTime.class) - })) - @Entity +@NamedNativeQuery( + name = "Zeitintervall.findWeekdayAverageByZaehlungIdZIAsc", + query = "select \n" + // + "\tzaehlung_id, \n" + // + "\tround(sum(pkw)/count(startuhrzeit::time)) as pkw, \n" + // + "\tround(sum(lkw)/count(startuhrzeit::time)) as lkw,\n" + // + "\tround(sum (lastzuege)/count(startuhrzeit::time)) as lastzuege,\n" + // + "\tround(sum(busse)/count(startuhrzeit::time)) as busse,\n" + // + "\tround(sum(kraftraeder)/count(startuhrzeit::time)) as kraftraeder,\n" + // + "\tround(sum(fahrradfahrer)/count(startuhrzeit::time)) as fahrradfahrer,\n" + // + "\tround(sum(fussgaenger)/count(startuhrzeit::time)) as fussgaenger, \n" + // + "\tround(sum(hochrechnung_hochrechnungkfz)/count(startuhrzeit::time),2) as hochrechnungkfz,\n" + // + "\tround(sum(hochrechnung_hochrechnunggv)/count(startuhrzeit::time),2) as hochrechnunggv,\n" + // + "\tround(sum(hochrechnung_hochrechnungsv)/count(startuhrzeit::time),2) as hochrechnungsv,\n" + // + "\tround(sum(hochrechnungrad)/count(startuhrzeit::time)) as hochrechnungrad,\n" + // + "\tCURRENT_DATE + startuhrzeit::time as startUhrzeit, \n" + // + "\tCURRENT_DATE + endeuhrzeit::time as endeUhrzeit \n" + // + "from (\n" + // + "select \n" + // + "\tzaehlung_id, \n" + // + "\tsum(pkw) as pkw, \n" + // + "\tsum(lkw) as lkw,\n" + // + "\tsum (lastzuege) as lastzuege,\n" + // + "\tsum(busse) as busse,\n" + // + "\tsum(kraftraeder) as kraftraeder,\n" + // + "\tsum(fahrradfahrer) as fahrradfahrer,\n" + // + "\tsum(fussgaenger) as fussgaenger, \n" + // + "\tsum(hochrechnung_hochrechnungkfz) as hochrechnung_hochrechnungkfz,\n" + // + "\tsum(hochrechnung_hochrechnunggv) as hochrechnung_hochrechnunggv,\n" + // + "\tsum(hochrechnung_hochrechnungsv) as hochrechnung_hochrechnungsv,\n" + // + "\tsum(hochrechnungrad) as hochrechnungrad,\n" + // + "\tstartuhrzeit, \n" + // + "\tendeuhrzeit\n" + // + "FROM public.zeitintervall \n" + // + "where startuhrzeit between :start and :ende and EXTRACT(DOW FROM startuhrzeit) IN (:tagestyp) \n" + // + "\tand zaehlung_id = :zaehlungId \n" + // + "\tand fahrbeziehung_von IN (:vonKnotenarm) and fahrbeziehung_nach IN (:nachKnotenarm) group by startuhrzeit, endeuhrzeit, zaehlung_id) \n" + // + "\tgroup by startuhrzeit::time, endeuhrzeit::time, zaehlung_id order by startUhrzeit ASC", + resultSetMapping = "Mapping.Zeitintervall" +) +@SqlResultSetMapping( + name = "Mapping.Zeitintervall", + classes = @ConstructorResult( + targetClass = Zeitintervall.class, + columns = { + @ColumnResult(name = "zaehlung_id", type = String.class), + @ColumnResult(name = "pkw", type = Integer.class), + @ColumnResult(name = "lkw", type = Integer.class), + @ColumnResult(name = "lastzuege", type = Integer.class), + @ColumnResult(name = "busse", type = Integer.class), + @ColumnResult(name = "kraftraeder", type = Integer.class), + @ColumnResult(name = "fahrradfahrer", type = Integer.class), + @ColumnResult(name = "fussgaenger", type = Integer.class), + @ColumnResult(name = "hochrechnungkfz", type = BigDecimal.class), + @ColumnResult(name = "hochrechnunggv", type = BigDecimal.class), + @ColumnResult(name = "hochrechnungsv", type = BigDecimal.class), + @ColumnResult(name = "hochrechnungrad", type = Integer.class), + @ColumnResult(name = "startUhrzeit", type = LocalDateTime.class), + @ColumnResult(name = "endeUhrzeit", type = LocalDateTime.class) + } + ) +) +@Entity // Definition of getter, setter, ... @Getter @Setter @@ -138,19 +118,26 @@ ) public class Zeitintervall extends BaseEntity { - public Zeitintervall(UUID zaehlungId, Integer pkw, Integer lkw, Integer lastzuege, Integer busse, Integer kraftraeder, - Integer fahrradfahrer, Integer fussgaenger, LocalDateTime startUhrzeit, LocalDateTime endeUhrzeit) { - this.zaehlungId = zaehlungId; - this.pkw = pkw; - this.lkw = lkw; - this.lastzuege = lastzuege; - this.busse = busse; - this.kraftraeder = kraftraeder; - this.fahrradfahrer = fahrradfahrer; - this.fussgaenger = fussgaenger; - this.startUhrzeit = startUhrzeit; - this.endeUhrzeit = endeUhrzeit; - } + public Zeitintervall(String zaehlung_id, Integer pkw, Integer lkw, Integer lastzuege, Integer busse, Integer kraftraeder, + Integer fahrradfahrer, Integer fussgaenger, BigDecimal hochrechnungkfz, BigDecimal hochrechnunggv, BigDecimal hochrechnungsv, + Integer hochrechnungrad, LocalDateTime startUhrzeit, LocalDateTime endeUhrzeit) { + this.zaehlungId = UUID.fromString(zaehlung_id); + this.pkw = pkw; + this.lkw = lkw; + this.lastzuege = lastzuege; + this.busse = busse; + this.kraftraeder = kraftraeder; + this.fahrradfahrer = fahrradfahrer; + this.fussgaenger = fussgaenger; + this.startUhrzeit = startUhrzeit; + this.endeUhrzeit = endeUhrzeit; + this.fahrbeziehung = new Fahrbeziehung(); + this.hochrechnung = new Hochrechnung(); + this.hochrechnung.setHochrechnungKfz(hochrechnungkfz); + this.hochrechnung.setHochrechnungGv(hochrechnunggv); + this.hochrechnung.setHochrechnungSv(hochrechnungsv); + this.hochrechnung.setHochrechnungRad(hochrechnungrad); + } @Column(name = "zaehlung_id", nullable = false) @JdbcTypeCode(SqlTypes.VARCHAR) diff --git a/src/main/java/de/muenchen/dave/domain/dtos/laden/LadeZaehldatumDTO.java b/src/main/java/de/muenchen/dave/domain/dtos/laden/LadeZaehldatumDTO.java index d788c1244..2e9c1208b 100644 --- a/src/main/java/de/muenchen/dave/domain/dtos/laden/LadeZaehldatumDTO.java +++ b/src/main/java/de/muenchen/dave/domain/dtos/laden/LadeZaehldatumDTO.java @@ -15,23 +15,6 @@ @Data public class LadeZaehldatumDTO implements Serializable { - public LadeZaehldatumDTO() { - // Default-Konstruktor für die Deserialisierung - } - - public LadeZaehldatumDTO(Integer pkw, Integer lkw, Integer lastzuege, Integer busse, Integer kraftraeder, Integer fahrradfahrer, - Integer fussgaenger, LocalTime startUhrzeit, LocalTime endeUhrzeit) { - this.pkw = pkw; - this.lkw = lkw; - this.lastzuege = lastzuege; - this.busse = busse; - this.kraftraeder = kraftraeder; - this.fahrradfahrer = fahrradfahrer; - this.fussgaenger = fussgaenger; - this.startUhrzeit = startUhrzeit; - this.endeUhrzeit = endeUhrzeit; - } - private String type; @JsonDeserialize(using = LocalTimeDeserializer.class) diff --git a/src/main/java/de/muenchen/dave/repositories/relationaldb/ZeitintervallRepository.java b/src/main/java/de/muenchen/dave/repositories/relationaldb/ZeitintervallRepository.java index 0bf111a65..10211cc0d 100644 --- a/src/main/java/de/muenchen/dave/repositories/relationaldb/ZeitintervallRepository.java +++ b/src/main/java/de/muenchen/dave/repositories/relationaldb/ZeitintervallRepository.java @@ -1,7 +1,6 @@ package de.muenchen.dave.repositories.relationaldb; import de.muenchen.dave.domain.Zeitintervall; -import de.muenchen.dave.domain.dtos.laden.LadeZaehldatumDTO; import de.muenchen.dave.domain.enums.FahrbewegungKreisverkehr; import de.muenchen.dave.domain.enums.TypeZeitintervall; import java.time.LocalDateTime; @@ -72,18 +71,14 @@ List findByZaehlungIdAndStartUhrzeitGreaterThanEqualAndEndeUhrzei final LocalDateTime endeUhrzeit, final FahrbewegungKreisverkehr fahrbewegungKreisverkehr); - @Query(nativeQuery = true) - List findWeekdayAverageByZaehlungIdZIAsc( - final String zaehlungId, - final LocalDateTime start, - final LocalDateTime ende); - @Query(nativeQuery = true) - List findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc( + List findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc( final String zaehlungId, final LocalDateTime start, - final LocalDateTime ende); - + final LocalDateTime ende, + final List vonKnotenarm, + final List nachKnotenarm, + final List tagestyp); Zeitintervall findByZaehlungIdAndTypeAndFahrbeziehungVonAndFahrbeziehungNachAndStartUhrzeitGreaterThanEqualAndEndeUhrzeitLessThanEqualAndFahrbeziehungFahrbewegungKreisverkehrIsNull( final UUID zaehlungId, diff --git a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java index 61cca9797..cbf160fee 100644 --- a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java +++ b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java @@ -26,6 +26,7 @@ import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; +import java.util.stream.IntStream; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.SetUtils; import org.apache.commons.lang3.BooleanUtils; @@ -328,40 +329,56 @@ public LadeZaehldatenTableDTO ladeZaehldaten(final UUID zaehlungId, final Zaehlung zaehlung = indexService.getZaehlung(zaehlungId.toString()); final PkwEinheit pkwEinheit = zaehlung.getPkwEinheit(); if (StringUtils.contains(options.getZeitauswahl(), ZEITAUSWAHL_SPITZENSTUNDE)) { - List zeitintervalle = extractZeitintervalleForSpitzenstunde(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), options); + List zeitintervalle = extractZeitintervalleForSpitzenstunde(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), + options); ladeZaehldaten = zeitintervalle.stream() - .map(zeitintervall -> mapToZaehldatum(zeitintervall, pkwEinheit, options)) - .collect(Collectors.toList()); + .map(zeitintervall -> mapToZaehldatum(zeitintervall, pkwEinheit, options)) + .collect(Collectors.toList()); } else if (zaehlung.getDauerzaehlung() && options.getZeitraum().size() == 2 && StringUtils.equals(options.getZeitauswahl(), LadeZaehldatenService.ZEITAUSWAHL_ZEITRAUM)) { - ladeZaehldaten = extractZeitintervalleWochentagsdurchschnitt(zaehlungId, options, pkwEinheit); - } else { - List zeitintervalle = extractZeitintervalle(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), options); - ladeZaehldaten = zeitintervalle.stream() - .map(zeitintervall -> mapToZaehldatum(zeitintervall, pkwEinheit, options)) - .collect(Collectors.toList()); - } + List zeitintervalle = extractZeitintervalleWochentagsdurchschnitt(zaehlungId, options); + ladeZaehldaten = zeitintervalle.stream() + .map(zeitintervall -> mapToZaehldatum(zeitintervall, pkwEinheit, options)) + .collect(Collectors.toList()); + //ladeZaehldaten = extractZeitintervalleWochentagsdurchschnitt(zaehlungId, options, pkwEinheit); + } else { + List zeitintervalle = extractZeitintervalle(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), options); + ladeZaehldaten = zeitintervalle.stream() + .map(zeitintervall -> mapToZaehldatum(zeitintervall, pkwEinheit, options)) + .collect(Collectors.toList()); + } ladeZaehldatenTable.setZaehldaten(ladeZaehldaten); log.debug("Anzahl der Zaehldaten: {}", ladeZaehldatenTable.getZaehldaten().size()); return ladeZaehldatenTable; } - private List extractZeitintervalleWochentagsdurchschnitt(final UUID zaehlungId, - final OptionsDTO options, PkwEinheit pkwEinheit) throws DataNotFoundException { - LocalDateTime start = options.getZeitraum().get(0).atTime(0, 0, 0); - LocalDateTime end = options.getZeitraum().get(1).atTime(23, 59, 59); - final List zaehldatumDTOs = zeitintervallRepository.findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc( + private List extractZeitintervalleWochentagsdurchschnitt(final UUID zaehlungId, + final OptionsDTO options) throws DataNotFoundException { + LocalDateTime start = options.getZeitraum().get(0).atTime(0, 0, 0); + LocalDateTime end = options.getZeitraum().get(1).atTime(23, 59, 59); + List vonKnotenarm = IntStream.rangeClosed(1, 8).boxed().toList(); + List nachKnotenarm = IntStream.rangeClosed(1, 8).boxed().toList(); + + if (options.getBeideRichtungen()) { + vonKnotenarm = List.of(options.getVonKnotenarm(), options.getNachKnotenarm()); + nachKnotenarm = List.of(options.getVonKnotenarm(), options.getNachKnotenarm()); + } else if (options.getVonKnotenarm() != null) { + vonKnotenarm = List.of(options.getVonKnotenarm()); + } else if (options.getNachKnotenarm() != null) { + nachKnotenarm = List.of(options.getNachKnotenarm()); + } + List tagestyp = List.of(1, 2, 3, 4, 5); + List zi = zeitintervallRepository.findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc( zaehlungId.toString(), - start, - end); - log.debug("Size of extracted Zeitintervalle for Wochentagsdurchschnitt: {}", zaehldatumDTOs.size()); - zaehldatumDTOs.forEach(zaehldatum -> { - zaehldatum.setPkwEinheiten( - CalculationUtil.calculatePkwEinheiten(zaehldatum, pkwEinheit)); - zaehldatum.setType(null); - }); - return zaehldatumDTOs; + start, + end, + vonKnotenarm, + nachKnotenarm, + tagestyp); + log.debug("Size of extracted Zeitintervalle for Wochentagsdurchschnitt: {}", zi.size()); + List allZeitintervalle = zeitintervallPersistierungsService.aufbereitenUndPersistieren(zi, false); + return allZeitintervalle; } private List extractZeitintervalle(final UUID zaehlungId, diff --git a/src/main/java/de/muenchen/dave/services/persist/ZeitintervallPersistierungsService.java b/src/main/java/de/muenchen/dave/services/persist/ZeitintervallPersistierungsService.java index 7fb6ef379..4fc18d106 100644 --- a/src/main/java/de/muenchen/dave/services/persist/ZeitintervallPersistierungsService.java +++ b/src/main/java/de/muenchen/dave/services/persist/ZeitintervallPersistierungsService.java @@ -105,10 +105,10 @@ public List aufbereitenForZeitraum(final List zeit allZeitintervalle.addAll(summierteZeitbloecke); allZeitintervalle.addAll(kiZeitintervalle); - for (Zeitintervall zeitintervall : allZeitintervalle) { - log.debug(zeitintervall.getFahrbeziehung() + " " + zeitintervall.getType() + " " + zeitintervall.getStartUhrzeit() + " " - + zeitintervall.getEndeUhrzeit() + " " + zeitintervall.getPkw()); - } + //for (Zeitintervall zeitintervall : allZeitintervalle) { + // log.debug(zeitintervall.getFahrbeziehung() + " " + zeitintervall.getType() + " " + zeitintervall.getStartUhrzeit() + " " + // + zeitintervall.getEndeUhrzeit() + " " + zeitintervall.getPkw()); + //} return allZeitintervalle; } diff --git a/src/test/java/de/muenchen/dave/domain/mapper/StadtbezirkMapperTest.java b/src/test/java/de/muenchen/dave/domain/mapper/StadtbezirkMapperTest.java index d9b33882a..7441a92a6 100644 --- a/src/test/java/de/muenchen/dave/domain/mapper/StadtbezirkMapperTest.java +++ b/src/test/java/de/muenchen/dave/domain/mapper/StadtbezirkMapperTest.java @@ -13,7 +13,10 @@ import de.muenchen.dave.repositories.elasticsearch.ZaehlstelleIndex; import de.muenchen.dave.repositories.relationaldb.CityDistrictRepository; import de.muenchen.dave.repositories.relationaldb.ZaehlstelleRepository; +import de.muenchen.dave.repositories.relationaldb.ZeitintervallRepository; import de.muenchen.dave.services.ConfigurationService; +import de.muenchen.dave.services.ZaehlstelleIndexService; +import de.muenchen.dave.services.persist.ExternalDetectorService; import de.muenchen.elasticimpl.CustomSuggestIndexElasticRepository; import de.muenchen.elasticimpl.MessstelleIndexElasticRepository; import de.muenchen.elasticimpl.ZaehlstelleIndexElasticRepository; @@ -61,6 +64,12 @@ public class StadtbezirkMapperTest { @MockitoBean private ZaehlstelleRepository zaehlstelleRepository; + @MockitoBean + private ZaehlstelleIndexService zaehlstelleIndexService; + + @MockitoBean + private ExternalDetectorService externalDetectorService; + @MockitoBean private MessstelleRepository messstelleRepository; @@ -72,6 +81,9 @@ public class StadtbezirkMapperTest { @MockitoBean private CustomSuggestIndex customSuggestIndex; + @MockitoBean + private ZeitintervallRepository zeitintervallRepository; + @BeforeEach private void beforeEach() { From b1d6f9a5e353decc1eb678325686b507007cb58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anett=20H=C3=BCbner?= Date: Wed, 18 Mar 2026 12:14:02 +0100 Subject: [PATCH 3/6] bugfix weekday query --- src/main/java/de/muenchen/dave/domain/Zeitintervall.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/muenchen/dave/domain/Zeitintervall.java b/src/main/java/de/muenchen/dave/domain/Zeitintervall.java index bf65a5063..326490b27 100644 --- a/src/main/java/de/muenchen/dave/domain/Zeitintervall.java +++ b/src/main/java/de/muenchen/dave/domain/Zeitintervall.java @@ -34,7 +34,7 @@ import org.hibernate.type.SqlTypes; @NamedNativeQuery( - name = "Zeitintervall.findWeekdayAverageByZaehlungIdZIAsc", + name = "Zeitintervall.findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc", query = "select \n" + // "\tzaehlung_id, \n" + // "\tround(sum(pkw)/count(startuhrzeit::time)) as pkw, \n" + // From f98e5b9623a61ef75d0b60de5e8f495677523823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anett=20H=C3=BCbner?= Date: Wed, 18 Mar 2026 12:39:29 +0100 Subject: [PATCH 4/6] corrected selection of crossing lane --- .../services/ladezaehldaten/LadeZaehldatenService.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java index cbf160fee..a5a1e3067 100644 --- a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java +++ b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java @@ -360,13 +360,19 @@ private List extractZeitintervalleWochentagsdurchschnitt(final UU List vonKnotenarm = IntStream.rangeClosed(1, 8).boxed().toList(); List nachKnotenarm = IntStream.rangeClosed(1, 8).boxed().toList(); - if (options.getBeideRichtungen()) { - vonKnotenarm = List.of(options.getVonKnotenarm(), options.getNachKnotenarm()); + if (options.getBeideRichtungen() && options.getVonKnotenarm() != null && options.getNachKnotenarm() != null) { + vonKnotenarm = List.of(options.getVonKnotenarm(), options.getNachKnotenarm()).stream().filter(val -> val != null).collect(Collectors.toList()); nachKnotenarm = List.of(options.getVonKnotenarm(), options.getNachKnotenarm()); } else if (options.getVonKnotenarm() != null) { vonKnotenarm = List.of(options.getVonKnotenarm()); + if( options.getBeideRichtungen() != null && options.getNachKnotenarm() != null) { + vonKnotenarm.add(options.getNachKnotenarm()); + } } else if (options.getNachKnotenarm() != null) { nachKnotenarm = List.of(options.getNachKnotenarm()); + if( options.getBeideRichtungen() != null && options.getVonKnotenarm() != null) { + vonKnotenarm.add(options.getVonKnotenarm()); + } } List tagestyp = List.of(1, 2, 3, 4, 5); List zi = zeitintervallRepository.findWeekdayAverageByZaehlungIdOrderBySortingIndexAsc( From 6efa62c5ccb210ffb48c17d3641e27aca7ccd6d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anett=20H=C3=BCbner?= Date: Wed, 18 Mar 2026 12:43:01 +0100 Subject: [PATCH 5/6] formatting --- .../dave/services/ladezaehldaten/LadeZaehldatenService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java index a5a1e3067..9de939948 100644 --- a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java +++ b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java @@ -365,12 +365,12 @@ private List extractZeitintervalleWochentagsdurchschnitt(final UU nachKnotenarm = List.of(options.getVonKnotenarm(), options.getNachKnotenarm()); } else if (options.getVonKnotenarm() != null) { vonKnotenarm = List.of(options.getVonKnotenarm()); - if( options.getBeideRichtungen() != null && options.getNachKnotenarm() != null) { + if (options.getBeideRichtungen() != null && options.getNachKnotenarm() != null) { vonKnotenarm.add(options.getNachKnotenarm()); } } else if (options.getNachKnotenarm() != null) { nachKnotenarm = List.of(options.getNachKnotenarm()); - if( options.getBeideRichtungen() != null && options.getVonKnotenarm() != null) { + if (options.getBeideRichtungen() != null && options.getVonKnotenarm() != null) { vonKnotenarm.add(options.getVonKnotenarm()); } } From 252beb1365834f7df8e57a1d9e4c39734e7e0272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anett=20H=C3=BCbner?= Date: Wed, 18 Mar 2026 13:43:33 +0100 Subject: [PATCH 6/6] removed comment --- .../dave/services/ladezaehldaten/LadeZaehldatenService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java index 9de939948..a71cdbc8a 100644 --- a/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java +++ b/src/main/java/de/muenchen/dave/services/ladezaehldaten/LadeZaehldatenService.java @@ -340,7 +340,6 @@ public LadeZaehldatenTableDTO ladeZaehldaten(final UUID zaehlungId, ladeZaehldaten = zeitintervalle.stream() .map(zeitintervall -> mapToZaehldatum(zeitintervall, pkwEinheit, options)) .collect(Collectors.toList()); - //ladeZaehldaten = extractZeitintervalleWochentagsdurchschnitt(zaehlungId, options, pkwEinheit); } else { List zeitintervalle = extractZeitintervalle(zaehlungId, zaehlung.getZaehldauer(), zaehlung.getKreisverkehr(), options); ladeZaehldaten = zeitintervalle.stream()