예제 #1
0
        /// <summary>
        /// Get course information given a complete / incomplete UofT course code
        /// Note that the Activities property will be set to null
        /// </summary>
        /// <param name="query">A complete / incomplete UofT course code</param>
        /// <param name="type">How the data is being retrieved</param>
        /// <returns>Course information</returns>
        public static List <Course> GetCourses(string query, CourseQueryType type)
        {
            query = query.ToLower();
            List <Course> courses = new List <Course>();

            if (type == CourseQueryType.CourseCode && query.Length >= 3)
            {
                using (UofTDataContext db = new UofTDataContext())
                {
                    List <DataContext.Course> dbCourses = db.Courses.ToList();
                    foreach (DataContext.Course c in dbCourses)
                    {
                        if (c.Code.ToLower().Contains(query))
                        {
                            Course newCourse = new Course()
                            {
                                CourseCode = c.Code,
                                Activities = null,
                                Term       = c.Term.ToString(),
                                Title      = ""
                            };
                            courses.Add(newCourse);
                        }
                    }
                }
            }
            return(courses);
        }
예제 #2
0
        /// <summary>
        /// Get course information given a complete / incomplete UofT course code
        /// Note that the Activities property will be set to null
        /// </summary>
        /// <param name="query">A complete / incomplete UofT course code</param>
        /// <param name="type">How the data is being retrieved</param>
        /// <returns>Course information</returns>
        public List <Course> GetCourses(string courseCodeQuery)
        {
            courseCodeQuery = courseCodeQuery.ToLower();
            List <Course> courses = new List <Course>();

            if (courseCodeQuery.Length == 3)
            {
                using (UofTDataContext db = new UofTDataContext())
                {
                    List <DataContext.usp_GetCourseInfoResult> foundCourses = db.usp_GetCourseInfo(courseCodeQuery).ToList();
                    foreach (DataContext.usp_GetCourseInfoResult course in foundCourses)
                    {
                        courses.Add(new Course()
                        {
                            CourseCode  = course.Code,
                            Term        = course.Term.ToString(),
                            Title       = course.Title,
                            Description = course.Description,
                            Campus      = course.Campus
                        });
                    }
                }
            }
            return(courses);
        }
        /// <summary>
        /// Adds the distance for two buildings in the database
        /// </summary>
        /// <param name="db">The database context</param>
        /// <param name="building1">The first building</param>
        /// <param name="building2">The second building</param>
        private void AddBuildingDistances(UofTDataContext db, Building building1, Building building2)
        {
            Console.WriteLine("Getting data " + building1.Address + " -> " + building2.Address);

            // Getting distance info (like walk durations, etc)
            BuildingDistanceCalculator calculator = new BuildingDistanceCalculator();

            DataModels.BuildingDistance buildingDistance = calculator.GetInfoBetweenBuildings("walking", building1.Address, building2.Address);

            BuildingDistance newBuildingDistance = new BuildingDistance()
            {
                Building        = building1,
                Building1       = building2,
                WalkingDistance = buildingDistance.WalkingDistance,
                WalkingDuration = buildingDistance.WalkDuration,
                CyclingDistance = buildingDistance.CyclingDistance,
                CyclingDuration = buildingDistance.CyclingDuration,
                TransitDistance = buildingDistance.PublicTransitDistance,
                TransitDuration = buildingDistance.PublicTransitDuration,
                DrivingDistance = buildingDistance.DrivingDistance,
                DrivingDuration = buildingDistance.DrivingDuration
            };

            Console.WriteLine("Inserting new data " + building1.BuildingCode + " -> " + building2.BuildingCode);
            db.BuildingDistances.InsertOnSubmit(newBuildingDistance);
            db.SubmitChanges();
        }
        /// <summary>
        /// Updates the distances between any two buildings in the database
        /// </summary>
        /// <param name="db">The database context</param>
        /// <param name="existingDistances">The existing distances</param>
        private void UpdateBuildingDistances(UofTDataContext db, BuildingDistance existingDistances)
        {
            Building building1 = existingDistances.Building;
            Building building2 = existingDistances.Building1;

            Console.WriteLine("Attempting to update data " + building1.BuildingCode + " -> " + building2.BuildingCode);

            // Getting distance info (like walk durations, etc)
            BuildingDistanceCalculator calculator = new BuildingDistanceCalculator();

            DataModels.BuildingDistance buildingDistance = calculator.GetInfoBetweenBuildings("walking", building1.Address, building2.Address);

            // Making changes to the data
            existingDistances.WalkingDistance = buildingDistance.WalkingDistance;
            existingDistances.WalkingDuration = buildingDistance.WalkDuration;
            existingDistances.CyclingDistance = buildingDistance.CyclingDistance;
            existingDistances.CyclingDuration = buildingDistance.CyclingDuration;
            existingDistances.TransitDistance = buildingDistance.PublicTransitDistance;
            existingDistances.TransitDuration = buildingDistance.PublicTransitDuration;
            existingDistances.DrivingDistance = buildingDistance.DrivingDistance;
            existingDistances.DrivingDuration = buildingDistance.DrivingDuration;

            db.SubmitChanges();
            Console.WriteLine("Successful! Has updated data for " + building1.BuildingCode + " -> " + building2.BuildingCode);
        }
        /// <summary>
        /// Insert new building distances into the database for every new building that exists in the Buildings table.
        /// If {skipExistingData} param is true:
        ///     - it will skip the pair of buildings whose distances already exists in the database.
        ///     - it will add the distances for any pair of buildings whose distances do not exist in the database
        ///
        /// If {skipExistingData} param is false:
        ///     - it will update the distances already existing in the database
        ///     - it will add the distances for any pair of buildings whose distances do not exist in the database
        /// </summary>
        /// <param name="skipExistingData">Whether to skip any existing data or not</param>
        public void InsertBuildingDistancesToDatabase(bool skipExistingData)
        {
            using (UofTDataContext db = new UofTDataContext())
            {
                List <Building> buildings = db.Buildings.ToList();
                for (int i = 0; i < buildings.Count; i++)
                {
                    for (int j = i + 1; j < buildings.Count; j++)
                    {
                        Building building1 = buildings[i];
                        Building building2 = buildings[j];
                        Console.WriteLine("Attempting to insert data " + building1.BuildingCode + " -> " + building2.BuildingCode);

                        // Getting pre-existing data for these two buildings
                        var existingData = from row in db.BuildingDistances
                                           where (row.BuildingID1 == building1.BuildingID && row.BuildingID2 == building2.BuildingID) ||
                                           (row.BuildingID1 == building2.BuildingID && row.BuildingID2 == building1.BuildingID)
                                           select row;

                        if (existingData != null && existingData.ToList().Count == 1 && !skipExistingData)
                        {
                            Console.WriteLine("Updating building distances " + building1.BuildingCode + " -> " + building2.BuildingCode);
                            foreach (BuildingDistance row in existingData.ToList())
                            {
                                UpdateBuildingDistances(db, row);
                            }
                        }
                        else if (existingData == null || existingData.ToList().Count == 0)
                        {
                            AddBuildingDistances(db, building1, building2);
                        }
                    }
                }
            }
        }
 /// <summary>
 /// Deletes all the records in the BuildingDistance table
 /// </summary>
 public void DeleteAllRecords()
 {
     using (UofTDataContext db = new UofTDataContext())
     {
         db.ExecuteCommand("DELETE FROM BuildingDistances");
         db.ExecuteCommand("DBCC CHECKIDENT ('BuildingDistances', RESEED, 0)");
     }
 }
 /// <summary>
 /// Updates all the distances already stored in the database
 /// </summary>
 public void UpdateBuildingDistanceInfo()
 {
     using (UofTDataContext db = new UofTDataContext())
     {
         List <BuildingDistance> rows = db.BuildingDistances.ToList();
         foreach (BuildingDistance row in rows)
         {
             UpdateBuildingDistances(db, row);
         }
     }
 }
