diff --git a/Lib_CSharp b/Lib_CSharp index fa260546..6b7ed8c0 160000 --- a/Lib_CSharp +++ b/Lib_CSharp @@ -1 +1 @@ -Subproject commit fa26054678e1c938b1120f7eaab8b26476700245 +Subproject commit 6b7ed8c04f1728570c2f7575bc1ceab2b713f04b diff --git a/PoliNetwork.Graduatorie.Common/Enums/SchoolEnum.cs b/PoliNetwork.Graduatorie.Common/Enums/SchoolEnum.cs index 66b6eced..12bb8d69 100644 --- a/PoliNetwork.Graduatorie.Common/Enums/SchoolEnum.cs +++ b/PoliNetwork.Graduatorie.Common/Enums/SchoolEnum.cs @@ -28,7 +28,7 @@ public static string ToShortName(this SchoolEnum s) SchoolEnum.Design => "DES", SchoolEnum.Ingegneria => "ENG", SchoolEnum.Urbanistica => "URB", - _ => "UNK", + _ => "UNK" }; } } \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Common/Objects/EnrollType.cs b/PoliNetwork.Graduatorie.Common/Objects/EnrollType.cs index 2fb946ec..09d44d99 100644 --- a/PoliNetwork.Graduatorie.Common/Objects/EnrollType.cs +++ b/PoliNetwork.Graduatorie.Common/Objects/EnrollType.cs @@ -23,7 +23,7 @@ public int GetHashWithoutLastUpdate() return i; } - + public static EnrollType From(string? rowCanEnrollInto, bool rowCanEnroll) { if (rowCanEnroll == false) diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/IndexJsonBase.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/IndexJsonBase.cs index 1dbd7040..15124454 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/IndexJsonBase.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/IndexJsonBase.cs @@ -6,6 +6,9 @@ using PoliNetwork.Graduatorie.Common.Objects; using PoliNetwork.Graduatorie.Parser.Objects.Json.Indexes.Specific; using PoliNetwork.Graduatorie.Parser.Objects.RankingNS; +using PoliNetwork.Graduatorie.Parser.Objects.Tables.Course; +using PoliNetwork.Graduatorie.Parser.Objects.Tables.Merit; +using PoliNetwork.Graduatorie.Parser.Utils; #endregion @@ -23,12 +26,115 @@ public void WriteToFile(string outFolder, string pathFile) var mainJsonString = JsonConvert.SerializeObject(this, Culture.JsonSerializerSettings); File.WriteAllText(mainJsonPath, mainJsonString); } - + + public static void WriteAllIndexes(RankingsSet rankingsSet, string outFolder, ArgsConfig argsConfig) { + //let's write all single json files + WriteSingleJsons(rankingsSet, outFolder, argsConfig); //now let's write each single different index BySchoolYearJson.From(rankingsSet)?.WriteToFile(outFolder, BySchoolYearJson.PathCustom); ByYearSchoolJson.From(rankingsSet)?.WriteToFile(outFolder, ByYearSchoolJson.PathCustom); BySchoolYearCourseJson.From(rankingsSet)?.WriteToFile(outFolder, BySchoolYearCourseJson.PathCustom); } + + + public static void WriteSingleJsons(RankingsSet? set, string outFolder, ArgsConfig argsConfig) + { + if (set == null) + return; + + // group rankings by year + var bySchool = set.Rankings.GroupBy(r => r.School); + foreach (var schoolGroup in bySchool) + { + if (schoolGroup.Key is null) + continue; + var school = schoolGroup.Key.Value; + + var byYears = schoolGroup.GroupBy(r => r.Year); + foreach (var yearGroup in byYears) + { + if (yearGroup.Key is null) + continue; + var year = yearGroup.Key.Value; + var folder = Path.Join(outFolder, school.ToString(), year.ToString()); + Directory.CreateDirectory(folder); + + foreach (var ranking in yearGroup) WriteSingleJsonRanking(folder, ranking, argsConfig); + } + } + } + + private static void WriteSingleJsonRanking(string folder, Ranking ranking, ArgsConfig argsConfig) + { + var path = Path.Join(folder, ranking.GetFilename()); + + if (ExitIfAlreadyExistsAndNotUpdated(ranking, path) && !argsConfig.ForceReparsing) return; + + var rankingJsonString = JsonConvert.SerializeObject(ranking, Culture.JsonSerializerSettings); + File.WriteAllText(path, rankingJsonString); + } + + private static bool ExitIfAlreadyExistsAndNotUpdated(Ranking a, string path) + { + if (!File.Exists(path)) return false; + var b = GetRankingFromFile(path); + return b != null && SameHash(a, b); + } + + private static bool SameHash(Ranking a, Ranking b) + { + var ai = a.GetHashWithoutLastUpdate(); + var bi = b.GetHashWithoutLastUpdate(); + return ai == bi; + } + + private static bool SameHashCourse(IReadOnlyCollection? aTableCourse, + IReadOnlyCollection? bTableCourse) + { + if (aTableCourse == null && bTableCourse == null) + return true; + if (aTableCourse == null || bTableCourse == null) + return false; + + if (aTableCourse.Count != bTableCourse.Count) + return false; + + var aList = aTableCourse.Select(variable => + { + var hashWithoutLastUpdate = variable.GetHashWithoutLastUpdate(); + return hashWithoutLastUpdate; + }).ToList(); + var aHash = Hashing.GetHashFromListHash(aList); + + var bList = bTableCourse.Select(variable => + { + var hashWithoutLastUpdate = variable.GetHashWithoutLastUpdate(); + return hashWithoutLastUpdate; + }).ToList(); + var bHash = Hashing.GetHashFromListHash(bList); + + return aHash == bHash; + } + + private static bool SameHashMerit(MeritTable? aTableMerit, MeritTable? bTableMerit) + { + if (aTableMerit == null && bTableMerit == null) + return true; + if (aTableMerit == null || bTableMerit == null) + return false; + + var ai = aTableMerit.GetHashWithoutLastUpdate(); + var bi = bTableMerit.GetHashWithoutLastUpdate(); + return ai == bi; + } + + private static Ranking? GetRankingFromFile(string path) + { + var x = File.ReadAllText(path); + + var j = JsonConvert.DeserializeObject(x, Culture.JsonSerializerSettings); + return j; + } } \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearCourseJson.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearCourseJson.cs index ae84a487..e4e9c9e0 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearCourseJson.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearCourseJson.cs @@ -1,9 +1,11 @@ #region + using System.Diagnostics; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using PoliNetwork.Graduatorie.Common.Enums; using PoliNetwork.Graduatorie.Parser.Objects.RankingNS; + #endregion namespace PoliNetwork.Graduatorie.Parser.Objects.Json.Indexes.Specific; diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/SingleCourseJson.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/SingleCourseJson.cs index 0a6d1b72..9f5dbb0b 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/SingleCourseJson.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/SingleCourseJson.cs @@ -12,16 +12,42 @@ namespace PoliNetwork.Graduatorie.Parser.Objects.Json; [Serializable] [JsonObject(MemberSerialization.Fields, NamingStrategyType = typeof(CamelCaseNamingStrategy))] -public class SingleCourseJson: IComparable +public class SingleCourseJson : IComparable { public string? BasePath; + public string? Id; public string? Link; public string? Location; - public string? Id; public RankingOrder? RankingOrder; public SchoolEnum? School; public int? Year; + + public int CompareTo(SingleCourseJson? singleCourseJson) + { + if (singleCourseJson == null) return 1; + + if (Year != singleCourseJson.Year) + return (Year ?? -1) < (singleCourseJson.Year ?? -1) ? -1 : 1; + + if (School != singleCourseJson.School) return School < singleCourseJson.School ? -1 : 1; + + if (BasePath != singleCourseJson.BasePath) + return string.Compare(BasePath ?? "", singleCourseJson.BasePath ?? "", StringComparison.InvariantCulture); + + if (Link != singleCourseJson.Link) + return string.Compare(Link ?? "", singleCourseJson.Link ?? "", StringComparison.InvariantCulture); + + if (Location != singleCourseJson.Location) + return string.Compare(Location ?? "", singleCourseJson.Location ?? "", StringComparison.InvariantCulture); + + if (Id != singleCourseJson.Id) + return string.Compare(Id ?? "", singleCourseJson.Id ?? "", StringComparison.InvariantCulture); + + return 0; + } + + public static SingleCourseJson From(Ranking ranking, CourseTable? course) { var basePath = $"{ranking.School}/{ranking.Year}/"; // "Ingegneria/2023" @@ -48,29 +74,6 @@ public int GetHashWithoutLastUpdate() return hashWithoutLastUpdate ^ hashCode ^ basePathInt ^ yearInt ^ schoolInt ^ code; } - public int CompareTo(SingleCourseJson? singleCourseJson) - { - if (singleCourseJson == null) return 1; - - if (Year != singleCourseJson.Year) - return (Year ?? -1) < (singleCourseJson.Year ?? -1) ? -1 : 1; - - if (School != singleCourseJson.School) return School < singleCourseJson.School ? -1 : 1; - - if (BasePath != singleCourseJson.BasePath) - return string.Compare(BasePath ?? "", singleCourseJson.BasePath ?? "", StringComparison.InvariantCulture); - - if (Link != singleCourseJson.Link) - return string.Compare(Link ?? "", singleCourseJson.Link ?? "", StringComparison.InvariantCulture); - - if (Location != singleCourseJson.Location) - return string.Compare(Location ?? "", singleCourseJson.Location ?? "", StringComparison.InvariantCulture); - - if (Id != singleCourseJson.Id) - return string.Compare(Id ?? "", singleCourseJson.Id ?? "", StringComparison.InvariantCulture); - - return 0; - } public bool Is(CourseTable courseTable) { diff --git a/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/Ranking.cs b/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/Ranking.cs index aed019d1..8ee534c0 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/Ranking.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/Ranking.cs @@ -10,7 +10,6 @@ using PoliNetwork.Graduatorie.Parser.Objects.Json.Stats; using PoliNetwork.Graduatorie.Parser.Objects.Tables.Course; using PoliNetwork.Graduatorie.Parser.Objects.Tables.Merit; -using PoliNetwork.Graduatorie.Parser.Utils; using PoliNetwork.Graduatorie.Parser.Utils.Output; #endregion @@ -31,33 +30,45 @@ public class Ranking : IComparable, IEquatable public RankingUrl? Url; public int? Year; - public RankingSummaryStudent GetRankingSummaryStudent() + + public int CompareTo(Ranking? other) { - return new RankingSummaryStudent(RankingOrder?.Phase, School, Year, Url); + if (ReferenceEquals(this, other)) return 0; + if (ReferenceEquals(null, other)) return 1; + + return string.Compare(GetId(), other.GetId(), StringComparison.Ordinal); } - + + + public bool Equals(Ranking? other) + { + if (other == null) return false; + return GetHashWithoutLastUpdate() == other.GetHashWithoutLastUpdate(); + } + + public static Ranking? FromJson(string fullPath) { if (!File.Exists(fullPath)) return null; - + var str = File.ReadAllText(fullPath); var ranking = JsonConvert.DeserializeObject(str, Culture.JsonSerializerSettings); return ranking; } - public int CompareTo(Ranking? other) + public RankingSummaryStudent GetRankingSummaryStudent() { - if (ReferenceEquals(this, other)) return 0; - if (ReferenceEquals(null, other)) return 1; - - return string.Compare(GetId(), other.GetId(), StringComparison.Ordinal); + return new RankingSummaryStudent(RankingOrder?.Phase, School, Year, Url); } + public override bool Equals(object? obj) + { + return Equals(obj as Ranking); + } - public bool Equals(Ranking? other) + public override int GetHashCode() { - if (other == null) return false; - return GetHashWithoutLastUpdate() == other.GetHashWithoutLastUpdate(); + return GetHashWithoutLastUpdate(); } @@ -99,7 +110,7 @@ public string GetFilename() public string GetId() { var idList = new List(); - + var schoolShort = School?.ToShortName(); if (schoolShort != null) idList.Add(schoolShort); @@ -108,7 +119,7 @@ public string GetId() var orderId = RankingOrder?.GetId(); if (orderId != null) idList.Add(orderId); - + var fallback = DateTime.UtcNow.ToString("yyyyMMddTHHmmss", CultureInfo.InvariantCulture) + "Z"; if (idList.Count == 0) idList.Add(fallback); @@ -159,7 +170,7 @@ public void WriteAsJson(string outFolder, bool forceReparse = false) { var folderPath = GetBasePath(outFolder); Directory.CreateDirectory(folderPath); - + var fullPath = GetFullPath(outFolder); var savedRanking = FromJson(fullPath); @@ -171,7 +182,7 @@ public void WriteAsJson(string outFolder, bool forceReparse = false) File.WriteAllText(fullPath, rankingJsonString); } } - + /*** * Ottieni l'hash senza considerare il valore di LastUpdate */ @@ -185,7 +196,7 @@ public int GetHashWithoutLastUpdate() i ^= Url?.GetHashWithoutLastUpdate() ?? "Url".GetHashCode(); i ^= Year?.GetHashCode() ?? "Year".GetHashCode(); var iMerit = ByMerit?.GetHashWithoutLastUpdate(); - i ^= Hashing.GetHashFromListHash(iMerit) ?? "ByMerit".GetHashCode(); + i ^= iMerit ?? "ByMerit".GetHashCode(); if (ByCourse == null) @@ -194,8 +205,7 @@ public int GetHashWithoutLastUpdate() i = ByCourse.Aggregate(i, (current, variable) => { var hashWithoutLastUpdate = variable.GetHashWithoutLastUpdate(); - var iList = Hashing.GetHashFromListHash(hashWithoutLastUpdate) ?? "empty".GetHashCode(); - return current ^ iList; + return current ^ hashWithoutLastUpdate; }); return i; diff --git a/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingOrder.cs b/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingOrder.cs index e7407401..561908ca 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingOrder.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingOrder.cs @@ -11,6 +11,9 @@ namespace PoliNetwork.Graduatorie.Parser.Objects.RankingNS; [JsonObject(MemberSerialization.Fields, NamingStrategyType = typeof(CamelCaseNamingStrategy))] public class RankingOrder { + public bool IsAnticipata; // used for DES/URB rankings until 2023 + public bool IsEnglish; + public bool IsExtraEu; public string? Phase; // the original string (e.g. " //esempio: @@ -18,15 +21,12 @@ public class RankingOrder //prima graduatoria di seconda fase:{primary:2, secondary:1} public int? Primary; public int? Secondary; - public bool IsAnticipata; // used for DES/URB rankings until 2023 - public bool IsExtraEu; - public bool IsEnglish; public RankingOrder(string phase, bool isExtraEu = false, bool isEnglish = false) { Phase = phase; ParsePhaseString(phase); - + IsExtraEu = isExtraEu; IsEnglish = isEnglish; } @@ -35,12 +35,12 @@ private void ParsePhaseString(string phase) { var s = phase.ToUpper().Trim(); if (string.IsNullOrEmpty(s)) return; - + var strings = s.Split(" "); - + IsAnticipata = s.Contains("ANTICIPATA"); if (IsAnticipata) return; - + Primary = ExtractPhaseNumberByKey(strings, "FASE"); Secondary = ExtractPhaseNumberByKey(strings, "GRADUATORIA"); } @@ -74,22 +74,19 @@ private void ParsePhaseString(string phase) public string GetId() { var idList = new List(); - if (IsAnticipata) idList.Add($"anticipata"); + if (IsAnticipata) idList.Add("anticipata"); if (Primary != null) idList.Add($"{Primary}fase"); if (Secondary != null) idList.Add($"{Secondary}grad"); - + var cleanPhase = Phase?.Replace("_", "").Replace("-", "").Replace(" ", "_").ToLower() ?? ""; - var noOrder = IsAnticipata == false && Primary == null && Secondary == null; + var noOrder = IsAnticipata == false && Primary == null && Secondary == null; var isSingleExtraEu = noOrder && cleanPhase.Contains("extraue"); - if (noOrder) - { - idList.Add(isSingleExtraEu ? "extraeu" : cleanPhase); - } - + if (noOrder) idList.Add(isSingleExtraEu ? "extraeu" : cleanPhase); + idList.Add(IsEnglish ? "eng" : "ita"); if (IsExtraEu && !isSingleExtraEu) idList.Add("extraeu"); // the second condition is to avoid double extraeu - + var id = string.Join("_", idList); return id; } @@ -111,4 +108,4 @@ public void Merge(RankingOrder? rankingRankingOrder) Primary ??= rankingRankingOrder?.Primary; Secondary ??= rankingRankingOrder?.Secondary; } -} +} \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs b/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs index 267e800d..37d69a09 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using PoliNetwork.Graduatorie.Common.Objects; +using PoliNetwork.Graduatorie.Parser.Utils; #endregion @@ -22,7 +23,7 @@ public class StudentResult public decimal? Result; public SortedDictionary? SectionsResults; - public List GetHashWithoutLastUpdate() + public int GetHashWithoutLastUpdate() { var r = new List { @@ -47,6 +48,6 @@ public class StudentResult r.Add(SectionsResults.Aggregate("SectionsResultsFull".GetHashCode(), (current, variable) => current ^ variable.Key.GetHashCode() ^ variable.Value.GetHashCode())); - return r; + return Hashing.GetHashFromListHash(r); } } \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTable.cs b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTable.cs index 17aac09b..791c4b5e 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTable.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTable.cs @@ -31,8 +31,8 @@ public RankingSummaryStudent GetRankingSummaryStudent(Ranking ranking) } /// - /// Get the course location if present, otherwise get the placeholder (constant). - /// Useful for index purposes. + /// Get the course location if present, otherwise get the placeholder (constant). + /// Useful for index purposes. /// /// A string with the location or the placeholder public string GetFixedLocation() diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Merit/MeritTable.cs b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Merit/MeritTable.cs index a796b4c5..1add9a7d 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Merit/MeritTable.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Merit/MeritTable.cs @@ -17,7 +17,7 @@ public class MeritTable public List? Rows; public int? Year; - public List GetHashWithoutLastUpdate() + public int GetHashWithoutLastUpdate() { var r = new List { "MeritTable".GetHashCode() }; if (Headers != null) @@ -30,14 +30,13 @@ public class MeritTable r.Add(Rows.Aggregate("RowsFull".GetHashCode(), (current, variable) => { var hashWithoutLastUpdate = variable.GetHashWithoutLastUpdate(); - var hashFromListHash = Hashing.GetHashFromListHash(hashWithoutLastUpdate) ?? "empty3".GetHashCode(); - return current ^ hashFromListHash; + return current ^ hashWithoutLastUpdate; })); else r.Add("RowsEmpty".GetHashCode()); r.Add(Year?.GetHashCode() ?? "Year".GetHashCode()); r.Add(Path?.GetHashCode() ?? "Path".GetHashCode()); - return r; + return Hashing.GetHashFromListHash(r); } } \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Parser/Utils/Hashing.cs b/PoliNetwork.Graduatorie.Parser/Utils/Hashing.cs index e71a7ceb..9d435101 100644 --- a/PoliNetwork.Graduatorie.Parser/Utils/Hashing.cs +++ b/PoliNetwork.Graduatorie.Parser/Utils/Hashing.cs @@ -2,13 +2,23 @@ namespace PoliNetwork.Graduatorie.Parser.Utils; public static class Hashing { - public static int? GetHashFromListHash(IReadOnlyCollection? iMerit) + public static int GetHashFromListHash(IReadOnlyCollection? iMerit) { if (iMerit == null) - return null; + return 0; if (iMerit.Count == 0) - return null; + return 0; - return iMerit.Aggregate(0, (current, variable) => current ^ variable ?? 0); + var hashFromListHash = iMerit.Aggregate(0, (current, variable) => current ^ variable ?? 0); + return hashFromListHash; + } + + public static int GetHashFromListHash(List iMerit) + { + if (iMerit.Count == 0) + return 0; + + var hashFromListHash = iMerit.Aggregate(0, (current, variable) => current ^ variable); + return hashFromListHash; } } \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Parser/Utils/Output/OutputWriteUtil.cs b/PoliNetwork.Graduatorie.Parser/Utils/Output/OutputWriteUtil.cs index f8dfad6f..f603a5c3 100644 --- a/PoliNetwork.Graduatorie.Parser/Utils/Output/OutputWriteUtil.cs +++ b/PoliNetwork.Graduatorie.Parser/Utils/Output/OutputWriteUtil.cs @@ -23,7 +23,7 @@ public OutputWriteUtil(ArgsConfig argsConfig) public void SaveOutputs(RankingsSet rankingsSet, DateFound dateFound) { var outFolder = Path.Join(_config.DataFolder, Constants.OutputFolder); - + rankingsSet.WriteAllRankings(outFolder, _config.ForceReparsing); IndexJsonBase.WriteAllIndexes(rankingsSet, outFolder, _config); StatsJson.Write(outFolder, rankingsSet, _config); diff --git a/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs b/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs index da2585ac..b986614d 100644 --- a/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs +++ b/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs @@ -207,26 +207,27 @@ private RankingsSet ParseNewRankings(IReadOnlyCollection htmls) var extraEuStr = intestazioni[4].Split("\n")[0].ToLower(); var isExtraEu = extraEuStr.Contains("extra-ue"); - if (ranking.Year < 2024) { + if (ranking.Year < 2024) + { // layout valid until 2023 var phase = string.Join(" ", intestazioni[3].Split(" - ")[1..]); ranking.RankingOrder = new RankingOrder(phase, isExtraEu); if (ranking.School == SchoolEnum.Architettura && ranking.RankingOrder.Primary == null && ranking.RankingOrder.Secondary == null && ranking.RankingOrder.IsExtraEu) - { // this is a fallback for 2020-2023: // POLIMI was used to add the ranking number (Secondary, e.g. "Prima Graduatoria") for ExtraEU starting // from the second ranking. // e.g. Extra-EU first ranking => phase = "Extra-ue", // Extra-EU second ranking => phase = "Extra-ue - Seconda Graduatoria" // so this is a fallback to add the equivalent of "Prima Graduatoria" to the first ExtraEU ranking. - ranking.RankingOrder.Secondary = 1; - } - } else { + } + else + { // layout valid since 2024 (if the layout changes again, make another else if) var phase = intestazioni[3]; - var isEnglish = intestazioni[2].Contains("taught in english") || intestazioni[2].Contains("erogati in inglese"); + var isEnglish = intestazioni[2].Contains("taught in english") || + intestazioni[2].Contains("erogati in inglese"); ranking.RankingOrder = new RankingOrder(phase, isExtraEu, isEnglish); } @@ -773,4 +774,4 @@ private IEnumerable ParseLocalHtmlFiles() ); return obj2; } -} +} \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Scraper/Utils/Web/Scraper.cs b/PoliNetwork.Graduatorie.Scraper/Utils/Web/Scraper.cs index 2dc91e58..f13f0154 100644 --- a/PoliNetwork.Graduatorie.Scraper/Utils/Web/Scraper.cs +++ b/PoliNetwork.Graduatorie.Scraper/Utils/Web/Scraper.cs @@ -40,7 +40,8 @@ private IEnumerable ScrapeAvvisiFuturiStudenti() var page = _web.Load(AvvisiFuturiStudentiUrl).DocumentNode; var newsCards = - page.SelectNodes("//div[contains(@class, 'news')]//div[contains(@class, 'row--card')]//div[contains(@class, 'card__content')]"); + page.SelectNodes( + "//div[contains(@class, 'news')]//div[contains(@class, 'row--card')]//div[contains(@class, 'card__content')]"); if (newsCards == null) return links; foreach (var card in newsCards) @@ -48,7 +49,7 @@ private IEnumerable ScrapeAvvisiFuturiStudenti() var title = card.Descendants("h5").First(); var titleValid = title != null && IsValidText(title.InnerText); - var body = card.Descendants("p").Where(el => el.ParentNode.HasClass("news-bodytext")).First(); + var body = card.Descendants("p").First(el => el.ParentNode.HasClass("news-bodytext")); var bodyValid = body != null && IsValidText(body.InnerText); var aTag = card.Descendants("a").First(); @@ -134,4 +135,4 @@ private bool IsValidText(string text) return null; } } -} +} \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Scraper/Utils/Web/UrlUtils.cs b/PoliNetwork.Graduatorie.Scraper/Utils/Web/UrlUtils.cs index fcf0d953..30bffc81 100644 --- a/PoliNetwork.Graduatorie.Scraper/Utils/Web/UrlUtils.cs +++ b/PoliNetwork.Graduatorie.Scraper/Utils/Web/UrlUtils.cs @@ -40,4 +40,4 @@ public static bool CheckUrl(RankingUrl? url) return false; } } -} +} \ No newline at end of file