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
This commit is contained in:
Julio Cesar Laura
2012-09-24 11:32:42 -04:00
parent 3f8584f20f
commit 31de7c5943
2 changed files with 36 additions and 30 deletions

View File

@@ -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()
});

View File

@@ -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());