From f3b89108e36d7ac10840710056c508cea4438355 Mon Sep 17 00:00:00 2001 From: Hongyuan Ma Date: Mon, 18 Jun 2018 10:54:57 +0800 Subject: [PATCH] update TestRecordListSerializer;add trend field; --- client/post-example/results.json | 12 ++--- web/apps/test_records/models.py | 7 +-- web/apps/test_records/serializer.py | 79 +++++++++++++++-------------- web/apps/test_records/views.py | 10 ++-- web/pgperffarm/settings.py | 6 +++ 5 files changed, 63 insertions(+), 51 deletions(-) diff --git a/client/post-example/results.json b/client/post-example/results.json index e189d89..1e5d913 100644 --- a/client/post-example/results.json +++ b/client/post-example/results.json @@ -4,7 +4,7 @@ "10": { "1": { "std": 397.30643899999995, - "metric": 11892.645435, + "metric": 11292.645435, "median": 11892.645435, "results": [ { @@ -37,7 +37,7 @@ }, "2": { "std": 252.71243850000064, - "metric": 28953.186513499997, + "metric": 28983.186513499997, "median": 28953.186513499997, "results": [ { @@ -70,7 +70,7 @@ }, "4": { "std": 285.0294699999995, - "metric": 28795.454019999997, + "metric": 38295.454019999997, "median": 28795.454019999997, "results": [ { @@ -107,7 +107,7 @@ "10": { "1": { "std": 86.91589850000001, - "metric": 150.6329775, + "metric": 350.6329775, "median": 150.6329775, "results": [ { @@ -140,7 +140,7 @@ }, "2": { "std": 4.182392499999992, - "metric": 280.8884175, + "metric": 180.8884175, "median": 280.8884175, "results": [ { @@ -173,7 +173,7 @@ }, "4": { "std": 15.571989000000002, - "metric": 399.858649, + "metric": 390.858649, "median": 399.858649, "results": [ { diff --git a/web/apps/test_records/models.py b/web/apps/test_records/models.py index ddd34cc..df89e22 100644 --- a/web/apps/test_records/models.py +++ b/web/apps/test_records/models.py @@ -168,7 +168,9 @@ def calc_status(sender, instance, **kwargs): print("prev dataset is: " + str(prevTestDataSet.id)) percentage = (instance.metric - prevTestDataSet.metric)/prevTestDataSet.metric - + print('instance.metric is:' + str(instance.metric)) + print('prevTestDataSet.metric is:' + str(prevTestDataSet.metric)) + print('percentage is:' + str(percentage)) status = 0 if(percentage >= 0.05): status = 1 @@ -180,8 +182,7 @@ def calc_status(sender, instance, **kwargs): instance.percentage = percentage instance.status = status instance.prev_id = prevTestDataSet.id - # print instance - # instance.save() + return diff --git a/web/apps/test_records/serializer.py b/web/apps/test_records/serializer.py index 143638b..1389968 100644 --- a/web/apps/test_records/serializer.py +++ b/web/apps/test_records/serializer.py @@ -1,8 +1,12 @@ from rest_framework import serializers + +from pgperffarm.settings import DB_ENUM from test_records.models import TestRecord, TestResult, PGInfo, LinuxInfo ,MetaInfo, TestDataSet from users.serializer import UserMachineSerializer from users.models import UserMachine -from django.db.models import Q +from django.db.models import Q, QuerySet, Count + + class PGInfoSerializer(serializers.ModelSerializer): ''' @@ -67,28 +71,12 @@ class CreateTestDateSetSerializer(serializers.ModelSerializer): 'status': -1, 'percentage': 0.0, ''' - # def create(self, validated_data): - # testDataSet = TestDataSet( - # test_record=validated_data['test_record'], - # clients=validated_data['clients'], - # scale=validated_data['scale'], - # std=validated_data['std'], - # metric=validated_data['metric'], - # test_cate=validated_data['test_cate'], - # prev=validated_data['prev'], - # status=validated_data['status'], - # percentage=validated_data['percentage'], - # ) - # - # # testDataSet.set_password(validated_data['password']) - # testDataSet.save() - # return testDataSet class Meta: model = TestDataSet fields = "__all__" -class TestRecordSerializer(serializers.ModelSerializer): +class TestRecordListSerializer(serializers.ModelSerializer): ''' use ModelSerializer @@ -96,36 +84,51 @@ class TestRecordSerializer(serializers.ModelSerializer): pg_info =PGInfoSerializer() linux_info = LinuxInfoSerializer() meta_info = MetaInfoSerializer() - ro_info = serializers.SerializerMethodField() - rw_info = serializers.SerializerMethodField() + + trend = serializers.SerializerMethodField() machine_info = serializers.SerializerMethodField() - client_max_num = serializers.SerializerMethodField() + # client_max_num = serializers.SerializerMethodField() class Meta: model = TestRecord - fields = ('add_time', 'machine_info', 'pg_info', 'linux_info', 'meta_info', 'ro_info', 'rw_info', 'client_max_num') - - def get_ro_info(self, obj): - all_data = TestResult.objects.filter(Q(test_record_id=obj.id ) ,test_cate_id=1) + fields = ('add_time', 'machine_info', 'pg_info', 'trend', 'linux_info', 'meta_info') + + def get_trend(self, obj): + dataset_list = TestDataSet.objects.filter(test_record_id=obj.id).values_list('status').annotate(Count('id')) + data_list_count = TestDataSet.objects.filter(test_record_id=obj.id).count() + + trend = {} + trend['improved'] = 0 + trend['quo'] = 0 + trend['regressive'] = 0 + trend['none'] = 0 + trend['is_first'] = False + for i in dataset_list: + if i[0] == DB_ENUM['status']['improved']: + trend['improved'] += i[1] + elif i[0] == DB_ENUM['status']['quo']: + trend['quo'] += i[1] + elif i[0] == DB_ENUM['status']['regressive']: + trend['regressive'] += i[1] + elif i[0] == DB_ENUM['status']['none']: + trend['none'] += i[1] + + if(data_list_count == trend['none']): + trend['is_first'] = True + + print str(data_list_count) + return trend - ro_info_serializer = TestResultSerializer(all_data, many=True, context={'request': self.context['request']}) - return ro_info_serializer.data - - def get_rw_info(self, obj): - all_data = TestResult.objects.filter(Q(test_record_id=obj.id) ,test_cate_id=2) - - rw_info_serializer = TestResultSerializer(all_data, many=True, context={'request': self.context['request']}) - return rw_info_serializer.data def get_machine_info(self, obj): - machine_data = UserMachine.objects.filter(Q(id=obj.test_machine_id.id)) + machine_data = UserMachine.objects.filter(Q(id=obj.test_machine_id)) machine_info_serializer = UserMachineSerializer(machine_data,many=True, context={'request': self.context['request']}) return machine_info_serializer.data - def get_client_max_num(self, obj): - ro_client_num = TestResult.objects.filter(Q(test_record_id=obj.id ) ,test_cate_id=1).order_by('clients').distinct('clients').count() - rw_client_num = TestResult.objects.filter(Q(test_record_id=obj.id ) ,test_cate_id=2).order_by('clients').distinct('clients').count() - return max(ro_client_num,rw_client_num) + # def get_client_max_num(self, obj): + # ro_client_num = TestResult.objects.filter(Q(test_record_id=obj.id ) ,test_cate_id=1).order_by('clients').distinct('clients').count() + # rw_client_num = TestResult.objects.filter(Q(test_record_id=obj.id ) ,test_cate_id=2).order_by('clients').distinct('clients').count() + # return max(ro_client_num,rw_client_num) class TestRecordDetailSerializer(serializers.ModelSerializer): diff --git a/web/apps/test_records/views.py b/web/apps/test_records/views.py index 919a161..5e25942 100644 --- a/web/apps/test_records/views.py +++ b/web/apps/test_records/views.py @@ -7,7 +7,7 @@ from rest_framework.pagination import PageNumberPagination from exception import TestDataUploadError from models import UserMachine, TestCategory from pgperffarm.settings import DB_ENUM -from .serializer import TestRecordSerializer, TestRecordDetailSerializer, LinuxInfoSerializer, MetaInfoSerializer, \ +from .serializer import TestRecordListSerializer, TestRecordDetailSerializer, LinuxInfoSerializer, MetaInfoSerializer, \ PGInfoSerializer, CreateTestRecordSerializer, CreateTestDateSetSerializer, TestResultSerializer from rest_framework.views import APIView from rest_framework.decorators import api_view @@ -21,7 +21,7 @@ import json class StandardResultsSetPagination(PageNumberPagination): - page_size = 10 + page_size = 5 page_size_query_param = 'page_size' max_page_size = 100 @@ -30,8 +30,8 @@ class TestRecordListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): """ List test records """ - queryset = TestRecord.objects.all() - serializer_class = TestRecordSerializer + queryset = TestRecord.objects.all().order_by('add_time') + serializer_class = TestRecordListSerializer pagination_class = StandardResultsSetPagination @@ -58,6 +58,8 @@ def TestRecordCreate(request, format=None): # obj = data[0].pgbench # jsLoads = json.loads(data[0]) + # todo get machine by token + # todo hash the json_data to ensure unique from django.db import transaction try: diff --git a/web/pgperffarm/settings.py b/web/pgperffarm/settings.py index b4d34a0..afe66af 100644 --- a/web/pgperffarm/settings.py +++ b/web/pgperffarm/settings.py @@ -141,6 +141,12 @@ DB_ENUM = { "mode":{ "simple":1, "other":2 + }, + "status": { + "none": -1, + "improved": 1, + "quo": 2, + "regressive": 3 } } -- 2.39.5