Skip to content
Closed
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
2 changes: 1 addition & 1 deletion PoliNetwork.Graduatorie.Common/Enums/SchoolEnum.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public static string ToShortName(this SchoolEnum s)
SchoolEnum.Design => "DES",
SchoolEnum.Ingegneria => "ENG",
SchoolEnum.Urbanistica => "URB",
_ => "UNK",
_ => "UNK"
};
}
}
2 changes: 1 addition & 1 deletion PoliNetwork.Graduatorie.Common/Objects/EnrollType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public int GetHashWithoutLastUpdate()

return i;
}

public static EnrollType From(string? rowCanEnrollInto, bool rowCanEnroll)
{
if (rowCanEnroll == false)
Expand Down
108 changes: 107 additions & 1 deletion PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/IndexJsonBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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<CourseTable>? aTableCourse,
IReadOnlyCollection<CourseTable>? 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<Ranking>(x, Culture.JsonSerializerSettings);
return j;
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
53 changes: 28 additions & 25 deletions PoliNetwork.Graduatorie.Parser/Objects/Json/SingleCourseJson.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,42 @@ namespace PoliNetwork.Graduatorie.Parser.Objects.Json;

[Serializable]
[JsonObject(MemberSerialization.Fields, NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class SingleCourseJson: IComparable<SingleCourseJson>
public class SingleCourseJson : IComparable<SingleCourseJson>
{
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"
Expand All @@ -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)
{
Expand Down
50 changes: 30 additions & 20 deletions PoliNetwork.Graduatorie.Parser/Objects/RankingNS/Ranking.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -31,33 +30,45 @@ public class Ranking : IComparable<Ranking>, IEquatable<Ranking>
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<Ranking>(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();
}


Expand Down Expand Up @@ -99,7 +110,7 @@ public string GetFilename()
public string GetId()
{
var idList = new List<string>();

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

Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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
*/
Expand All @@ -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)
Expand All @@ -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;
Expand Down
Loading