Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions PoliNetwork.Graduatorie.Common/Enums/SchoolEnum.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,19 @@ public enum SchoolEnum
Architettura = 3,
Design = 4,
Unknown = 0
}

public static class SchoolEnumMethods
{
public static string ToShortName(this SchoolEnum s)
{
return s switch
{
SchoolEnum.Architettura => "ARC",
SchoolEnum.Design => "DES",
SchoolEnum.Ingegneria => "ENG",
SchoolEnum.Urbanistica => "URB",
_ => "UNK",
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public static void WriteSingleJsons(RankingsSet? set, string outFolder, ArgsConf

private static void WriteSingleJsonRanking(string folder, Ranking ranking, ArgsConfig argsConfig)
{
var path = Path.Join(folder, ranking.ConvertPhaseToFilename());
var path = Path.Join(folder, ranking.GetFilename());

if (ExitIfAlreadyExistsAndNotUpdated(ranking, path) && !argsConfig.ForceReparsing) return;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,16 +132,16 @@ bool IsThisCourse(SingleCourseJson x)

private static int Comparison(SingleCourseJson x, SingleCourseJson y)
{
return x.Compare(y);
return x.CompareTo(y);
}

private static SingleCourseJson CreateCourseJson(Ranking ranking, CourseTable course)
{
var basePath = ranking.School + "/" + ranking.Year + "/";
return new SingleCourseJson
{
Link = ranking.ConvertPhaseToFilename(),
Name = ranking.RankingOrder?.Phase,
Link = ranking.GetFilename(),
Id = ranking.GetId(),
BasePath = basePath,
Year = ranking.Year,
School = ranking.School,
Expand All @@ -159,7 +159,7 @@ bool Predicate(Ranking v1)
{
return singleCourseJson.School == v1.School
&& singleCourseJson.Year == v1.Year
&& v1.RankingOrder?.Phase == singleCourseJson.Name;
&& singleCourseJson.RankingOrder?.GetId() == v1.RankingOrder?.GetId();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,10 @@ IDictionary<int, IEnumerable<SingleCourseJson>> schoolDict
.DistinctBy(x => x.Link)
.ToList();
var filenames = singleCourseJsons
.OrderBy(a => a.Name)
.OrderBy(a => a.Id)
.ThenBy(a => a.Year)
.ThenBy(a => a.School)
.ThenBy(a => a.BasePath)
.ThenBy(a => a.Link)
.ToList();

schoolDict.Add(yearGroupKey.Value, filenames);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class ByYearSchoolJson : IndexJsonBase
var filenames = schoolGroup
.SelectMany(ranking => ranking.ToSingleCourseJson())
.DistinctBy(x => x.Link)
.ToList().OrderBy(a => a.Name);
.ToList().OrderBy(a => a.Id);
yearDict.Add(schoolGroup.Key.Value, filenames);
}

Expand Down
16 changes: 9 additions & 7 deletions PoliNetwork.Graduatorie.Parser/Objects/Json/SingleCourseJson.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,29 +12,31 @@ namespace PoliNetwork.Graduatorie.Parser.Objects.Json;

[Serializable]
[JsonObject(MemberSerialization.Fields, NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class SingleCourseJson
public class SingleCourseJson: IComparable<SingleCourseJson>
{
public string? BasePath;
public string? Link;
public string? Location;
public string? Name;
public string? Id;
public RankingOrder? RankingOrder;
public SchoolEnum? School;
public int? Year;

public int GetHashWithoutLastUpdate()
{
var hashWithoutLastUpdate = Link?.GetHashCode() ?? "Link".GetHashCode();
var hashCode = Name?.GetHashCode() ?? "Name".GetHashCode();
var hashCode = Id?.GetHashCode() ?? "Id".GetHashCode();
var basePathInt = BasePath?.GetHashCode() ?? "BasePath".GetHashCode();
var yearInt = Year?.GetHashCode() ?? "Year".GetHashCode();
var schoolInt = School?.GetHashCode() ?? "School".GetHashCode();
var code = "SingleCourseJson".GetHashCode();
return hashWithoutLastUpdate ^ hashCode ^ basePathInt ^ yearInt ^ schoolInt ^ code;
}

public int Compare(SingleCourseJson singleCourseJson)
public int CompareTo(SingleCourseJson? singleCourseJson)
{
if (singleCourseJson == null) return 1;

if (Year != singleCourseJson.Year)
return (Year ?? -1) < (singleCourseJson.Year ?? -1) ? -1 : 1;

Expand All @@ -49,14 +51,14 @@ public int Compare(SingleCourseJson singleCourseJson)
if (Location != singleCourseJson.Location)
return string.Compare(Location ?? "", singleCourseJson.Location ?? "", StringComparison.InvariantCulture);

if (Name != singleCourseJson.Name)
return string.Compare(Name ?? "", singleCourseJson.Name ?? "", StringComparison.InvariantCulture);
if (Id != singleCourseJson.Id)
return string.Compare(Id ?? "", singleCourseJson.Id ?? "", StringComparison.InvariantCulture);

return 0;
}

public bool Is(CourseTable courseTable)
{
return Name == courseTable.Title;
return (RankingOrder?.Phase ?? "") == courseTable.Title;
}
}
30 changes: 24 additions & 6 deletions PoliNetwork.Graduatorie.Parser/Objects/RankingNS/Ranking.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,29 @@ private void MergeRankingOrder(Ranking ranking)
RankingOrder.Merge(ranking.RankingOrder);
}

public string ConvertPhaseToFilename()
public string GetFilename()
{
var s = DateTime.UtcNow.ToString("yyyyMMddTHHmmss", CultureInfo.InvariantCulture) + "Z";
var phase1 = RankingOrder?.Phase ?? s;
return $"{phase1}.json".Replace(" ", "_");
var id = GetId();
return $"{id}.json";
}

public string GetId()
{
var idList = new List<string>();

var schoolShort = School?.ToShortName();
if (schoolShort != null) idList.Add(schoolShort);

var yearStr = Year.ToString();
if (yearStr != null) idList.Add(yearStr);

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);

return string.Join("_", idList);
}

public List<SingleCourseJson> ToSingleCourseJson()
Expand All @@ -111,8 +129,8 @@ public List<SingleCourseJson> ToSingleCourseJson()
if (courseTables == null) return result;
result.AddRange(courseTables.Select(variable => new SingleCourseJson
{
Link = ConvertPhaseToFilename(),
Name = RankingOrder?.Phase,
Link = GetFilename(),
Id = GetId(),
BasePath = schoolString + "/" + Year + "/",
Year = Year,
School = School,
Expand Down
33 changes: 31 additions & 2 deletions PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,16 @@ public class RankingOrder
//prima graduatoria di seconda fase:{primary:2, secondary:1}
public int? Primary;
public int? Secondary;
public bool IsEnglish = false;

public RankingOrder()
{
}

public RankingOrder(string phase)
public RankingOrder(string phase, bool isEnglish = false)
{
Phase = phase;
IsEnglish = isEnglish;
FixValues();
}

Expand Down Expand Up @@ -62,13 +64,40 @@ private void FixValues()
"TERZA" => 3,
"QUARTA" => 4,
"QUINTA" => 5,
"SESTA" => 6,
"SETTIMA" => 7,
"OTTAVA" => 8,
// veramente ci sarà una nona graduatoria?
_ => null
};
}

return null;
}

public string GetId()
{
var idList = new List<string>();
if (Anticipata == true) 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 = Anticipata == false && Primary == null && Secondary == null;
var isSingleExtraEu = noOrder && cleanPhase.Contains("extraue");

if (noOrder)
{
idList.Add(isSingleExtraEu ? "extraeu" : cleanPhase);
}

idList.Add(IsEnglish ? "eng" : "ita");
if (ExtraEu == true && !isSingleExtraEu) idList.Add("extraeu"); // the second condition is to avoid double extraeu

var id = string.Join("_", idList);
return id;
}

public int GetHashWithoutLastUpdate()
{
var i = "RankingOrder".GetHashCode();
Expand All @@ -88,4 +117,4 @@ public void Merge(RankingOrder? rankingRankingOrder)
Secondary ??= rankingRankingOrder?.Secondary;
ExtraEu ??= rankingRankingOrder?.ExtraEu;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,29 @@ private RankingsSet ParseNewRankings(IReadOnlyCollection<HtmlPage> htmls)
ranking.School = school;
ranking.Year = Convert.ToInt16(intestazioni[1].Split("Year ")[1].Split("/")[0]);

var phase = string.Join(" ", intestazioni[3].Split(" - ")[1..]);
ranking.RankingOrder = new RankingOrder(phase);
if (ranking.Year < 2024) {
// layout valid until 2023
var phase = string.Join(" ", intestazioni[3].Split(" - ")[1..]);
ranking.RankingOrder = new RankingOrder(phase);
if (ranking.School == SchoolEnum.Architettura && ranking.RankingOrder.Primary == null &&
ranking.RankingOrder.Secondary == null && ranking.RankingOrder.ExtraEu == true)
{
// 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 {
// 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");
ranking.RankingOrder = new RankingOrder(phase, isEnglish);
}

ranking.Extra = intestazioni[4];
ranking.LastUpdate = DateTime.UtcNow;
ranking.ByCourse = new List<CourseTable>();
Expand Down Expand Up @@ -750,4 +771,4 @@ private IEnumerable<HtmlPage> ParseLocalHtmlFiles()
);
return obj2;
}
}
}
Loading