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);
     }
 }
Exemplo n.º 3
0
        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());
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }