From 792f7ca12f82d92e3adc1518b0d360711a2fc106 Mon Sep 17 00:00:00 2001 From: JoshuaTianYangLiu Date: Wed, 4 Aug 2021 12:40:33 -0400 Subject: [PATCH 1/7] Add consistency to participation in /contest --- judge/views/api/api_v2.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py index 5c5df4f5bf..47a098708b 100644 --- a/judge/views/api/api_v2.py +++ b/judge/views/api/api_v2.py @@ -265,6 +265,8 @@ def get_object_data(self, contest): username=F('user__user__username'), old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), new_rating=Subquery(new_ratings_subquery.values('rating')[:1]), + old_volatility=Subquery(old_ratings_subquery.values('volatility')[:1]), + new_volatility=Subquery(new_ratings_subquery.values('volatility')[:1]), ) .order_by('-score', 'cumtime', 'tiebreaker') ) @@ -318,6 +320,8 @@ def get_object_data(self, contest): 'tiebreaker': participation.tiebreaker, 'old_rating': participation.old_rating, 'new_rating': participation.new_rating, + 'old_volatility': participation.old_volatility, + 'new_volatility': participation.new_volatility, 'is_disqualified': participation.is_disqualified, 'solutions': contest.format.get_problem_breakdown(participation, problems), } for participation in participations From 73080286cd51e759740d1adce4163532c20a73cf Mon Sep 17 00:00:00 2001 From: JoshuaTianYangLiu Date: Tue, 10 Aug 2021 18:48:01 -0400 Subject: [PATCH 2/7] Add consistency to participation in /particition and /user --- judge/views/api/api_v2.py | 55 +++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py index 47a098708b..98ac0d5080 100644 --- a/judge/views/api/api_v2.py +++ b/judge/views/api/api_v2.py @@ -356,9 +356,22 @@ def get_unfiltered_queryset(self): q |= Q(view_contest_scoreboard=self.request.profile) visible_contests = visible_contests.filter(q) + new_ratings_subquery = Rating.objects.filter(participation=OuterRef('pk')) + old_ratings_subquery = ( + Rating.objects + .filter(user=OuterRef('user__pk'), contest__end_time__lt=OuterRef('contest__end_time')) + .order_by('-contest__end_time') + ) + return ( ContestParticipation.objects .filter(virtual__gte=0, contest__in=visible_contests) + .annotate( + old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), + new_rating=Subquery(new_ratings_subquery.values('rating')[:1]), + old_volatility=Subquery(old_ratings_subquery.values('volatility')[:1]), + new_volatility=Subquery(new_ratings_subquery.values('volatility')[:1]), + ) .select_related('user__user', 'contest') .order_by('id') .only( @@ -373,6 +386,10 @@ def get_unfiltered_queryset(self): 'tiebreaker', 'is_disqualified', 'virtual', + 'old_rating', + 'new_rating', + 'old_volatility', + 'new_volatility', ) ) @@ -385,6 +402,10 @@ def get_object_data(self, participation): 'score': participation.score, 'cumulative_time': participation.cumtime, 'tiebreaker': participation.tiebreaker, + 'old_rating': participation.old_rating, + 'new_rating': participation.new_rating, + 'old_volatility': participation.old_volatility, + 'new_volatility': participation.new_volatility, 'is_disqualified': participation.is_disqualified, 'virtual_participation_number': participation.virtual, } @@ -531,6 +552,13 @@ def get_object_data(self, profile): last_rating = profile.ratings.order_by('-contest__end_time').first() + new_ratings_subquery = Rating.objects.filter(participation=OuterRef('pk')) + old_ratings_subquery = ( + Rating.objects + .filter(user=OuterRef('user__pk'), contest__end_time__lt=OuterRef('contest__end_time')) + .order_by('-contest__end_time') + ) + contest_history = [] participations = ( ContestParticipation.objects @@ -540,17 +568,28 @@ def get_object_data(self, profile): contest__in=Contest.get_visible_contests(self.request.user), contest__end_time__lt=self._now, ) + .annotate( + old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), + new_rating=Subquery(new_ratings_subquery.values('rating')[:1]), + old_volatility=Subquery(old_ratings_subquery.values('volatility')[:1]), + new_volatility=Subquery(new_ratings_subquery.values('volatility')[:1]), + ) .order_by('contest__end_time') ) - for contest_key, score, cumtime, rating, volatility in participations.values_list( - 'contest__key', 'score', 'cumtime', 'rating__rating', 'rating__volatility', - ): + for participation in participations: contest_history.append({ - 'key': contest_key, - 'score': score, - 'cumulative_time': cumtime, - 'rating': rating, - 'volatility': volatility, + 'key': participation.contest.key, + 'user': participation.username, + 'start_time': participation.start.isoformat(), + 'end_time': participation.end_time.isoformat(), + 'score': participation.score, + 'cumulative_time': participation.cumtime, + 'tiebreaker': participation.tiebreaker, + 'old_rating': participation.old_rating, + 'new_rating': participation.new_rating, + 'old_volatility': participation.old_volatility, + 'new_volatility': participation.new_volatility, + 'is_disqualified': participation.is_disqualified, }) return { From 11dba5404b9f6ae9d8a0c669d5288b4549d04f7d Mon Sep 17 00:00:00 2001 From: JoshuaTianYangLiu Date: Tue, 10 Aug 2021 18:50:11 -0400 Subject: [PATCH 3/7] Remove redundant value from /user endpoint --- judge/views/api/api_v2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py index 98ac0d5080..f5381c8f53 100644 --- a/judge/views/api/api_v2.py +++ b/judge/views/api/api_v2.py @@ -579,7 +579,6 @@ def get_object_data(self, profile): for participation in participations: contest_history.append({ 'key': participation.contest.key, - 'user': participation.username, 'start_time': participation.start.isoformat(), 'end_time': participation.end_time.isoformat(), 'score': participation.score, From bfd94f095f82d4e3250306d28cbca06a4053d003 Mon Sep 17 00:00:00 2001 From: JoshuaTianYangLiu Date: Mon, 23 Aug 2021 17:07:48 -0400 Subject: [PATCH 4/7] Update consistency for #1751 --- judge/views/api/api_v2.py | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py index 4677eece11..192f6f06e6 100644 --- a/judge/views/api/api_v2.py +++ b/judge/views/api/api_v2.py @@ -252,7 +252,6 @@ def get_object_data(self, contest): .order_by('order'), ) - new_ratings_subquery = Rating.objects.filter(participation=OuterRef('pk')) old_ratings_subquery = ( Rating.objects .filter(user=OuterRef('user__pk'), contest__end_time__lt=OuterRef('contest__end_time')) @@ -264,10 +263,10 @@ def get_object_data(self, contest): .annotate( username=F('user__user__username'), old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), - new_rating=Subquery(new_ratings_subquery.values('rating')[:1]), - old_volatility=Subquery(old_ratings_subquery.values('volatility')[:1]), - new_volatility=Subquery(new_ratings_subquery.values('volatility')[:1]), + old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), + old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), ) + .select_related('rating') .order_by('-score', 'cumtime', 'tiebreaker') ) @@ -319,9 +318,11 @@ def get_object_data(self, contest): 'cumulative_time': participation.cumtime, 'tiebreaker': participation.tiebreaker, 'old_rating': participation.old_rating, - 'new_rating': participation.new_rating, - 'old_volatility': participation.old_volatility, - 'new_volatility': participation.new_volatility, + 'new_rating': participation.rating.new_rating if participation.rating else None, + 'old_raw_rating': participation.old_mean, + 'new_raw_rating': participation.rating.new_mean if participation.rating else None, + 'old_performance': participation.old_performance, + 'new_performance': participation.rating.new_performance if participation.rating else None, 'is_disqualified': participation.is_disqualified, 'solutions': contest.format.get_problem_breakdown(participation, problems), } for participation in participations @@ -356,7 +357,6 @@ def get_unfiltered_queryset(self): q |= Q(view_contest_scoreboard=self.request.profile) visible_contests = visible_contests.filter(q) - new_ratings_subquery = Rating.objects.filter(participation=OuterRef('pk')) old_ratings_subquery = ( Rating.objects .filter(user=OuterRef('user__pk'), contest__end_time__lt=OuterRef('contest__end_time')) @@ -368,11 +368,10 @@ def get_unfiltered_queryset(self): .filter(virtual__gte=0, contest__in=visible_contests) .annotate( old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), - new_rating=Subquery(new_ratings_subquery.values('rating')[:1]), - old_volatility=Subquery(old_ratings_subquery.values('volatility')[:1]), - new_volatility=Subquery(new_ratings_subquery.values('volatility')[:1]), + old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), + old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), ) - .select_related('user__user', 'contest') + .select_related('user__user', 'contest', 'rating') .order_by('id') .only( 'user__user__username', @@ -387,9 +386,9 @@ def get_unfiltered_queryset(self): 'is_disqualified', 'virtual', 'old_rating', - 'new_rating', - 'old_volatility', - 'new_volatility', + 'old_mean', + 'old_performance', + 'rating', ) ) @@ -403,9 +402,11 @@ def get_object_data(self, participation): 'cumulative_time': participation.cumtime, 'tiebreaker': participation.tiebreaker, 'old_rating': participation.old_rating, - 'new_rating': participation.new_rating, - 'old_volatility': participation.old_volatility, - 'new_volatility': participation.new_volatility, + 'new_rating': participation.rating.new_rating if participation.rating else None, + 'old_raw_rating': participation.old_mean, + 'new_raw_rating': participation.rating.new_mean if participation.rating else None, + 'old_performance': participation.old_performance, + 'new_performance': participation.rating.new_performance if participation.rating else None, 'is_disqualified': participation.is_disqualified, 'virtual_participation_number': participation.virtual, } @@ -550,7 +551,6 @@ def get_object_data(self, profile): last_rating = profile.ratings.order_by('-contest__end_time').first() - new_ratings_subquery = Rating.objects.filter(participation=OuterRef('pk')) old_ratings_subquery = ( Rating.objects .filter(user=OuterRef('user__pk'), contest__end_time__lt=OuterRef('contest__end_time')) @@ -568,10 +568,10 @@ def get_object_data(self, profile): ) .annotate( old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), - new_rating=Subquery(new_ratings_subquery.values('rating')[:1]), - old_volatility=Subquery(old_ratings_subquery.values('volatility')[:1]), - new_volatility=Subquery(new_ratings_subquery.values('volatility')[:1]), + old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), + old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), ) + .select_related('rating') .order_by('contest__end_time') ) @@ -584,11 +584,11 @@ def get_object_data(self, profile): 'cumulative_time': participation.cumtime, 'tiebreaker': participation.tiebreaker, 'old_rating': participation.old_rating, - 'new_rating': participation.new_rating, + 'new_rating': participation.rating.new_rating if participation.rating else None, 'old_raw_rating': participation.old_mean, - 'new_raw_rating': participation.new_mean, + 'new_raw_rating': participation.rating.new_mean if participation.rating else None, 'old_performance': participation.old_performance, - 'new_performance': participation.new_performance, + 'new_performance': participation.rating.new_performance if participation.rating else None, 'is_disqualified': participation.is_disqualified, }) From e3ef05a1a268717a05b4bb81b8ac496c14215742 Mon Sep 17 00:00:00 2001 From: JoshuaTianYangLiu Date: Mon, 23 Aug 2021 17:29:06 -0400 Subject: [PATCH 5/7] Use annotate instead --- judge/views/api/api_v2.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py index 192f6f06e6..67d3fa61b2 100644 --- a/judge/views/api/api_v2.py +++ b/judge/views/api/api_v2.py @@ -263,10 +263,12 @@ def get_object_data(self, contest): .annotate( username=F('user__user__username'), old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), + new_rating=F('rating_rating'), old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), + new_mean=F('rating_mean'), old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), + new_performance=F('rating_performance'), ) - .select_related('rating') .order_by('-score', 'cumtime', 'tiebreaker') ) @@ -318,11 +320,11 @@ def get_object_data(self, contest): 'cumulative_time': participation.cumtime, 'tiebreaker': participation.tiebreaker, 'old_rating': participation.old_rating, - 'new_rating': participation.rating.new_rating if participation.rating else None, + 'new_rating': participation.new_rating, 'old_raw_rating': participation.old_mean, - 'new_raw_rating': participation.rating.new_mean if participation.rating else None, + 'new_raw_rating': participation.new_mean, 'old_performance': participation.old_performance, - 'new_performance': participation.rating.new_performance if participation.rating else None, + 'new_performance': participation.new_performance, 'is_disqualified': participation.is_disqualified, 'solutions': contest.format.get_problem_breakdown(participation, problems), } for participation in participations @@ -368,10 +370,13 @@ def get_unfiltered_queryset(self): .filter(virtual__gte=0, contest__in=visible_contests) .annotate( old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), + new_rating=F('rating_rating'), old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), + new_mean=F('rating_mean'), old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), + new_performance=F('rating_performance'), ) - .select_related('user__user', 'contest', 'rating') + .select_related('user__user', 'contest') .order_by('id') .only( 'user__user__username', @@ -388,7 +393,6 @@ def get_unfiltered_queryset(self): 'old_rating', 'old_mean', 'old_performance', - 'rating', ) ) @@ -402,11 +406,11 @@ def get_object_data(self, participation): 'cumulative_time': participation.cumtime, 'tiebreaker': participation.tiebreaker, 'old_rating': participation.old_rating, - 'new_rating': participation.rating.new_rating if participation.rating else None, + 'new_rating': participation.new_rating, 'old_raw_rating': participation.old_mean, - 'new_raw_rating': participation.rating.new_mean if participation.rating else None, + 'new_raw_rating': participation.new_mean, 'old_performance': participation.old_performance, - 'new_performance': participation.rating.new_performance if participation.rating else None, + 'new_performance': participation.new_performance, 'is_disqualified': participation.is_disqualified, 'virtual_participation_number': participation.virtual, } @@ -568,10 +572,12 @@ def get_object_data(self, profile): ) .annotate( old_rating=Subquery(old_ratings_subquery.values('rating')[:1]), + new_rating=F('rating_rating'), old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), + new_mean=F('rating_mean'), old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), + new_performance=F('rating_performance'), ) - .select_related('rating') .order_by('contest__end_time') ) @@ -584,11 +590,11 @@ def get_object_data(self, profile): 'cumulative_time': participation.cumtime, 'tiebreaker': participation.tiebreaker, 'old_rating': participation.old_rating, - 'new_rating': participation.rating.new_rating if participation.rating else None, + 'new_rating': participation.new_rating, 'old_raw_rating': participation.old_mean, - 'new_raw_rating': participation.rating.new_mean if participation.rating else None, + 'new_raw_rating': participation.new_mean, 'old_performance': participation.old_performance, - 'new_performance': participation.rating.new_performance if participation.rating else None, + 'new_performance': participation.new_performance, 'is_disqualified': participation.is_disqualified, }) From a13f00c6fb21133b9ed74c852a60e69458ce0e64 Mon Sep 17 00:00:00 2001 From: JoshuaTianYangLiu Date: Thu, 26 Aug 2021 17:21:56 -0400 Subject: [PATCH 6/7] Include attributes in .only --- judge/views/api/api_v2.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py index 67d3fa61b2..7736a2072b 100644 --- a/judge/views/api/api_v2.py +++ b/judge/views/api/api_v2.py @@ -391,8 +391,11 @@ def get_unfiltered_queryset(self): 'is_disqualified', 'virtual', 'old_rating', + 'new_rating', 'old_mean', + 'new_mean', 'old_performance', + 'new_performance', ) ) From f2cd2cd07312218c7a318c7b9eaba30b598e3128 Mon Sep 17 00:00:00 2001 From: JoshuaTianYangLiu Date: Fri, 27 Aug 2021 11:23:14 -0400 Subject: [PATCH 7/7] Remove old_performance --- judge/views/api/api_v2.py | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py index 7736a2072b..3851a9c9b9 100644 --- a/judge/views/api/api_v2.py +++ b/judge/views/api/api_v2.py @@ -266,8 +266,7 @@ def get_object_data(self, contest): new_rating=F('rating_rating'), old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), new_mean=F('rating_mean'), - old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), - new_performance=F('rating_performance'), + performance=F('rating_performance'), ) .order_by('-score', 'cumtime', 'tiebreaker') ) @@ -323,8 +322,7 @@ def get_object_data(self, contest): 'new_rating': participation.new_rating, 'old_raw_rating': participation.old_mean, 'new_raw_rating': participation.new_mean, - 'old_performance': participation.old_performance, - 'new_performance': participation.new_performance, + 'performance': participation.performance, 'is_disqualified': participation.is_disqualified, 'solutions': contest.format.get_problem_breakdown(participation, problems), } for participation in participations @@ -373,8 +371,7 @@ def get_unfiltered_queryset(self): new_rating=F('rating_rating'), old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), new_mean=F('rating_mean'), - old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), - new_performance=F('rating_performance'), + performance=F('rating_performance'), ) .select_related('user__user', 'contest') .order_by('id') @@ -394,8 +391,7 @@ def get_unfiltered_queryset(self): 'new_rating', 'old_mean', 'new_mean', - 'old_performance', - 'new_performance', + 'performance', ) ) @@ -412,8 +408,7 @@ def get_object_data(self, participation): 'new_rating': participation.new_rating, 'old_raw_rating': participation.old_mean, 'new_raw_rating': participation.new_mean, - 'old_performance': participation.old_performance, - 'new_performance': participation.new_performance, + 'performance': participation.performance, 'is_disqualified': participation.is_disqualified, 'virtual_participation_number': participation.virtual, } @@ -578,8 +573,7 @@ def get_object_data(self, profile): new_rating=F('rating_rating'), old_mean=Subquery(old_ratings_subquery.values('mean')[:1]), new_mean=F('rating_mean'), - old_performance=Subquery(old_ratings_subquery.values('performance')[:1]), - new_performance=F('rating_performance'), + performance=F('rating_performance'), ) .order_by('contest__end_time') ) @@ -596,8 +590,7 @@ def get_object_data(self, profile): 'new_rating': participation.new_rating, 'old_raw_rating': participation.old_mean, 'new_raw_rating': participation.new_mean, - 'old_performance': participation.old_performance, - 'new_performance': participation.new_performance, + 'performance': participation.performance, 'is_disqualified': participation.is_disqualified, })