From e0eca0ee99ea04b1a13c96a918d13ec974ebf181 Mon Sep 17 00:00:00 2001 From: scrudden Date: Thu, 17 Mar 2022 21:13:27 +0000 Subject: [PATCH 1/2] Create new keys for cache that are not based on trip. Implement new key for TripDataHistoryCache. Removed jcs and memcached implementations as we have settled on ehcache. --- .../core/PredictionGenerator.java | 31 +-- .../DwellTimeModelCacheInterface.java | 1 + .../core/dataCache/ErrorCache.java | 1 + .../StopArrivalDepartureCacheInterface.java | 1 + .../dataCache/StopPathPredictionCache.java | 1 + .../TripDataHistoryCacheInterface.java | 2 +- .../dataCache/ehcache/KalmanErrorCache.java | 4 +- .../ehcache/StopArrivalDepartureCache.java | 6 +- .../frequency/TripDataHistoryCache.java | 9 +- .../scheduled/DwellTimeModelCache.java | 4 +- .../scheduled/TripDataHistoryCache.java | 18 +- .../FrequencyBasedHistoricalAverageCache.java | 12 +- .../StopPathCacheKeyStartTimeComparator.java | 2 +- .../core/dataCache/jcs/KalmanErrorCache.java | 105 -------- .../jcs/frequency/DwellTimeModelCache.java | 232 ----------------- .../jcs/frequency/TripDataHistoryCache.java | 190 -------------- .../jcs/scheduled/DwellTimeModelCache.java | 238 ------------------ .../jcs/scheduled/TripDataHistoryCache.java | 177 ------------- .../StopArrivalDepartureCacheKey.java | 2 +- .../keys/byroute/KalmanErrorCacheKey.java | 56 +++++ .../keys/byroute/StopPathCacheKey.java | 85 +++++++ .../core/dataCache/keys/byroute/TripKey.java | 99 ++++++++ .../bytrip}/KalmanErrorCacheKey.java | 2 +- .../{ => keys/bytrip}/StopPathCacheKey.java | 2 +- .../dataCache/{ => keys/bytrip}/TripKey.java | 2 +- .../scheduled/DwellTimeModelCache.java | 196 --------------- .../memcached/scheduled/KalmanErrorCache.java | 82 ------ .../scheduled/StopArrivalDepartureCache.java | 107 -------- .../scheduled/TripDataHistoryCache.java | 162 ------------ .../ScheduleBasedHistoricalAverageCache.java | 18 +- .../LastArrivalsHeadwayGenerator.java | 2 +- .../LastDepartureHeadwayGenerator.java | 2 +- .../HoldingTimeGeneratorDefaultImpl.java | 2 +- .../SimpleHoldingTimeGeneratorImpl.java | 2 +- .../rls/DwellTimePredictionGeneratorImpl.java | 2 +- ...toricalAveragePredictionGeneratorImpl.java | 2 +- .../kalman/KalmanPredictionGeneratorImpl.java | 4 +- .../LastVehiclePredictionGeneratorImpl.java | 2 +- ...toricalAveragePredictionGeneratorImpl.java | 2 +- .../DwellTimePredictionGeneratorImpl.java | 2 +- .../kalman/KalmanPredictionGeneratorImpl.java | 16 +- .../data/IpcHistoricalAverageCacheKey.java | 2 +- .../ipc/data/IpcKalmanErrorCacheKey.java | 4 +- .../ipc/interfaces/CacheQueryInterface.java | 5 +- .../ipc/servers/CacheQueryServer.java | 39 +-- .../ipc/servers/PredictionAnalysisServer.java | 2 +- transitclock/src/main/resources/ehcache.xml | 10 +- transitclock/src/main/resources/logback.xml | 48 ++-- .../api/rootResources/CacheApi.java | 8 +- 49 files changed, 351 insertions(+), 1652 deletions(-) delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/jcs/KalmanErrorCache.java delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/jcs/frequency/DwellTimeModelCache.java delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/jcs/frequency/TripDataHistoryCache.java delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/jcs/scheduled/DwellTimeModelCache.java delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/jcs/scheduled/TripDataHistoryCache.java rename transitclock/src/main/java/org/transitclock/core/dataCache/{ => keys}/StopArrivalDepartureCacheKey.java (93%) create mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/KalmanErrorCacheKey.java create mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/StopPathCacheKey.java create mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/TripKey.java rename transitclock/src/main/java/org/transitclock/core/dataCache/{ => keys/bytrip}/KalmanErrorCacheKey.java (93%) rename transitclock/src/main/java/org/transitclock/core/dataCache/{ => keys/bytrip}/StopPathCacheKey.java (94%) rename transitclock/src/main/java/org/transitclock/core/dataCache/{ => keys/bytrip}/TripKey.java (93%) delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/DwellTimeModelCache.java delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/KalmanErrorCache.java delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/StopArrivalDepartureCache.java delete mode 100644 transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/TripDataHistoryCache.java diff --git a/transitclock/src/main/java/org/transitclock/core/PredictionGenerator.java b/transitclock/src/main/java/org/transitclock/core/PredictionGenerator.java index 490d9076e..a2937b9ae 100644 --- a/transitclock/src/main/java/org/transitclock/core/PredictionGenerator.java +++ b/transitclock/src/main/java/org/transitclock/core/PredictionGenerator.java @@ -24,36 +24,24 @@ import java.util.List; import java.util.Map; -import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.lang3.time.DateUtils; import org.transitclock.applications.Core; import org.transitclock.config.BooleanConfigValue; import org.transitclock.config.IntegerConfigValue; -import org.transitclock.core.dataCache.PredictionComparator; -import org.transitclock.core.dataCache.PredictionDataCache; import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; import org.transitclock.core.dataCache.TripDataHistoryCacheInterface; -import org.transitclock.core.dataCache.TripKey; -import org.transitclock.core.dataCache.ehcache.StopArrivalDepartureCache; -import org.transitclock.core.dataCache.ehcache.scheduled.TripDataHistoryCache; -import org.transitclock.core.predictiongenerator.datafilter.DwellTimeDataFilter; -import org.transitclock.core.predictiongenerator.datafilter.DwellTimeFilterFactory; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; +import org.transitclock.core.dataCache.keys.byroute.TripKey; import org.transitclock.core.predictiongenerator.datafilter.TravelTimeDataFilter; import org.transitclock.core.predictiongenerator.datafilter.TravelTimeFilterFactory; import org.transitclock.db.structs.ArrivalDeparture; -import org.transitclock.db.structs.AvlReport; import org.transitclock.db.structs.Block; import org.transitclock.db.structs.PredictionEvent; -import org.transitclock.db.structs.Trip; import org.transitclock.gtfs.DbConfig; import org.transitclock.ipc.data.IpcArrivalDeparture; import org.transitclock.ipc.data.IpcPrediction; -import org.transitclock.ipc.data.IpcPredictionsForRouteStopDest; -import org.transitclock.utils.Time; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -262,7 +250,7 @@ Integer numAfter(List stops, String stop1, String stop2) { } - protected List lastDaysTimes(TripDataHistoryCacheInterface cache, String tripId,String direction, int stopPathIndex, Date startDate, + protected List lastDaysTimes(TripDataHistoryCacheInterface cache, Indices indicies, String tripId,String direction, int stopPathIndex, Date startDate, Integer startTime, int num_days_look_back, int num_days) { @@ -277,13 +265,16 @@ protected List lastDaysTimes(TripDataHistoryCacheInterface ca for (int i = 0; i < num_days_look_back && num_found < num_days; i++) { Date nearestDay = DateUtils.truncate(DateUtils.addDays(startDate, (i + 1) * -1), Calendar.DAY_OF_MONTH); - - TripKey tripKey = new TripKey(tripId, nearestDay, startTime); - + + TripKey tripKey = new TripKey(indicies.getRoute().getId(), indicies.getTrip().getDirectionId(), startTime, nearestDay); + + logger.debug("Looking for cache entry in TripDataHistoryCache for {}.", tripKey); + results = cache.getTripHistory(tripKey); if (results != null) { + logger.debug("Have cache entry in TripDataHistoryCache for {}.", tripKey); IpcArrivalDeparture arrival = getArrival(stopPathIndex, results); if(arrival!=null) @@ -305,7 +296,11 @@ protected List lastDaysTimes(TripDataHistoryCacheInterface ca } } } + }else + { + logger.debug("No cache entry in TripDataHistoryCache for {}.", tripKey); } + } return times; } diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/DwellTimeModelCacheInterface.java b/transitclock/src/main/java/org/transitclock/core/dataCache/DwellTimeModelCacheInterface.java index d169ebeeb..ad51dcaa7 100644 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/DwellTimeModelCacheInterface.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/DwellTimeModelCacheInterface.java @@ -1,5 +1,6 @@ package org.transitclock.core.dataCache; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.Headway; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/ErrorCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/ErrorCache.java index 5ff3dbf2f..d892a6f72 100644 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/ErrorCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/ErrorCache.java @@ -4,6 +4,7 @@ import org.slf4j.Logger; import org.transitclock.core.Indices; +import org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey; public interface ErrorCache { diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/StopArrivalDepartureCacheInterface.java b/transitclock/src/main/java/org/transitclock/core/dataCache/StopArrivalDepartureCacheInterface.java index aa2444747..5765a88b5 100644 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/StopArrivalDepartureCacheInterface.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/StopArrivalDepartureCacheInterface.java @@ -7,6 +7,7 @@ import org.hibernate.Session; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.ipc.data.IpcArrivalDeparture; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/StopPathPredictionCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/StopPathPredictionCache.java index 3f2094fc5..ecdad89a0 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/StopPathPredictionCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/StopPathPredictionCache.java @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.transitclock.core.Indices; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.PredictionForStopPath; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/TripDataHistoryCacheInterface.java b/transitclock/src/main/java/org/transitclock/core/dataCache/TripDataHistoryCacheInterface.java index 4e5c6acc7..d7f7dfaa0 100644 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/TripDataHistoryCacheInterface.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/TripDataHistoryCacheInterface.java @@ -4,7 +4,7 @@ import java.util.List; import org.hibernate.Session; -import org.slf4j.Logger; +import org.transitclock.core.dataCache.keys.byroute.TripKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.ipc.data.IpcArrivalDeparture; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/KalmanErrorCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/KalmanErrorCache.java index 3e3a4b839..a9090624d 100644 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/KalmanErrorCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/KalmanErrorCache.java @@ -16,7 +16,7 @@ import org.transitclock.core.Indices; import org.transitclock.core.dataCache.ErrorCache; import org.transitclock.core.dataCache.KalmanError; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey; /** * @author Sean Óg Crudden * @@ -102,7 +102,7 @@ public void putErrorValue(KalmanErrorCacheKey key, Double value) { error.setError(value); } - + logger.debug("Putting error value {} for key {}.",value, key); cache.put(key,error); } diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/StopArrivalDepartureCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/StopArrivalDepartureCache.java index 106ee9e85..dc0b10241 100644 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/StopArrivalDepartureCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/StopArrivalDepartureCache.java @@ -25,13 +25,13 @@ import org.transitclock.core.dataCache.ArrivalDepartureComparator; import org.transitclock.core.dataCache.DwellTimeModelCacheFactory; import org.transitclock.core.dataCache.IpcArrivalDepartureComparator; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; import org.transitclock.core.dataCache.StopArrivalDepartureCacheInterface; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; import org.transitclock.core.dataCache.StopEvents; import org.transitclock.core.dataCache.TripEvents; -import org.transitclock.core.dataCache.TripKey; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.TripKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.ipc.data.IpcArrivalDeparture; import org.transitclock.utils.Time; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/frequency/TripDataHistoryCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/frequency/TripDataHistoryCache.java index 6a829b5d5..2adb2af04 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/frequency/TripDataHistoryCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/frequency/TripDataHistoryCache.java @@ -32,9 +32,9 @@ import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; import org.transitclock.core.dataCache.TripDataHistoryCacheInterface; import org.transitclock.core.dataCache.TripEvents; -import org.transitclock.core.dataCache.TripKey; import org.transitclock.core.dataCache.ehcache.CacheManagerFactory; import org.transitclock.core.dataCache.frequency.FrequencyBasedHistoricalAverageCache; +import org.transitclock.core.dataCache.keys.byroute.TripKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.Block; import org.transitclock.db.structs.Trip; @@ -164,10 +164,9 @@ synchronized public TripKey putArrivalDeparture(ArrivalDeparture arrivalDepartur time=FrequencyBasedHistoricalAverageCache.round(time, FrequencyBasedHistoricalAverageCache.getCacheIncrementsForFrequencyService()); if(trip!=null) - { - tripKey = new TripKey(arrivalDeparture.getTripId(), - nearestDay, - time); + { + + tripKey=new TripKey(arrivalDeparture.getRouteId(), trip.getDirectionId(), time, nearestDay); logger.debug("Putting :{} in TripDataHistoryCache cache using key {}.", arrivalDeparture, tripKey); diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/scheduled/DwellTimeModelCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/scheduled/DwellTimeModelCache.java index 9c0860ea1..0f229d800 100644 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/scheduled/DwellTimeModelCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/scheduled/DwellTimeModelCache.java @@ -12,9 +12,9 @@ import org.transitclock.config.IntegerConfigValue; import org.transitclock.config.LongConfigValue; import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; -import org.transitclock.core.dataCache.StopPathCacheKey; import org.transitclock.core.dataCache.ehcache.CacheManagerFactory; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.core.predictiongenerator.scheduled.dwell.DwellTimeModelFactory; import org.transitclock.core.predictiongenerator.scheduled.dwell.DwellModel; import org.transitclock.db.structs.ArrivalDeparture; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/scheduled/TripDataHistoryCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/scheduled/TripDataHistoryCache.java index 6369b6205..f7ff0ce53 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/scheduled/TripDataHistoryCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/ehcache/scheduled/TripDataHistoryCache.java @@ -6,17 +6,12 @@ import java.util.Collections; import java.util.Date; import java.net.URL; -import java.util.ArrayList; import java.util.Calendar; import java.util.List; import org.ehcache.Cache; import org.ehcache.CacheManager; -import org.ehcache.Status; -import org.ehcache.config.builders.CacheManagerBuilder; - -import org.ehcache.xml.XmlConfiguration; import org.apache.commons.lang3.time.DateUtils; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; @@ -29,8 +24,8 @@ import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; import org.transitclock.core.dataCache.TripDataHistoryCacheInterface; import org.transitclock.core.dataCache.TripEvents; -import org.transitclock.core.dataCache.TripKey; import org.transitclock.core.dataCache.ehcache.CacheManagerFactory; +import org.transitclock.core.dataCache.keys.byroute.TripKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.Trip; import org.transitclock.gtfs.DbConfig; @@ -46,7 +41,7 @@ * filter. * */ -public class TripDataHistoryCache implements TripDataHistoryCacheInterface{ +public class TripDataHistoryCache implements TripDataHistoryCacheInterface { private static TripDataHistoryCacheInterface singleton = new TripDataHistoryCache(); private static boolean debug = false; @@ -129,10 +124,8 @@ synchronized public TripKey putArrivalDeparture(ArrivalDeparture arrivalDepartur if(trip!=null) { - - tripKey = new TripKey(arrivalDeparture.getTripId(), - nearestDay, - trip.getStartTime()); + + tripKey=new TripKey(arrivalDeparture.getRouteId(), trip.getDirectionId(), trip.getStartTime(), nearestDay); TripEvents result = (TripEvents) cache.get(tripKey); @@ -147,7 +140,8 @@ synchronized public TripKey putArrivalDeparture(ArrivalDeparture arrivalDepartur logger.error("Error adding "+arrivalDeparture.toString()+" event to TripDataHistoryCache.", e); } - + logger.debug("Adding to TripDataHistoryCache {} with key {}.",arrivalDeparture, tripKey); + cache.put(tripKey, result); } } diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/frequency/FrequencyBasedHistoricalAverageCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/frequency/FrequencyBasedHistoricalAverageCache.java index ce87f8bef..f3e2a6b9b 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/frequency/FrequencyBasedHistoricalAverageCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/frequency/FrequencyBasedHistoricalAverageCache.java @@ -28,6 +28,8 @@ import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.*; import org.transitclock.core.dataCache.ehcache.scheduled.TripDataHistoryCache; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; +import org.transitclock.core.dataCache.keys.byroute.TripKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.Trip; import org.transitclock.gtfs.DbConfig; @@ -248,9 +250,8 @@ public IpcArrivalDeparture findPreviousArrivalEvent(List ar private TravelTimeResult getLastPathDuration(IpcArrivalDeparture arrivalDeparture, Trip trip) { Date nearestDay = DateUtils.truncate(new Date(arrivalDeparture.getTime().getTime()), Calendar.DAY_OF_MONTH); - TripKey tripKey = new TripKey(arrivalDeparture.getTripId(), - nearestDay, - trip.getStartTime()); + + TripKey tripKey=new TripKey(arrivalDeparture.getRouteId(), trip.getDirectionId(), trip.getStartTime(), nearestDay); List arrivalDepartures=(List) TripDataHistoryCacheFactory.getInstance().getTripHistory(tripKey); @@ -271,9 +272,8 @@ private TravelTimeResult getLastPathDuration(IpcArrivalDeparture arrivalDepartur private DwellTimeResult getLastStopDuration(IpcArrivalDeparture arrivalDeparture, Trip trip) { Date nearestDay = DateUtils.truncate(new Date(arrivalDeparture.getTime().getTime()), Calendar.DAY_OF_MONTH); - TripKey tripKey = new TripKey(arrivalDeparture.getTripId(), - nearestDay, - trip.getStartTime()); + + TripKey tripKey=new TripKey(arrivalDeparture.getRouteId(), trip.getDirectionId(), trip.getStartTime(), nearestDay); List arrivalDepartures=(List) TripDataHistoryCacheFactory.getInstance().getTripHistory(tripKey); diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/frequency/StopPathCacheKeyStartTimeComparator.java b/transitclock/src/main/java/org/transitclock/core/dataCache/frequency/StopPathCacheKeyStartTimeComparator.java index 9be9b5138..9cd0b39d6 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/frequency/StopPathCacheKeyStartTimeComparator.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/frequency/StopPathCacheKeyStartTimeComparator.java @@ -2,7 +2,7 @@ import java.util.Comparator; -import org.transitclock.core.dataCache.StopPathCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; public class StopPathCacheKeyStartTimeComparator implements Comparator{ diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/KalmanErrorCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/KalmanErrorCache.java deleted file mode 100644 index f59f92f65..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/KalmanErrorCache.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.transitclock.core.dataCache.jcs; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import org.apache.commons.jcs.JCS; -import org.apache.commons.jcs.access.CacheAccess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.transitclock.core.Indices; -import org.transitclock.core.dataCache.ErrorCache; -import org.transitclock.core.dataCache.KalmanError; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; -/** - * @author Sean Og Crudden - * - */ -public class KalmanErrorCache implements ErrorCache { - final private static String cacheName = "KalmanErrorCache"; - - private static final Logger logger = LoggerFactory - .getLogger(KalmanErrorCache.class); - - private CacheAccess cache = null; - - public KalmanErrorCache() { - cache = JCS.getInstance(cacheName); - - } - - /* (non-Javadoc) - * @see org.transitime.core.dataCache.ErrorCache#getErrorValue(org.transitime.core.Indices) - */ - @Override - @SuppressWarnings("unchecked") - synchronized public KalmanError getErrorValue(Indices indices) { - - KalmanErrorCacheKey key=new KalmanErrorCacheKey(indices); - - KalmanError result = cache.get(key); - - return result; - - } - /* (non-Javadoc) - * @see org.transitime.core.dataCache.ErrorCache#getErrorValue(org.transitime.core.dataCache.KalmanErrorCacheKey) - */ - @Override - @SuppressWarnings("unchecked") - synchronized public KalmanError getErrorValue(KalmanErrorCacheKey key) { - System.out.println(cache.getStats().toString()); - - KalmanError result = cache.get(key); - - return result; - } - /* (non-Javadoc) - * @see org.transitime.core.dataCache.ErrorCache#putErrorValue(org.transitime.core.Indices, java.lang.Double) - */ - @Override - @SuppressWarnings("unchecked") - synchronized public void putErrorValue(Indices indices, Double value) { - - KalmanErrorCacheKey key=new KalmanErrorCacheKey(indices); - - putErrorValue(key,value); - - } - - @Override - public void putErrorValue(KalmanErrorCacheKey key, Double value) { - - - KalmanError error= (KalmanError)cache.get(key); - - if(error==null) - { - error=new KalmanError(value); - }else - { - error.setError(value); - } - - - cache.put(key,error); - } - - - public List getKeys() { - ArrayList fulllist=new ArrayList(); - Set names = JCS.getGroupCacheInstance(cacheName).getGroupNames(); - - for(String name:names) - { - Set keys = JCS.getGroupCacheInstance(cacheName).getGroupKeys(name); - - for(Object key:keys) - { - fulllist.add((KalmanErrorCacheKey)key); - } - } - return fulllist; - } -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/frequency/DwellTimeModelCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/frequency/DwellTimeModelCache.java deleted file mode 100644 index b6a6ad7a4..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/frequency/DwellTimeModelCache.java +++ /dev/null @@ -1,232 +0,0 @@ -package org.transitclock.core.dataCache.jcs.frequency; - -import java.util.List; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.jcs.JCS; -import org.apache.commons.jcs.access.CacheAccess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.transitclock.applications.Core; -import org.transitclock.config.DoubleConfigValue; -import org.transitclock.config.IntegerConfigValue; -import org.transitclock.config.LongConfigValue; -import org.transitclock.core.Indices; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; -import org.transitclock.core.dataCache.StopPathCacheKey; -import org.transitclock.core.dataCache.frequency.FrequencyBasedHistoricalAverageCache; -import org.transitclock.core.predictiongenerator.scheduled.dwell.rls.TransitClockRLS; -import org.transitclock.db.structs.ArrivalDeparture; -import org.transitclock.db.structs.Block; -import org.transitclock.db.structs.Headway; -import org.transitclock.gtfs.DbConfig; -import org.transitclock.ipc.data.IpcArrivalDeparture; -import org.transitclock.utils.Time; - -public class DwellTimeModelCache implements org.transitclock.core.dataCache.DwellTimeModelCacheInterface { - - final private static String cacheName = "DwellTimeModelCache"; - - private static IntegerConfigValue maxDwellTimeAllowedInModel = new IntegerConfigValue("org.transitclock.core.dataCache.jcs.maxDwellTimeAllowedInModel", 2 * Time.MS_PER_MIN, "Max dwell time to be considered in dwell RLS algotithm."); - private static LongConfigValue maxHeadwayAllowedInModel = new LongConfigValue("org.transitclock.core.dataCache.jcs.maxHeadwayAllowedInModel", 1*Time.MS_PER_HOUR, "Max headway to be considered in dwell RLS algotithm."); - - private static DoubleConfigValue lambda = new DoubleConfigValue("org.transitclock.core.dataCache.jcs.lambda", 0.75, "This sets the rate at which the RLS algorithm forgets old values. Value are between 0 and 1. With 0 being the most forgetful."); - - private CacheAccess cache = null; - - private static final Logger logger = LoggerFactory.getLogger(DwellTimeModelCache.class); - - public DwellTimeModelCache() { - cache = JCS.getInstance(cacheName); - } - @Override - synchronized public void addSample(ArrivalDeparture event, Headway headway, long dwellTime) { - - Integer time=FrequencyBasedHistoricalAverageCache.secondsFromMidnight(event.getFreqStartTime(),2); - - time=FrequencyBasedHistoricalAverageCache.round(time, FrequencyBasedHistoricalAverageCache.getCacheIncrementsForFrequencyService()); - - StopPathCacheKey key=new StopPathCacheKey(event.getTripId(), event.getStopPathIndex(), false, new Long(time)); - - TransitClockRLS rls = null; - if(cache.get(key)!=null) - { - rls=cache.get(key); - - double[] x = new double[1]; - x[0]=headway.getHeadway(); - - double y = Math.log10(dwellTime); - - - double[] arg0 = new double[1]; - arg0[0]=headway.getHeadway(); - if(rls.getRls()!=null) - { - double prediction = Math.pow(10,rls.getRls().predict(arg0)); - - logger.debug("Predicted dwell: "+prediction + " for: "+key + " based on headway: "+TimeUnit.MILLISECONDS.toMinutes((long) headway.getHeadway())+" mins"); - - logger.debug("Actual dwell: "+ dwellTime + " for: "+key + " based on headway: "+TimeUnit.MILLISECONDS.toMinutes((long) headway.getHeadway())+" mins"); - } - - rls.addSample(headway.getHeadway(), Math.log10(dwellTime)); - if(rls.getRls()!=null) - { - double prediction = Math.pow(10,rls.getRls().predict(arg0)); - - logger.debug("Predicted dwell after: "+ prediction + " for: "+key+ " with samples: "+rls.numSamples()); - } - }else - { - - rls=new TransitClockRLS(lambda.getValue()); - rls.addSample(headway.getHeadway(), Math.log10(dwellTime)); - } - cache.put(key,rls); - } - - @Override - public void addSample(ArrivalDeparture departure) { - try { - if(departure!=null && !departure.isArrival()) - { - Block block=null; - if(departure.getBlock()==null) - { - DbConfig dbConfig = Core.getInstance().getDbConfig(); - block=dbConfig.getBlock(departure.getServiceId(), departure.getBlockId()); - }else - { - block=departure.getBlock(); - } - - Indices indices = new Indices(departure); - StopArrivalDepartureCacheKey key= new StopArrivalDepartureCacheKey(departure.getStopId(), departure.getDate()); - List stopData = StopArrivalDepartureCacheFactory.getInstance().getStopHistory(key); - - if(stopData!=null && stopData.size()>1) - { - IpcArrivalDeparture arrival=findArrival(stopData, new IpcArrivalDeparture(departure)); - if(arrival!=null) - { - IpcArrivalDeparture previousArrival=findPreviousArrival(stopData, arrival); - if(arrival!=null&&previousArrival!=null) - { - Headway headway=new Headway(); - headway.setHeadway(arrival.getTime().getTime()-previousArrival.getTime().getTime()); - long dwelltime=departure.getTime()-arrival.getTime().getTime(); - headway.setTripId(arrival.getTripId()); - - // Negative dwell times are errors in data so do not include. - // TODO not sure if it should ignore zero values. - if(dwelltime>=0) - { - /* Leave out silly values as they are most likely errors or unusual circumstance. */ - if(dwelltime stopData, IpcArrivalDeparture arrival) { - for(IpcArrivalDeparture event:stopData) - { - if(event.isArrival()) - { - if(!event.getVehicleId().equals(arrival.getVehicleId())) - { - if(!event.getTripId().equals(arrival.getTripId())) - { - if(event.getStopId().equals(arrival.getStopId())) - { - if(event.getTime().getTime() stopData, IpcArrivalDeparture departure) { - - for(IpcArrivalDeparture event:stopData) - { - if(event.isArrival()) - { - if(event.getStopId().equals(departure.getStopId())) - { - if(event.getVehicleId().equals(departure.getVehicleId())) - { - if(event.getTripId().equals(departure.getTripId())) - { - return event; - } - } - } - } - } - return null; - } - @Override - public Long predictDwellTime(StopPathCacheKey cacheKey, Headway headway) { - - TransitClockRLS rls=cache.get(cacheKey); - if(rls!=null&&rls.getRls()!=null) - { - double[] arg0 = new double[1]; - arg0[0]=headway.getHeadway(); - rls.getRls().predict(arg0); - long prediction = (long) Math.pow(10, rls.getRls().predict(arg0)); - - // If silly values returned then need to reset model and allow it use the super prediction. - if(prediction>maxDwellTimeAllowedInModel.getValue()) - { - cache.remove(cacheKey); - return null; - } - return prediction; - }else - { - return null; - } - } - public static void main(String[] args) - { - double startvalue=1000; - double result1 = Math.log10(startvalue); - double result2 = Math.pow(10, result1); - if(startvalue==result2) - System.out.println("As expected they are the same."); - } - -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/frequency/TripDataHistoryCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/frequency/TripDataHistoryCache.java deleted file mode 100644 index dab1c056a..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/frequency/TripDataHistoryCache.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.transitclock.core.dataCache.jcs.frequency; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Set; - -import org.apache.commons.jcs.JCS; -import org.apache.commons.jcs.access.CacheAccess; -import org.apache.commons.lang3.time.DateUtils; -import org.hibernate.Criteria; -import org.hibernate.Session; -import org.hibernate.criterion.Restrictions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.transitclock.applications.Core; -import org.transitclock.core.dataCache.ArrivalDepartureComparator; -import org.transitclock.core.dataCache.IpcArrivalDepartureComparator; -import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; -import org.transitclock.core.dataCache.TripDataHistoryCacheInterface; -import org.transitclock.core.dataCache.TripKey; -import org.transitclock.core.dataCache.frequency.FrequencyBasedHistoricalAverageCache; -import org.transitclock.db.structs.ArrivalDeparture; -import org.transitclock.db.structs.Trip; -import org.transitclock.gtfs.DbConfig; -import org.transitclock.gtfs.GtfsData; -import org.transitclock.ipc.data.IpcArrivalDeparture; - - - -public class TripDataHistoryCache implements TripDataHistoryCacheInterface { - final private static String cacheName = "FrequencyTripDataHistoryCache"; - - private static final Logger logger = LoggerFactory - .getLogger(TripDataHistoryCache.class); - - private CacheAccess> cache = null; - - - public List getKeys() { - ArrayList fulllist=new ArrayList(); - Set names = JCS.getGroupCacheInstance(cacheName).getGroupNames(); - - for(String name:names) - { - Set keys = JCS.getGroupCacheInstance(cacheName).getGroupKeys(name); - - for(Object key:keys) - { - fulllist.add((TripKey)key); - } - } - return fulllist; - } - - public TripDataHistoryCache() { - cache = JCS.getInstance(cacheName); - } - - - public void logCache(Logger logger) { - - logger.debug("Cache content log. Not implemented."); - } - - @Override - public List getTripHistory(TripKey tripKey) { - - /* this is what gets the trip from the buckets */ - int time = FrequencyBasedHistoricalAverageCache.round(tripKey.getStartTime(), FrequencyBasedHistoricalAverageCache.getCacheIncrementsForFrequencyService()); - - tripKey.setStartTime(time); - - return cache.get(tripKey); - } - - @Override - synchronized public TripKey putArrivalDeparture(ArrivalDeparture arrivalDeparture) { - logger.debug("Putting :"+arrivalDeparture.toString() + " in TripDataHistoryCache cache."); - /* just put todays time in for last three days to aid development. This means it will kick in in 1 days rather than 3. Perhaps be a good way to start rather than using default transiTime method but I doubt it. */ - int days_back=1; - - TripKey tripKey=null; - - for(int i=0;i < days_back;i++) - { - Date nearestDay = DateUtils.truncate(new Date(arrivalDeparture.getTime()), Calendar.DAY_OF_MONTH); - - nearestDay=DateUtils.addDays(nearestDay, i*-1); - - DbConfig dbConfig = Core.getInstance().getDbConfig(); - - Trip trip=dbConfig.getTrip(arrivalDeparture.getTripId()); - - if(trip!=null) - { - Integer time=FrequencyBasedHistoricalAverageCache.secondsFromMidnight(arrivalDeparture.getDate(),2); - - /* this is what gets the trip from the buckets */ - time=FrequencyBasedHistoricalAverageCache.round(time, FrequencyBasedHistoricalAverageCache.getCacheIncrementsForFrequencyService()); - - tripKey = new TripKey(arrivalDeparture.getTripId(), - nearestDay, - time); - - List list = cache.get(tripKey); - - if(list==null) - list = new ArrayList(); - - try { - list.add(new IpcArrivalDeparture(arrivalDeparture)); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - cache.put(tripKey, Collections.synchronizedList(list)); - } - } - return tripKey; - - } - - /* (non-Javadoc) - * @see org.transitclock.core.dataCache.TripDataHistoryCacheInterface#populateCacheFromDb(org.hibernate.Session, java.util.Date, java.util.Date) - */ - - @Override - public void populateCacheFromDb(Session session, Date startDate, Date endDate) - { - Criteria criteria =session.createCriteria(ArrivalDeparture.class); - - @SuppressWarnings("unchecked") - List results=criteria.add(Restrictions.between("time", startDate, endDate)).list(); - - for(ArrivalDeparture result : results) - { - // TODO this might be better done in the database. - if(GtfsData.routeNotFiltered(result.getRouteId())) - { - TripDataHistoryCacheFactory.getInstance().putArrivalDeparture(result); - } - } - } - - /* (non-Javadoc) - * @see org.transitclock.core.dataCache.ehcache.test#findPreviousArrivalEvent(java.util.List, org.transitclock.db.structs.ArrivalDeparture) - */ - @Override - public IpcArrivalDeparture findPreviousArrivalEvent(List arrivalDepartures,IpcArrivalDeparture current) - { - Collections.sort(arrivalDepartures, new IpcArrivalDepartureComparator()); - for (IpcArrivalDeparture tocheck : emptyIfNull(arrivalDepartures)) - { - if(tocheck.getStopId().equals(current.getStopId()) && (current.isDeparture() && tocheck.isArrival())) - { - return tocheck; - } - } - return null; - } - /* (non-Javadoc) - * @see org.transitclock.core.dataCache.ehcache.test#findPreviousDepartureEvent(java.util.List, org.transitclock.db.structs.ArrivalDeparture) - */ - @Override - public IpcArrivalDeparture findPreviousDepartureEvent(List arrivalDepartures, IpcArrivalDeparture current) - { - Collections.sort(arrivalDepartures, new IpcArrivalDepartureComparator()); - for (IpcArrivalDeparture tocheck : emptyIfNull(arrivalDepartures)) - { - try { - if(tocheck.getStopPathIndex()==(current.getStopPathIndex()-1) - && (current.isArrival() && tocheck.isDeparture()) - && current.getFreqStartTime().equals(tocheck.getFreqStartTime())) - { - return tocheck; - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - return null; - } - private static Iterable emptyIfNull(Iterable iterable) { - return iterable == null ? Collections. emptyList() : iterable; - } -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/scheduled/DwellTimeModelCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/scheduled/DwellTimeModelCache.java deleted file mode 100644 index a7947e02c..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/scheduled/DwellTimeModelCache.java +++ /dev/null @@ -1,238 +0,0 @@ -package org.transitclock.core.dataCache.jcs.scheduled; - -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.jcs.JCS; -import org.apache.commons.jcs.access.CacheAccess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.transitclock.applications.Core; -import org.transitclock.config.DoubleConfigValue; -import org.transitclock.config.IntegerConfigValue; -import org.transitclock.config.LongConfigValue; -import org.transitclock.core.Indices; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; -import org.transitclock.core.dataCache.StopPathCacheKey; -import org.transitclock.core.predictiongenerator.scheduled.dwell.rls.TransitClockRLS; -import org.transitclock.db.structs.ArrivalDeparture; -import org.transitclock.db.structs.Block; -import org.transitclock.db.structs.Headway; -import org.transitclock.gtfs.DbConfig; -import org.transitclock.ipc.data.IpcArrivalDeparture; -import org.transitclock.utils.Time; - -public class DwellTimeModelCache implements org.transitclock.core.dataCache.DwellTimeModelCacheInterface { - - final private static String cacheName = "DwellTimeModelCache"; - - - private static LongConfigValue maxDwellTimeAllowedInModel = new LongConfigValue("transitclock.prediction.rls.maxDwellTimeAllowedInModel", (long) (2 * Time.MS_PER_MIN), "Max dwell time to be considered in dwell RLS algotithm."); - private static LongConfigValue minDwellTimeAllowedInModel = new LongConfigValue("transitclock.prediction.rls.minDwellTimeAllowedInModel", (long) 1000, "Min dwell time to be considered in dwell RLS algotithm."); - private static LongConfigValue maxHeadwayAllowedInModel = new LongConfigValue("transitclock.prediction.rls.maxHeadwayAllowedInModel", 1*Time.MS_PER_HOUR, "Max headway to be considered in dwell RLS algotithm."); - private static LongConfigValue minHeadwayAllowedInModel = new LongConfigValue("transitclock.prediction.rls.minHeadwayAllowedInModel", (long) 1000, "Min headway to be considered in dwell RLS algotithm."); - private static IntegerConfigValue minSceheduleAdherence = new IntegerConfigValue("transitclock.prediction.rls.minSceheduleAdherence", (int) (10 * Time.SEC_PER_MIN), "If schedule adherence of vehicle is outside this then not considerd in dwell RLS algorithm."); - private static IntegerConfigValue maxSceheduleAdherence = new IntegerConfigValue("transitclock.prediction.rls.maxSceheduleAdherence", (int) (10 * Time.SEC_PER_MIN), "If schedule adherence of vehicle is outside this then not considerd in dwell RLS algorithm."); - - - - - private static DoubleConfigValue lambda = new DoubleConfigValue("transitclock.prediction.rls.lambda", 0.75, "This sets the rate at which the RLS algorithm forgets old values. Value are between 0 and 1. With 0 being the most forgetful."); - - private CacheAccess cache = null; - - private static final Logger logger = LoggerFactory.getLogger(DwellTimeModelCache.class); - - public DwellTimeModelCache() { - cache = JCS.getInstance(cacheName); - } - @Override - synchronized public void addSample(ArrivalDeparture event, Headway headway, long dwellTime) { - - StopPathCacheKey key=new StopPathCacheKey(headway.getTripId(), event.getStopPathIndex()); - - - TransitClockRLS rls = null; - if(cache.get(key)!=null) - { - rls=cache.get(key); - - double[] x = new double[1]; - x[0]=headway.getHeadway(); - - double y = Math.log10(dwellTime); - - - double[] arg0 = new double[1]; - arg0[0]=headway.getHeadway(); - if(rls.getRls()!=null) - { - double prediction = Math.pow(10,rls.getRls().predict(arg0)); - - logger.debug("Predicted dwell: "+prediction + " for: "+key + " based on headway: "+TimeUnit.MILLISECONDS.toMinutes((long) headway.getHeadway())+" mins"); - - logger.debug("Actual dwell: "+ dwellTime + " for: "+key + " based on headway: "+TimeUnit.MILLISECONDS.toMinutes((long) headway.getHeadway())+" mins"); - } - - rls.addSample(headway.getHeadway(), Math.log10(dwellTime)); - if(rls.getRls()!=null) - { - double prediction = Math.pow(10,rls.getRls().predict(arg0)); - - logger.debug("Predicted dwell after: "+ prediction + " for: "+key+ " with samples: "+rls.numSamples()); - } - }else - { - - rls=new TransitClockRLS(lambda.getValue()); - rls.addSample(headway.getHeadway(), Math.log10(dwellTime)); - } - cache.put(key,rls); - } - - @Override - public void addSample(ArrivalDeparture departure) { - - try { - if(departure!=null && !departure.isArrival()) - { - StopArrivalDepartureCacheKey key= new StopArrivalDepartureCacheKey(departure.getStopId(), departure.getDate()); - List stopData = StopArrivalDepartureCacheFactory.getInstance().getStopHistory(key); - - if(stopData!=null && stopData.size()>1) - { - IpcArrivalDeparture arrival=findArrival(stopData, new IpcArrivalDeparture(departure)); - if(arrival!=null) - { - IpcArrivalDeparture previousArrival=findPreviousArrival(stopData, arrival); - if(arrival!=null&&previousArrival!=null) - { - Headway headway=new Headway(); - headway.setHeadway(arrival.getTime().getTime()-previousArrival.getTime().getTime()); - long dwelltime=departure.getTime()-arrival.getTime().getTime(); - headway.setTripId(arrival.getTripId()); - - /* Leave out silly values as they are most likely errors or unusual circumstance. */ - /* TODO Should abstract this behind an anomaly detention interface/Factory */ - - if(departure.getScheduleAdherence()!=null && departure.getScheduleAdherence().isWithinBounds(minSceheduleAdherence.getValue(),maxSceheduleAdherence.getValue())) - { - - // Arrival schedule adherence appears not to be set alot. So only stop if set and outside range. - if(previousArrival.getScheduledAdherence()==null || previousArrival.getScheduledAdherence().isWithinBounds(minSceheduleAdherence.getValue(),maxSceheduleAdherence.getValue())) - { - if(dwelltime minDwellTimeAllowedInModel.getValue()) - { - if(headway.getHeadway() < maxHeadwayAllowedInModel.getValue() - && headway.getHeadway() > minHeadwayAllowedInModel.getValue()) - { - addSample(departure,headway,dwelltime); - }else - { - - } - }else - { - logger.info("Dwell time {} outside allowable range for {}.", dwelltime, departure); - } - }else - { - logger.info("Schedule adherence outside allowable range. "+previousArrival.getScheduledAdherence()); - } - }else - { - logger.info("Schedule adherence outside allowable range. "+departure.getScheduleAdherence()); - } - - } - } - } - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - - private IpcArrivalDeparture findPreviousArrival(List stopData, IpcArrivalDeparture arrival) { - for(IpcArrivalDeparture event:stopData) - { - if(event.isArrival()) - { - if(!event.getVehicleId().equals(arrival.getVehicleId())) - { - if(!event.getTripId().equals(arrival.getTripId())) - { - if(event.getStopId().equals(arrival.getStopId())) - { - if(event.getTime().getTime() stopData, IpcArrivalDeparture departure) { - - for(IpcArrivalDeparture event:stopData) - { - if(event.isArrival()) - { - if(event.getStopId().equals(departure.getStopId())) - { - if(event.getVehicleId().equals(departure.getVehicleId())) - { - if(event.getTripId().equals(departure.getTripId())) - { - return event; - } - } - } - } - } - return null; - } - @Override - public Long predictDwellTime(StopPathCacheKey cacheKey, Headway headway) { - - TransitClockRLS rls=cache.get(cacheKey); - if(rls!=null&&rls.getRls()!=null) - { - double[] arg0 = new double[1]; - arg0[0]=headway.getHeadway(); - rls.getRls().predict(arg0); - return (long) Math.pow(10, rls.getRls().predict(arg0)); - }else - { - return null; - } - } - public static void main(String[] args) - { - double startvalue=1000; - double result1 = Math.log10(startvalue); - double result2 = Math.pow(10, result1); - if(startvalue==result2) - System.out.println("As expected they are the same."); - } - -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/scheduled/TripDataHistoryCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/scheduled/TripDataHistoryCache.java deleted file mode 100644 index 8192af168..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/jcs/scheduled/TripDataHistoryCache.java +++ /dev/null @@ -1,177 +0,0 @@ -package org.transitclock.core.dataCache.jcs.scheduled; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Set; - -import org.apache.commons.jcs.JCS; -import org.apache.commons.jcs.access.CacheAccess; -import org.apache.commons.lang3.time.DateUtils; -import org.hibernate.Criteria; -import org.hibernate.Session; -import org.hibernate.criterion.Restrictions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.transitclock.applications.Core; -import org.transitclock.core.dataCache.ArrivalDepartureComparator; -import org.transitclock.core.dataCache.IpcArrivalDepartureComparator; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; -import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; -import org.transitclock.core.dataCache.TripDataHistoryCacheInterface; -import org.transitclock.core.dataCache.TripKey; -import org.transitclock.db.structs.ArrivalDeparture; -import org.transitclock.db.structs.Trip; -import org.transitclock.gtfs.DbConfig; -import org.transitclock.gtfs.GtfsData; -import org.transitclock.ipc.data.IpcArrivalDeparture; - - - -public class TripDataHistoryCache implements TripDataHistoryCacheInterface { - final private static String cacheName = "TripDataHistoryCache"; - - private static final Logger logger = LoggerFactory - .getLogger(TripDataHistoryCache.class); - - private CacheAccess> cache = null; - - - public List getKeys() { - ArrayList fulllist=new ArrayList(); - Set names = JCS.getGroupCacheInstance(cacheName).getGroupNames(); - - for(String name:names) - { - Set keys = JCS.getGroupCacheInstance(cacheName).getGroupKeys(name); - - for(Object key:keys) - { - fulllist.add((TripKey)key); - } - } - return fulllist; - } - - public TripDataHistoryCache() { - cache = JCS.getInstance(cacheName); - } - - - public void logCache(Logger logger) { - - logger.debug("Cache content log. Not implemented."); - } - - @Override - public List getTripHistory(TripKey tripKey) { - return cache.get(tripKey); - } - - @Override - synchronized public TripKey putArrivalDeparture(ArrivalDeparture arrivalDeparture) { - logger.debug("Putting :"+arrivalDeparture.toString() + " in TripDataHistoryCache cache."); - /* just put todays time in for last three days to aid development. This means it will kick in in 1 days rather than 3. Perhaps be a good way to start rather than using default transiTime method but I doubt it. */ - int days_back=1; - - TripKey tripKey=null; - - for(int i=0;i < days_back;i++) - { - Date nearestDay = DateUtils.truncate(new Date(arrivalDeparture.getTime()), Calendar.DAY_OF_MONTH); - - nearestDay=DateUtils.addDays(nearestDay, i*-1); - - DbConfig dbConfig = Core.getInstance().getDbConfig(); - - Trip trip=dbConfig.getTrip(arrivalDeparture.getTripId()); - - if(trip!=null) - { - tripKey = new TripKey(arrivalDeparture.getTripId(), - nearestDay, - trip.getStartTime()); - - List list = cache.get(tripKey); - - if(list==null) - list = new ArrayList(); - - try { - list.add(new IpcArrivalDeparture(arrivalDeparture)); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - cache.put(tripKey, Collections.synchronizedList(list)); - } - } - return tripKey; - - } - - /* (non-Javadoc) - * @see org.transitclock.core.dataCache.TripDataHistoryCacheInterface#populateCacheFromDb(org.hibernate.Session, java.util.Date, java.util.Date) - */ - - @Override - public void populateCacheFromDb(Session session, Date startDate, Date endDate) - { - Criteria criteria =session.createCriteria(ArrivalDeparture.class); - - @SuppressWarnings("unchecked") - List results=criteria.add(Restrictions.between("time", startDate, endDate)).list(); - - for(ArrivalDeparture result : results) - { - // TODO this might be better done in the database. - if(GtfsData.routeNotFiltered(result.getRouteId())) - { - TripDataHistoryCacheFactory.getInstance().putArrivalDeparture(result); - } - } - } - - /* (non-Javadoc) - * @see org.transitclock.core.dataCache.ehcache.test#findPreviousArrivalEvent(java.util.List, org.transitclock.db.structs.ArrivalDeparture) - */ - @Override - public IpcArrivalDeparture findPreviousArrivalEvent(List arrivalDepartures,IpcArrivalDeparture current) - { - Collections.sort(arrivalDepartures, new IpcArrivalDepartureComparator()); - for (IpcArrivalDeparture tocheck : emptyIfNull(arrivalDepartures)) - { - if(tocheck.getStopId().equals(current.getStopId()) && (current.isDeparture() && tocheck.isArrival())) - { - return tocheck; - } - } - return null; - } - /* (non-Javadoc) - * @see org.transitclock.core.dataCache.ehcache.test#findPreviousDepartureEvent(java.util.List, org.transitclock.db.structs.ArrivalDeparture) - */ - @Override - public IpcArrivalDeparture findPreviousDepartureEvent(List arrivalDepartures,IpcArrivalDeparture current) - { - Collections.sort(arrivalDepartures, new IpcArrivalDepartureComparator()); - for (IpcArrivalDeparture tocheck : emptyIfNull(arrivalDepartures)) - { - try { - if(tocheck.getStopPathIndex()==(current.getStopPathIndex()-1) && (current.isArrival() && tocheck.isDeparture())) - { - return tocheck; - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - return null; - } - private static Iterable emptyIfNull(Iterable iterable) { - return iterable == null ? Collections. emptyList() : iterable; - } -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/StopArrivalDepartureCacheKey.java b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/StopArrivalDepartureCacheKey.java similarity index 93% rename from transitclock/src/main/java/org/transitclock/core/dataCache/StopArrivalDepartureCacheKey.java rename to transitclock/src/main/java/org/transitclock/core/dataCache/keys/StopArrivalDepartureCacheKey.java index 2feafca76..21172d7f5 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/StopArrivalDepartureCacheKey.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/StopArrivalDepartureCacheKey.java @@ -1,4 +1,4 @@ -package org.transitclock.core.dataCache; +package org.transitclock.core.dataCache.keys; import java.io.Serializable; import java.util.Calendar; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/KalmanErrorCacheKey.java b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/KalmanErrorCacheKey.java new file mode 100644 index 000000000..3578996c9 --- /dev/null +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/KalmanErrorCacheKey.java @@ -0,0 +1,56 @@ +package org.transitclock.core.dataCache.keys.byroute; + +import java.util.Date; + +public class KalmanErrorCacheKey extends StopPathCacheKey implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 7423030175916471434L; + + // The vehicleId is only used for debug purposed we know in log which vehicle set the error value + private String vehiceId; + + + public KalmanErrorCacheKey(String routeId, String directionId, Integer startTime, Date tripStartDate, + String originStopId, String destinationStopId, boolean travelTime, String vehiceId) { + super(routeId, directionId, startTime, tripStartDate, originStopId, destinationStopId, travelTime); + this.vehiceId = vehiceId; + } + + public String getVehiceId() { + return vehiceId; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((vehiceId == null) ? 0 : vehiceId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + KalmanErrorCacheKey other = (KalmanErrorCacheKey) obj; + if (vehiceId == null) { + if (other.vehiceId != null) + return false; + } else if (!vehiceId.equals(other.vehiceId)) + return false; + return true; + } + + @Override + public String toString() { + return "KalmanErrorCacheKey [vehiceId=" + vehiceId + ", toString()=" + super.toString() + "]"; + } + +} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/StopPathCacheKey.java b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/StopPathCacheKey.java new file mode 100644 index 000000000..c9b23bbc1 --- /dev/null +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/StopPathCacheKey.java @@ -0,0 +1,85 @@ +package org.transitclock.core.dataCache.keys.byroute; + +import java.util.Date; + +/** + * @author Sean Og Crudden + * This key uses route and stop data rather than trip_id and stop path as a mean of looking up an individual stop paths in the cache. + * + */ +public class StopPathCacheKey extends TripKey implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 5269421047453594588L; + + private String originStopId; + private String destinationStopId; + + private boolean travelTime; + + + + public StopPathCacheKey(String routeId, String directionId, Integer startTime, Date tripStartDate, + String originStopId, String destinationStopId, boolean travelTime) { + super(routeId, directionId, startTime, tripStartDate); + this.originStopId = originStopId; + this.destinationStopId = destinationStopId; + this.travelTime = travelTime; + } + + public String getOriginStopId() { + return originStopId; + } + + public String getDestinationStopId() { + return destinationStopId; + } + + public boolean isTravelTime() { + return travelTime; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((destinationStopId == null) ? 0 : destinationStopId.hashCode()); + result = prime * result + ((originStopId == null) ? 0 : originStopId.hashCode()); + result = prime * result + (travelTime ? 1231 : 1237); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + StopPathCacheKey other = (StopPathCacheKey) obj; + if (destinationStopId == null) { + if (other.destinationStopId != null) + return false; + } else if (!destinationStopId.equals(other.destinationStopId)) + return false; + if (originStopId == null) { + if (other.originStopId != null) + return false; + } else if (!originStopId.equals(other.originStopId)) + return false; + if (travelTime != other.travelTime) + return false; + return true; + } + + @Override + public String toString() { + return "StopPathCacheKey [originStopId=" + originStopId + ", destinationStopId=" + destinationStopId + + ", travelTime=" + travelTime + "]"; + } + + +} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/TripKey.java b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/TripKey.java new file mode 100644 index 000000000..fc8e3404d --- /dev/null +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/byroute/TripKey.java @@ -0,0 +1,99 @@ +package org.transitclock.core.dataCache.keys.byroute; + +import java.util.Date; +/** + * @author Sean Og Crudden + * This key uses route rather than trip_id as a mean of looking up an individual trip in the cache. + * + */ +public class TripKey implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -2510753920238579214L; + private String routeId; + private String directionId; + private Integer startTime; + private Date tripStartDate; + + public TripKey(String routeId, String directionId, Integer startTime, Date tripStartDate) { + super(); + this.routeId = routeId; + this.directionId = directionId; + this.startTime = startTime; + this.tripStartDate = tripStartDate; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public String getRouteId() { + return routeId; + } + + public String getDirectionId() { + return directionId; + } + + public Integer getStartTime() { + return startTime; + } + + public Date getTripStartDate() { + return tripStartDate; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((directionId == null) ? 0 : directionId.hashCode()); + result = prime * result + ((routeId == null) ? 0 : routeId.hashCode()); + result = prime * result + ((startTime == null) ? 0 : startTime.hashCode()); + result = prime * result + ((tripStartDate == null) ? 0 : tripStartDate.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TripKey other = (TripKey) obj; + if (directionId == null) { + if (other.directionId != null) + return false; + } else if (!directionId.equals(other.directionId)) + return false; + if (routeId == null) { + if (other.routeId != null) + return false; + } else if (!routeId.equals(other.routeId)) + return false; + if (startTime == null) { + if (other.startTime != null) + return false; + } else if (!startTime.equals(other.startTime)) + return false; + if (tripStartDate == null) { + if (other.tripStartDate != null) + return false; + } else if (!tripStartDate.equals(other.tripStartDate)) + return false; + return true; + } + + @Override + public String toString() { + return "TripKey [routeId=" + routeId + ", directionId=" + directionId + ", startTime=" + startTime + + ", tripStartDate=" + tripStartDate + "]"; + } + + + +} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/KalmanErrorCacheKey.java b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/KalmanErrorCacheKey.java similarity index 93% rename from transitclock/src/main/java/org/transitclock/core/dataCache/KalmanErrorCacheKey.java rename to transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/KalmanErrorCacheKey.java index 3cec5f392..d79a4db32 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/KalmanErrorCacheKey.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/KalmanErrorCacheKey.java @@ -1,4 +1,4 @@ -package org.transitclock.core.dataCache; +package org.transitclock.core.dataCache.keys.bytrip; import org.transitclock.core.Indices; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/StopPathCacheKey.java b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/StopPathCacheKey.java similarity index 94% rename from transitclock/src/main/java/org/transitclock/core/dataCache/StopPathCacheKey.java rename to transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/StopPathCacheKey.java index 2e42b06b0..1b2780359 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/StopPathCacheKey.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/StopPathCacheKey.java @@ -1,4 +1,4 @@ -package org.transitclock.core.dataCache; +package org.transitclock.core.dataCache.keys.bytrip; import java.util.Date; diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/TripKey.java b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/TripKey.java similarity index 93% rename from transitclock/src/main/java/org/transitclock/core/dataCache/TripKey.java rename to transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/TripKey.java index cfa1ff89b..86668eb3b 100755 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/TripKey.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/keys/bytrip/TripKey.java @@ -1,4 +1,4 @@ -package org.transitclock.core.dataCache; +package org.transitclock.core.dataCache.keys.bytrip; import java.util.Date; /** diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/DwellTimeModelCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/DwellTimeModelCache.java deleted file mode 100644 index d25e292a1..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/DwellTimeModelCache.java +++ /dev/null @@ -1,196 +0,0 @@ -package org.transitclock.core.dataCache.memcached.scheduled; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.transitclock.config.IntegerConfigValue; -import org.transitclock.config.LongConfigValue; -import org.transitclock.config.StringConfigValue; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; -import org.transitclock.core.dataCache.StopPathCacheKey; -import org.transitclock.core.predictiongenerator.scheduled.dwell.DwellTimeModelFactory; -import org.transitclock.core.predictiongenerator.datafilter.DwellTimeDataFilter; -import org.transitclock.core.predictiongenerator.datafilter.DwellTimeFilterFactory; -import org.transitclock.core.predictiongenerator.scheduled.dwell.DwellModel; -import org.transitclock.db.structs.ArrivalDeparture; -import org.transitclock.db.structs.Headway; -import org.transitclock.ipc.data.IpcArrivalDeparture; -import org.transitclock.utils.Time; - -import net.spy.memcached.MemcachedClient; -/** - * - * @author scrudden - * This stores DwellModel instances in the cache. TODO We should abstract the anomaly detection as per TODO in code below. - */ -public class DwellTimeModelCache implements org.transitclock.core.dataCache.DwellTimeModelCacheInterface { - - private static LongConfigValue maxHeadwayAllowedInModel = new LongConfigValue("transitclock.prediction.dwell.maxHeadwayAllowedInModel", 1*Time.MS_PER_HOUR, "Max headway to be considered in dwell RLS algotithm."); - private static LongConfigValue minHeadwayAllowedInModel = new LongConfigValue("transitclock.prediction.dwell.minHeadwayAllowedInModel", (long) 1000, "Min headway to be considered in dwell RLS algotithm."); - - - private static StringConfigValue memcachedHost = new StringConfigValue("transitclock.cache.memcached.host", "127.0.0.1", - "Specifies the host machine that memcache is running on."); - - private static IntegerConfigValue memcachedPort = new IntegerConfigValue("transitclock.cache.memcached.port", 11211, - "Specifies the port that memcache is running on."); - - - private static final Logger logger = LoggerFactory.getLogger(DwellTimeModelCache.class); - MemcachedClient memcachedClient = null; - private static String keystub = "DWELLTIMEMODEL_"; - Integer expiryDuration=Time.SEC_PER_DAY*7; - public DwellTimeModelCache() throws IOException { - memcachedClient = new MemcachedClient( - new InetSocketAddress(memcachedHost.getValue(), memcachedPort.getValue().intValue())); - } - @Override - synchronized public void addSample(ArrivalDeparture event, Headway headway, long dwellTime) { - - StopPathCacheKey key=new StopPathCacheKey(headway.getTripId(), event.getStopPathIndex()); - - DwellModel model = null; - - if(memcachedClient.get(createKey(key))!=null) - { - model=(DwellModel) memcachedClient.get(createKey(key)); - - model.putSample((int)dwellTime, (int)headway.getHeadway(),null); - }else - { - model=DwellTimeModelFactory.getInstance(); - } - model.putSample((int)dwellTime, (int)headway.getHeadway(),null); - memcachedClient.set(createKey(key),expiryDuration, model); - } - - @Override - public void addSample(ArrivalDeparture departure) { - try { - if(departure!=null && !departure.isArrival()) - { - StopArrivalDepartureCacheKey key= new StopArrivalDepartureCacheKey(departure.getStopId(), departure.getDate()); - List stopData = StopArrivalDepartureCacheFactory.getInstance().getStopHistory(key); - - if(stopData!=null && stopData.size()>1) - { - IpcArrivalDeparture arrival=findArrival(stopData, new IpcArrivalDeparture(departure)); - if(arrival!=null) - { - IpcArrivalDeparture previousArrival=findPreviousArrival(stopData, arrival); - if(arrival!=null&&previousArrival!=null) - { - Headway headway=new Headway(); - headway.setHeadway(arrival.getTime().getTime()-previousArrival.getTime().getTime()); - long dwelltime=departure.getTime()-arrival.getTime().getTime(); - headway.setTripId(arrival.getTripId()); - - /* Leave out silly values as they are most likely errors or unusual circumstance. */ - DwellTimeDataFilter datafilter = DwellTimeFilterFactory.getInstance(); - - if(!datafilter.filter(arrival, new IpcArrivalDeparture(departure))) - { - - /* TODO Should also abstract behind an anomaly detention interface/Factory */ - if(headway.getHeadway() < maxHeadwayAllowedInModel.getValue() - && headway.getHeadway() > minHeadwayAllowedInModel.getValue()) - { - addSample(departure,headway,dwelltime); - }else - { - logger.warn("Headway outside allowable range . {}", headway); - } - } - } - } - } - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - private IpcArrivalDeparture findPreviousArrival(List stopData, IpcArrivalDeparture arrival) { - for(IpcArrivalDeparture event:stopData) - { - if(event.isArrival()) - { - if(!event.getVehicleId().equals(arrival.getVehicleId())) - { - if(!event.getTripId().equals(arrival.getTripId())) - { - if(event.getStopId().equals(arrival.getStopId())) - { - if(event.getTime().getTime() stopData, IpcArrivalDeparture departure) { - - for(IpcArrivalDeparture event:stopData) - { - if(event.isArrival()) - { - if(event.getStopId().equals(departure.getStopId())) - { - if(event.getVehicleId().equals(departure.getVehicleId())) - { - if(event.getTripId().equals(departure.getTripId())) - { - return event; - } - } - } - } - } - return null; - } - @Override - public Long predictDwellTime(StopPathCacheKey cacheKey, Headway headway) { - - DwellModel model=(DwellModel) memcachedClient.get(createKey(cacheKey)); - if(model==null||headway==null) - return null; - - if(model.predict((int)headway.getHeadway(), null)!=null) - return new Long(model.predict((int)headway.getHeadway(), null)); - - return null; - } - public static void main(String[] args) - { - double startvalue=1000; - double result1 = Math.log10(startvalue); - double result2 = Math.pow(10, result1); - if(startvalue==result2) - System.out.println("As expected they are the same."); - } - private String createKey(StopPathCacheKey key) - { - return keystub + key.getTripId() + "_" + key.getStopPathIndex(); - } - -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/KalmanErrorCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/KalmanErrorCache.java deleted file mode 100644 index 08e5fce1a..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/KalmanErrorCache.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.transitclock.core.dataCache.memcached.scheduled; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.transitclock.config.IntegerConfigValue; -import org.transitclock.config.StringConfigValue; -import org.transitclock.core.Indices; -import org.transitclock.core.dataCache.ErrorCache; -import org.transitclock.core.dataCache.KalmanError; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; -import org.transitclock.utils.Time; - - -import net.spy.memcached.MemcachedClient; -/*TODO This implementation should be removed. */ -public class KalmanErrorCache implements ErrorCache { - - private static StringConfigValue memcachedHost = new StringConfigValue("transitclock.cache.memcached.host", "127.0.0.1", - "Specifies the host machine that memcache is running on."); - - private static IntegerConfigValue memcachedPort = new IntegerConfigValue("transitclock.cache.memcached.port", 11211, - "Specifies the port that memcache is running on."); - - MemcachedClient memcachedClient = null; - private static String keystub = "KALMANERROR_"; - Integer expiryDuration=Time.SEC_PER_DAY*28; - - private static final Logger logger = LoggerFactory - .getLogger(KalmanErrorCache.class); - - public KalmanErrorCache() throws IOException { - memcachedClient = new MemcachedClient( - new InetSocketAddress(memcachedHost.getValue(), memcachedPort.getValue().intValue())); - } - - @Override - public KalmanError getErrorValue(Indices indices) { - KalmanErrorCacheKey key=new KalmanErrorCacheKey(indices); - - return getErrorValue(key); - } - - @Override - public KalmanError getErrorValue(KalmanErrorCacheKey key) { - - KalmanError value = (KalmanError)memcachedClient.get(createKey(key)); - - return value; - } - - @Override - public void putErrorValue(Indices indices, Double value) { - - KalmanErrorCacheKey key=new KalmanErrorCacheKey(indices); - - putErrorValue(key, value); - } - - @Override - public void putErrorValue(KalmanErrorCacheKey key, Double value) { - - memcachedClient.set(createKey(key), expiryDuration, value); - - } - - - public List getKeys() { - - logger.info("Not implemented for memecached."); - return null; - } - - private String createKey(KalmanErrorCacheKey key) { - return keystub + key.getTripId() + "_" + key.getStopPathIndex(); - - } - -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/StopArrivalDepartureCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/StopArrivalDepartureCache.java deleted file mode 100644 index a975a9405..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/StopArrivalDepartureCache.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.transitclock.core.dataCache.memcached.scheduled; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.transitclock.config.IntegerConfigValue; -import org.transitclock.config.StringConfigValue; -import org.transitclock.core.dataCache.ArrivalDepartureComparator; -import org.transitclock.core.dataCache.IpcArrivalDepartureComparator; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheInterface; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; -import org.transitclock.db.structs.ArrivalDeparture; -import org.transitclock.ipc.data.IpcArrivalDeparture; -import org.transitclock.utils.Time; - -import net.spy.memcached.MemcachedClient; - -public class StopArrivalDepartureCache extends StopArrivalDepartureCacheInterface { - - private static StringConfigValue memcachedHost = new StringConfigValue("transitclock.cache.memcached.host", "127.0.0.1", - "Specifies the host machine that memcache is running on."); - - private static IntegerConfigValue memcachedPort = new IntegerConfigValue("transitclock.cache.memcached.port", 11211, - "Specifies the port that memcache is running on."); - - MemcachedClient memcachedClient = null; - Integer expiryDuration=Time.SEC_PER_DAY; - private static String keystub = "STOPAD_"; - - private static final Logger logger = LoggerFactory.getLogger(StopArrivalDepartureCache.class); - - @SuppressWarnings("unchecked") - @Override - public List getStopHistory(StopArrivalDepartureCacheKey key) { - - Calendar date = Calendar.getInstance(); - date.setTime(key.getDate()); - - date.set(Calendar.HOUR_OF_DAY, 0); - date.set(Calendar.MINUTE, 0); - date.set(Calendar.SECOND, 0); - date.set(Calendar.MILLISECOND, 0); - key.setDate(date.getTime()); - List result = (List) memcachedClient.get(createKey(key)); - - return result; - } - - @Override - public StopArrivalDepartureCacheKey putArrivalDeparture(ArrivalDeparture arrivalDeparture) { - - Calendar date = Calendar.getInstance(); - date.setTime(arrivalDeparture.getDate()); - - date.set(Calendar.HOUR_OF_DAY, 0); - date.set(Calendar.MINUTE, 0); - date.set(Calendar.SECOND, 0); - date.set(Calendar.MILLISECOND, 0); - - StopArrivalDepartureCacheKey key = new StopArrivalDepartureCacheKey(arrivalDeparture.getStop().getId(), - date.getTime()); - - List list = getStopHistory(key); - - if (list == null) - list = new ArrayList(); - - try { - list.add(new IpcArrivalDeparture(arrivalDeparture)); - Collections.sort(list, new IpcArrivalDepartureComparator()); - memcachedClient.set(createKey(key), expiryDuration, list); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return key; - } - - public StopArrivalDepartureCache() throws IOException { - super(); - memcachedClient = new MemcachedClient( - new InetSocketAddress(memcachedHost.getValue(), memcachedPort.getValue().intValue())); - } - - private String createKey(StopArrivalDepartureCacheKey key) { - - Calendar date = Calendar.getInstance(); - date.setTime(key.getDate()); - - date.set(Calendar.HOUR_OF_DAY, 0); - date.set(Calendar.MINUTE, 0); - date.set(Calendar.SECOND, 0); - date.set(Calendar.MILLISECOND, 0); - key.setDate(date.getTime()); - - SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); - return keystub + key.getStopid() + "_" + formatter.format(key.getDate()); - } - -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/TripDataHistoryCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/TripDataHistoryCache.java deleted file mode 100644 index b3089ef44..000000000 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/memcached/scheduled/TripDataHistoryCache.java +++ /dev/null @@ -1,162 +0,0 @@ -package org.transitclock.core.dataCache.memcached.scheduled; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.List; - -import org.apache.commons.lang3.time.DateUtils; -import org.hibernate.Criteria; -import org.hibernate.Session; -import org.hibernate.criterion.Restrictions; -import org.slf4j.Logger; -import org.transitclock.applications.Core; -import org.transitclock.config.IntegerConfigValue; -import org.transitclock.config.StringConfigValue; -import org.transitclock.core.dataCache.ArrivalDepartureComparator; -import org.transitclock.core.dataCache.IpcArrivalDepartureComparator; -import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; -import org.transitclock.core.dataCache.TripDataHistoryCacheInterface; -import org.transitclock.core.dataCache.TripKey; -import org.transitclock.db.structs.ArrivalDeparture; -import org.transitclock.db.structs.Trip; -import org.transitclock.gtfs.DbConfig; -import org.transitclock.gtfs.GtfsData; -import org.transitclock.ipc.data.IpcArrivalDeparture; -import org.transitclock.utils.Time; - -import net.spy.memcached.MemcachedClient; - -public class TripDataHistoryCache implements TripDataHistoryCacheInterface { - - private static StringConfigValue memcachedHost = new StringConfigValue("transitclock.cache.memcached.host", "127.0.0.1", - "Specifies the host machine that memcache is running on."); - - private static IntegerConfigValue memcachedPort = new IntegerConfigValue("transitclock.cache.memcached.port", 11211, - "Specifies the port that memcache is running on."); - - MemcachedClient memcachedClient = null; - - private static String keystub = "TRIPHISTORY_"; - Integer expiryDuration=Time.SEC_PER_DAY*28; - public TripDataHistoryCache() throws IOException { - - memcachedClient = new MemcachedClient( - new InetSocketAddress(memcachedHost.getValue(), memcachedPort.getValue().intValue())); - } - - - public List getKeys() { - // TODO Auto-generated method stub - return null; - } - - - public void logCache(Logger logger) { - // TODO Auto-generated method stub - - } - - @SuppressWarnings("unchecked") - @Override - public List getTripHistory(TripKey tripKey) { - - Object value = memcachedClient.get(createKey(tripKey)); - if (value instanceof List) - return (List) value; - return null; - - } - - @Override - public TripKey putArrivalDeparture(ArrivalDeparture arrivalDeparture) { - - Date nearestDay = DateUtils.truncate(new Date(arrivalDeparture.getTime()), Calendar.DAY_OF_MONTH); - - DbConfig dbConfig = Core.getInstance().getDbConfig(); - - Trip trip = dbConfig.getTrip(arrivalDeparture.getTripId()); - if (trip != null) { - TripKey tripKey = new TripKey(arrivalDeparture.getTripId(), nearestDay, trip.getStartTime()); - - List list = this.getTripHistory(tripKey); - - if (list == null) - list = new ArrayList(); - - try { - list.add(new IpcArrivalDeparture(arrivalDeparture)); - } catch (Exception e) { - - e.printStackTrace(); - } - memcachedClient.set(createKey(tripKey), expiryDuration, list); - } - - return null; - } - - @Override - public void populateCacheFromDb(Session session, Date startDate, Date endDate) { - Criteria criteria =session.createCriteria(ArrivalDeparture.class); - - @SuppressWarnings("unchecked") - List results=criteria.add(Restrictions.between("time", startDate, endDate)).list(); - - for(ArrivalDeparture result : results) - { - // TODO this might be better done in the database. - if(GtfsData.routeNotFiltered(result.getRouteId())) - { - TripDataHistoryCacheFactory.getInstance().putArrivalDeparture(result); - } - } - - } - - @Override - public IpcArrivalDeparture findPreviousArrivalEvent(List arrivalDepartures, - IpcArrivalDeparture current) { - Collections.sort(arrivalDepartures, new IpcArrivalDepartureComparator()); - for (IpcArrivalDeparture tocheck : emptyIfNull(arrivalDepartures)) - { - if(tocheck.getStopId().equals(current.getStopId()) && (current.isDeparture() && tocheck.isArrival())) - { - return tocheck; - } - } - return null; - } - - @Override - public IpcArrivalDeparture findPreviousDepartureEvent(List arrivalDepartures, - IpcArrivalDeparture current) { - Collections.sort(arrivalDepartures, new IpcArrivalDepartureComparator()); - for (IpcArrivalDeparture tocheck : emptyIfNull(arrivalDepartures)) - { - try { - if(tocheck.getStopPathIndex()==(current.getStopPathIndex()-1) && (current.isArrival() && tocheck.isDeparture())) - { - return tocheck; - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - return null; - } - - private String createKey(TripKey tripKey) { - SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); - return keystub + tripKey.getTripId() + "_" + formatter.format(tripKey.getTripStartDate()); - } - private static Iterable emptyIfNull(Iterable iterable) { - return iterable == null ? Collections. emptyList() : iterable; - } -} diff --git a/transitclock/src/main/java/org/transitclock/core/dataCache/scheduled/ScheduleBasedHistoricalAverageCache.java b/transitclock/src/main/java/org/transitclock/core/dataCache/scheduled/ScheduleBasedHistoricalAverageCache.java index 52fee658f..f46a6776f 100644 --- a/transitclock/src/main/java/org/transitclock/core/dataCache/scheduled/ScheduleBasedHistoricalAverageCache.java +++ b/transitclock/src/main/java/org/transitclock/core/dataCache/scheduled/ScheduleBasedHistoricalAverageCache.java @@ -22,13 +22,13 @@ import org.transitclock.core.TravelTimeDetails; import org.transitclock.core.dataCache.ArrivalDepartureComparator; import org.transitclock.core.dataCache.HistoricalAverage; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; -import org.transitclock.core.dataCache.StopPathCacheKey; import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; -import org.transitclock.core.dataCache.TripKey; import org.transitclock.core.dataCache.ehcache.CacheManagerFactory; import org.transitclock.core.dataCache.ehcache.scheduled.TripDataHistoryCache; import org.transitclock.core.dataCache.frequency.FrequencyBasedHistoricalAverageCache; +import org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; +import org.transitclock.core.dataCache.keys.byroute.TripKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.Trip; import org.transitclock.gtfs.DbConfig; @@ -129,10 +129,9 @@ synchronized public void putArrivalDeparture(ArrivalDeparture arrivalDeparture) } private TravelTimeDetails getLastTravelTimeDetails(IpcArrivalDeparture arrivalDeparture, Trip trip) { - Date nearestDay = DateUtils.truncate(new Date(arrivalDeparture.getTime().getTime()), Calendar.DAY_OF_MONTH); - TripKey tripKey = new TripKey(arrivalDeparture.getTripId(), - nearestDay, - trip.getStartTime()); + Date nearestDay = DateUtils.truncate(new Date(arrivalDeparture.getTime().getTime()), Calendar.DAY_OF_MONTH); + + TripKey tripKey = new TripKey(trip.getRouteId(), trip.getDirectionId(), trip.getStartTime(), nearestDay); List arrivalDepartures=(List) TripDataHistoryCacheFactory.getInstance().getTripHistory(tripKey); @@ -152,10 +151,9 @@ private TravelTimeDetails getLastTravelTimeDetails(IpcArrivalDeparture arrivalDe private DwellTimeDetails getLastDwellTimeDetails(IpcArrivalDeparture arrivalDeparture, Trip trip) { Date nearestDay = DateUtils.truncate(new Date(arrivalDeparture.getTime().getTime()), Calendar.DAY_OF_MONTH); - TripKey tripKey = new TripKey(arrivalDeparture.getTripId(), - nearestDay, - trip.getStartTime()); + TripKey tripKey = new TripKey(trip.getRouteId(), trip.getDirectionId(), trip.getStartTime(), nearestDay); + List arrivalDepartures=(List) TripDataHistoryCacheFactory.getInstance().getTripHistory(tripKey); if(arrivalDepartures!=null && arrivalDepartures.size()>0 && arrivalDeparture.isDeparture()) diff --git a/transitclock/src/main/java/org/transitclock/core/headwaygenerator/LastArrivalsHeadwayGenerator.java b/transitclock/src/main/java/org/transitclock/core/headwaygenerator/LastArrivalsHeadwayGenerator.java index b73b3934e..80cf19187 100755 --- a/transitclock/src/main/java/org/transitclock/core/headwaygenerator/LastArrivalsHeadwayGenerator.java +++ b/transitclock/src/main/java/org/transitclock/core/headwaygenerator/LastArrivalsHeadwayGenerator.java @@ -8,10 +8,10 @@ import org.transitclock.core.HeadwayGenerator; import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; import org.transitclock.core.dataCache.VehicleDataCache; import org.transitclock.core.dataCache.VehicleStateManager; import org.transitclock.core.dataCache.ehcache.StopArrivalDepartureCache; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.Headway; import org.transitclock.ipc.data.IpcArrivalDeparture; diff --git a/transitclock/src/main/java/org/transitclock/core/headwaygenerator/LastDepartureHeadwayGenerator.java b/transitclock/src/main/java/org/transitclock/core/headwaygenerator/LastDepartureHeadwayGenerator.java index 12e62ce6c..b12950aac 100644 --- a/transitclock/src/main/java/org/transitclock/core/headwaygenerator/LastDepartureHeadwayGenerator.java +++ b/transitclock/src/main/java/org/transitclock/core/headwaygenerator/LastDepartureHeadwayGenerator.java @@ -9,10 +9,10 @@ import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.PredictionDataCache; import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; import org.transitclock.core.dataCache.VehicleDataCache; import org.transitclock.core.dataCache.VehicleStateManager; import org.transitclock.core.dataCache.ehcache.StopArrivalDepartureCache; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.Headway; import org.transitclock.ipc.data.IpcArrivalDeparture; diff --git a/transitclock/src/main/java/org/transitclock/core/holdingmethod/HoldingTimeGeneratorDefaultImpl.java b/transitclock/src/main/java/org/transitclock/core/holdingmethod/HoldingTimeGeneratorDefaultImpl.java index d35868f3d..fe2dac205 100755 --- a/transitclock/src/main/java/org/transitclock/core/holdingmethod/HoldingTimeGeneratorDefaultImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/holdingmethod/HoldingTimeGeneratorDefaultImpl.java @@ -19,10 +19,10 @@ import org.transitclock.core.dataCache.IpcArrivalDepartureComparator; import org.transitclock.core.dataCache.PredictionDataCache; import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; import org.transitclock.core.dataCache.VehicleDataCache; import org.transitclock.core.dataCache.VehicleStateManager; import org.transitclock.core.dataCache.ehcache.StopArrivalDepartureCache; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.HoldingTime; import org.transitclock.ipc.data.IpcArrivalDeparture; diff --git a/transitclock/src/main/java/org/transitclock/core/holdingmethod/SimpleHoldingTimeGeneratorImpl.java b/transitclock/src/main/java/org/transitclock/core/holdingmethod/SimpleHoldingTimeGeneratorImpl.java index 4300b80f4..86eed6210 100644 --- a/transitclock/src/main/java/org/transitclock/core/holdingmethod/SimpleHoldingTimeGeneratorImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/holdingmethod/SimpleHoldingTimeGeneratorImpl.java @@ -19,10 +19,10 @@ import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.PredictionDataCache; import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; import org.transitclock.core.dataCache.VehicleDataCache; import org.transitclock.core.dataCache.VehicleStateManager; import org.transitclock.core.dataCache.ehcache.StopArrivalDepartureCache; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; import org.transitclock.db.structs.ArrivalDeparture; import org.transitclock.db.structs.HoldingTime; import org.transitclock.db.structs.Prediction; diff --git a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/dwell/rls/DwellTimePredictionGeneratorImpl.java b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/dwell/rls/DwellTimePredictionGeneratorImpl.java index 51b41b39d..f5305d214 100644 --- a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/dwell/rls/DwellTimePredictionGeneratorImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/dwell/rls/DwellTimePredictionGeneratorImpl.java @@ -7,8 +7,8 @@ import org.transitclock.core.Indices; import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.DwellTimeModelCacheFactory; -import org.transitclock.core.dataCache.StopPathCacheKey; import org.transitclock.core.dataCache.frequency.FrequencyBasedHistoricalAverageCache; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.core.predictiongenerator.frequency.traveltime.kalman.KalmanPredictionGeneratorImpl; import org.transitclock.db.structs.AvlReport; import org.transitclock.db.structs.Headway; diff --git a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/traveltime/average/HistoricalAveragePredictionGeneratorImpl.java b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/traveltime/average/HistoricalAveragePredictionGeneratorImpl.java index 4a5ac82c1..2ee4beee3 100755 --- a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/traveltime/average/HistoricalAveragePredictionGeneratorImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/traveltime/average/HistoricalAveragePredictionGeneratorImpl.java @@ -12,10 +12,10 @@ import org.transitclock.core.SpatialMatch; import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.HistoricalAverage; -import org.transitclock.core.dataCache.StopPathCacheKey; import org.transitclock.core.dataCache.StopPathPredictionCache; import org.transitclock.core.dataCache.VehicleStateManager; import org.transitclock.core.dataCache.frequency.FrequencyBasedHistoricalAverageCache; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.core.dataCache.scheduled.ScheduleBasedHistoricalAverageCache; import org.transitclock.core.predictiongenerator.PredictionComponentElementsGenerator; import org.transitclock.core.predictiongenerator.lastvehicle.LastVehiclePredictionGeneratorImpl; diff --git a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/traveltime/kalman/KalmanPredictionGeneratorImpl.java b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/traveltime/kalman/KalmanPredictionGeneratorImpl.java index a49bb6ac7..bcd778513 100755 --- a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/traveltime/kalman/KalmanPredictionGeneratorImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/frequency/traveltime/kalman/KalmanPredictionGeneratorImpl.java @@ -18,12 +18,12 @@ import org.transitclock.core.dataCache.ErrorCache; import org.transitclock.core.dataCache.ErrorCacheFactory; import org.transitclock.core.dataCache.KalmanError; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; import org.transitclock.core.dataCache.StopPathPredictionCache; import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; import org.transitclock.core.dataCache.TripDataHistoryCacheInterface; import org.transitclock.core.dataCache.VehicleStateManager; import org.transitclock.core.dataCache.frequency.FrequencyBasedHistoricalAverageCache; +import org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey; import org.transitclock.core.predictiongenerator.PredictionComponentElementsGenerator; import org.transitclock.core.predictiongenerator.frequency.traveltime.average.HistoricalAveragePredictionGeneratorImpl; import org.transitclock.core.predictiongenerator.kalman.KalmanPrediction; @@ -117,7 +117,7 @@ public long getTravelTimeForPath(Indices indices, AvlReport avlReport, VehicleSt Date nearestDay = DateUtils.truncate(avlReport.getDate(), Calendar.DAY_OF_MONTH); - List lastDaysTimes = lastDaysTimes(tripCache, currentVehicleState.getTrip().getId(),currentVehicleState.getTrip().getDirectionId(), + List lastDaysTimes = lastDaysTimes(tripCache, indices, currentVehicleState.getTrip().getId(),currentVehicleState.getTrip().getDirectionId(), indices.getStopPathIndex(), nearestDay, time, maxKalmanDaysToSearch.getValue(), maxKalmanDays.getValue()); diff --git a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/lastvehicle/LastVehiclePredictionGeneratorImpl.java b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/lastvehicle/LastVehiclePredictionGeneratorImpl.java index 00d8c3d87..a09f7cb6e 100755 --- a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/lastvehicle/LastVehiclePredictionGeneratorImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/lastvehicle/LastVehiclePredictionGeneratorImpl.java @@ -14,11 +14,11 @@ import org.transitclock.core.TravelTimeDetails; import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.HistoricalAverage; -import org.transitclock.core.dataCache.StopPathCacheKey; import org.transitclock.core.dataCache.StopPathPredictionCache; import org.transitclock.core.dataCache.VehicleDataCache; import org.transitclock.core.dataCache.VehicleStateManager; import org.transitclock.core.dataCache.ehcache.scheduled.TripDataHistoryCache; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.core.dataCache.scheduled.ScheduleBasedHistoricalAverageCache; import org.transitclock.core.predictiongenerator.PredictionComponentElementsGenerator; import org.transitclock.db.structs.AvlReport; diff --git a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/average/HistoricalAveragePredictionGeneratorImpl.java b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/average/HistoricalAveragePredictionGeneratorImpl.java index ab2224504..13c8f6d91 100755 --- a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/average/HistoricalAveragePredictionGeneratorImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/average/HistoricalAveragePredictionGeneratorImpl.java @@ -11,8 +11,8 @@ import org.transitclock.core.PredictionGeneratorDefaultImpl; import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.HistoricalAverage; -import org.transitclock.core.dataCache.StopPathCacheKey; import org.transitclock.core.dataCache.StopPathPredictionCache; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.core.dataCache.scheduled.ScheduleBasedHistoricalAverageCache; import org.transitclock.core.predictiongenerator.PredictionComponentElementsGenerator; import org.transitclock.core.predictiongenerator.lastvehicle.LastVehiclePredictionGeneratorImpl; diff --git a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/dwell/DwellTimePredictionGeneratorImpl.java b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/dwell/DwellTimePredictionGeneratorImpl.java index df4ba01d9..74e5e1db1 100644 --- a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/dwell/DwellTimePredictionGeneratorImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/dwell/DwellTimePredictionGeneratorImpl.java @@ -5,7 +5,7 @@ import org.transitclock.core.Indices; import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.DwellTimeModelCacheFactory; -import org.transitclock.core.dataCache.StopPathCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.core.predictiongenerator.scheduled.traveltime.kalman.KalmanPredictionGeneratorImpl; import org.transitclock.db.structs.AvlReport; import org.transitclock.db.structs.Headway; diff --git a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/traveltime/kalman/KalmanPredictionGeneratorImpl.java b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/traveltime/kalman/KalmanPredictionGeneratorImpl.java index b9dc02d95..36ce42c10 100755 --- a/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/traveltime/kalman/KalmanPredictionGeneratorImpl.java +++ b/transitclock/src/main/java/org/transitclock/core/predictiongenerator/scheduled/traveltime/kalman/KalmanPredictionGeneratorImpl.java @@ -1,6 +1,5 @@ package org.transitclock.core.predictiongenerator.scheduled.traveltime.kalman; -import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -12,35 +11,28 @@ import org.transitclock.config.BooleanConfigValue; import org.transitclock.config.DoubleConfigValue; import org.transitclock.config.IntegerConfigValue; -import org.transitclock.core.HeadwayDetails; import org.transitclock.core.Indices; import org.transitclock.core.PredictionGeneratorDefaultImpl; import org.transitclock.core.SpatialMatch; -import org.transitclock.core.TemporalDifference; import org.transitclock.core.TravelTimeDetails; import org.transitclock.core.VehicleState; import org.transitclock.core.dataCache.ErrorCache; import org.transitclock.core.dataCache.ErrorCacheFactory; import org.transitclock.core.dataCache.KalmanError; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; import org.transitclock.core.dataCache.StopPathPredictionCache; import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; import org.transitclock.core.dataCache.TripDataHistoryCacheInterface; import org.transitclock.core.dataCache.VehicleStateManager; -import org.transitclock.core.dataCache.ehcache.scheduled.TripDataHistoryCache; -import org.transitclock.core.dataCache.jcs.KalmanErrorCache; +import org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey; import org.transitclock.core.predictiongenerator.PredictionComponentElementsGenerator; import org.transitclock.core.predictiongenerator.kalman.KalmanPrediction; import org.transitclock.core.predictiongenerator.kalman.KalmanPredictionResult; import org.transitclock.core.predictiongenerator.kalman.TripSegment; import org.transitclock.core.predictiongenerator.kalman.Vehicle; import org.transitclock.core.predictiongenerator.kalman.VehicleStopDetail; -import org.transitclock.core.predictiongenerator.scheduled.average.HistoricalAveragePredictionGeneratorImpl; import org.transitclock.db.structs.AvlReport; import org.transitclock.db.structs.PredictionEvent; import org.transitclock.db.structs.PredictionForStopPath; -import org.transitclock.db.structs.VehicleEvent; -import org.transitclock.ipc.data.IpcPrediction; /** * @author Sean Óg Crudden This is a prediction generator that uses a Kalman @@ -124,8 +116,10 @@ public long getTravelTimeForPath(Indices indices, AvlReport avlReport, VehicleSt logger.debug("Kalman has last vehicle info for : " +indices.toString()+ " : "+travelTimeDetails); Date nearestDay = DateUtils.truncate(avlReport.getDate(), Calendar.DAY_OF_MONTH); - - List lastDaysTimes = lastDaysTimes(tripCache, currentVehicleState.getTrip().getId(),currentVehicleState.getTrip().getDirectionId(), + + indices.getStopPath().getStopId(); + + List lastDaysTimes = lastDaysTimes(tripCache, indices,currentVehicleState.getTrip().getId(),currentVehicleState.getTrip().getDirectionId(), indices.getStopPathIndex(), nearestDay, currentVehicleState.getTrip().getStartTime(), maxKalmanDaysToSearch.getValue(), maxKalmanDays.getValue()); diff --git a/transitclock/src/main/java/org/transitclock/ipc/data/IpcHistoricalAverageCacheKey.java b/transitclock/src/main/java/org/transitclock/ipc/data/IpcHistoricalAverageCacheKey.java index b79a13e6e..6e394b656 100755 --- a/transitclock/src/main/java/org/transitclock/ipc/data/IpcHistoricalAverageCacheKey.java +++ b/transitclock/src/main/java/org/transitclock/ipc/data/IpcHistoricalAverageCacheKey.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import org.transitclock.core.dataCache.StopPathCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; public class IpcHistoricalAverageCacheKey implements Serializable { diff --git a/transitclock/src/main/java/org/transitclock/ipc/data/IpcKalmanErrorCacheKey.java b/transitclock/src/main/java/org/transitclock/ipc/data/IpcKalmanErrorCacheKey.java index 5b569059e..a62e010ee 100755 --- a/transitclock/src/main/java/org/transitclock/ipc/data/IpcKalmanErrorCacheKey.java +++ b/transitclock/src/main/java/org/transitclock/ipc/data/IpcKalmanErrorCacheKey.java @@ -2,8 +2,8 @@ import java.io.Serializable; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; -import org.transitclock.core.dataCache.StopPathCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; public class IpcKalmanErrorCacheKey implements Serializable { diff --git a/transitclock/src/main/java/org/transitclock/ipc/interfaces/CacheQueryInterface.java b/transitclock/src/main/java/org/transitclock/ipc/interfaces/CacheQueryInterface.java index 4ada258c3..c542f296d 100755 --- a/transitclock/src/main/java/org/transitclock/ipc/interfaces/CacheQueryInterface.java +++ b/transitclock/src/main/java/org/transitclock/ipc/interfaces/CacheQueryInterface.java @@ -71,13 +71,14 @@ public IpcHistoricalAverage getHistoricalAverage(String tripId, Integer stopPath /** * Return the arrivals and departures for a trip on a specific day and start time - * @param tripId + * @param routeId + * @param directionId * @param date * @param starttime * @return * @throws RemoteException */ - public List getTripArrivalDepartures(String tripId, LocalDate date, Integer starttime) + public List getTripArrivalDepartures(String routeId,String directionId, LocalDate date, Integer starttime) throws RemoteException; diff --git a/transitclock/src/main/java/org/transitclock/ipc/servers/CacheQueryServer.java b/transitclock/src/main/java/org/transitclock/ipc/servers/CacheQueryServer.java index 3bdb48572..e3f692785 100755 --- a/transitclock/src/main/java/org/transitclock/ipc/servers/CacheQueryServer.java +++ b/transitclock/src/main/java/org/transitclock/ipc/servers/CacheQueryServer.java @@ -19,13 +19,13 @@ import org.transitclock.core.dataCache.HoldingTimeCache; import org.transitclock.core.dataCache.HoldingTimeCacheKey; import org.transitclock.core.dataCache.IpcArrivalDepartureComparator; -import org.transitclock.core.dataCache.KalmanErrorCacheKey; import org.transitclock.core.dataCache.StopArrivalDepartureCacheFactory; -import org.transitclock.core.dataCache.StopArrivalDepartureCacheKey; -import org.transitclock.core.dataCache.TripKey; import org.transitclock.core.dataCache.frequency.FrequencyBasedHistoricalAverageCache; +import org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; +import org.transitclock.core.dataCache.keys.byroute.TripKey; import org.transitclock.core.dataCache.scheduled.ScheduleBasedHistoricalAverageCache; -import org.transitclock.core.dataCache.StopPathCacheKey; import org.transitclock.core.dataCache.TripDataHistoryCacheFactory; import org.transitclock.ipc.data.IpcArrivalDeparture; import org.transitclock.ipc.data.IpcHistoricalAverage; @@ -114,40 +114,21 @@ public IpcHistoricalAverage getHistoricalAverage(String tripId, Integer stopPath } @Override - public List getTripArrivalDepartures(String tripId, LocalDate localDate, Integer starttime) + public List getTripArrivalDepartures(String routeId, String directionId, LocalDate localDate, Integer starttime) throws RemoteException { try { List result = new ArrayList(); - if(tripId!=null && localDate!=null && starttime!=null){ + if(routeId!=null && localDate!=null && starttime!=null && directionId!=null){ Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); - TripKey tripKey = new TripKey(tripId, date, starttime); + TripKey tripKey = new TripKey(routeId, directionId, starttime, date); + result = TripDataHistoryCacheFactory.getInstance().getTripHistory(tripKey); - } - else if(tripId!=null && localDate!=null && starttime==null) - { - Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); - for(TripKey key:TripDataHistoryCacheFactory.getInstance().getKeys()) - { - if(key.getTripId().equals(tripId) && date.compareTo(key.getTripStartDate())==0) - { - result.addAll(TripDataHistoryCacheFactory.getInstance().getTripHistory(key)); - } - } - }else if(tripId!=null && localDate==null && starttime==null) - { - for(TripKey key:TripDataHistoryCacheFactory.getInstance().getKeys()) - { - if(key.getTripId().equals(tripId)) - { - result.addAll(TripDataHistoryCacheFactory.getInstance().getTripHistory(key)); - } - } - } - else if(tripId==null && localDate!=null && starttime==null) + } + else if(routeId==null && localDate!=null && starttime==null) { Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); for(TripKey key:TripDataHistoryCacheFactory.getInstance().getKeys()) diff --git a/transitclock/src/main/java/org/transitclock/ipc/servers/PredictionAnalysisServer.java b/transitclock/src/main/java/org/transitclock/ipc/servers/PredictionAnalysisServer.java index c4723977c..c1d24efad 100755 --- a/transitclock/src/main/java/org/transitclock/ipc/servers/PredictionAnalysisServer.java +++ b/transitclock/src/main/java/org/transitclock/ipc/servers/PredictionAnalysisServer.java @@ -10,8 +10,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.transitclock.core.dataCache.StopPathCacheKey; import org.transitclock.core.dataCache.StopPathPredictionCache; +import org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey; import org.transitclock.db.structs.PredictionForStopPath; import org.transitclock.ipc.data.IpcPredictionForStopPath; import org.transitclock.ipc.interfaces.PredictionAnalysisInterface; diff --git a/transitclock/src/main/resources/ehcache.xml b/transitclock/src/main/resources/ehcache.xml index 5a11e876c..f7f476ab9 100644 --- a/transitclock/src/main/resources/ehcache.xml +++ b/transitclock/src/main/resources/ehcache.xml @@ -8,7 +8,7 @@ - org.transitclock.core.dataCache.StopPathCacheKey + org.transitclock.core.dataCache.keys.byroute.StopPathCacheKey org.transitclock.core.predictiongenerator.scheduled.dwell.DwellModel 7 @@ -22,7 +22,7 @@ - org.transitclock.core.dataCache.TripKey + org.transitclock.core.dataCache.keys.byroute.TripKey org.transitclock.core.dataCache.TripEvents 7 @@ -36,7 +36,7 @@ - org.transitclock.core.dataCache.StopArrivalDepartureCacheKey + org.transitclock.core.dataCache.keys.StopArrivalDepartureCacheKey org.transitclock.core.dataCache.StopEvents 1 @@ -50,7 +50,7 @@ - org.transitclock.core.dataCache.KalmanErrorCacheKey + org.transitclock.core.dataCache.keys.bytrip.KalmanErrorCacheKey org.transitclock.core.dataCache.KalmanError 21 @@ -62,7 +62,7 @@ - org.transitclock.core.dataCache.StopPathCacheKey + org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey org.transitclock.core.dataCache.HistoricalAverage 14 diff --git a/transitclock/src/main/resources/logback.xml b/transitclock/src/main/resources/logback.xml index 8b3920f1e..daf850f4f 100755 --- a/transitclock/src/main/resources/logback.xml +++ b/transitclock/src/main/resources/logback.xml @@ -448,13 +448,19 @@ + level="debug" additivity="false"> + level="debug" additivity="false"> + + + + @@ -472,30 +478,17 @@ - - - - - - - - - - - - - - - + + + + @@ -532,11 +525,6 @@ - - - - @@ -545,15 +533,7 @@ level="warn" additivity="false"> - - - - - - diff --git a/transitclockApi/src/main/java/org/transitclock/api/rootResources/CacheApi.java b/transitclockApi/src/main/java/org/transitclock/api/rootResources/CacheApi.java index 4ae7a4798..7d7a1c4dd 100755 --- a/transitclockApi/src/main/java/org/transitclock/api/rootResources/CacheApi.java +++ b/transitclockApi/src/main/java/org/transitclock/api/rootResources/CacheApi.java @@ -241,8 +241,10 @@ public Response getStopArrivalDepartureCacheData(@BeanParam StandardParameters s + "Either tripId or date must be specified.", tags= {"cache"}) public Response getTripArrivalDepartureCacheData(@BeanParam StandardParameters stdParameters, - @Parameter(description="if specified, returns the list for that tripId.",required=false) - @QueryParam(value = "tripId") String tripid, + @Parameter(description="if specified, returns the list for that routeId.",required=false) + @QueryParam(value = "routeId") String routeid, + @Parameter(description="if specified, returns the list for that direction.",required=false) + @QueryParam(value = "routeId") String directionid, @Parameter(description="if specified, returns the list for that date.",required=false) @QueryParam(value = "date") DateParam date, @Parameter(description="if specified, returns the list for that starttime.",required=false) @@ -253,7 +255,7 @@ public Response getTripArrivalDepartureCacheData(@BeanParam StandardParameters s LocalDate queryDate = null; if (date != null) queryDate = date.getDate(); - List result = cachequeryInterface.getTripArrivalDepartures(tripid, queryDate, + List result = cachequeryInterface.getTripArrivalDepartures(routeid,directionid, queryDate, starttime); ApiArrivalDepartures apiResult = new ApiArrivalDepartures(result); From ae141617982a5dd3a6e9a5f377629c908c555095 Mon Sep 17 00:00:00 2001 From: scrudden Date: Mon, 21 Mar 2022 12:53:33 +0000 Subject: [PATCH 2/2] Update cache config to match new cache key for historical trip cache. --- transitclock/src/main/resources/ehcache.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transitclock/src/main/resources/ehcache.xml b/transitclock/src/main/resources/ehcache.xml index f7f476ab9..4934520a9 100644 --- a/transitclock/src/main/resources/ehcache.xml +++ b/transitclock/src/main/resources/ehcache.xml @@ -8,7 +8,7 @@ - org.transitclock.core.dataCache.keys.byroute.StopPathCacheKey + org.transitclock.core.dataCache.keys.bytrip.StopPathCacheKey org.transitclock.core.predictiongenerator.scheduled.dwell.DwellModel 7