예제 #8
0
        /// <summary>
        /// Get building info from a building code
        /// </summary>
        /// <param name="buildingCode">The building code</param>
        /// <returns>Building information</returns>
        public Building GetBuilding(string buildingCode)
        {
            using (UofTDataContext db = new UofTDataContext())
            {
                var building = (from b in db.Buildings
                                where b.BuildingCode == buildingCode
                                select b).ToList();

                if (building.Count != 1)
                {
                    throw new Exception("There is more than one or no buildings with building code " + buildingCode);
                }

                return(new Building(building[0]));
            }
        }
예제 #9
0
        /// <summary>
        /// Get complete course information (including the activities, sections, sessions, etc)
        /// of a course
        /// </summary>
        /// <param name="courseCode">A complete UofT course code</param>
        /// <returns>Course information</returns>
        public Course GetCourseDetails(string courseCode)
        {
            using (UofTDataContext db = new UofTDataContext())
            {
                List <DataContext.Course> oldCourses = (from c in db.Courses
                                                        where c.Code == courseCode
                                                        select c).ToList();

                if (oldCourses.Count() != 1)
                {
                    throw new Exception("There is more than one or no course with course code " + courseCode);
                }

                DataContext.Course oldCourse = oldCourses[0];
                return(CourseFactory.GetCourse(oldCourse));
            }
        }
        /// <summary>
        /// Deletes all building records in the database and repopulates it with new data
        /// </summary>
        public void RedoBuildingList()
        {
            db.ExecuteCommand("DELETE FROM BuildingDistances");
            db.ExecuteCommand("DELETE FROM Building");

            Browser.Initialize();
            Browser.WebInstance.Url = "http://map.utoronto.ca/c/buildings";

            using (UofTDataContext db = new UofTDataContext())
            {
                IWebElement buildingsList = Browser.WebInstance.FindElement(By.ClassName("buildinglist"));
                IReadOnlyList <IWebElement> buildingElements = buildingsList.FindElements(By.TagName("li"));

                foreach (IWebElement building in buildingElements)
                {
                    string[] description  = building.FindElement(By.XPath("./dl/dt")).Text.Split('|');
                    string   address      = building.FindElement(By.XPath("./dl/dd[1]")).Text.Trim();
                    string   buildingName = description[0].Trim();
                    string   buildingCode = description[1].Trim();

                    Building newBuilding = new Building
                    {
                        Address      = address + " Toronto, Canada",
                        BuildingCode = buildingCode,
                        BuildingName = buildingName,
                        Latitude     = null,
                        Longitude    = null
                    };

                    db.Buildings.InsertOnSubmit(newBuilding);
                }
                db.SubmitChanges();
            }

            Browser.Close();
        }