/// <summary>
 /// Count the sessions in current segment
 /// </summary>
 /// <param name="segment"></param>
 /// <returns></returns>
 public int countSegmentUsers(SearchParkingSegment segment)
 {
     if (segmentToSessionMap.ContainsKey(segment.SegmentUnique))
     {
         return(segmentToSessionMap[segment.SegmentUnique].sessionList.Count);
     }
     return(0);
 }
 /// <summary>
 /// Count the sessions in current segment
 /// </summary>
 /// <param name="segment"></param>
 /// <returns></returns>
 public int countSegmentUsers(SearchParkingSegment segment)
 {
     if(segmentToSessionMap.ContainsKey(segment.SegmentUnique))
     {
         return segmentToSessionMap[segment.SegmentUnique].sessionList.Count;
     }
     return 0;
 }
        /// <summary>
        /// Get the search parking segment is exists and if not create it
        /// </summary>
        /// <param name="sps">SearchParkingSegment</param>
        /// <returns>SearchParkingSegment</returns>
        public SearchParkingSegment getSearchParkingSegment(SearchParkingSegment sps)
        {
            if (segmentToSessionMap.ContainsKey(sps.SegmentUnique))
            {
                return(segmentToSessionMap[sps.SegmentUnique].sps);
            }

            segmentToSessionMap.Add(sps.SegmentUnique, new SearchParkingSegmentDetails(sps, new List <String>()));
            return(sps);
        }
 /// <summary>
 /// Add the session to segment
 /// </summary>
 /// <param name="sessionData"></param>
 /// <param name="segment"></param>
 public void addSessionDataToSegment(String sessionData,SearchParkingSegment segment)
 {
     try
     {
         if (segmentToSessionMap.ContainsKey(segment.SegmentUnique))
         {
             SearchParkingSegmentDetails spsd = segmentToSessionMap[segment.SegmentUnique];
             if (!spsd.sessionList.Contains(sessionData))
             {
                 spsd.sessionList.Add(sessionData);
             }
         }
         else
         {
             segment = getSearchParkingSegment(segment);
             segmentToSessionMap[segment.SegmentUnique].sessionList.Add(sessionData);
         }
     }
     catch (Exception ex) { }
 }
 /// <summary>
 /// Add the session to segment
 /// </summary>
 /// <param name="sessionData"></param>
 /// <param name="segment"></param>
 public void addSessionDataToSegment(String sessionData, SearchParkingSegment segment)
 {
     try
     {
         if (segmentToSessionMap.ContainsKey(segment.SegmentUnique))
         {
             SearchParkingSegmentDetails spsd = segmentToSessionMap[segment.SegmentUnique];
             if (!spsd.sessionList.Contains(sessionData))
             {
                 spsd.sessionList.Add(sessionData);
             }
         }
         else
         {
             segment = getSearchParkingSegment(segment);
             segmentToSessionMap[segment.SegmentUnique].sessionList.Add(sessionData);
         }
     }
     catch (Exception ex) { }
 }
        /// <summary>
        /// Get the search parking segment is exists and if not create it
        /// </summary>
        /// <param name="sps">SearchParkingSegment</param>
        /// <returns>SearchParkingSegment</returns>
        public SearchParkingSegment getSearchParkingSegment(SearchParkingSegment sps)
        {
            if (segmentToSessionMap.ContainsKey(sps.SegmentUnique))
            {
                return segmentToSessionMap[sps.SegmentUnique].sps;
            }

            segmentToSessionMap.Add(sps.SegmentUnique, new SearchParkingSegmentDetails(sps,new List<String>()));
            return sps;
        }
 public SearchParkingSegmentDetails(SearchParkingSegment pSps, List<String> pSessionList)
 {
     sps = pSps;
     sessionList = pSessionList;
 }
 private int getSegmentUsersCount(SearchParkingSegment searchParkingSegment)
 {
     return segmentSessionMap.countSegmentUsers(searchParkingSegment);
 }
 private SearchParkingSegment getParkingSegment(float lat, float lon)
 {
     //Algo:
     //Select from segment
     //todo:fix the SQL logic
     SearchParkingSegment sps = null;
     String conStr = ConfigurationManager.ConnectionStrings["CityParkCS"].ConnectionString;
     using (SqlConnection con = new SqlConnection(conStr))
     {
         using (SqlCommand cmd = new SqlCommand())
         {
             String sql = String.Format(@"DECLARE @UserLat float = {0}
                     DECLARE @UserLong float = {1}
                     SELECT TOP 1 SQRT  ( POWER((a.StartLatitude - @UserLat) * COS(@UserLat/180) * 40000 / 360, 2)
                         + POWER((a.StartLongitude -@UserLong) * 40000 / 360, 2)) as distance,*
                     FROM [CITYPARK].[dbo].[StreetSegmentLine] a
                         order by distance", lat, lon);
             cmd.Connection = con;
             cmd.CommandText = sql;
             con.Open();
             using (SqlDataReader sqlDataReader = cmd.ExecuteReader())
             {
                 if (sqlDataReader.HasRows)
                 {
                     while (sqlDataReader.Read())
                     {
                         StreetSegmentLine ssl = new StreetSegmentLine();
                         ssl.StartLatitude = sqlDataReader["StartLatitude"].ToString();
                         ssl.StartLongitude = sqlDataReader["StartLongitude"].ToString();
                         ssl.EndLatitude = sqlDataReader["EndLatitude"].ToString();
                         ssl.EndLongitude = sqlDataReader["EndLongitude"].ToString();
                         ssl.SegmentUnique = sqlDataReader["SegmentUnique"].ToString();
                         sps = new SearchParkingSegment(-1, ssl.SegmentUnique);
                         break;
                     }
                 }
             }
         }
     }
     return segmentSessionMap.getSearchParkingSegment(sps);
 }
 private float calcSWT(SearchParkingSegment segment, int rate, int radius)
 {
     float SWT = 0;
     if (rate > 0 && segmentSessionMap.countSegmentUsers(segment) > 0)
     {
         //Algo:
         //calulate SWT
         //for each user in the segment waiting list [[1/(sum[user distance from segment/searchRadiusConstant ])]/waitingList[segment].count]/rate
         int waitingListCount = segmentSessionMap.countSegmentUsers(segment);
         List<String> sdList = segmentSessionMap.getSegmetsSessionDataList(segment.SegmentUnique);
         float tmpDistanceDivRadius = 0;
         foreach (String sd in sdList)
         {
             if (sessionMap.ContainsKey(sd))
             {
                 Dictionary<String, DistancePredictionWrapper> sdMap = sessionMap[sd].SegmentDistanceAndPredictionMap;
                 if (sdMap != null && sdMap.ContainsKey(segment.SegmentUnique))
                 {
                     float distance = sdMap[segment.SegmentUnique].distance;
                     tmpDistanceDivRadius += distance / radius;
                 }
             }
         }
         SWT = (1 / tmpDistanceDivRadius) * waitingListCount / rate;
         //store the data SWT in the segment map
         segment.SWT = SWT;
         return SWT;
     }
     else
     {
         return TPhigh;//30 minutes
     }
 }
        /**
         *Recalculate SegmentParkingRate (++)
         * */
        private int calcSegmentParkingRate(SearchParkingSegment sps)
        {
            //Algo:
            //count and return how many start parking in last DELTA T
            int previousSegmentRate = 0;
            int delta = -1;//last houre
            String conStr = ConfigurationManager.ConnectionStrings["CityParkCS"].ConnectionString;
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand())
                {

                    String sql = String.Format(
                        @"SELECT COUNT(*)
                            FROM CITYPARK.[dbo].[StreetParking] where Date > dateadd(hh, {0}, getdate()) and SegementUniqueId='{1}'", delta, sps.SegmentUnique);
                    cmd.Connection = con;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = sql;
                    con.Open();
                    previousSegmentRate = (Int32)cmd.ExecuteScalar();
                }
            }
            return previousSegmentRate;
        }
 public SearchParkingSegmentDetails(SearchParkingSegment pSps, List <String> pSessionList)
 {
     sps         = pSps;
     sessionList = pSessionList;
 }