VirtualBox

Changeset 56764 in vbox


Ignore:
Timestamp:
Jul 3, 2015 3:03:42 AM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
101413
Message:

TestResultLogic::fetchResultsForListing+getEntriesCount: Optimize the queries by always getting the first selected TestSets bits first and then join with the other tables as necessary (not necessary in when counting).

File:
1 edited

Legend:

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

    r56295 r56764  
    520520    ksResultsGroupingTypeSchedGroup = 'ResultsGroupingTypeSchedGroup'
    521521
    522     ksBaseTables = 'BuildCategories, Builds, TestBoxes, TestResults, TestCases, TestCaseArgs,\n' \
    523                  + '       TestSets LEFT OUTER JOIN Builds AS TestSuiteBits\n' \
    524                    '                ON TestSets.idBuildTestSuite = TestSuiteBits.idBuild\n';
    525 
    526     ksBasePreCondition = 'TestSets.idTestSet         = TestResults.idTestSet\n' \
    527                 + '   AND TestResults.idTestResultParent is NULL\n' \
    528                 + '   AND TestSets.idBuild           = Builds.idBuild\n' \
    529                 + '   AND Builds.tsExpire            > TestSets.tsCreated\n' \
    530                 + '   AND Builds.tsEffective        <= TestSets.tsCreated\n' \
    531                 + '   AND Builds.idBuildCategory     = BuildCategories.idBuildCategory\n' \
    532                 + '   AND TestSets.idGenTestBox      = TestBoxes.idGenTestBox\n' \
    533                 + '   AND TestSets.idGenTestCase     = TestCases.idGenTestCase\n' \
    534                 + '   AND TestSets.idGenTestCaseArgs = TestCaseArgs.idGenTestCaseArgs\n'
    535522    kdResultGroupingMap = {
    536         ksResultsGroupingTypeNone:       (ksBaseTables,
    537                                           ksBasePreCondition,),
    538 
    539         ksResultsGroupingTypeTestGroup:  (ksBaseTables,
    540                                           ksBasePreCondition + '   AND TestSets.idTestGroup',),
    541 
    542         ksResultsGroupingTypeBuildRev:   (ksBaseTables,
    543                                           ksBasePreCondition + '   AND Builds.iRevision',),
    544 
    545         ksResultsGroupingTypeTestBox:    (ksBaseTables,
    546                                           ksBasePreCondition + '   AND TestSets.idTestBox',),
    547 
    548         ksResultsGroupingTypeTestCase:   (ksBaseTables,
    549                                           ksBasePreCondition + '   AND TestSets.idTestCase',),
    550 
    551         ksResultsGroupingTypeSchedGroup: (ksBaseTables,
    552                                           ksBasePreCondition + '   AND TestBoxes.idSchedGroup',),
     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'),
    553533    }
    554534
     
    575555        return sRet
    576556
    577     def _getSqlQueryForGroupSearch(self, sWhat, tsNow, sInterval, enmResultsGroupingType, iResultsGroupingValue, fOnlyFailures):
    578         """
    579         Returns an SQL query that limits SELECT result
    580         in order to satisfy @param enmResultsGroupingType.
    581         """
    582 
    583         if enmResultsGroupingType is None:
    584             raise TMExceptionBase('Unknown grouping type')
    585 
    586         if enmResultsGroupingType not in self.kdResultGroupingMap:
    587             raise TMExceptionBase('Unknown grouping type')
    588 
    589         # Get SQL query parameters
    590         sTables, sCondition = self.kdResultGroupingMap[enmResultsGroupingType]
    591 
    592         # Extend SQL query with time period limitation
    593         sTimePeriodQuery = self._getTimePeriodQueryPart(tsNow, sInterval)
    594 
    595         if iResultsGroupingValue is not None:
    596             sCondition += ' = %d' % iResultsGroupingValue + '\n';
    597         sCondition += '   AND ' + sTimePeriodQuery
    598 
    599         # Extend the condition with test status limitations if requested.
    600         if fOnlyFailures:
    601             sCondition += '\n   AND TestSets.enmStatus != \'success\'::TestStatus_T' \
    602                           '\n   AND TestSets.enmStatus != \'running\'::TestStatus_T';
    603 
    604         # Assemble the query.
    605         sQuery  = 'SELECT DISTINCT %s\n'  % sWhat
    606         sQuery += 'FROM   %s\n'  % sTables
    607         sQuery += 'WHERE  %s\n' % sCondition
    608 
    609         return sQuery
    610 
    611557    def fetchResultsForListing(self, iStart, cMaxRows, tsNow, sInterval, enmResultsGroupingType, iResultsGroupingValue,
    612558                               fOnlyFailures):
     
    625571        """
    626572
    627         sWhat =        'TestSets.idTestSet,\n' \
    628                 '       BuildCategories.idBuildCategory,\n' \
    629                 '       BuildCategories.sProduct,\n' \
    630                 '       BuildCategories.sRepository,\n' \
    631                 '       BuildCategories.sBranch,\n' \
    632                 '       BuildCategories.sType,\n' \
    633                 '       Builds.idBuild,\n' \
    634                 '       Builds.sVersion,\n' \
    635                 '       Builds.iRevision,\n' \
    636                 '       TestBoxes.sOs,\n' \
    637                 '       TestBoxes.sOsVersion,\n' \
    638                 '       TestBoxes.sCpuArch,\n' \
    639                 '       TestBoxes.sCpuVendor,\n' \
    640                 '       TestBoxes.sCpuName,\n' \
    641                 '       TestBoxes.cCpus,\n' \
    642                 '       TestBoxes.fCpuHwVirt,\n' \
    643                 '       TestBoxes.fCpuNestedPaging,\n' \
    644                 '       TestBoxes.fCpu64BitGuest,\n' \
    645                 '       TestBoxes.idTestBox,\n' \
    646                 '       TestBoxes.sName,\n' \
    647                 '       TestResults.tsCreated,\n' \
    648                 '       COALESCE(TestResults.tsElapsed, CURRENT_TIMESTAMP - TestResults.tsCreated),\n' \
    649                 '       TestSets.enmStatus,\n' \
    650                 '       TestResults.cErrors,\n' \
    651                 '       TestCases.idTestCase,\n' \
    652                 '       TestCases.sName,\n' \
    653                 '       TestCases.sBaseCmd,\n' \
    654                 '       TestCaseArgs.sArgs,\n' \
    655                 '       TestSuiteBits.idBuild AS idBuildTestSuite,\n' \
    656                 '       TestSuiteBits.iRevision AS iRevisionTestSuite,\n' \
    657                 '       (TestSets.tsDone IS NULL) SortRunningFirst' \
    658                 ;
    659 
    660         sSqlQuery = self._getSqlQueryForGroupSearch(sWhat, tsNow, sInterval, enmResultsGroupingType, iResultsGroupingValue,
    661                                                     fOnlyFailures);
    662 
    663         sSqlQuery += 'ORDER BY SortRunningFirst DESC, TestSets.idTestSet DESC\n';
    664         sSqlQuery += 'LIMIT %s OFFSET %s\n' % (cMaxRows, iStart,);
    665 
    666         self._oDb.execute(sSqlQuery);
     573        #
     574        # Get SQL query parameters
     575        #
     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]
     581
     582        #
     583        # Construct the query.
     584        #
     585        sQuery  = 'SELECT DISTINCT TestSets.idTestSet,\n' \
     586                  '       BuildCategories.idBuildCategory,\n' \
     587                  '       BuildCategories.sProduct,\n' \
     588                  '       BuildCategories.sRepository,\n' \
     589                  '       BuildCategories.sBranch,\n' \
     590                  '       BuildCategories.sType,\n' \
     591                  '       Builds.idBuild,\n' \
     592                  '       Builds.sVersion,\n' \
     593                  '       Builds.iRevision,\n' \
     594                  '       TestBoxes.sOs,\n' \
     595                  '       TestBoxes.sOsVersion,\n' \
     596                  '       TestBoxes.sCpuArch,\n' \
     597                  '       TestBoxes.sCpuVendor,\n' \
     598                  '       TestBoxes.sCpuName,\n' \
     599                  '       TestBoxes.cCpus,\n' \
     600                  '       TestBoxes.fCpuHwVirt,\n' \
     601                  '       TestBoxes.fCpuNestedPaging,\n' \
     602                  '       TestBoxes.fCpu64BitGuest,\n' \
     603                  '       TestBoxes.idTestBox,\n' \
     604                  '       TestBoxes.sName,\n' \
     605                  '       TestResults.tsCreated,\n' \
     606                  '       COALESCE(TestResults.tsElapsed, CURRENT_TIMESTAMP - TestResults.tsCreated),\n' \
     607                  '       TestSets.enmStatus,\n' \
     608                  '       TestResults.cErrors,\n' \
     609                  '       TestCases.idTestCase,\n' \
     610                  '       TestCases.sName,\n' \
     611                  '       TestCases.sBaseCmd,\n' \
     612                  '       TestCaseArgs.sArgs,\n' \
     613                  '       TestSuiteBits.idBuild AS idBuildTestSuite,\n' \
     614                  '       TestSuiteBits.iRevision AS iRevisionTestSuite,\n' \
     615                  '       (TestSets.tsDone IS NULL) SortRunningFirst\n' \
     616                  'FROM   BuildCategories,\n' \
     617                  '       Builds,\n' \
     618                  '       TestBoxes,\n' \
     619                  '       TestResults,\n' \
     620                  '       TestCases,\n' \
     621                  '       TestCaseArgs,\n' \
     622                  '       (  SELECT TestSets.idTestSet AS idTestSet,\n' \
     623                  '                 TestSets.tsDone AS tsDone,\n' \
     624                  '                 TestSets.tsCreated AS tsCreated,\n' \
     625                  '                 TestSets.enmStatus AS enmStatus,\n' \
     626                  '                 TestSets.idBuild AS idBuild,\n' \
     627                  '                 TestSets.idBuildTestSuite AS idBuildTestSuite,\n' \
     628                  '                 TestSets.idGenTestBox AS idGenTestBox,\n' \
     629                  '                 TestSets.idGenTestCase AS idGenTestCase,\n' \
     630                  '                 TestSets.idGenTestCaseArgs AS idGenTestCaseArgs\n' \
     631                  '          FROM  ' + sTables + '\n' \
     632                  '          WHERE ' + self._getTimePeriodQueryPart(tsNow, sInterval);
     633        if fOnlyFailures:
     634            sQuery += '            AND TestSets.enmStatus != \'success\'::TestStatus_T' \
     635                      '            AND TestSets.enmStatus != \'running\'::TestStatus_T';
     636        if sGroupingField is not None:
     637            sQuery += '            AND %s = %d\n' % (sGroupingField, iResultsGroupingValue,);
     638        if sGroupingCondition is not None:
     639            sQuery += sGroupingCondition.replace(' AND ', '            AND ');
     640        sQuery += '          ORDER BY (TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n' \
     641                  '          LIMIT %s OFFSET %s\n' % (cMaxRows, iStart,);
     642
     643        sQuery += '       ) AS TestSets\n' \
     644                  '       LEFT OUTER JOIN Builds AS TestSuiteBits\n' \
     645                  '                    ON TestSets.idBuildTestSuite = TestSuiteBits.idBuild\n' \
     646                  'WHERE  TestSets.idTestSet         = TestResults.idTestSet\n' \
     647                  '   AND TestResults.idTestResultParent is NULL\n' \
     648                  '   AND TestSets.idBuild           = Builds.idBuild\n' \
     649                  '   AND Builds.tsExpire            > TestSets.tsCreated\n' \
     650                  '   AND Builds.tsEffective        <= TestSets.tsCreated\n' \
     651                  '   AND Builds.idBuildCategory     = BuildCategories.idBuildCategory\n' \
     652                  '   AND TestSets.idGenTestBox      = TestBoxes.idGenTestBox\n' \
     653                  '   AND TestSets.idGenTestCase     = TestCases.idGenTestCase\n' \
     654                  '   AND TestSets.idGenTestCaseArgs = TestCaseArgs.idGenTestCaseArgs\n' \
     655                  'ORDER BY (TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n'
     656
     657        #
     658        # Execute the query and return the wrapped results.
     659        #
     660        self._oDb.execute(sQuery);
    667661
    668662        aoRows = [];
     
    684678        """
    685679
    686         sSqlQuery = self._getSqlQueryForGroupSearch('COUNT(TestSets.idTestSet)', tsNow, sInterval,
    687                                                     enmResultsGroupingType, iResultsGroupingValue, fOnlyFailures)
    688         self._oDb.execute(sSqlQuery)
     680        #
     681        # Get SQL query parameters
     682        #
     683        if enmResultsGroupingType is None:
     684            raise TMExceptionBase('Unknown grouping type')
     685
     686        if enmResultsGroupingType not in self.kdResultGroupingMap:
     687            raise TMExceptionBase('Unknown grouping type')
     688        sTables, sGroupingField, sGroupingCondition  = self.kdResultGroupingMap[enmResultsGroupingType]
     689
     690        #
     691        # Construct the query.
     692        #
     693        sQuery = 'SELECT COUNT(idTestSet)\n' \
     694                 'FROM   ' + sTables + '\n' \
     695                 'WHERE  ' + self._getTimePeriodQueryPart(tsNow, sInterval);
     696        if fOnlyFailures:
     697            sQuery += '   AND TestSets.enmStatus != \'success\'::TestStatus_T' \
     698                      '   AND TestSets.enmStatus != \'running\'::TestStatus_T';
     699        if sGroupingField is not None:
     700            sQuery += '   AND %s = %d\n' % (sGroupingField, iResultsGroupingValue,);
     701        if sGroupingCondition is not None:
     702            sQuery += sGroupingCondition.replace(' AND ', '   AND ');
     703
     704        #
     705        # Execute the query and return the result.
     706        #
     707        self._oDb.execute(sQuery)
    689708        return self._oDb.fetchOne()[0]
    690709
Note: See TracChangeset for help on using the changeset viewer.

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