//---------------------------------------------------------------------------------------------------
        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
     );
 }
Esempio n. 10
0
        //---------------------------------------------------------------------------------------------------
        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);
                }
            }
        }
Esempio n. 11
0
 //---------------------------------------------------------------------------------------------------
 /// <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);
 }