//--------------------------------------------------------------------------------------------------- public void Execute(IImportRepository repository, Event e) { m_repository = repository; ProcessEvent(e); ProcessResults(e); }
//--------------------------------------------------------------------------------------------------- public void Save(Event obj) { using (var transaction = SessionProvider.Instance.GetSession().BeginTransaction()) { SessionProvider.Instance.GetSession().SaveOrUpdate(obj); transaction.Commit(); } }
//--------------------------------------------------------------------------------------------------- /// <summary> /// Try to relate the event club to an actual club /// </summary> /// <param name="e"></param> private void ProcessEvent(Event e) { // Only process once and don't bother if club name is empty if (e.Club == null && !String.IsNullOrWhiteSpace(e.ClubName)) { e.Club = FindOrCreateClub(e.ClubName); m_repository.Event(ref e); } }
//--------------------------------------------------------------------------------------------------- private Event GetEventSection(HtmlDocument page) { Event ev = new Event(); // The event name is in a div with id="title" var title_node = page.DocumentNode.SelectSingleNode("//div[@id=\"title\"]"); var title = title_node.InnerText.Trim(); try { ev.Name = title.Remove(title.LastIndexOf(" on")).Remove(0, "Results for".Length); ev.Date = DateTime.Parse(title.Substring(title.LastIndexOf(" on ") + " on ".Length)); } catch (Exception) { // If anything goes wrong just use the entire title as the name ev.Name = title; } ev.Url = InternalEvent.Url; return ev; }
public IDictionary<int, int> GetCompetitorsForPerson(Event e, Person person) { IList results = SessionProvider.Instance.GetSession().CreateQuery( @"SELECT r.Person, COUNT(r.Person) AS Number FROM Result r JOIN r.Course as c JOIN c.Event as e WHERE r.Person IN ( SELECT person.Id FROM Result result JOIN result.Person WHERE result.Course = some ( SELECT course.Id FROM Course course JOIN course. ) ) ").SetParameter("event", e) .SetParameter("person", person) .List(); return new Dictionary<int, int>(); }
public ActionResult Create(Event new_event) { s_repository.Save(new_event); return new EmptyResult(); }
//--------------------------------------------------------------------------------------------------- /// <summary> /// Try to relate the club for each result to an actual club /// </summary> /// <param name="e"></param> private void ProcessResults(Event e) { foreach (var course in s_course_repository.ForEvent(e)) { foreach (var result in s_course_repository.Results(course)) { var res = result; // Only process once and don't bother if club name is empty if (res.Club == null && !String.IsNullOrWhiteSpace(res.ClubName)) { res.Club = FindOrCreateClub(res.ClubName); m_repository.Result(ref res); } } } }
//--------------------------------------------------------------------------------------------------- private void ParseSinglePageWithSplits(IImportRepository repository, HtmlDocument document, Event ev) { }
//--------------------------------------------------------------------------------------------------- private void ParseSinglePage(IImportRepository repository, HtmlDocument document, Event ev) { ParseSinglePage( repository, document, ev, "//div[@class=\"course\"]", // Courses "div[@class=\"course-title\"]/h2", // Course name "p[@class=\"course-info\"][2]", // Course details "table//tr[td]", // Results "td", // Result position "td/td", // Result name "td/td/td", // Result club "td/td/td/td", // Result age "td/td/td/td/td" // Result time ); }
//--------------------------------------------------------------------------------------------------- private void ParseSinglePage( IImportRepository repository, HtmlDocument document, Event ev, string course_selector, string course_name_selector, string course_details_selector, string results_selector, string results_position_selector, string results_name_selector, string results_club_selector, string results_age_selector, string results_time_selector ) { // Courses var course_nodes = document.DocumentNode.SelectNodes(course_selector); foreach (var course_node in course_nodes) { Course course = new Course(); course.Event = ev; // Course name var name_node = course_node.SelectSingleNode(course_name_selector); course.Name = name_node.InnerText; // Course details var details_node = course_node.SelectSingleNode(course_details_selector); if (details_node != null) { course.Length = Convert.ToDecimal(details_node.InnerText.Split(new char[] { ' ' })[0].TrimEnd(new char[] { 'k', 'm' })); course.Climb = Convert.ToDecimal(details_node.InnerText.Split(new char[] { ' ' })[1].TrimEnd(new char[] { 'm' })); } // Commit the course repository.Course(ref course); // Results var results_nodes = course_node.SelectNodes(results_selector); foreach (var results_node in results_nodes) { Result result = new Result(); result.Course = course; // Position can be a number or null, if null then use the string as a code var position_node = results_node.SelectSingleNode(results_position_selector); try { result.Position = Convert.ToInt32(position_node.ChildNodes[0].InnerText.TrimEnd(new char[] { 'r', 's', 't', 'n', 'd', 'h' })); } catch (FormatException) { result.Position = null; result.Code = position_node.ChildNodes[0].InnerText; } // Name var results_name_node = results_node.SelectSingleNode(results_name_selector); result.Name = results_name_node.ChildNodes[0].InnerText; // Club var club_name_node = results_node.SelectSingleNode(results_club_selector); result.ClubName = club_name_node.ChildNodes[0].InnerText; // Age class var age_class_node = results_node.SelectSingleNode(results_age_selector); result.Age = age_class_node.ChildNodes[0].InnerText; // Time var time_node = results_node.SelectSingleNode(results_time_selector); try { result.Time = new TimeSpan( 0, Convert.ToInt32(time_node.ChildNodes[0].InnerText.Split(new char[] { ':' })[0]), Convert.ToInt32(time_node.ChildNodes[0].InnerText.Split(new char[] { ':' })[1]) ); } catch (FormatException) { result.Time = null; } // Commit the result repository.Result(ref result); } } }
//--------------------------------------------------------------------------------------------------- /// <summary> /// AutoDownload results split over multiple pages with splits /// </summary> /// <param name="repository"></param> /// <param name="document"></param> /// <param name="ev"></param> private void ParseMultiplePageWithSplits(IImportRepository repository, HtmlDocument document, Event ev) { ParseMultiplePage( repository, document, ev, "//tr[td]", // Courses "td/td/a", // Course page address "//div[@class=\"course-title\"]/h2", // Course name "//p[@class=\"course-info\"][2]", // Course details "//tr[td]", // Results "td", // Result position "td/td", // Result name "td/td/td", // Result club "td/td/td/td", // Result age "td/td/td/td/td" // Result time ); }
public IList<Course> ForEvent(Event e) { return SessionProvider.Instance.GetSession().CreateQuery("FROM Course c WHERE c.Event = :event") .SetEntity("event", e) .List<Course>(); }
public void Event(ref Event e) { e.Id = m_event_id++; m_events.Add(e); }