From 31de7c5943745af8054a57864cc51d0611e5143e Mon Sep 17 00:00:00 2001 From: Julio Cesar Laura Date: Mon, 24 Sep 2012 11:32:42 -0400 Subject: [PATCH] BUG 9796 Slow Query deleting a task ( error collected by New Relic ) SOLVED - The query used to check if a task can be deleted was very slow - Change the businnes logic to check if a task can be deleted --- .../engine/js/processmap/core/processmap.js | 1 + .../methods/processes/processes_Ajax.php | 65 ++++++++++--------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/workflow/engine/js/processmap/core/processmap.js b/workflow/engine/js/processmap/core/processmap.js index dec700929..a8f11387e 100755 --- a/workflow/engine/js/processmap/core/processmap.js +++ b/workflow/engine/js/processmap/core/processmap.js @@ -1540,6 +1540,7 @@ var processmap=function(){ var r = new leimnud.module.rpc.xmlhttp({ url: this.options.dataServer, args: "action=taskCases&data=" + { + pro_uid: this.options.uid, task_uid: data.uid }.toJSONString() }); diff --git a/workflow/engine/methods/processes/processes_Ajax.php b/workflow/engine/methods/processes/processes_Ajax.php index f7999b4f5..bd89d286c 100755 --- a/workflow/engine/methods/processes/processes_Ajax.php +++ b/workflow/engine/methods/processes/processes_Ajax.php @@ -66,7 +66,7 @@ try { $c->addSelectColumn(AppDelegationPeer::TAS_UID); $c->add(AppDelegationPeer::APP_UID, $_SESSION['APPLICATION']); $c->add(AppDelegationPeer::DEL_INDEX, $_SESSION['INDEX']); - $oDataset = AppDelegationPeer::doSelectRs($c); + $oDataset = AppDelegationPeer::doSelectRS($c); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); $aData = $oDataset->getRow(); @@ -518,41 +518,46 @@ try { break; case "taskCases": - require_once ("classes/model/Application.php"); - require_once ("classes/model/AppDelegation.php"); - require_once ("classes/model/AppDelay.php"); - - $criteria = new Criteria("workflow"); - $criteria->addSelectColumn("COUNT(DISTINCT APPLICATION.APP_UID)"); - - $criteria->addJoin(ApplicationPeer::APP_UID, AppDelegationPeer::APP_UID, Criteria::LEFT_JOIN); - $criteria->addJoin(ApplicationPeer::APP_UID, AppDelayPeer::APP_UID, Criteria::LEFT_JOIN); - + require_once 'classes/model/AppDelegation.php'; + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(AppDelegationPeer::APP_UID); + $criteria->addSelectColumn(AppDelegationPeer::DEL_INDEX); + $criteria->addSelectColumn(AppDelegationPeer::TAS_UID); $criteria->add(AppDelegationPeer::TAS_UID, $oData->task_uid); - - $criteria->add( - $criteria->getNewCriterion(AppDelegationPeer::DEL_FINISH_DATE, null, Criteria::ISNULL)->addOr( - $criteria->getNewCriterion(AppDelayPeer::APP_DELAY_UID, null, Criteria::ISNOTNULL)->addAnd( - $criteria->getNewCriterion(AppDelayPeer::APP_TYPE, array("REASSIGN", "ADHOC", "CANCEL"), Criteria::NOT_IN))->addAnd( - $criteria->getNewCriterion(AppDelayPeer::APP_DISABLE_ACTION_USER, null, Criteria::ISNULL)->addOr( - $criteria->getNewCriterion(AppDelayPeer::APP_DISABLE_ACTION_USER, 0)) - ) - ) - ); - - $rs = ApplicationPeer::doSelectRS($criteria); - - $rs->next(); - $row = $rs->getRow(); - - $response->casesNumRec = intval($row[0]); - + $criteria->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN'); + $casesNumRec = AppDelegationPeer::doCount($criteria); + if ($casesNumRec == 0) { + require_once 'classes/model/AppDelay.php'; + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(AppDelayPeer::APP_UID); + $criteria->addSelectColumn(AppDelayPeer::APP_DEL_INDEX); + $criteria->add(AppDelayPeer::PRO_UID, $oData->pro_uid); + $criteria->add(AppDelayPeer::APP_TYPE, 'PAUSE'); + $criteria->add(AppDelayPeer::APP_DISABLE_ACTION_DATE, null, Criteria::ISNULL); + $dataset = AppDelayPeer::doSelectRS($criteria); + if ($dataset->getRecordCount() > 0) { + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $dataset->next(); + while ($row = $dataset->getRow()) { + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(AppDelegationPeer::TAS_UID); + $criteria->add(AppDelegationPeer::APP_UID, $row['APP_UID']); + $criteria->add(AppDelegationPeer::DEL_INDEX, $row['APP_DEL_INDEX']); + $criteria->add(AppDelegationPeer::TAS_UID, $oData->task_uid); + $casesNumRec += AppDelegationPeer::doCount($criteria); + $dataset->next(); + } + } + } + $response = new stdclass(); + $response->casesNumRec = $casesNumRec; $json = new Services_JSON(); $sOutput = $json->encode($response); break; } - if( isset($sOutput) ) + if (isset($sOutput)) { die($sOutput); + } } catch (Exception $oException) { die($oException->getMessage() . "\n" . $oException->getTraceAsString());