public static List <BusinessTrip> GetCachedSearch(RedisSearch search) { using (var client = new RedisClient(RedisDataLayer.SingleHost)) { // RedisSearch s = SearchDTO.FromDTO(search); var searchKey = JsonConvert.SerializeObject(search); var result = client.Get <List <BusinessTrip> >(searchKey); return(result); } }
public static void CacheSearch(RedisSearch search, List <BusinessTrip> searchResult) { using (var client = new RedisClient(RedisDataLayer.SingleHost)) { TimeSpan expire = new TimeSpan(0, 10, 0); //RedisSearch s = SearchDTO.FromDTO(search); var searchKey = JsonConvert.SerializeObject(search); client.Set <List <BusinessTrip> >(searchKey, searchResult, expire); } }
public static SearchResultsDTO FindPath(SearchDTO search) { try { var result = new SearchResultsDTO(); if (!ValidateSearch(search)) { return(result); } if (search.IsRoundAbout) { var oneWaySearch = SearchDTO.FromDTO(search); var roundWaySearch = new RedisSearch() { NumberOfCards = search.NumberOfCards, ArrivalStationId = search.TakeOfStationId, TakeOfStationId = search.ArrivalStationId, TakeOfDate = search.TakeOfDateRoundAbout, ArrivalDate = search.ArrivalDateRoundAbout, MaxCardPrice = search.MaxCardPrice, RideTypes = search.RideTypes }; var resultOneWay = GetTripsInPath(oneWaySearch); var resultRoundWay = GetTripsInPath(roundWaySearch); result.OneWayTrip = resultOneWay; result.RoundAboutTrip = resultRoundWay; } else { var oneWaySearch = SearchDTO.FromDTO(search); var resultOneWay = GetTripsInPath(oneWaySearch); result.OneWayTrip = resultOneWay; } return(result); } catch (Exception e) { return(new SearchResultsDTO()); } }
private static IEnumerable <BusinessRideRelationship> CheckIfPathInRange(IEnumerable <BusinessRideRelationship> paths, RedisSearch search) { List <BusinessRideRelationship> list = new List <BusinessRideRelationship>(); DateTime arrivalDate = search.ArrivalDate.Date; DateTime takeOfDate = search.TakeOfDate.Date; foreach (var path in paths) { if (path.Rides.Count() > 0) { var firstRideInPath = path.Rides.ToList()[0]; if (CheckNumSeats(takeOfDate.AddDays(DayDifference(takeOfDate.DayOfWeek, firstRideInPath.DayOfWeek)), search.NumberOfCards, firstRideInPath.Id)) { var totalDays = 0; bool add = true; for (int i = 1; i < path.Rides.Count(); i++) { var rideI = path.Rides.ToList()[i]; var rideIMin = path.Rides.ToList()[i - 1]; totalDays += DayDifference(rideIMin.DayOfWeek, rideI.DayOfWeek); if (takeOfDate.AddDays(totalDays) > arrivalDate) { add = false; break; } if (!CheckNumSeats(takeOfDate.AddDays(DayDifference(takeOfDate.DayOfWeek, rideI.DayOfWeek)), search.NumberOfCards, rideI.Id)) { add = false; break; } } if (add) { list.Add(path); } } } } return(list); }
private static IEnumerable <BusinessTrip> GetTripsInPath(RedisSearch search) { try { var cachedResult = RedisSearchDataProvider.GetCachedSearch(search); if (cachedResult != null) { return(cachedResult); } var takeOfDay = search.TakeOfDate.DayOfWeek; var maxPrice = search.MaxCardPrice; if (maxPrice == 0) { maxPrice = float.MaxValue; } RideType[] rideTypes; if (search.RideTypes == null || (search.RideTypes != null && search.RideTypes.Count == 0)) { rideTypes = new RideType[3]; rideTypes[0] = RideType.Bus; rideTypes[1] = RideType.Car; rideTypes[2] = RideType.MiniBus; } else { rideTypes = search.RideTypes.ToArray(); } var query = DataLayer.Client.Cypher .Match("p = (takeOf: Station) - [ride: RIDE *..15]->(arrive: Station)") .Where((Station takeOf) => takeOf.Id == search.TakeOfStationId) .AndWhere((Station arrive) => arrive.Id == search.ArrivalStationId) .AndWhere("(ride[0]).DayOfWeek = {takeOfDay} ") .WithParam("takeOfDay", takeOfDay) .AndWhere("all (index in range(0, size(ride) -2)" + " where ( (ride[index]).ArrivalTime <= (ride[index+1]).TakeOfTime and (ride[index]).DayOfWeek = (ride[index+1]).DayOfWeek ) " + "or (ride[index]).DayOfWeek <> (ride[index+1]).DayOfWeek )") .AndWhere("reduce (s = 0, r in relationships(p) | " + " s + r.RidePrice) < {maxPrice} ") .WithParam("maxPrice", maxPrice) .AndWhere("all (r in relationships(p) where r.RideType in {rideTypes})") .WithParam("rideTypes", rideTypes) .Return(() => new BusinessRideRelationship { Rides = Return.As <IEnumerable <RideRelationship> >("relationships (p)"), Stations = Return.As <IEnumerable <Station> >("nodes (p)"), }) .Results; var valid = CheckIfPathInRange(query, search); var result = GetSearchResults(valid, search.TakeOfDate); RedisSearchDataProvider.CacheSearch(search, result.ToList()); return(result); } catch (Exception e) { return(new List <BusinessTrip>()); } }
public static IEnumerable <BusinessRideRelationship> CheckNumberOfSeats(IEnumerable <BusinessRideRelationship> paths, RedisSearch search) { var takeOfDate = search.TakeOfDate.Date; List <BusinessRideRelationship> list = new List <BusinessRideRelationship>(); foreach (var path in paths) { bool add = true; foreach (var ride in path.Rides) { var rideDate = takeOfDate.AddDays((ride.DayOfWeek - takeOfDate.DayOfWeek + 7) % 7); var numSeats = CheckExistsNumSeats(ride.Id, rideDate, search.NumberOfCards); if (!numSeats) { add = false; break; } } if (add) { list.Add(path); } } return(list); }