PM-3659 "Uso de interface lenta (assignment rules) cuando..." SOLVED

Issue:
    Uso de interface lenta (assignment rules) cuando se tienen varios usuarios (40000)
Cause:
    No se realizo de manera correcta el paginado de registros
Solution:
    > Se a implementado los siguientes end-points:
        GET /api/1.0/{workspace}/project/{prj_uid}/activity/{act_uid}/assignee/paged
        GET /api/1.0/{workspace}/project/{prj_uid}/activity/{act_uid}/available-assignee/paged
        GET /api/1.0/{workspace}/project/{prj_uid}/activity/{act_uid}/adhoc-assignee/paged
        GET /api/1.0/{workspace}/project/{prj_uid}/activity/{act_uid}/adhoc-available-assignee/paged

        Estos end-points aceptan los siguientes parametros:
            /paged?filter={filter}&start={start}&limit={limit}&type={type}
            /paged?lfilter={lfilter}&start={start}&limit={limit}&type={type}
            /paged?rfilter={rfilter}&start={start}&limit={limit}&type={type}
        Donde:
            filter:  Representa la busqueda de registros que contienen este valor
            lfilter: Representa la busqueda de registros que empiezan con este valor
            rfilter: Representa la busqueda de registros que terminan con este valor
            type:    Acepta los siguentes valores: "user", "group"
        Ejemplo:
            GET /api/1.0/{workspace}/project/{prj_uid}/activity/{act_uid}/assignee/paged?start=0&limit=3
            <<<<< 200
            {
                "total": 15,
                "start": 0,
                "limit": 3,
                "filter": "",
                "data": [
                    {
                        "aas_uid": "60593768854492f8fa43aa2064326562",
                        "aas_name": "GROUP1 (2 Users)",
                        "aas_lastname": "",
                        "aas_username": "",
                        "aas_type": "group"
                    },
                    {
                        "aas_uid": "11886228656016c9329c898096916123",
                        "aas_name": "GROUP2 (1 User)",
                        "aas_lastname": "",
                        "aas_username": "",
                        "aas_type": "group"
                    },
                    {
                        "aas_uid": "52242914255f202805bd552031573543",
                        "aas_name": "user1",
                        "aas_lastname": "user1",
                        "aas_username": "user1",
                        "aas_type": "user"
                    }
                ]
            }
    > Se a mejorado los siguientes end-points:
        GET /api/1.0/{workspace}/users?filter={filter}&start={start}&limit={limit}
        GET /api/1.0/{workspace}/users?lfilter={lfilter}&start={start}&limit={limit}
        GET /api/1.0/{workspace}/users?rfilter={rfilter}&start={start}&limit={limit}
        GET /api/1.0/{workspace}/groups?filter={filter}&start={start}&limit={limit}
        GET /api/1.0/{workspace}/groups?lfilter={lfilter}&start={start}&limit={limit}
        GET /api/1.0/{workspace}/groups?rfilter={rfilter}&start={start}&limit={limit}
This commit is contained in:
Victor Saisa Lopez
2015-09-25 15:11:42 -04:00
parent 9fa3c2d2bf
commit ef1208ce98
9 changed files with 681 additions and 755 deletions

View File

