refactor: simplify history and mileage runtime
This commit is contained in:
@@ -57,8 +57,7 @@ public final class JdbcVehicleStatMetricRepository implements VehicleStatReposit
|
||||
String normalizedVin = clean(vin);
|
||||
Date date = Date.valueOf(statDate);
|
||||
String strategy = DailyMileageStrategy.JT808_TOTAL_MILEAGE_DIFF.name();
|
||||
DailyMileageState existingState = findDailyMileageState(normalizedVin, date)
|
||||
.orElseGet(() -> legacyDailyMileageState(normalizedVin, date).orElse(null));
|
||||
DailyMileageState existingState = findDailyMileageState(normalizedVin, date).orElse(null);
|
||||
double firstTotalMileage = existingState == null || !Double.isFinite(existingState.firstTotalMileageKm())
|
||||
? totalMileageKm
|
||||
: existingState.firstTotalMileageKm();
|
||||
@@ -90,29 +89,6 @@ public final class JdbcVehicleStatMetricRepository implements VehicleStatReposit
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
private Optional<DailyMileageState> legacyDailyMileageState(String vin, Date statDate) {
|
||||
OptionalDouble start = findMetric(vin, statDate, DAILY_MILEAGE_START_TOTAL_KEY);
|
||||
OptionalDouble latest = findMetric(vin, statDate, DAILY_MILEAGE_LATEST_TOTAL_KEY);
|
||||
if (start.isEmpty() || latest.isEmpty()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(new DailyMileageState(start.getAsDouble(), latest.getAsDouble()));
|
||||
}
|
||||
|
||||
private OptionalDouble findMetric(String vin, Date statDate, String metricKey) {
|
||||
List<Double> rows = jdbcTemplate.query("""
|
||||
SELECT metric_value
|
||||
FROM vehicle_stat_metric
|
||||
WHERE vin = ? AND stat_date = ? AND metric_key = ?
|
||||
""", (rs, rowNum) -> rs.getBigDecimal("metric_value") == null
|
||||
? Double.NaN
|
||||
: rs.getBigDecimal("metric_value").doubleValue(), vin, statDate, metricKey);
|
||||
if (rows.isEmpty() || !Double.isFinite(rows.getFirst())) {
|
||||
return OptionalDouble.empty();
|
||||
}
|
||||
return OptionalDouble.of(rows.getFirst());
|
||||
}
|
||||
|
||||
private void upsertDailyMileageMetric(String vin, Date statDate, double value, String unit, String strategy,
|
||||
double firstTotalMileageKm, double latestTotalMileageKm) {
|
||||
try {
|
||||
|
||||
@@ -115,6 +115,37 @@ class JdbcVehicleStatMetricRepositoryTest {
|
||||
""", Double.class)).isEqualTo(9.5);
|
||||
}
|
||||
|
||||
@Test
|
||||
void ignoresLegacySplitMileageStateMetricsWhenRecordingNewGpsTotalMileage() {
|
||||
JdbcTemplate jdbcTemplate = new JdbcTemplate(new DriverManagerDataSource(
|
||||
"jdbc:h2:mem:vehicle_stat_metric_ignore_legacy_state;MODE=MySQL;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1",
|
||||
"sa",
|
||||
""));
|
||||
JdbcVehicleStatMetricRepository repository = new JdbcVehicleStatMetricRepository(jdbcTemplate);
|
||||
jdbcTemplate.update("""
|
||||
INSERT INTO vehicle_stat_metric
|
||||
(vin, stat_date, metric_key, metric_value, metric_unit, calculation_method)
|
||||
VALUES
|
||||
('VIN001', DATE '2026-07-01', 'daily_mileage_start_total_km', 100.0, 'km', 'JT808_TOTAL_MILEAGE_DIFF'),
|
||||
('VIN001', DATE '2026-07-01', 'daily_mileage_latest_total_km', 105.0, 'km', 'JT808_TOTAL_MILEAGE_DIFF')
|
||||
""");
|
||||
|
||||
VehicleDailyStatResult result = repository.recordDailyMileageSample(
|
||||
"VIN001", LocalDate.of(2026, 7, 1), 110.0).orElseThrow();
|
||||
|
||||
assertThat(result.dailyMileageKm()).hasValue(0.0);
|
||||
assertThat(jdbcTemplate.queryForObject("""
|
||||
SELECT first_total_mileage_km
|
||||
FROM vehicle_stat_metric
|
||||
WHERE vin = 'VIN001' AND metric_key = 'daily_mileage_km'
|
||||
""", Double.class)).isEqualTo(110.0);
|
||||
assertThat(jdbcTemplate.queryForObject("""
|
||||
SELECT latest_total_mileage_km
|
||||
FROM vehicle_stat_metric
|
||||
WHERE vin = 'VIN001' AND metric_key = 'daily_mileage_km'
|
||||
""", Double.class)).isEqualTo(110.0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void readsLegacyCalculationMethodAsTotalMileageDifference() {
|
||||
JdbcTemplate jdbcTemplate = new JdbcTemplate(new DriverManagerDataSource(
|
||||
|
||||
Reference in New Issue
Block a user