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);
 }
 public void add(StreetSegmentLine ssl)
 {
     SegmentLine.Add(ssl);
 }
        public List<StreetSegment> getStreetParkingPrediction(String sessionId, float latitude, float longitude, int distance)
        {
            if (!authenticateUser(sessionId))
            {
                throw Utils.RaiseException(Context.Request.Url.AbsoluteUri,
                                    "getStreetParkingPrediction",
                                    USER_NOT_AUTHENTICATE,
                                    "401",
                                    "getStreetParkingPrediction");
            }

            float distanceKm = ((float)distance) / 1000f;
            Boolean demo = isDemoUser(sessionId);
            List<StreetSegment> segList = new List<StreetSegment>();

            //Algo2:
            if (!PredictionAlgorithmEnabled && !demo)//if not demo user and the prediction algo should not work
            {
                return segList;
            }
            //get all segments and distance from current session and store on sessionData for cache usage
            Dictionary<String, DistancePredictionWrapper> segmentDistance = getAllSegmentsInRange(latitude, longitude, distanceKm);
            //Add user to SegementWaitingUsersList (only if not exist in waiting list)
            assignSessionToSegments(segmentDistance, sessionMap[sessionId]);

            String conStr = ConfigurationManager.ConnectionStrings["CityParkCS"].ConnectionString;
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand())
                {//todo:This SQL should be as getAllSegmentsInRange(..) logic or use the existing return value from getAllSegmentsInRange(..)
                    String sql = String.Format(@"DECLARE @UserLat float = {0}
                            DECLARE @UserLong float = {1}
                            SELECT * FROM [CITYPARK].[dbo].[StreetSegmentLine] a
                            where SQRT  ( POWER((a.StartLatitude - @UserLat) * COS(@UserLat/180) * 40000 / 360, 2)
                            + POWER((a.StartLongitude -@UserLong) * 40000 / 360, 2)) < {2}
                            AND
                                  SQRT  ( POWER((a.endLatitude - @UserLat) * COS(@UserLat/180) * 40000 / 360, 2)
                            + POWER((a.endLongitude -@UserLong) * 40000 / 360, 2)) < {2} order by SegmentUnique", latitude, longitude, distanceKm);
                    cmd.Connection = con;
                    cmd.CommandTimeout = 1200;
                    cmd.CommandText = sql;
                    con.Open();
                    using (SqlDataReader sqlDataReader = cmd.ExecuteReader())
                    {
                        if (sqlDataReader.HasRows)
                        {
                            Random random = new Random();
                            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();
                                StreetSegment sSeg = null;
                                foreach (StreetSegment ss in segList)
                                {
                                    if (ss.SegmentUnique.Equals(ssl.SegmentUnique))
                                    {
                                        sSeg = ss;
                                        break;
                                    }
                                }
                                if (sSeg != null)
                                {
                                    sSeg.add(ssl);
                                }
                                else
                                {
                                    float probability = segmentDistance[ssl.SegmentUnique].calcProbability();
                                    if (probability >= 0 || demo)
                                    {
                                        if (demo)
                                        {
                                            probability = random.Next(0, 100);
                                        }
                                        sSeg = new StreetSegment(ssl.SegmentUnique, probability);
                                        sSeg.add(ssl);
                                        segList.Add(sSeg);
                                    }
                                }

                            }
                        }
                    }
                }
            }
            return segList;
        }