@@ -460,31 +460,76 @@ class Group
try {
$arrayGroup = array();
$numRecTotal = 0;
//Verify data
$process = new \ProcessMaker\BusinessModel\Process();
$process->throwExceptionIfDataNotMetPagerVarDefinition(array("start" => $start, "limit" => $limit), $this->arrayFieldNameForException);
//Get data
if (!is_null($limit) && $limit . "" == "0") {
return $arrayGroup;
//Set variables
$filterName = "filter";
if (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"])) {
$arrayAux = array(
"" => "filter",
"LEFT" => "lfilter",
"RIGHT" => "rfilter"
);
$filterName = $arrayAux[(isset($arrayFilterData["filterOption"]))? $arrayFilterData["filterOption"] : ""];
}
//Get data
if (!is_null($limit) && $limit . "" == "0") {
//Return
return array(
"total" => $numRecTotal,
"start" => (int)((!is_null($start))? $start : 0),
"limit" => (int)((!is_null($limit))? $limit : 0),
$filterName => (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"]))? $arrayFilterData["filter"] : "",
"data" => $arrayGroup
);
}
//Set variables
$arrayTotalUsersByGroup = $this->getTotalUsersByGroup();
$arrayTotalTasksByGroup = $this->getTotalTasksByGroup();
//SQL
//Query
$criteria = $this->getGroupCriteria();
if (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"]) && trim($arrayFilterData["filter"]) != "") {
$criteria->add(\ContentPeer::CON_VALUE, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE);
$arraySearch = array(
"" => "%" . $arrayFilterData["filter"] . "%",
"LEFT" => $arrayFilterData["filter"] . "%",
"RIGHT" => "%" . $arrayFilterData["filter"]
);
$search = $arraySearch[(isset($arrayFilterData["filterOption"]))? $arrayFilterData["filterOption"] : ""];
$criteria->add(\ContentPeer::CON_VALUE, $search, \Criteria::LIKE);
}
//SQL
//Number records total
$criteriaCount = clone $criteria;
$criteriaCount->clearSelectColumns();
$criteriaCount->addSelectColumn("COUNT(" . \GroupwfPeer::GRP_UID . ") AS NUM_REC");
$rsCriteriaCount = \GroupwfPeer::doSelectRS($criteriaCount);
$rsCriteriaCount->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
$result = $rsCriteriaCount->next();
$row = $rsCriteriaCount->getRow();
$numRecTotal = (int)($row["NUM_REC"]);
//Query
if (!is_null($sortField) && trim($sortField) != "") {
$sortField = strtoupper($sortField);
if (in_array($sortField, array("GRP_UID", "GRP_STATUS", "GRP_LDAP_DN", "GRP_UX"))) {
if (in_array(\GroupwfPeer::TABLE_NAME . "." . $sortField, $criteria->getSelectColumns())) {
$sortField = \GroupwfPeer::TABLE_NAME . "." . $sortField;
} else {
$sortField = "GRP_TITLE";
@@ -520,7 +565,13 @@ class Group
}
//Return
return $arrayGroup;
return array(
"total" => $numRecTotal,
"start" => (int)((!is_null($start))? $start : 0),
"limit" => (int)((!is_null($limit))? $limit : 0),
$filterName => (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"]))? $arrayFilterData["filter"] : "",
"data" => $arrayGroup
);
} catch (\Exception $e) {
throw $e;
}
@@ -635,7 +686,7 @@ class Group
}
/**
* return permissions of user
* return permissions of user
*/
public function loadUserRolePermission ($sSystem, $sUser)
{
@@ -748,11 +799,11 @@ class Group
$rsCriteria = \UsersPeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
if (isset($flagPermission) && $flagPermission){
if (isset($flagPermission) && $flagPermission) {
\G::LoadSystem('rbac');
while ($rsCriteria->next()) {
$row = $rsCriteria->getRow();
$aPermissions = $this->loadUserRolePermission("PROCESSMAKER", $row['USR_UID']);
$bInclude = false;
@@ -768,7 +819,7 @@ class Group
} else {
while ($rsCriteria->next()) {
$row = $rsCriteria->getRow();
$arrayUser[] = $this->getUserDataFromRecord($row);
}
}

View File

@@ -169,10 +169,10 @@ class Process
public function throwExceptionIfDataNotMetFieldDefinition($arrayData, $arrayFieldDefinition, $arrayFieldNameForException, $flagValidateRequired = true)
{
try {
\G::LoadSystem('inputfilter');
$filter = new \InputFilter();
if ($flagValidateRequired) {
foreach ($arrayFieldDefinition as $key => $value) {
$fieldName = $key;
@@ -191,7 +191,7 @@ class Process
foreach ($arrayData as $key => $value) {
$fieldName = $key;
$fieldValue = $value;
if (isset($arrayFieldDefinition[$fieldName])) {
$fieldNameAux = (isset($arrayFieldNameForException[$arrayFieldDefinition[$fieldName]["fieldNameAux"]]))? $arrayFieldNameForException[$arrayFieldDefinition[$fieldName]["fieldNameAux"]] : "";
@@ -435,38 +435,6 @@ class Process
}
}
/**
* Verify if doesn't exists the Task in table TASK
*
* @param string $processUid Unique id of Process
* @param string $taskUid Unique id of Task
* @param string $fieldNameForException Field name for the exception
*
* return void Throw exception if doesn't exists the Task in table TASK
*/
public function throwExceptionIfNotExistsTask($processUid, $taskUid, $fieldNameForException)
{
try {
$criteria = new \Criteria("workflow");
$criteria->addSelectColumn(\TaskPeer::TAS_UID);
if ($processUid != "") {
$criteria->add(\TaskPeer::PRO_UID, $processUid, \Criteria::EQUAL);
}
$criteria->add(\TaskPeer::TAS_UID, $taskUid, \Criteria::EQUAL);
$rsCriteria = \TaskPeer::doSelectRS($criteria);
if (!$rsCriteria->next()) {
throw new \Exception(\G::LoadTranslation("ID_ACTIVITY_DOES_NOT_EXIST", array($fieldNameForException, $taskUid)));
}
} catch (\Exception $e) {
throw $e;
}
}
/**
* Verify if doesn't exists the Template in Routing Screen Template
*

View File

@@ -211,22 +211,6 @@ class Step
}
}
/**
* Verify if doesn't exist the Task in table TASK
*
* @param string $taskUid Unique id of Task
*
* return void Throw exception if doesn't exist the Task in table TASK
*/
public function throwExceptionIfNotExistsTask($taskUid)
{
$task = new \Task();
if (!$task->taskExists($taskUid)) {
throw new \Exception(\G::LoadTranslation("ID_ACTIVITY_DOES_NOT_EXIST", array($this->arrayParamException["taskUid"], $taskUid)));
}
}
/**
* Verify if doesn't exist the Process in table PROCESS
*
@@ -260,10 +244,12 @@ class Step
unset($arrayData["STEP_UID"]);
//Verify data
$this->throwExceptionIfNotExistsTask($taskUid);
$task = new \ProcessMaker\BusinessModel\Task();
$this->throwExceptionIfNotExistsProcess($processUid);
$task->throwExceptionIfNotExistsTask($processUid, $taskUid, $this->arrayParamException["taskUid"]);
if (!isset($arrayData["STEP_TYPE_OBJ"])) {
throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($this->arrayParamException["stepTypeObj"])));
}
@@ -495,7 +481,9 @@ class Step
$step->setArrayParamException($this->arrayParamException);
//Verify data
$this->throwExceptionIfNotExistsTask($taskUid);
$task = new \ProcessMaker\BusinessModel\Task();
$task->throwExceptionIfNotExistsTask("", $taskUid, $this->arrayParamException["taskUid"]);
//Get data
$criteria = new \Criteria("workflow");
@@ -638,7 +626,9 @@ class Step
}
if ($stepUid == "") {
$this->throwExceptionIfNotExistsTask($taskUid);
$task = new \ProcessMaker\BusinessModel\Task();
$task->throwExceptionIfNotExistsTask("", $taskUid, $this->arrayParamException["taskUid"]);
}
//Get data
@@ -753,7 +743,9 @@ class Step
}
if ($stepUid == "") {
$this->throwExceptionIfNotExistsTask($taskUid);
$task = new \ProcessMaker\BusinessModel\Task();
$task->throwExceptionIfNotExistsTask("", $taskUid, $this->arrayParamException["taskUid"]);
}
//Get data
@@ -937,10 +929,12 @@ class Step
unset($arrayData["STEP_UID"]);
//Verify data
$this->throwExceptionIfNotExistsTask($taskUid);
$task = new \ProcessMaker\BusinessModel\Task();
$this->throwExceptionIfNotExistsProcess($processUid);
$task->throwExceptionIfNotExistsTask($processUid, $taskUid, $this->arrayParamException["taskUid"]);
if (!isset($arrayData["STEP_TYPE_OBJ"])) {
throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($this->arrayParamException["stepTypeObj"])));
}

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,6 @@ use \G;
class User
{
//--- ---
private $arrayFieldDefinition = array(
"USR_UID" => array("type" => "string", "required" => false, "empty" => false, "defaultValues" => array(), "fieldNameAux" => "usrUid"),
"USR_FIRSTNAME" => array("type" => "string", "required" => true, "empty" => false, "defaultValues" => array(), "fieldNameAux" => "usrFirstname"),
@@ -29,7 +28,6 @@ class User
"USR_BIRTHDAY" => array("type" => "date", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "usrBirthday"),
"USR_FAX" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "usrFax"),
"USR_CELLULAR" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "usrCellular"),
/*----------------------------------********---------------------------------*/
"USR_COST_BY_HOUR" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "usrCostByHour"),
"USR_UNIT_COST" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "usrUnitCost"),
@@ -348,7 +346,7 @@ class User
return array(
$this->getFieldNameByFormatFieldName("USR_UID") => $record["USR_UID"],
$this->getFieldNameByFormatFieldName("USR_USERNAME") => $record["USR_USERNAME"],
$this->getFieldNameByFormatFieldName("USR_PASSWORD") => $record["USR_PASSWORD"],
//$this->getFieldNameByFormatFieldName("USR_PASSWORD") => $record["USR_PASSWORD"],
$this->getFieldNameByFormatFieldName("USR_FIRSTNAME") => $record["USR_FIRSTNAME"],
$this->getFieldNameByFormatFieldName("USR_LASTNAME") => $record["USR_LASTNAME"],
$this->getFieldNameByFormatFieldName("USR_EMAIL") => $record["USR_EMAIL"],
@@ -759,7 +757,6 @@ class User
throw $e;
}
}
//--- /---
/**
* Create User Uid
@@ -777,7 +774,7 @@ class User
if ($pluginRegistry->existsTrigger(PM_BEFORE_CREATE_USER)) {
try {
$pluginRegistry->executeTriggers(PM_BEFORE_CREATE_USER, null);
} catch(Exception $error) {
} catch (Exception $error) {
throw new Exception($error->getMessage());
}
}
@@ -1031,51 +1028,130 @@ class User
/**
* Get all Users
*
* @param string $filter
* @param int $start
* @param int $limit
* @param array $arrayFilterData Data of the filters
* @param string $sortField Field name to sort
* @param string $sortDir Direction of sorting (ASC, DESC)
* @param int $start Start
* @param int $limit Limit
*
* return array Return an array with all Users
*/
public function getUsers($filter, $start, $limit)
public function getUsers($arrayFilterData = null, $sortField = null, $sortDir = null, $start = null, $limit = null)
{
try {
$aUserInfo = array();
require_once (PATH_TRUNK . "workflow" . PATH_SEP . "engine" . PATH_SEP . "classes" . PATH_SEP . "model" . PATH_SEP . "Users.php");
$arrayUser = array();
$oCriteria = $this->getUserCriteria();
$numRecTotal = 0;
if ($filter != '') {
$oCriteria->add( $oCriteria->getNewCriterion( \UsersPeer::USR_USERNAME, "%$filter%", \Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( \UsersPeer::USR_FIRSTNAME, "%$filter%", \Criteria::LIKE ) )->addOr( $oCriteria->getNewCriterion( \UsersPeer::USR_LASTNAME, "%$filter%", \Criteria::LIKE ) ) );
//Verify data
$process = new \ProcessMaker\BusinessModel\Process();
$process->throwExceptionIfDataNotMetPagerVarDefinition(array("start" => $start, "limit" => $limit), array("start" => "start", "limit" => "limit"));
//Set variables
$filterName = "filter";
if (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"])) {
$arrayAux = array(
"" => "filter",
"LEFT" => "lfilter",
"RIGHT" => "rfilter"
);
$filterName = $arrayAux[(isset($arrayFilterData["filterOption"]))? $arrayFilterData["filterOption"] : ""];
}
if ($start) {
if ($start < 0) {
throw new \Exception(\G::LoadTranslation("ID_INVALID_START"));
//Get data
if (!is_null($limit) && $limit . "" == "0") {
//Return
return array(
"total" => $numRecTotal,
"start" => (int)((!is_null($start))? $start : 0),
"limit" => (int)((!is_null($limit))? $limit : 0),
$filterName => (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"]))? $arrayFilterData["filter"] : "",
"data" => $arrayUser
);
}
//Query
$criteria = $this->getUserCriteria();
if (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"]) && trim($arrayFilterData["filter"]) != "") {
$arraySearch = array(
"" => "%" . $arrayFilterData["filter"] . "%",
"LEFT" => $arrayFilterData["filter"] . "%",
"RIGHT" => "%" . $arrayFilterData["filter"]
);
$search = $arraySearch[(isset($arrayFilterData["filterOption"]))? $arrayFilterData["filterOption"] : ""];
$criteria->add(
$criteria->getNewCriterion(\UsersPeer::USR_USERNAME, $search, \Criteria::LIKE)->addOr(
$criteria->getNewCriterion(\UsersPeer::USR_FIRSTNAME, $search, \Criteria::LIKE))->addOr(
$criteria->getNewCriterion(\UsersPeer::USR_LASTNAME, $search, \Criteria::LIKE))
);
}
$criteria->add(\UsersPeer::USR_STATUS, "ACTIVE", \Criteria::EQUAL);
//Number records total
$criteriaCount = clone $criteria;
$criteriaCount->clearSelectColumns();
$criteriaCount->addSelectColumn("COUNT(" . \UsersPeer::USR_UID . ") AS NUM_REC");
$rsCriteriaCount = \UsersPeer::doSelectRS($criteriaCount);
$rsCriteriaCount->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
$result = $rsCriteriaCount->next();
$row = $rsCriteriaCount->getRow();
$numRecTotal = (int)($row["NUM_REC"]);
//Query
if (!is_null($sortField) && trim($sortField) != "") {
$sortField = strtoupper($sortField);
if (in_array(\UsersPeer::TABLE_NAME . "." . $sortField, $criteria->getSelectColumns())) {
$sortField = \UsersPeer::TABLE_NAME . "." . $sortField;
} else {
$oCriteria->setOffset($start);
$sortField = \UsersPeer::USR_FIRSTNAME;
}
} else {
$sortField = \UsersPeer::USR_FIRSTNAME;
}
if ($limit != '') {
if ($limit < 0) {
throw new \Exception(\G::LoadTranslation("ID_INVALID_LIMIT"));
} else {
if ($limit == 0) {
return $aUserInfo;
} else {
$oCriteria->setLimit($limit);
}
}
if (!is_null($sortDir) && trim($sortDir) != "" && strtoupper($sortDir) == "DESC") {
$criteria->addDescendingOrderByColumn($sortField);
} else {
$criteria->addAscendingOrderByColumn($sortField);
}
$oCriteria->add(\UsersPeer::USR_STATUS, "ACTIVE", \Criteria::EQUAL);
$oDataset = \UsersPeer::doSelectRS($oCriteria);
$oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
while ($oDataset->next()) {
$aRow1 = $oDataset->getRow();
$aRow1 = array_change_key_case($aRow1, CASE_LOWER);
$aUserInfo[] = $aRow1;
if (!is_null($start)) {
$criteria->setOffset((int)($start));
}
if (!is_null($limit)) {
$criteria->setLimit((int)($limit));
}
$rsCriteria = \UsersPeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
while ($rsCriteria->next()) {
$row = $rsCriteria->getRow();
$arrayUser[] = $this->getUserDataFromRecord($row);
}
//Return
return $aUserInfo;
return array(
"total" => $numRecTotal,
"start" => (int)((!is_null($start))? $start : 0),
"limit" => (int)((!is_null($limit))? $limit : 0),
$filterName => (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"]))? $arrayFilterData["filter"] : "",
"data" => $arrayUser
);
} catch (\Exception $e) {
throw $e;
}
@@ -1146,3 +1222,4 @@ class User
}
}
}

View File

@@ -255,7 +255,9 @@ class WebEntry
}
if (isset($arrayData["TAS_UID"])) {
$process->throwExceptionIfNotExistsTask($processUid, $arrayData["TAS_UID"], $this->arrayFieldNameForException["taskUid"]);
$task = new \ProcessMaker\BusinessModel\Task();
$task->throwExceptionIfNotExistsTask($processUid, $arrayData["TAS_UID"], $this->arrayFieldNameForException["taskUid"]);
}
if (isset($arrayData["DYN_UID"])) {

View File

@@ -34,15 +34,20 @@ class Group extends Api
/**
* @url GET
*/
public function index($filter = null, $start = null, $limit = null)
public function index($filter = null, $lfilter = null, $rfilter = null, $start = null, $limit = null)
{
try {
$group = new \ProcessMaker\BusinessModel\Group();
$group->setFormatFieldNameInUppercase(false);
$response = $group->getGroups(array("filter" => $filter), null, null, $start, $limit);
$arrayFilterData = array(
"filter" => (!is_null($filter))? $filter : ((!is_null($lfilter))? $lfilter : ((!is_null($rfilter))? $rfilter : null)),
"filterOption" => (!is_null($filter))? "" : ((!is_null($lfilter))? "LEFT" : ((!is_null($rfilter))? "RIGHT" : ""))
);
return $response;
$response = $group->getGroups($arrayFilterData, null, null, $start, $limit);
return $response["data"];
} catch (\Exception $e) {
throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()));
}

View File

@@ -33,18 +33,23 @@ class User extends Api
/**
* @url GET
* @param string $filter
* @param int $start
* @param int $limit
*/
public function doGetUsers($filter = '', $start = null, $limit = null)
public function index($filter = null, $lfilter = null, $rfilter = null, $start = null, $limit = null)
{
try {
$user = new \ProcessMaker\BusinessModel\User();
$response = $user->getUsers($filter, $start, $limit);
return $response;
$user->setFormatFieldNameInUppercase(false);
$arrayFilterData = array(
"filter" => (!is_null($filter))? $filter : ((!is_null($lfilter))? $lfilter : ((!is_null($rfilter))? $rfilter : null)),
"filterOption" => (!is_null($filter))? "" : ((!is_null($lfilter))? "LEFT" : ((!is_null($rfilter))? "RIGHT" : ""))
);
$response = $user->getUsers($arrayFilterData, null, null, $start, $limit);
return $response["data"];
} catch (\Exception $e) {
throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()));
throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage());
}
}
@@ -57,6 +62,8 @@ class User extends Api
{
try {
$user = new \ProcessMaker\BusinessModel\User();
$user->setFormatFieldNameInUppercase(false);
$response = $user->getUser($usr_uid);
return $response;
} catch (\Exception $e) {
@@ -131,3 +138,4 @@ class User extends Api
}
}
}