VirtualBox

Changeset 56809 in vbox for trunk/src/VBox/ValidationKit


Ignore:
Timestamp:
Jul 6, 2015 12:32:55 AM (10 years ago)
Author:
vboxsync
Message:

testmanager: Test result sorting.

Location:
trunk/src/VBox/ValidationKit/testmanager
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/testmanager/core/testresults.py

    r56764 r56809  
    513513    #
    514514
    515     ksResultsGroupingTypeNone       = 'ResultsGroupingTypeNone'
    516     ksResultsGroupingTypeTestGroup  = 'ResultsGroupingTypeTestGroup'
    517     ksResultsGroupingTypeBuildRev   = 'ResultsGroupingTypeBuild'
    518     ksResultsGroupingTypeTestBox    = 'ResultsGroupingTypeTestBox'
    519     ksResultsGroupingTypeTestCase   = 'ResultsGroupingTypeTestCase'
    520     ksResultsGroupingTypeSchedGroup = 'ResultsGroupingTypeSchedGroup'
     515    ksResultsGroupingTypeNone       = 'ResultsGroupingTypeNone';
     516    ksResultsGroupingTypeTestGroup  = 'ResultsGroupingTypeTestGroup';
     517    ksResultsGroupingTypeBuildRev   = 'ResultsGroupingTypeBuild';
     518    ksResultsGroupingTypeTestBox    = 'ResultsGroupingTypeTestBox';
     519    ksResultsGroupingTypeTestCase   = 'ResultsGroupingTypeTestCase';
     520    ksResultsGroupingTypeSchedGroup = 'ResultsGroupingTypeSchedGroup';
     521
     522    #kdResultGroupingMapOld = {
     523    #    ksResultsGroupingTypeNone:       ('TestSets',            None,                      None),
     524    #    ksResultsGroupingTypeTestGroup:  ('TestSets',            'TestSets.idTestGroup',    None),
     525    #    ksResultsGroupingTypeTestBox:    ('TestSets',            'TestSets.idTestBox',      None),
     526    #    ksResultsGroupingTypeTestCase:   ('TestSets',            'TestSets.idTestCase',     None),
     527    #    ksResultsGroupingTypeBuildRev:   ('TestSets, Builds',    'Builds.iRevision',
     528    #                                      ' AND Builds.idBuild      = TestSets.idBuild'
     529    #                                      ' AND Builds.tsExpire     > TestSets.tsCreated'
     530    #                                      ' AND Builds.tsEffective <= TestSets.tsCreated' ),
     531    #    ksResultsGroupingTypeSchedGroup: ('TestSets, TestBoxes', 'TestBoxes.idSchedGroup',
     532    #                                      ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox'),
     533    #};
     534
     535    ## @name Result sorting options.
     536    ## @{
     537    ksResultsSortByRunningAndStart      = 'ResultsSortByRunningAndStart'; ##< Default
     538    ksResultsSortByBuildRevision        = 'ResultsSortByBuildRevision';
     539    ksResultsSortByTestBoxName          = 'ResultsSortByTestBoxName';
     540    ksResultsSortByTestBoxOs            = 'ResultsSortByTestBoxOs';
     541    ksResultsSortByTestBoxOsVersion     = 'ResultsSortByTestBoxOsVersion';
     542    ksResultsSortByTestBoxOsArch        = 'ResultsSortByTestBoxOsArch';
     543    ksResultsSortByTestBoxArch          = 'ResultsSortByTestBoxArch';
     544    ksResultsSortByTestBoxCpuVendor     = 'ResultsSortByTestBoxCpuVendor';
     545    ksResultsSortByTestBoxCpuName       = 'ResultsSortByTestBoxCpuName';
     546    ksResultsSortByTestBoxCpuRev        = 'ResultsSortByTestBoxCpuRev';
     547    ksResultsSortByTestBoxCpuFeatures   = 'ResultsSortByTestBoxCpuFeatures';
     548    ksResultsSortByTestCaseName         = 'ResultsSortByTestCaseName';
     549    kasResultsSortBy = {
     550        ksResultsSortByRunningAndStart,
     551        ksResultsSortByBuildRevision,
     552        ksResultsSortByTestBoxName,
     553        ksResultsSortByTestBoxOs,
     554        ksResultsSortByTestBoxOsVersion,
     555        ksResultsSortByTestBoxOsArch,
     556        ksResultsSortByTestBoxArch,
     557        ksResultsSortByTestBoxCpuVendor,
     558        ksResultsSortByTestBoxCpuName,
     559        ksResultsSortByTestBoxCpuRev,
     560        ksResultsSortByTestBoxCpuFeatures,
     561        ksResultsSortByTestCaseName,
     562    };
     563    ## Used by the WUI for generating the drop down.
     564    kaasResultsSortByTitles = (
     565        ( ksResultsSortByRunningAndStart,       'Running & Start TS' ),
     566        ( ksResultsSortByBuildRevision,         'Build Revision' ),
     567        ( ksResultsSortByTestBoxName,           'TestBox Name' ),
     568        ( ksResultsSortByTestBoxOs,             'O/S' ),
     569        ( ksResultsSortByTestBoxOsVersion,      'O/S Version' ),
     570        ( ksResultsSortByTestBoxOsArch,         'O/S & Architecture' ),
     571        ( ksResultsSortByTestBoxArch,           'Architecture' ),
     572        ( ksResultsSortByTestBoxCpuVendor,      'CPU Vendor' ),
     573        ( ksResultsSortByTestBoxCpuName,        'CPU Vendor & Name' ),
     574        ( ksResultsSortByTestBoxCpuRev,         'CPU Vendor & Revision' ),
     575        ( ksResultsSortByTestBoxCpuFeatures,    'CPU Features' ),
     576        ( ksResultsSortByTestCaseName,          'Test Case Name' ),
     577    );
     578    ## @}
     579
     580    ## Default sort by map.
     581    kdResultSortByMap= {
     582        ksResultsSortByRunningAndStart:  ('', None, None, ''),
     583        ksResultsSortByBuildRevision: (
     584            # Sorting tables.
     585            ', Builds',
     586            # Sorting table join(s).
     587            ' AND TestSets.idBuild    = Builds.idBuild'
     588            ' AND Builds.tsExpire    >= TestSets.tsCreated'
     589            ' AND Builds.tsEffective <= TestSets.tsCreated',
     590            # Start of ORDER BY statement.
     591            ' Builds.iRevision DESC',
     592            # Extra columns to fetch for the above ORDER BY to work in a SELECT DISTINCT statement.
     593            ''  ),
     594        ksResultsSortByTestBoxName: (
     595            ', TestBoxes',
     596            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     597            ' TestBoxes.sName DESC',
     598            '' ),
     599        ksResultsSortByTestBoxOsArch: (
     600            ', TestBoxes',
     601            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     602            ' TestBoxes.sOs, TestBoxes.sCpuArch',
     603            ''  ),
     604        ksResultsSortByTestBoxOs: (
     605            ', TestBoxes',
     606            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     607            ' TestBoxes.sOs',
     608            ''  ),
     609        ksResultsSortByTestBoxOsVersion: (
     610            ', TestBoxes',
     611            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     612            ' TestBoxes.sOs, TestBoxes.sOsVersion DESC',
     613            ''  ),
     614        ksResultsSortByTestBoxArch: (
     615            ', TestBoxes',
     616            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     617            ' TestBoxes.sCpuArch',
     618            ''  ),
     619        ksResultsSortByTestBoxCpuVendor: (
     620            ', TestBoxes',
     621            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     622            ' TestBoxes.sCpuVendor',
     623            ''  ),
     624        ksResultsSortByTestBoxCpuName: (
     625            ', TestBoxes',
     626            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     627            ' TestBoxes.sCpuVendor, TestBoxes.sCpuName',
     628            ''  ),
     629        ksResultsSortByTestBoxCpuRev: (
     630            ', TestBoxes',
     631            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     632            ' TestBoxes.sCpuVendor, TestBoxes.lCpuRevision DESC',
     633            ', TestBoxes.lCpuRevision'  ),
     634        ksResultsSortByTestBoxCpuFeatures: (
     635            ', TestBoxes',
     636            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     637            ' TestBoxes.fCpuHwVirt DESC, TestBoxes.fCpuNestedPaging DESC, TestBoxes.fCpu64BitGuest DESC, TestBoxes.cCpus DESC',
     638            ', TestBoxes.cCpus' ),
     639        ksResultsSortByTestCaseName: (
     640            ', TestCases',
     641            ' AND TestSets.idGenTestCase = TestCases.idGenTestCase',
     642            ' TestCases.sName',
     643            ''  ),
     644    };
    521645
    522646    kdResultGroupingMap = {
    523         ksResultsGroupingTypeNone:       ('TestSets',            None,                      None),
    524         ksResultsGroupingTypeTestGroup:  ('TestSets',            'TestSets.idTestGroup',    None),
    525         ksResultsGroupingTypeTestBox:    ('TestSets',            'TestSets.idTestBox',      None),
    526         ksResultsGroupingTypeTestCase:   ('TestSets',            'TestSets.idTestCase',     None),
    527         ksResultsGroupingTypeBuildRev:   ('TestSets, Builds',    'Builds.iRevision',
    528                                           ' AND Builds.idBuild      = TestSets.idBuild'
    529                                           ' AND Builds.tsExpire     > TestSets.tsCreated'
    530                                           ' AND Builds.tsEffective <= TestSets.tsCreated' ),
    531         ksResultsGroupingTypeSchedGroup: ('TestSets, TestBoxes', 'TestBoxes.idSchedGroup',
    532                                           ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox'),
    533     }
     647        ksResultsGroupingTypeNone: (
     648            # Grouping tables;     # Grouping field;          # Grouping where addition.  # Sort by overrides.
     649            'TestSets',            None,                      None,                       {}
     650        ),
     651        ksResultsGroupingTypeTestGroup:  ('TestSets',   'TestSets.idTestGroup',     None, {}),
     652        ksResultsGroupingTypeTestBox:    ('TestSets',   'TestSets.idTestBox',       None, {}),
     653        ksResultsGroupingTypeTestCase:   ('TestSets',   'TestSets.idTestCase',      None, {}),
     654        ksResultsGroupingTypeBuildRev: (
     655            'TestSets, Builds',
     656            'Builds.iRevision',
     657            ' AND Builds.idBuild      = TestSets.idBuild'
     658            ' AND Builds.tsExpire     > TestSets.tsCreated'
     659            ' AND Builds.tsEffective <= TestSets.tsCreated',
     660            { ksResultsSortByBuildRevision: ( '', None,  ' Builds.iRevision DESC' ), }
     661        ),
     662        ksResultsGroupingTypeSchedGroup: (
     663            'TestSets, TestBoxes',
     664            'TestBoxes.idSchedGroup',
     665            ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox',
     666            { ksResultsSortByTestBoxName:       ( '', None, ' TestBoxes.sName DESC', '' ),
     667              ksResultsSortByTestBoxOsArch:     ( '', None, ' TestBoxes.sOs, TestBoxes.sCpuArch', ''  ),
     668              ksResultsSortByTestBoxOs:         ( '', None,  ' TestBoxes.sOs', ''  ),
     669              ksResultsSortByTestBoxOsVersion:  ( '', None, ' TestBoxes.sOs, TestBoxes.sOsVersion DESC', ''  ),
     670              ksResultsSortByTestBoxArch:       ( '', None, ' TestBoxes.sCpuArch', ''  ),
     671              ksResultsSortByTestBoxCpuVendor:  ( '', None, ' TestBoxes.sCpuVendor', ''  ),
     672              ksResultsSortByTestBoxCpuName:    ( '', None, ' TestBoxes.sCpuVendor, TestBoxes.sCpuName', ''  ),
     673              ksResultsSortByTestBoxCpuRev: (
     674                  '', None,  ' TestBoxes.sCpuVendor, TestBoxes.lCpuRevision DESC', ', TestBoxes.lCpuRevision'  ),
     675              ksResultsSortByTestBoxCpuFeatures: (
     676                  ' TestBoxes.fCpuHwVirt DESC, TestBoxes.fCpuNestedPaging DESC, TestBoxes.fCpu64BitGuest DESC, '
     677                  + 'TestBoxes.cCpus DESC',
     678                  ', TestBoxes.cCpus' ), }
     679        ),
     680    };
     681
    534682
    535683    def _getTimePeriodQueryPart(self, tsNow, sInterval):
     
    555703        return sRet
    556704
    557     def fetchResultsForListing(self, iStart, cMaxRows, tsNow, sInterval, enmResultsGroupingType, iResultsGroupingValue,
    558                                fOnlyFailures):
     705    def fetchResultsForListing(self, iStart, cMaxRows, tsNow, sInterval, enmResultSortBy,
     706                               enmResultsGroupingType, iResultsGroupingValue, fOnlyFailures):
    559707        """
    560708        Fetches TestResults table content.
     
    574722        # Get SQL query parameters
    575723        #
    576         if enmResultsGroupingType is None:
    577             raise TMExceptionBase('Unknown grouping type')
    578         if enmResultsGroupingType not in self.kdResultGroupingMap:
    579             raise TMExceptionBase('Unknown grouping type')
    580         sTables, sGroupingField, sGroupingCondition = self.kdResultGroupingMap[enmResultsGroupingType]
     724        if enmResultsGroupingType is None or enmResultsGroupingType not in self.kdResultGroupingMap:
     725            raise TMExceptionBase('Unknown grouping type');
     726        if enmResultSortBy is None or enmResultSortBy not in self.kasResultsSortBy:
     727            raise TMExceptionBase('Unknown sorting');
     728        sGroupingTables, sGroupingField, sGroupingCondition, dSortingOverrides = self.kdResultGroupingMap[enmResultsGroupingType];
     729        if enmResultSortBy in dSortingOverrides:
     730            sSortingTables, sSortingWhere, sSortingOrderBy, sSortingColumns = dSortingOverrides[enmResultSortBy];
     731        else:
     732            sSortingTables, sSortingWhere, sSortingOrderBy, sSortingColumns = self.kdResultSortByMap[enmResultSortBy];
    581733
    582734        #
     
    613765                  '       TestSuiteBits.idBuild AS idBuildTestSuite,\n' \
    614766                  '       TestSuiteBits.iRevision AS iRevisionTestSuite,\n' \
    615                   '       (TestSets.tsDone IS NULL) SortRunningFirst\n' \
     767                  '       (TestSets.tsDone IS NULL) SortRunningFirst' + sSortingColumns + '\n' \
    616768                  'FROM   BuildCategories,\n' \
    617769                  '       Builds,\n' \
     
    629781                  '                 TestSets.idGenTestCase AS idGenTestCase,\n' \
    630782                  '                 TestSets.idGenTestCaseArgs AS idGenTestCaseArgs\n' \
    631                   '          FROM  ' + sTables + '\n' \
     783                  '          FROM  ' + sGroupingTables + sSortingTables + '\n' \
    632784                  '          WHERE ' + self._getTimePeriodQueryPart(tsNow, sInterval);
    633785        if fOnlyFailures:
     
    638790        if sGroupingCondition is not None:
    639791            sQuery += sGroupingCondition.replace(' AND ', '            AND ');
    640         sQuery += '          ORDER BY (TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n' \
     792        if sSortingWhere is not None:
     793            sQuery += sSortingWhere.replace(' AND ', '            AND ');
     794        sQuery += '          ORDER BY ';
     795        if sSortingOrderBy is not None:
     796            sQuery += sSortingOrderBy + ',\n                ';
     797        sQuery += '(TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n' \
    641798                  '          LIMIT %s OFFSET %s\n' % (cMaxRows, iStart,);
    642799
     
    653810                  '   AND TestSets.idGenTestCase     = TestCases.idGenTestCase\n' \
    654811                  '   AND TestSets.idGenTestCaseArgs = TestCaseArgs.idGenTestCaseArgs\n' \
    655                   'ORDER BY (TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n'
     812                  'ORDER BY ';
     813        if sSortingOrderBy is not None:
     814            sQuery += sSortingOrderBy + ',\n       ';
     815        sQuery += '(TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n';
    656816
    657817        #
     
    686846        if enmResultsGroupingType not in self.kdResultGroupingMap:
    687847            raise TMExceptionBase('Unknown grouping type')
    688         sTables, sGroupingField, sGroupingCondition  = self.kdResultGroupingMap[enmResultsGroupingType]
     848        sGroupingTables, sGroupingField, sGroupingCondition, _  = self.kdResultGroupingMap[enmResultsGroupingType];
    689849
    690850        #
     
    692852        #
    693853        sQuery = 'SELECT COUNT(idTestSet)\n' \
    694                  'FROM   ' + sTables + '\n' \
     854                 'FROM   ' + sGroupingTables + '\n' \
    695855                 'WHERE  ' + self._getTimePeriodQueryPart(tsNow, sInterval);
    696856        if fOnlyFailures:
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuimain.py

    r56806 r56809  
    142142    ## @}
    143143
     144    ## @name Test result listing parameters.
     145    ## @{
     146    ## If this param is specified, then show only results for this member when results grouped by some parameter.
     147    ksParamGroupMemberId        = 'GroupMemberId'
     148    ## Optional parameter for indicating whether to restrict the listing to failures only.
     149    ksParamOnlyFailures         = 'OnlyFailures'
     150    ## Result listing sorting.
     151    ksParamTestResultsSortBy    = 'enmSortBy'
     152    ## @}
     153
    144154    ## Effective time period. one of the first column values in kaoResultPeriods.
    145155    ksParamEffectivePeriod      = 'sEffectivePeriod'
    146 
    147     ## If this param is specified, then show only results for this member when results grouped by some parameter.
    148     ksParamGroupMemberId        = 'GroupMemberId'
    149 
    150     ## Optional parameter for indicating whether to restrict the listing to failures only.
    151     ksParamOnlyFailures         = 'OnlyFailures'
    152156
    153157    ## Test result period values.
     
    296300    #
    297301
     302    def _generateSortBySelector(self, dParams, sPreamble, sPostamble):
     303        """
     304        Generate HTML code for the sort by selector.
     305        """
     306        if self.ksParamTestResultsSortBy in dParams:
     307            enmResultSortBy = dParams[self.ksParamTestResultsSortBy];
     308            del dParams[self.ksParamTestResultsSortBy];
     309        else:
     310            enmResultSortBy = TestResultLogic.ksResultsSortByRunningAndStart;
     311
     312        sHtmlSortBy  = '<form name="TimeForm" method="GET"> Sort by\n';
     313        sHtmlSortBy += sPreamble;
     314        sHtmlSortBy += '\n  <select name="%s" onchange="window.location=' % (self.ksParamTestResultsSortBy,);
     315        sHtmlSortBy += '\'?%s&%s=\' + ' % (webutils.encodeUrlParams(dParams), self.ksParamTestResultsSortBy)
     316        sHtmlSortBy += 'this.options[this.selectedIndex].value;" title="Sorting by">\n'
     317
     318        fSelected = False;
     319        for enmCode, sTitle in TestResultLogic.kaasResultsSortByTitles:
     320            if enmCode == enmResultSortBy:
     321                fSelected = True;
     322            sHtmlSortBy += '    <option value="%s"%s>%s</option>\n' \
     323                         % (enmCode, ' selected="selected"' if enmCode == enmResultSortBy else '', sTitle,);
     324        assert fSelected;
     325        sHtmlSortBy += '  </select>\n';
     326        sHtmlSortBy += sPostamble;
     327        sHtmlSortBy += '\n</form>\n'
     328        return sHtmlSortBy;
     329
    298330    def _generateStatusSelector(self, dParams, fOnlyFailures):
    299331        """
     
    318350        if WuiDispatcherBase.ksParamPageNo in dParams:
    319351            del dParams[WuiDispatcherBase.ksParamPageNo]
    320 
    321352
    322353        sHtmlTimeSelector  = '<form name="TimeForm" method="GET">\n'
     
    546577        # Generate the elements.
    547578        sHtmlStatusSelector = self._generateStatusSelector(self.getParameters(), fOnlyFailures);
     579        sHtmlSortBySelector = self._generateSortBySelector(self.getParameters(), '', sHtmlStatusSelector);
    548580        sHtmlPeriodSelector = self._generateResultPeriodSelector(self.getParameters(), sCurPeriod)
    549581        sHtmlTimeWalker     = self._generateTimeWalker(self.getParameters(), tsEffective, sCurPeriod);
     
    564596                '</tr>\n' \
    565597                '<tr>\n' \
    566                 ' <td width=30%>' + sHtmlStatusSelector + '</td>\n' \
     598                ' <td width=30%>' + sHtmlSortBySelector + '</td>\n' \
    567599                ' <td width=40% align=center>\n' + sHtmlPager + '</td>\n' \
    568600                ' <td width=30% align=right>\n' + sHtmlItemsPerPageSelector + '</td>\n'\
     
    638670        oListContentType is a child of WuiListContentBase.
    639671        """
    640         cItemsPerPage     = self.getIntParam(self.ksParamItemsPerPage,  iMin =  2, iMax =   9999, iDefault = 128)
    641         iPage             = self.getIntParam(self.ksParamPageNo,        iMin =  0, iMax = 999999, iDefault = 0)
    642         tsEffective       = self.getEffectiveDateParam()
    643         iGroupMemberId    = self.getIntParam(self.ksParamGroupMemberId, iMin = -1, iMax = 999999, iDefault = -1)
     672        cItemsPerPage     = self.getIntParam(self.ksParamItemsPerPage,  iMin =  2, iMax =   9999, iDefault = 128);
     673        iPage             = self.getIntParam(self.ksParamPageNo,        iMin =  0, iMax = 999999, iDefault = 0);
     674        tsEffective       = self.getEffectiveDateParam();
     675        iGroupMemberId    = self.getIntParam(self.ksParamGroupMemberId, iMin = -1, iMax = 999999, iDefault = -1);
    644676        fOnlyFailures     = self.getBoolParam(self.ksParamOnlyFailures, fDefault = False);
     677        enmResultSortBy   = self.getStringParam(self.ksParamTestResultsSortBy,
     678                                                asValidValues = TestResultLogic.kasResultsSortBy,
     679                                                sDefault = TestResultLogic.ksResultsSortByRunningAndStart);
    645680
    646681        # Get testing results period and validate it
    647         asValidValues = [x for (x, _, _) in self.kaoResultPeriods]
     682        asValidValues     = [x for (x, _, _) in self.kaoResultPeriods]
    648683        sCurPeriod        = self.getStringParam(self.ksParamEffectivePeriod, asValidValues = asValidValues,
    649684                                                sDefault = self.ksResultPeriodDefault)
     
    727762                                                            tsNow = tsEffective,
    728763                                                            sInterval = sCurPeriod,
     764                                                            enmResultSortBy = enmResultSortBy,
    729765                                                            enmResultsGroupingType = enmResultsGroupingType,
    730766                                                            iResultsGroupingValue = idMember,
    731                                                             fOnlyFailures = fOnlyFailures)
    732 
     767                                                            fOnlyFailures = fOnlyFailures);
    733768            cEntriesMax = max(cEntriesMax, cEntries)
    734769
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette