workflow/engine/classes/entities/Entity_AppSolrQueue.php workflow/engine/classes/entities/Entity_Base.php workflow/engine/classes/entities/Entity_FacetGroup.php workflow/engine/classes/entities/Entity_FacetInterfaceRequest.php workflow/engine/classes/entities/Entity_FacetInterfaceResult.php workflow/engine/classes/entities/Entity_FacetItem.php workflow/engine/classes/entities/Entity_FacetRequest.php workflow/engine/classes/entities/Entity_FacetResult.php workflow/engine/classes/entities/Entity_SelectedFacetGroupItem.php workflow/engine/classes/entities/Entity_SolrQueryResult.php
2831 lines
116 KiB
PHP
2831 lines
116 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Implementation to display application data in the PMOS2 grids using Solr
|
|
* search service
|
|
*/
|
|
class AppSolr
|
|
{
|
|
private $_solrIsEnabled = false;
|
|
private $_solrHost = "";
|
|
private $_solrInstance = "";
|
|
private $debug = false; //false
|
|
private $debugAppInfo = false;
|
|
private $trunkSizeAcumulated;
|
|
private $totalTimeAcumulated;
|
|
|
|
public function __construct($SolrEnabled, $SolrHost, $SolrInstance)
|
|
{
|
|
// define solr availability
|
|
$this->_solrIsEnabled = $this->isSolrEnabled();
|
|
$this->_solrHost = $SolrHost;
|
|
$this->_solrInstance = $SolrInstance;
|
|
}
|
|
|
|
/**
|
|
* Return if the Solr server is currently working.
|
|
* @return boolean true:enabled functionality, false:disabled functionality
|
|
*/
|
|
public function isSolrEnabled()
|
|
{
|
|
$searchIndex = new BpmnEngineServicesSearchIndex($this->_solrIsEnabled, $this->_solrHost);
|
|
// execute query
|
|
$solrStatusResult = $searchIndex->isEnabled($this->_solrInstance);
|
|
return $solrStatusResult;
|
|
}
|
|
|
|
/**
|
|
* Gets the information of Grids using Solr server.
|
|
*
|
|
* Returns the list of records for the grid depending of the function
|
|
* conditions
|
|
* If doCount is true only the count of records is returned.
|
|
*
|
|
* @param string $userUid
|
|
* current logged user.
|
|
* @param int $start
|
|
* the offset to return the group of records. Used for pagination.
|
|
* @param int $limit
|
|
* The number of records to return in the set.
|
|
* @param string $action
|
|
* the action: todo, participated, draft, unassigned
|
|
* @param string $filter
|
|
* filter the results posible values ('read', 'unread', 'started',
|
|
* 'completed')
|
|
* @param string $search
|
|
* search string
|
|
* @param string $process
|
|
* PRO_UID to filter results by specified process.
|
|
* @param string $user
|
|
* USR_UID to filter results by specified user.
|
|
* @param string $status
|
|
* filter by an application Status : TO_DO, COMPLETED, DRAFT
|
|
* @param string $type
|
|
* default extjs
|
|
* @param string $dateFrom
|
|
* filter by DEL_DELEGATE_DATE, not used
|
|
* @param string $dateTo
|
|
* filter by DEL_DELEGATE_DATE, not used
|
|
* @param string $callback
|
|
* default stcCallback1001 not used
|
|
* @param string $dir
|
|
* sort direction ASC, DESC
|
|
* @param string $sort
|
|
* sort field
|
|
* @param boolean $doCount
|
|
* default=false, if true only the count of records is returned.
|
|
* @return array return the list of cases
|
|
*/
|
|
public function getAppGridData(
|
|
$userUid, $start = null, $limit = null, $action = null, $filter = null, $search = null, $process = null, $status = null, $type = null, $dateFrom = null, $dateTo = null, $callback = null, $dir = null, $sort = 'APP_CACHE_VIEW.APP_NUMBER', $category = null, $doCount = false
|
|
) {
|
|
$callback = isset($callback) ? $callback : 'stcCallback1001';
|
|
$dir = isset($dir) ? $dir : 'DESC'; // direction of sort column
|
|
// (ASC, DESC)
|
|
$sort = isset($sort) ? $sort : ''; // sort column (APP_NUMBER,
|
|
// CASE_SUMMARY,
|
|
// CASE_NOTES_COUNT, APP_TITLE,
|
|
// APP_PRO_TITLE, APP_TAS_TITLE,
|
|
// APP_DEL_PREVIOUS_USER,
|
|
// DEL_TASK_DUE_DATE,
|
|
// APP_UPDATE_DATE, DEL_PRIORITY)
|
|
$start = isset($start) ? $start : '0';
|
|
$limit = isset($limit) ? $limit : '25';
|
|
$filter = isset($filter) ? $filter : ''; // posible values ('read',
|
|
// 'unread', 'started',
|
|
// 'completed')
|
|
$search = isset($search) ? $search : ''; // search in fields, plain text
|
|
$process = isset($process) ? $process : ''; // filter by an specific
|
|
// process
|
|
// uid
|
|
$user = $userUid; // filter by an specific user uid
|
|
$status = isset($status) ? strtoupper($status) : ''; // filter by an
|
|
// specific
|
|
// app_status
|
|
$action = isset($action) ? $action : 'todo'; // todo, paused
|
|
$type = isset($type) ? $type : 'extjs';
|
|
$dateFrom = isset($dateFrom) ? $dateFrom : ''; // filter by
|
|
// DEL_DELEGATE_DATE
|
|
$dateTo = isset($dateTo) ? $dateTo : ''; // filter by DEL_DELEGATE_DATE
|
|
|
|
$swErrorInSearchText = false;
|
|
$solrQueryResult = null;
|
|
$aPriorities = array('1' => 'VL', '2' => 'L', '3' => 'N', '4' => 'H', '5' => 'VH');
|
|
$delegationIndexes = array();
|
|
|
|
$result = array();
|
|
$result ['totalCount'] = 0;
|
|
$result ['data'] = array();
|
|
$result ['success'] = false;
|
|
$result ['message'] = "Error description.";
|
|
|
|
try {
|
|
if ($this->debug) {
|
|
$this->initTimeAll = microtime(true);
|
|
}
|
|
|
|
// the array of data that must be returned with placeholders
|
|
/* $columsToInclude = array (
|
|
'APP_CREATE_DATE',
|
|
'APP_NUMBER',
|
|
'APP_PRO_TITLE',
|
|
'APP_STATUS',
|
|
'APP_TITLE',
|
|
'APP_UID',
|
|
'DEL_LAST_UPDATE_DATE',
|
|
'DEL_MAX_PRIORITY',
|
|
'PRO_UID'
|
|
); */
|
|
|
|
$columsToInclude = array(
|
|
'APP_PRO_TITLE',
|
|
'APP_TITLE',
|
|
'APP_UID',
|
|
'DEL_MAX_PRIORITY'
|
|
);
|
|
|
|
// create pagination data
|
|
$solrSearchText = "";
|
|
$sortableCols = array();
|
|
$sortCols = array();
|
|
$sortDir = array();
|
|
$numSortingCols = 0;
|
|
|
|
// define sort conditions, default APP_NUMBER, desc
|
|
// only one column is sorted
|
|
$dir = strtolower($dir);
|
|
|
|
if (!empty($sort)) {
|
|
switch ($sort) {
|
|
case 'APP_CACHE_VIEW.APP_NUMBER':
|
|
case 'APP_NUMBER':
|
|
$sortCols [0] = 'APP_NUMBER'; //4;
|
|
//$sortableCols [0] = 'true';
|
|
$sortDir [0] = $dir;
|
|
break;
|
|
// multivalue field can't be ordered
|
|
case 'APP_TITLE':
|
|
$sortCols [0] = 'APP_TITLE'; //10;
|
|
//$sortableCols [0] = 'true';
|
|
$sortDir [0] = $dir;
|
|
break;
|
|
case 'APP_PRO_TITLE':
|
|
$sortCols [0] = 'APP_PRO_TITLE'; //6;
|
|
//$sortableCols [0] = 'true';
|
|
$sortDir [0] = $dir;
|
|
break;
|
|
case 'APP_STATUS':
|
|
$sortCols [0] = 'APP_STATUS'; //6;
|
|
//$sortableCols [0] = 'true';
|
|
$sortDir [0] = $dir;
|
|
break;
|
|
case 'APP_UPDATE_DATE':
|
|
$sortCols [0] = 'DEL_LAST_UPDATE_DATE'; //12;
|
|
//$sortableCols [0] = 'true';
|
|
$sortDir [0] = $dir;
|
|
break;
|
|
default:
|
|
$sortCols [0] = 'APP_NUMBER'; //4;
|
|
//$sortableCols [0] = 'true';
|
|
$sortDir [0] = 'desc';
|
|
break;
|
|
}
|
|
$numSortingCols ++;
|
|
}
|
|
|
|
// get del_index field
|
|
$delIndexDynaField = "";
|
|
// process filter
|
|
if ($process != '') {
|
|
$solrSearchText .= "PRO_UID:" . $process . " AND ";
|
|
}
|
|
// status filter
|
|
if ($status != '') {
|
|
$solrSearchText .= "APP_STATUS:" . $status . " AND ";
|
|
}
|
|
//Category filter
|
|
if (!empty($category)) {
|
|
$solrSearchText .= "PRO_CATEGORY_UID_s:" . $category . " AND ";
|
|
}
|
|
|
|
// todo list, add condition
|
|
if ($userUid != null && $action == 'todo') {
|
|
if ($filter == 'read') {
|
|
$solrSearchText .= "APP_ASSIGNED_USERS_READ:" . $userUid . " AND ";
|
|
$delegationIndexes[] = "APP_ASSIGNED_USER_READ_DEL_INDEX_" . trim($userUid) . '_txt';
|
|
} elseif ($filter == 'unread') {
|
|
$solrSearchText .= "APP_ASSIGNED_USERS_UNREAD:" . $userUid . " AND ";
|
|
$delegationIndexes[] = "APP_ASSIGNED_USER_UNREAD_DEL_INDEX_" . trim($userUid) . '_txt';
|
|
} else {
|
|
$solrSearchText .= "APP_ASSIGNED_USERS:" . $userUid . " AND ";
|
|
$delegationIndexes[] = "APP_ASSIGNED_USER_DEL_INDEX_" . trim($userUid) . '_txt';
|
|
}
|
|
}
|
|
// participated, add condition
|
|
if ($userUid != null && $action == 'sent') {
|
|
if ($filter == 'started') {
|
|
$solrSearchText .= "APP_PARTICIPATED_USERS_STARTED:" . $userUid . " AND ";
|
|
$delegationIndexes[] = "APP_PARTICIPATED_USER_STARTED_DEL_INDEX_" . trim($userUid) . '_txt';
|
|
} elseif ($filter == 'completed') {
|
|
$solrSearchText .= "APP_PARTICIPATED_USERS_COMPLETED:" . $userUid . " AND ";
|
|
$delegationIndexes[] = "APP_PARTICIPATED_USER_COMPLETED_DEL_INDEX_" . trim($userUid) . '_txt';
|
|
} else {
|
|
$solrSearchText .= "APP_PARTICIPATED_USERS:" . $userUid . " AND ";
|
|
//$delegationIndexes[] = "APP_PARTICIPATED_USER_DEL_INDEX_" . trim ($userUid) . '_txt';
|
|
//show the last index of the case
|
|
$delegationIndexes[] = "DEL_LAST_INDEX";
|
|
}
|
|
}
|
|
// draft, add condition
|
|
if ($userUid != null && $action == 'draft') {
|
|
$solrSearchText .= "APP_DRAFT_USER:" . $userUid . " AND ";
|
|
// index is allways 1
|
|
}
|
|
// unassigned, add condition
|
|
if ($userUid != null && $action == 'unassigned') {
|
|
// get the list of groups to which belongs the user.
|
|
$userGroups = $this->getUserGroups($userUid);
|
|
|
|
$solrSearchText .= "(APP_UNASSIGNED_USERS:" . $userUid;
|
|
if (count($userGroups) > 0) {
|
|
$solrSearchText .= " OR ";
|
|
|
|
foreach ($userGroups as $group) {
|
|
$solrSearchText .= "APP_UNASSIGNED_GROUPS:" . $group ['GRP_UID'] . " OR ";
|
|
}
|
|
|
|
// remove last OR in condition
|
|
if ($solrSearchText != '') {
|
|
$solrSearchText = substr_replace($solrSearchText, "", - 4);
|
|
}
|
|
}
|
|
$solrSearchText .= ") AND ";
|
|
|
|
$delegationIndexes[] = "APP_UNASSIGNED_USER_GROUP_DEL_INDEX_" . trim($userUid) . '_txt';
|
|
foreach ($userGroups as $group) {
|
|
$delegationIndexes[] = "APP_UNASSIGNED_USER_GROUP_DEL_INDEX_" . trim($group ['GRP_UID']) . '_txt';
|
|
}
|
|
}
|
|
// Paused, add condition
|
|
if ($userUid != null && $action == 'paused') {
|
|
$solrSearchText .= "APP_PAUSED_USERS:" . $userUid . ' AND ';
|
|
$delegationIndexes[] = "APP_PAUSED_USER_DEL_INDEX_" . trim($userUid) . '_txt';
|
|
}
|
|
//search action
|
|
if ($action == 'search') {
|
|
if ($dateFrom != "" || $dateTo != "") {
|
|
$fromDate = ($dateFrom != '') ? date("Y-m-d", strtotime($dateFrom)) : '*';
|
|
$toDate = ($dateTo != '') ? date("Y-m-d", strtotime($dateTo)) : '*';
|
|
|
|
$searchDateOriginal = "DEL_LAST_UPDATE_DATE:[" . $fromDate . " TO " . $toDate . "]";
|
|
//FechaRegistro:[2011-04-15 TO 2011-04-30]
|
|
|
|
$searchDateFormatedSolr = $this->getSearchText($searchDateOriginal);
|
|
|
|
$solrSearchText .= "(" . $searchDateFormatedSolr . ") AND ";
|
|
}
|
|
|
|
//verify if we need to filter by user
|
|
if ($user != '') {
|
|
$solrSearchText .= "(APP_PARTICIPATED_USERS:" . $user . ") AND ";
|
|
}
|
|
//in all cases of search show the last index of the case
|
|
$delegationIndexes[] = "DEL_LAST_INDEX";
|
|
}
|
|
|
|
// remove last AND in condition
|
|
if ($solrSearchText != '') {
|
|
$solrSearchText = substr_replace($solrSearchText, "", - 5);
|
|
}
|
|
|
|
// add parenthesis to Solr search text
|
|
if ($solrSearchText != "") {
|
|
$solrSearchText = "(" . $solrSearchText . ")";
|
|
}
|
|
|
|
// create query string, add query conditions
|
|
if ($search != '') {
|
|
// format search string
|
|
// return exception in case of invalid text
|
|
$search = $this->getSearchText($search);
|
|
|
|
if ($solrSearchText != "" && $search != "") {
|
|
$solrSearchText .= " AND ";
|
|
}
|
|
if ($search != "") {
|
|
$solrSearchText .= "(" . $search . ")";
|
|
}
|
|
}
|
|
// add del_index dynamic fields to list of resulting columns
|
|
$columsToIncludeFinal = array();
|
|
$columsToIncludeFinal = array_merge($columsToInclude, $delegationIndexes);
|
|
|
|
// if is a counter no records are returned
|
|
if ($doCount) {
|
|
$start = 0;
|
|
$limit = 0;
|
|
$numSortingCols = 0;
|
|
$columsToIncludeFinal = array();
|
|
}
|
|
|
|
$data = array(
|
|
'workspace' => $this->_solrInstance, // solr instance
|
|
'startAfter' => intval($start),
|
|
'pageSize' => intval($limit),
|
|
'searchText' => $solrSearchText,
|
|
'filterText' => '', // $filter, //ex:'field1:value1,field2:[value2.1
|
|
// TO value2.2],field3:value3'
|
|
'numSortingCols' => $numSortingCols,
|
|
'sortableCols' => $sortableCols,
|
|
'sortCols' => $sortCols,
|
|
'sortDir' => $sortDir,
|
|
'includeCols' => $columsToIncludeFinal,
|
|
'resultFormat' => 'json'
|
|
);
|
|
$solrRequestData = EntitySolrRequestData::createForRequestPagination($data);
|
|
// use search index to return list of cases
|
|
$searchIndex = new BpmnEngineServicesSearchIndex($this->_solrIsEnabled, $this->_solrHost);
|
|
// execute query
|
|
$solrQueryResult = $searchIndex->getDataTablePaginatedList($solrRequestData);
|
|
if ($this->debug) {
|
|
$this->afterSolrQueryTime = microtime(true);
|
|
}
|
|
//return inmediatelly
|
|
if ($doCount) {
|
|
$result ['totalCount'] = $solrQueryResult->iTotalDisplayRecords;
|
|
$result ['data'] = array();
|
|
$result ['success'] = true;
|
|
$result ['result'] = true;
|
|
$result ['message'] = "";
|
|
|
|
return $result;
|
|
}
|
|
// complete return data, complete list of columns in grid
|
|
$resultColumns = array(
|
|
"APP_CREATE_DATE",
|
|
"APP_CURRENT_USER",
|
|
"APP_DEL_PREVIOUS_USER",
|
|
"APP_FINISH_DATE",
|
|
"APP_NUMBER",
|
|
"APP_OVERDUE_PERCENTAGE",
|
|
"APP_PRO_TITLE",
|
|
"APP_STATUS",
|
|
"APP_TAS_TITLE",
|
|
"APP_THREAD_STATUS",
|
|
"APP_TITLE",
|
|
"APP_UID",
|
|
"APP_UPDATE_DATE",
|
|
"DEL_DELAYED",
|
|
"DEL_DELAY_DURATION",
|
|
"DEL_DELEGATE_DATE",
|
|
"DEL_DURATION",
|
|
"DEL_FINISHED",
|
|
"DEL_FINISH_DATE",
|
|
"DEL_INDEX",
|
|
"DEL_INIT_DATE",
|
|
"DEL_PRIORITY",
|
|
"DEL_QUEUE_DURATION",
|
|
"DEL_STARTED",
|
|
"DEL_TASK_DUE_DATE",
|
|
"DEL_THREAD_STATUS",
|
|
"PREVIOUS_USR_UID",
|
|
"PRO_UID",
|
|
"TAS_UID",
|
|
"USR_UID"
|
|
);
|
|
|
|
$rows = array();
|
|
// number of found records
|
|
$result ['totalCount'] = $solrQueryResult->iTotalDisplayRecords;
|
|
|
|
//var_dump($solrQueryResult->aaData); die;
|
|
//get the missing data from database
|
|
$appUids = array();
|
|
foreach ($solrQueryResult->aaData as $i => $data) {
|
|
$appUids[] = $data ['APP_UID']; //APP_UID
|
|
}
|
|
|
|
$aaappsDBData = $this->getListApplicationDelegationData($appUids);
|
|
|
|
if ($this->debug) {
|
|
$this->afterDbQueryTime = microtime(true);
|
|
}
|
|
//****************************************************************
|
|
//Begin the list of Cases and define which delegations are display
|
|
//to complete the data for each delegation
|
|
//****************************************************************
|
|
// complete the missing data to display it in the grid.
|
|
$delIndexes = array(); //store all the delegation indexes
|
|
foreach ($solrQueryResult->aaData as $i => $data) {
|
|
//initialize array
|
|
$delIndexes = array();
|
|
// complete empty values
|
|
$appUID = $data ['APP_UID']; //APP_UID
|
|
//get all the indexes returned by Solr as columns
|
|
for ($i = count($columsToInclude); $i < count($data); $i++) {
|
|
//var_dump($data [$columsToIncludeFinal[$i]]);
|
|
|
|
if (is_array($data [$columsToIncludeFinal[$i]])) {
|
|
foreach ($data [$columsToIncludeFinal[$i]] as $delIndex) {
|
|
$delIndexes[] = $delIndex;
|
|
}
|
|
}
|
|
}
|
|
// verify if the delindex is an array
|
|
// if is not check different types of repositories
|
|
// the delegation index must always be defined.
|
|
if (count($delIndexes) == 0) {
|
|
// if is draft
|
|
if ($action == 'draft') {
|
|
$delIndexes [] = 1; // the first default index
|
|
}
|
|
/* elseif ($action == 'search') {
|
|
// get all the indexes
|
|
//$delIndexes = $this->getApplicationDelegationsIndex ($appUID);
|
|
$indexes = $this->aaSearchRecords ($aaappsDBData, array (
|
|
'APP_UID' => $appUID
|
|
));
|
|
|
|
foreach ($indexes as $index) {
|
|
$delIndexes[] = $aaappsDBData [$index]['DEL_INDEX'];
|
|
}
|
|
|
|
} */ else {
|
|
//error an index must always be defined
|
|
print date('Y-m-d H:i:s:u') . " Delegation not defined\n";
|
|
}
|
|
/*
|
|
elseif ($action == 'unassigned'){
|
|
$delIndexes = $this->getApplicationDelegationsIndex ($appUID);
|
|
} */
|
|
}
|
|
//remove duplicated
|
|
$delIndexes = array_unique($delIndexes);
|
|
|
|
//var_dump($delIndexes);
|
|
|
|
foreach ($delIndexes as $delIndex) {
|
|
$aRow = array();
|
|
|
|
//copy result values to new row from Solr server
|
|
$aRow ['APP_UID'] = $data['APP_UID'];
|
|
$aRow ['DEL_PRIORITY'] = $data['DEL_MAX_PRIORITY']; //different name
|
|
$aRow ['APP_PRO_TITLE'] = $data['APP_PRO_TITLE'];
|
|
$aRow ['APP_TITLE'] = $data['APP_TITLE'];
|
|
|
|
/*
|
|
foreach ($resultColumns as $j => $columnName) {
|
|
if(isset($data [$columnName]))
|
|
$aRow [$columnName] = $data [$columnName];
|
|
else if($columnName = 'DEL_PRIORITY')
|
|
$aRow [$columnName] = $data['DEL_MAX_PRIORITY'];//different name
|
|
else
|
|
$aRow [$columnName] = '';//placeholder
|
|
}
|
|
|
|
//var_dump($aRow);
|
|
|
|
// convert date from solr format UTC to local time in MySQL format
|
|
$solrdate = $data ['APP_CREATE_DATE'];
|
|
$localDate = date ('Y-m-d H:i:s', strtotime ($solrdate));
|
|
$aRow ['APP_CREATE_DATE'] = $localDate;
|
|
|
|
$solrdate = $data ['DEL_LAST_UPDATE_DATE'];
|
|
$localDate = date ('Y-m-d H:i:s', strtotime ($solrdate));
|
|
$aRow ['APP_UPDATE_DATE'] = $localDate;
|
|
*/
|
|
|
|
// get delegation data from DB
|
|
//filter data from db
|
|
$indexes = $this->aaSearchRecords($aaappsDBData, array(
|
|
'APP_UID' => $appUID,
|
|
'DEL_INDEX' => $delIndex
|
|
));
|
|
$row = '';
|
|
foreach ($indexes as $index) {
|
|
$row = $aaappsDBData [$index];
|
|
}
|
|
|
|
if (empty($row)) {
|
|
$fh = fopen("SolrAppWithoutDelIndex.txt", 'a') or die("can't open file to store Solr search time.");
|
|
fwrite($fh, sprintf("Solr AppUid: %s DelIndex: %s not found.\r\n", $appUID, $delIndex));
|
|
fclose($fh);
|
|
continue;
|
|
}
|
|
//$row = $this->getAppDelegationData ($appUID, $delIndex);
|
|
$aRow ['APP_CREATE_DATE'] = $row ['APP_CREATE_DATE'];
|
|
$aRow ['APP_UPDATE_DATE'] = $row ['APP_UPDATE_DATE'];
|
|
$aRow ['APP_NUMBER'] = $row ['APP_NUMBER'];
|
|
$aRow ['APP_STATUS'] = $row ['APP_STATUS'];
|
|
$aRow ['PRO_UID'] = $row ['PRO_UID'];
|
|
|
|
$aRow ['APP_FINISH_DATE'] = null;
|
|
$aRow ['APP_CURRENT_USER'] = $row ['USR_NAME'] . " " . $row ['USR_LAST'];
|
|
$aRow ['APP_DEL_PREVIOUS_USER'] = $row ['USR_PREV_NAME'] . " " . $row ['USR_PREV_LAST'];
|
|
$aRow ['APP_OVERDUE_PERCENTAGE'] = $row ['APP_OVERDUE_PERCENTAGE'];
|
|
$aRow ['APP_TAS_TITLE'] = $row ['APP_TAS_TITLE'];
|
|
$aRow ['APP_THREAD_STATUS'] = $row ['APP_THREAD_STATUS'];
|
|
$aRow ['DEL_DELAYED'] = $row ['DEL_DELAYED'];
|
|
$aRow ['DEL_DELAY_DURATION'] = $row ['DEL_DELAY_DURATION'];
|
|
$aRow ['DEL_DELEGATE_DATE'] = $row ['DEL_DELEGATE_DATE'];
|
|
$aRow ['DEL_DURATION'] = $row ['DEL_DURATION'];
|
|
$aRow ['DEL_FINISHED'] = (isset($row ['DEL_FINISH_DATE']) && $row ['DEL_FINISH_DATE'] != '') ? 1 : 0;
|
|
$aRow ['DEL_FINISH_DATE'] = $row ['DEL_FINISH_DATE'];
|
|
$aRow ['DEL_INDEX'] = $row ['DEL_INDEX'];
|
|
$aRow ['DEL_INIT_DATE'] = $row ['DEL_INIT_DATE'];
|
|
$aRow ['DEL_QUEUE_DURATION'] = $row ['DEL_QUEUE_DURATION'];
|
|
$aRow ['DEL_STARTED'] = (isset($row ['DEL_INIT_DATE']) && $row ['DEL_INIT_DATE'] != '') ? 1 : 0;
|
|
$aRow ['DEL_TASK_DUE_DATE'] = $row ['DEL_TASK_DUE_DATE'];
|
|
$aRow ['DEL_THREAD_STATUS'] = $row ['DEL_THREAD_STATUS'];
|
|
$aRow ['PREVIOUS_USR_UID'] = $row ['PREVIOUS_USR_UID'];
|
|
$aRow ['TAS_UID'] = $row ['TAS_UID'];
|
|
$aRow ['USR_UID'] = $userUid;
|
|
$aRow ['DEL_PRIORITY'] = G::LoadTranslation("ID_PRIORITY_{$aPriorities[$aRow['DEL_PRIORITY']]}");
|
|
|
|
$rows [] = $aRow;
|
|
}
|
|
}
|
|
$result ['data'] = $rows;
|
|
$result ['success'] = true;
|
|
$result ['result'] = true;
|
|
$result ['message'] = "";
|
|
|
|
//var_dump($result);
|
|
|
|
/* * ****************************************** */
|
|
if ($this->debug) {
|
|
$this->afterPrepareResultTime = microtime(true);
|
|
|
|
$fh = fopen("SolrSearchTime.txt", 'a') or die("can't open file to store Solr search time.");
|
|
//fwrite($fh, sprintf("Solr Query time: %s DB Query time: %s Prepare result time: %s \n", gmdate ('H:i:s:u', ($this->afterSolrQueryTime - $this->initTimeAll)), gmdate ('H:i:s:u', ($this->afterDbQueryTime - $this->afterSolrQueryTime)), gmdate ('H:i:s:u', ($this->afterPrepareResultTime - $this->afterDbQueryTime)) ));
|
|
fwrite($fh, sprintf("Solr Query time: %s DB Query time: %s Prepare result time: %s Total:%s \r\n", ($this->afterSolrQueryTime - $this->initTimeAll), ($this->afterDbQueryTime - $this->afterSolrQueryTime), ($this->afterPrepareResultTime - $this->afterDbQueryTime), ($this->afterPrepareResultTime - $this->initTimeAll)));
|
|
fclose($fh);
|
|
}
|
|
/* * ************************************ */
|
|
|
|
return $result;
|
|
} // end try
|
|
catch (InvalidIndexSearchTextException $ex) {
|
|
// return empty result with description of error
|
|
$result = array();
|
|
$result ['totalCount'] = 0;
|
|
$result ['data'] = array();
|
|
$result ['success'] = true;
|
|
$result ['result'] = false;
|
|
$result ['message'] = $ex->getMessage();
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the array of counters of cases
|
|
*
|
|
* @param string $userUid
|
|
* the current logged user uid identifier
|
|
*/
|
|
public function getCasesCount($userUid)
|
|
{
|
|
$casesCount = array();
|
|
|
|
// get number of records in todo list
|
|
$data = $this->getAppGridData($userUid, 0, 0, 'todo', null, null, null, null, null, null, null, null, null, null, null, true);
|
|
$casesCount ['to_do'] = $data ['totalCount'];
|
|
// get number of records in participated list
|
|
$data = $this->getAppGridData($userUid, 0, 0, 'sent', null, null, null, null, null, null, null, null, null, null, null, true);
|
|
$casesCount ['sent'] = $data ['totalCount'];
|
|
// get number of records in draft list
|
|
$data = $this->getAppGridData($userUid, 0, 0, 'draft', null, null, null, null, null, null, null, null, null, null, null, true);
|
|
$casesCount ['draft'] = $data ['totalCount'];
|
|
// get number of records in unassigned list
|
|
$data = $this->getAppGridData($userUid, 0, 0, 'unassigned', null, null, null, null, null, null, null, null, null, null, null, true);
|
|
$casesCount ['selfservice'] = $data ['totalCount'];
|
|
$data = $this->getAppGridData($userUid, 0, 0, 'paused', null, null, null, null, null, null, null, null, null, null, null, true);
|
|
$casesCount ['paused'] = $data ['totalCount'];
|
|
|
|
return $casesCount;
|
|
}
|
|
|
|
/**
|
|
* Get the user groups
|
|
* @param string $usrUID the user identifier
|
|
* @return array of user groups
|
|
*/
|
|
public function getUserGroups($usrUID)
|
|
{
|
|
$gu = new GroupUser();
|
|
$rows = $gu->getAllUserGroups($usrUID);
|
|
return $rows;
|
|
}
|
|
|
|
/**
|
|
* Get the application delegation record from database
|
|
*
|
|
* @param string $aappUIDs
|
|
* array of Application identifiers
|
|
* @return array of arrays with delegation information.
|
|
*/
|
|
public function getListApplicationDelegationData($aappUIDs)
|
|
{
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(ApplicationPeer::APP_CREATE_DATE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_NUMBER);
|
|
$c->addSelectColumn(ApplicationPeer::APP_STATUS);
|
|
$c->addSelectColumn(ApplicationPeer::APP_UPDATE_DATE);
|
|
$c->addSelectColumn(ApplicationPeer::PRO_UID);
|
|
|
|
$c->addSelectColumn(AppDelegationPeer::APP_UID);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_INDEX);
|
|
|
|
$c->addAsColumn('USR_NAME', 'u.USR_FIRSTNAME');
|
|
$c->addAsColumn('USR_LAST', 'u.USR_LASTNAME');
|
|
|
|
$c->addAsColumn('USR_PREV_NAME', 'uprev.USR_FIRSTNAME');
|
|
$c->addAsColumn('USR_PREV_LAST', 'uprev.USR_LASTNAME');
|
|
$c->addAsColumn('PREVIOUS_USR_UID', 'uprev.USR_UID');
|
|
|
|
$c->addAsColumn('APP_TAS_TITLE', TaskPeer::TAS_TITLE);
|
|
$c->addAsColumn('APP_THREAD_STATUS', 'at.APP_THREAD_STATUS');
|
|
|
|
$c->addSelectColumn(AppDelegationPeer::APP_OVERDUE_PERCENTAGE);
|
|
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_DELAYED);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_DELAY_DURATION);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_DELEGATE_DATE);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_DURATION);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_FINISH_DATE);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_INIT_DATE);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_QUEUE_DURATION);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_TASK_DUE_DATE);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_THREAD_STATUS);
|
|
$c->addSelectColumn(AppDelegationPeer::TAS_UID);
|
|
|
|
$c->addAlias('u', 'USERS');
|
|
$c->addAlias('uprev', 'USERS');
|
|
$c->addAlias('adprev', 'APP_DELEGATION');
|
|
$c->addAlias('at', 'APP_THREAD');
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::APP_UID,
|
|
ApplicationPeer::APP_UID
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::JOIN);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::USR_UID,
|
|
'u.USR_UID'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::APP_UID,
|
|
'adprev.APP_UID'
|
|
);
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::DEL_PREVIOUS,
|
|
'adprev.DEL_INDEX'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
$c->addJoin(AppDelegationPeer::TAS_UID, TaskPeer::TAS_UID);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
'adprev.USR_UID',
|
|
'uprev.USR_UID'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::APP_UID,
|
|
'at.APP_UID'
|
|
);
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::DEL_THREAD,
|
|
'at.APP_THREAD_INDEX'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
$c->add(AppDelegationPeer::APP_UID, $aappUIDs, Criteria::IN);
|
|
//$c->add (AppDelegationPeer::DEL_INDEX, $delIndex);
|
|
|
|
$rs = AppDelegationPeer::doSelectRS($c);
|
|
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
// echo $c->toString();
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
|
|
$appDataRows = array();
|
|
while (is_array($row)) {
|
|
$appDataRows [] = $row;
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
}
|
|
|
|
//Propel::close();
|
|
|
|
return $appDataRows;
|
|
}
|
|
|
|
/**
|
|
* Get the application delegation record from database
|
|
*
|
|
* @param string $appUID
|
|
* Application identifier
|
|
* @param string $delIndex
|
|
* delegation index
|
|
* @return array with delegation record.
|
|
*/
|
|
public function getAppDelegationData($appUID, $delIndex)
|
|
{
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(AppDelegationPeer::APP_UID);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_INDEX);
|
|
|
|
$c->addAsColumn('USR_NAME', 'u.USR_FIRSTNAME');
|
|
$c->addAsColumn('USR_LAST', 'u.USR_LASTNAME');
|
|
|
|
$c->addAsColumn('USR_PREV_NAME', 'uprev.USR_FIRSTNAME');
|
|
$c->addAsColumn('USR_PREV_LAST', 'uprev.USR_LASTNAME');
|
|
$c->addAsColumn('PREVIOUS_USR_UID', 'uprev.USR_UID');
|
|
|
|
$c->addAsColumn('APP_TAS_TITLE', TaskPeer::TAS_TITLE);
|
|
$c->addAsColumn('APP_THREAD_STATUS', 'at.APP_THREAD_STATUS');
|
|
|
|
$c->addSelectColumn(AppDelegationPeer::APP_OVERDUE_PERCENTAGE);
|
|
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_DELAYED);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_DELAY_DURATION);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_DELEGATE_DATE);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_DURATION);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_FINISH_DATE);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_INIT_DATE);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_QUEUE_DURATION);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_TASK_DUE_DATE);
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_THREAD_STATUS);
|
|
$c->addSelectColumn(AppDelegationPeer::TAS_UID);
|
|
|
|
$c->addAlias('u', 'USERS');
|
|
$c->addAlias('uprev', 'USERS');
|
|
$c->addAlias('adprev', 'APP_DELEGATION');
|
|
$c->addAlias('at', 'APP_THREAD');
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::USR_UID,
|
|
'u.USR_UID'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::APP_UID,
|
|
'adprev.APP_UID'
|
|
);
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::DEL_PREVIOUS,
|
|
'adprev.DEL_INDEX'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
$c->addJoin(AppDelegationPeer::TAS_UID, TaskPeer::TAS_UID);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
'adprev.USR_UID',
|
|
'uprev.USR_UID'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::APP_UID,
|
|
'at.APP_UID'
|
|
);
|
|
$aConditions [] = array(
|
|
AppDelegationPeer::DEL_THREAD,
|
|
'at.APP_THREAD_INDEX'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
$c->add(AppDelegationPeer::APP_UID, $appUID);
|
|
$c->add(AppDelegationPeer::DEL_INDEX, $delIndex);
|
|
|
|
$rs = AppDelegationPeer::doSelectRS($c);
|
|
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
// echo $c->toString();
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
|
|
//Propel::close();
|
|
|
|
return $row;
|
|
}
|
|
|
|
/**
|
|
* return the correct search text for solr.
|
|
* if a field is included only search in this field.
|
|
*
|
|
* @param string $plainSearchText
|
|
* @return string formated Solr search string.
|
|
*/
|
|
public function getSearchText($plainSearchText)
|
|
{
|
|
$formattedSearchText = "";
|
|
// if an error is found in string null is returned
|
|
$includeToken = true;
|
|
|
|
// prepare string to separate and join parentesis
|
|
// " " => " "
|
|
$count = 1;
|
|
while ($count > 0) {
|
|
$plainSearchText = preg_replace('/\s\s+/', ' ', $plainSearchText, - 1, $count);
|
|
}
|
|
// "text0( text1" => "text0 (text1"; "text0 )text1" => "text0) text1";
|
|
$plainSearchText = preg_replace('/\s\[\s/', '[', $plainSearchText);
|
|
$plainSearchText = preg_replace('/\s\]\s/', '] ', $plainSearchText);
|
|
$plainSearchText = preg_replace('/\s"\s/', '" ', $plainSearchText);
|
|
|
|
// print "format search string: " . $plainSearchText . "\n";
|
|
// format
|
|
// 1: plain text that is used to search in text field: concat field
|
|
// 2: a field is specified [field_name]:["phrase search"]
|
|
// [field_name]:["phrase search"] [field_name]:[word_search] word_search
|
|
// "phrase search"
|
|
// to scape a reserved character use a double value: "::", """"
|
|
// ex: (APP_ASSIGNED_USERS:7091676694d9269da75c254003021135) AND
|
|
// (contrato_t:76* AND Causal_t:1021 AND Materiales AND 143073)
|
|
// ex: date search => APP_CREATE_DATE:[2012-03-12T00:00:00Z TO
|
|
// 2012-04-12T00:00:00Z]
|
|
// ex: phrase => TEXT:"This is a lazy dog"
|
|
// search the first
|
|
|
|
$searchIndex = new BpmnEngineServicesSearchIndex($this->_solrIsEnabled, $this->_solrHost);
|
|
// execute query
|
|
$ListFieldsInfo = $searchIndex->getIndexFields($this->_solrInstance);
|
|
|
|
$tok = strtok($plainSearchText, " ");
|
|
|
|
while ($tok !== false) {
|
|
$fieldName = substr($tok, 0, strpos($tok, ":")); // strstr ( $tok,
|
|
// ":",
|
|
// true ); php 5.3
|
|
$searchText = strstr($tok, ":");
|
|
|
|
// verify if there's a field definition
|
|
if ($fieldName === false || $fieldName == "") {
|
|
// it's not a field
|
|
// the token is not a field
|
|
// add it completelly
|
|
$includeToken = true;
|
|
// no field found
|
|
$formattedSearchText .= $tok; // used to search in the general default
|
|
// text field
|
|
} else {
|
|
// it's a field
|
|
// verify if is complete
|
|
if ($fieldName == "" || $searchText == ":") {
|
|
$includeToken = false;
|
|
throw new InvalidIndexSearchTextException(" Invalid search text, verify the syntax. Expected format = {variable_name}:{search_text}");
|
|
}
|
|
|
|
// field name found
|
|
// search index field name
|
|
$indexFieldName = "";
|
|
if (array_key_exists($fieldName, $ListFieldsInfo)) {
|
|
$indexFieldName = $ListFieldsInfo [$fieldName];
|
|
} else {
|
|
// no field name found
|
|
// don't include field search
|
|
// return message about it
|
|
$includeToken = false;
|
|
throw new InvalidIndexSearchTextException(" Invalid search text, variable not found.");
|
|
}
|
|
|
|
// The token is part of a phrase, date or a word?
|
|
if ($searchText [1] == "[" || $searchText [1] == "\"") { //
|
|
// expecting
|
|
// date
|
|
// interval
|
|
// we must
|
|
// search
|
|
// the end of
|
|
// the
|
|
// phrase
|
|
// the phrase is complete?
|
|
if ($searchText [1] == "[" && $searchText [strlen($searchText) - 1] == "]") {
|
|
// complete phrase ok, the date must be validated
|
|
// throw new InvalidIndexSearchTextException("Invalid search text.
|
|
// Expected date interval format =>
|
|
// {variable_name}:[YYYY-MM-DDThh:mm:ssZ TO YYYY-MM-DDThh:mm:ssZ]");
|
|
} elseif ($searchText [1] == "\"" && $searchText [strlen($searchText) - 1] == "\"") {
|
|
// the phrase is complete and is ok.
|
|
} else {
|
|
// search end of phrase
|
|
$tok = strtok(" ");
|
|
$found = false;
|
|
while ($tok !== false) {
|
|
if ((($searchText [1] == "[") && ($tok [strlen($tok) - 1] == "]")) || (($searchText [1] == "\"") && ($tok [strlen($tok) - 1] == "\""))) {
|
|
// end of phrase found
|
|
$found = true;
|
|
$searchText .= " " . $tok;
|
|
break;
|
|
} else {
|
|
// continue adding text
|
|
$searchText .= " " . $tok;
|
|
}
|
|
$tok = strtok(" ");
|
|
}
|
|
if (!$found) {
|
|
// error invalid text
|
|
// Expected date interval format => {variable_name}:[YYYY-MM-DDThh:mm:ssZ TO YYYY-MM-DDThh:mm:ssZ]
|
|
throw new InvalidIndexSearchTextException("Invalid search text. The date or phase is not completed");
|
|
}
|
|
}
|
|
}
|
|
|
|
// validate phrase in case of date
|
|
if (($searchText [1] == "[")) {
|
|
// validate date range format
|
|
// use regular expresion to validate it [yyyy-mm-dd TO yyyy-mm-dd]
|
|
$result1 = strpos($searchText, '-');
|
|
if ($result1 !== false) {
|
|
$result2 = strpos($searchText, 'TO');
|
|
if ($result2 !== false) {
|
|
$reg = "/:\[(\d\d\d\d-\d\d-\d\d|\*)\sTO\s(\d\d\d\d-\d\d-\d\d|\*)\]/";
|
|
// convert date to utc
|
|
$matched = preg_match($reg, $searchText, $matches);
|
|
if ($matched == 1) {
|
|
// the date interval is valid
|
|
// convert to SOlr format
|
|
$fromDateOriginal = $matches [1];
|
|
$fromDate = $matches [1];
|
|
$toDateOriginal = $matches [2];
|
|
$toDate = $matches [2];
|
|
if ($fromDateOriginal != '*') {
|
|
$fromDate = gmdate("Y-m-d\T00:00:00\Z", strtotime($fromDateOriginal));
|
|
}
|
|
if ($toDateOriginal != '*') {
|
|
// list($year, $month, $day) = sscanf($fromDateOriginal,
|
|
// '%04d/%02d/%02d');
|
|
// $toDateDatetime = new DateTime($toDateOriginal);
|
|
// $toDateDatetime = date_create_from_format ( 'Y-m-d',
|
|
// $toDateOriginal );
|
|
$toDate = gmdate("Y-m-d\T23:59:59.999\Z", strtotime($toDateOriginal));
|
|
}
|
|
$searchText = ":[" . $fromDate . " TO " . $toDate . "]";
|
|
}
|
|
} else {
|
|
$searchText = str_replace("[", "", $searchText);
|
|
$searchText = str_replace("]", "", $searchText);
|
|
$searchText = str_replace(":", "", $searchText);
|
|
$searchText = ":[" . $searchText . "T00:00:00Z TO " . $searchText . "T23:59:59.999Z]";
|
|
}
|
|
}
|
|
}
|
|
|
|
// validate phrase in case of < and <=
|
|
$result1 = strpos($searchText, '<');
|
|
if ($result1 !== false) {
|
|
$result = strpos($searchText, '<=');
|
|
if ($result !== false) {
|
|
$v1 = str_replace('<=', '', $searchText);
|
|
$v2 = str_replace(':', '', $v1);
|
|
$v3 = str_replace('<', '', ':[* TO ' . $v2 . ']');
|
|
$searchText = $v3;
|
|
} else {
|
|
$v1 = str_replace('<', '', $searchText);
|
|
$v2 = str_replace(':', '', $v1);
|
|
$v3 = (int) $v2 - 1;
|
|
$v4 = str_replace('<', '', ':[* TO ' . $v3 . ']');
|
|
$searchText = $v4;
|
|
}
|
|
}
|
|
// validate phrase in case of > and >=
|
|
$result2 = strpos($searchText, '>');
|
|
if ($result2 !== false) {
|
|
$result = strpos($searchText, '>=');
|
|
if ($result !== false) {
|
|
$v1 = str_replace('>=', '', $searchText);
|
|
$v2 = str_replace(':', '', $v1);
|
|
$v3 = str_replace('>', '', ':[' . $v2 . ' TO *]');
|
|
$searchText = $v3;
|
|
} else {
|
|
$v1 = str_replace('>', '', $searchText);
|
|
$v2 = str_replace(':', '', $v1);
|
|
$v3 = (int) $v2 + 1;
|
|
$v4 = str_replace('>', '', ':[' . $v3 . ' TO *]');
|
|
$searchText = $v4;
|
|
}
|
|
}
|
|
$formattedSearchText .= $indexFieldName . $searchText;
|
|
$includeToken = true;
|
|
}
|
|
|
|
if ($includeToken) {
|
|
$formattedSearchText .= " AND ";
|
|
}
|
|
|
|
// next token
|
|
$tok = strtok(" ");
|
|
}
|
|
|
|
// remove last AND
|
|
$formattedSearchText = substr_replace($formattedSearchText, "", - 5);
|
|
return $formattedSearchText;
|
|
}
|
|
|
|
/**
|
|
* Get all the application delegation records from database
|
|
*
|
|
* @param string $appUID
|
|
* Application identifier
|
|
* @return array delegation records
|
|
*/
|
|
public function getApplicationDelegationsIndex($appUID)
|
|
{
|
|
$delIndexes = array();
|
|
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(AppDelegationPeer::DEL_INDEX);
|
|
$c->add(AppDelegationPeer::APP_UID, $appUID);
|
|
|
|
$rs = AppDelegationPeer::doSelectRS($c);
|
|
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
|
|
while (is_array($row)) {
|
|
$delIndexes [] = $row ['DEL_INDEX'];
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
}
|
|
|
|
//Propel::close();
|
|
|
|
return $delIndexes;
|
|
}
|
|
|
|
/**
|
|
* Update the information of the specified applications in Solr
|
|
*
|
|
* @param array $aaAPPUIDs
|
|
* Array of arrays of App_UID that must be updated,
|
|
* APP_UID is permitted also
|
|
*/
|
|
public function updateApplicationSearchIndex($aaAPPUIDs, $saveDBRecord = false)
|
|
{
|
|
if (empty($aaAPPUIDs)) {
|
|
return;
|
|
}
|
|
|
|
if ($this->debug) {
|
|
//show app to reindex
|
|
var_dump($aaAPPUIDs);
|
|
}
|
|
|
|
if (!is_array($aaAPPUIDs)) {
|
|
// convert to array
|
|
$APPUID = $aaAPPUIDs;
|
|
$aaAPPUIDs = array();
|
|
$aaAPPUIDs [] = array(
|
|
'APP_UID' => $APPUID
|
|
);
|
|
}
|
|
|
|
if ($this->debug) {
|
|
//show app to reindex
|
|
var_dump($aaAPPUIDs);
|
|
}
|
|
|
|
try {
|
|
|
|
// check if index server is available
|
|
/*
|
|
if ($saveDBRecord) {
|
|
if($this->isSolrEnabled()){
|
|
//store update in table but with status updated
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$this->applicationChangedUpdateSolrQueue ($aAPPUID ['APP_UID'], 0);
|
|
}
|
|
}
|
|
else{
|
|
// store update in table and return
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$this->applicationChangedUpdateSolrQueue ($aAPPUID ['APP_UID'], true);
|
|
}
|
|
return;
|
|
}
|
|
|
|
} */
|
|
|
|
|
|
if ($this->debug) {
|
|
$this->getApplicationDataDBTime = 0;
|
|
$this->getPreparedApplicationDataDBTime = 0;
|
|
$this->getBuilXMLDocTime = 0;
|
|
$this->afterUpdateSolrXMLDocTime = 0;
|
|
|
|
$this->beforeCreateSolrXMLDocTime = microtime(true);
|
|
}
|
|
// create XML document
|
|
$xmlDoc = $this->createSolrXMLDocument($aaAPPUIDs);
|
|
|
|
if ($this->debug) {
|
|
$this->afterCreateSolrXMLDocTime = microtime(true);
|
|
}
|
|
// update document
|
|
$data = array(
|
|
'workspace' => $this->_solrInstance,
|
|
'document' => $xmlDoc
|
|
);
|
|
$oSolrUpdateDocument = EntitySolrUpdateDocument::createForRequest($data);
|
|
|
|
$oSearchIndex = new BpmnEngineServicesSearchIndex($this->_solrIsEnabled, $this->_solrHost);
|
|
|
|
$oSearchIndex->updateIndexDocument($oSolrUpdateDocument);
|
|
|
|
if ($this->debug) {
|
|
$this->afterUpdateSolrXMLDocTime = microtime(true);
|
|
}
|
|
// commit changes no required because of the commitwithin option
|
|
//$oSearchIndex->commitIndexChanges ($this->_solrInstance);
|
|
//change status in db to indexed
|
|
if ($saveDBRecord) {
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$this->applicationChangedUpdateSolrQueue($aAPPUID ['APP_UID'], 0);
|
|
}
|
|
}
|
|
} catch (Exception $ex) {
|
|
//echo $ex->getMessage();
|
|
//echo $ex->getTraceAsString();
|
|
$appuidsString = " ";
|
|
//register all the appuids that can't be indexed
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$this->applicationChangedUpdateSolrQueue($aAPPUID ['APP_UID'], true);
|
|
$appuidsString .= $aAPPUID ['APP_UID'] . ", ";
|
|
}
|
|
//print "Excepcion indexing data: " . $ex->getMessage() . "\n"; die;
|
|
$fh = fopen("./SolrIndexErrors.txt", 'a') or die("can't open file to store Solr index errors.");
|
|
fwrite($fh, date('Y-m-d H:i:s:u') . ":" . $appuidsString . $ex->getMessage() . "\r\n");
|
|
fclose($fh);
|
|
}
|
|
if ($this->debug) {
|
|
|
|
//$this->afterCommitSolrDocTime = microtime (true);
|
|
|
|
$fh = fopen("SolrIndexTime.txt", 'a') or die("can't open file to store Solr index time.");
|
|
//fwrite($fh, sprintf("Solr Query time: %s DB Query time: %s Prepare result time: %s \n", gmdate ('H:i:s:u', ($this->afterSolrQueryTime - $this->initTimeAll)), gmdate ('H:i:s:u', ($this->afterDbQueryTime - $this->afterSolrQueryTime)), gmdate ('H:i:s:u', ($this->afterPrepareResultTime - $this->afterDbQueryTime)) ));
|
|
$trunkSize = count($aaAPPUIDs);
|
|
$this->trunkSizeAcumulated += $trunkSize;
|
|
$this->totalTimeAcumulated += ($this->afterUpdateSolrXMLDocTime - $this->beforeCreateSolrXMLDocTime);
|
|
|
|
//Solr App trunk size| Get Data from DB (s)| Prepare DB data (s) | Create XML file (s)| Create XML Document total (s)| Update Solr Document (s)
|
|
fwrite($fh, sprintf("%s|%s|%s|%s|%s|%s|%s|%s\r\n", $this->trunkSizeAcumulated, $this->totalTimeAcumulated, $this->getApplicationDataDBTime, $this->getPreparedApplicationDataDBTime, $this->getBuilXMLDocTime, ($this->afterCreateSolrXMLDocTime - $this->beforeCreateSolrXMLDocTime), ($this->afterUpdateSolrXMLDocTime - $this->afterCreateSolrXMLDocTime), ($this->afterUpdateSolrXMLDocTime - $this->beforeCreateSolrXMLDocTime)
|
|
));
|
|
|
|
fclose($fh);
|
|
|
|
/*
|
|
fwrite($fh, sprintf("Solr App trunk size: %s => Create XML Document total (s): %s, Update Solr Document (s): %s, Total (s):%s \r\n",
|
|
$trunkSize, ($this->afterCreateSolrXMLDocTime - $this->beforeCreateSolrXMLDocTime), ($this->afterUpdateSolrXMLDocTime - $this->afterCreateSolrXMLDocTime),
|
|
($this->afterUpdateSolrXMLDocTime - $this->beforeCreateSolrXMLDocTime)));
|
|
fclose($fh);
|
|
$fh = fopen("SolrIndexTime.txt", 'a') or die("can't open file to store Solr index time.");
|
|
fwrite($fh, sprintf("APP range => Get Data from DB (s): %s, Prepare DB data (s): %s, Create XML file(s): %s \r\n",
|
|
$this->getApplicationDataDBTime, $this->getPreparedApplicationDataDBTime, $this->getBuilXMLDocTime ));
|
|
fclose($fh); */
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Delete the specified application record from Solr
|
|
*
|
|
* @param string $aaAPPUIDs
|
|
* array of arrays of Application identifiers format:$aaAPPUIDs [] = array ('APP_UID' => '...')
|
|
*/
|
|
public function deleteApplicationSearchIndex($aaAPPUIDs, $saveDBRecord = false)
|
|
{
|
|
if (empty($aaAPPUIDs)) {
|
|
return;
|
|
}
|
|
|
|
|
|
if (!is_array($aaAPPUIDs)) {
|
|
// convert to array
|
|
$APPUID = $aaAPPUIDs;
|
|
$aaAPPUIDs = array();
|
|
$aaAPPUIDs [] = array(
|
|
'APP_UID' => $APPUID
|
|
);
|
|
}
|
|
|
|
/*
|
|
if ($saveDBRecord) {
|
|
if($this->isSolrEnabled()){
|
|
//store update in table but with status updated
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$this->applicationChangedUpdateSolrQueue ($aAPPUID ['APP_UID'], 0);
|
|
}
|
|
}
|
|
else{
|
|
// store update in table and return
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$this->applicationChangedUpdateSolrQueue ($aAPPUID ['APP_UID'], 2);
|
|
}
|
|
return;
|
|
}
|
|
} */
|
|
|
|
try {
|
|
$oSearchIndex = new BpmnEngineServicesSearchIndex($this->_solrIsEnabled, $this->_solrHost);
|
|
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$idQuery = "APP_UID:" . $aAPPUID ['APP_UID'];
|
|
|
|
$oSearchIndex->deleteDocumentFromIndex($this->_solrInstance, $idQuery);
|
|
}
|
|
|
|
if ($saveDBRecord) {
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$this->applicationChangedUpdateSolrQueue($aAPPUID ['APP_UID'], 0);
|
|
}
|
|
}
|
|
} catch (Exception $ex) {
|
|
//register all the appuids that can't be indexed
|
|
$appuidsString = " ";
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$this->applicationChangedUpdateSolrQueue($aAPPUID ['APP_UID'], 2);
|
|
$appuidsString .= $aAPPUID ['APP_UID'] . ", ";
|
|
}
|
|
//print "Excepcion indexing data: " . $ex->getMessage() . "\n"; die;
|
|
$fh = fopen("./SolrIndexErrors.txt", 'a') or die("can't open file to store Solr index errors.");
|
|
fwrite($fh, date('Y-m-d H:i:s:u') . ":" . $appuidsString . $ex->getMessage() . "\r\n");
|
|
fclose($fh);
|
|
}
|
|
|
|
// commit changes
|
|
//$oSearchIndex->commitIndexChanges ($this->_solrInstance);
|
|
}
|
|
|
|
/**
|
|
* Create XML data in Solr format of the specified applications
|
|
* this function uses the buildSearchIndexDocumentPMOS2 function to create
|
|
* each record
|
|
*
|
|
* @param array $aaAPPUIDs
|
|
* array of arrays of application identifiers
|
|
* @return string The resulting XML document in Solr format
|
|
*/
|
|
public function createSolrXMLDocument($aaAPPUIDs)
|
|
{
|
|
if ($this->debug) {
|
|
$this->getApplicationDataDBTime = 0;
|
|
$this->getPreparedApplicationDataDBTime = 0;
|
|
$this->getBuilXMLDocTime = 0;
|
|
}
|
|
// search data from DB
|
|
$xmlDoc = "<?xml version='1.0' encoding='UTF-8'?>\n";
|
|
$xmlDoc .= "<add>\n";
|
|
|
|
//get all application data from DB of all applications and delegations
|
|
$aAPPUIDs = array();
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
$aAPPUIDs[] = $aAPPUID ['APP_UID'];
|
|
}
|
|
if ($this->debug) {
|
|
$this->beforeGetApplicationDataDBTime = microtime(true);
|
|
}
|
|
$aaAllAppDelData = $this->getListApplicationUpdateDelegationData($aAPPUIDs);
|
|
if ($this->debug) {
|
|
$this->afterGetApplicationDataDBTime = microtime(true);
|
|
|
|
$this->getApplicationDataDBTime = $this->afterGetApplicationDataDBTime - $this->beforeGetApplicationDataDBTime;
|
|
}
|
|
foreach ($aaAPPUIDs as $aAPPUID) {
|
|
try {
|
|
if ($this->debug) {
|
|
$this->beforePrepareApplicationDataDBTime = microtime(true);
|
|
}
|
|
//filter data, include all the rows of the application
|
|
// get delegation data from DB
|
|
$aaAppData = array();
|
|
//filter data from db
|
|
$indexes = $this->aaSearchRecords($aaAllAppDelData, array(
|
|
'APP_UID' => $aAPPUID ['APP_UID']
|
|
));
|
|
|
|
foreach ($indexes as $index) {
|
|
$aaAppData[] = $aaAllAppDelData [$index];
|
|
}
|
|
|
|
$result = $this->getApplicationIndexData($aAPPUID ['APP_UID'], $aaAppData);
|
|
|
|
if ($this->debug) {
|
|
$this->afterPrepareApplicationDataDBTime = microtime(true);
|
|
|
|
$this->getPreparedApplicationDataDBTime += $this->afterPrepareApplicationDataDBTime - $this->beforePrepareApplicationDataDBTime;
|
|
}
|
|
} catch (ApplicationWithoutDelegationRecordsException $ex) {
|
|
// exception trying to get application information
|
|
// skip and continue with the next application
|
|
$fh = fopen("./SolrIndexErrors.txt", 'a') or die("can't open file to store Solr index errors.");
|
|
fwrite($fh, date('Y-m-d H:i:s:u') . " " . $ex->getMessage());
|
|
fclose($fh);
|
|
continue;
|
|
} catch (ApplicationWithCorruptDynaformException $ex) {
|
|
$fh = fopen("./SolrIndexErrors.txt", 'a') or die("can't open file to store Solr index errors.");
|
|
fwrite($fh, date('Y-m-d H:i:s:u') . " " . $ex->getMessage());
|
|
fclose($fh);
|
|
continue;
|
|
} catch (Exception $ex) {
|
|
$fh = fopen("./SolrIndexErrors.txt", 'a') or die("can't open file to store Solr index errors.");
|
|
fwrite($fh, date('Y-m-d H:i:s:u') . " " . "getApplicationIndexData " . $aAPPUID['APP_UID'] . ":" . $ex->getMessage() . "\n");
|
|
fclose($fh);
|
|
continue;
|
|
}
|
|
/* $documentInformation,
|
|
* $dynaformFieldTypes,
|
|
* $lastUpdateDate,
|
|
* $maxPriority,
|
|
* $delLastIndex,
|
|
* $assignedUsers,
|
|
* $assignedUsersRead,
|
|
* $assignedUsersUnread,
|
|
* $draftUser,
|
|
* $participatedUsers,
|
|
* $participatedUsersStartedByUser,
|
|
* $participatedUsersCompletedByUser,
|
|
* $unassignedUsers,
|
|
* $unassignedGroups */
|
|
$documentInformation = $result [0];
|
|
$dynaformFieldTypes = $result [1];
|
|
$lastUpdateDate = $result [2];
|
|
$maxPriority = $result [3];
|
|
$delLastIndex = $result [4];
|
|
$assignedUsers = $result [5];
|
|
$assignedUsersRead = $result [6];
|
|
$assignedUsersUnread = $result [7];
|
|
$draftUser = $result [8];
|
|
$participatedUsers = $result [9];
|
|
$participatedUsersStartedByUser = $result [10];
|
|
$participatedUsersCompletedByUser = $result [11];
|
|
$unassignedUsers = $result [12];
|
|
$unassignedGroups = $result [13];
|
|
$pausedtUser = $result [14];
|
|
|
|
try {
|
|
|
|
// create document
|
|
$xmlCurrentDoc = $this->buildSearchIndexDocumentPMOS2($documentInformation, $dynaformFieldTypes, $lastUpdateDate, $maxPriority, $delLastIndex, $assignedUsers, $assignedUsersRead, $assignedUsersUnread, $draftUser, $participatedUsers, $participatedUsersStartedByUser, $participatedUsersCompletedByUser, $unassignedUsers, $unassignedGroups, $pausedtUser);
|
|
|
|
//concat doc to the list of docs
|
|
$xmlDoc .= $xmlCurrentDoc;
|
|
|
|
if ($this->debug) {
|
|
$this->afterBuilXMLDocTime = microtime(true);
|
|
|
|
$this->getBuilXMLDocTime += $this->afterBuilXMLDocTime - $this->afterPrepareApplicationDataDBTime;
|
|
}
|
|
} catch (ApplicationAppDataUnserializeException $ex) {
|
|
// exception trying to get application information
|
|
$fh = fopen("./SolrIndexErrors.txt", 'a') or die("can't open file to store Solr index errors.");
|
|
fwrite($fh, date('Y-m-d H:i:s:u') . " " . $ex->getMessage());
|
|
fclose($fh);
|
|
// skip and continue with the next application
|
|
continue;
|
|
} catch (Exception $ex) {
|
|
$fh = fopen("./SolrIndexErrors.txt", 'a') or die("can't open file to store Solr index errors.");
|
|
fwrite($fh, date('Y-m-d H:i:s:u') . " " . "buildSearchIndexDocumentPMOS2 " . $aAPPUID['APP_UID'] . ":" . $ex->getMessage() . "\n");
|
|
fclose($fh);
|
|
continue;
|
|
}
|
|
|
|
if ($this->debugAppInfo) {
|
|
$fh = fopen("SolrAPPUIDIndexSize.txt", 'a') or die("can't open file to store Solr index time.");
|
|
//fwrite($fh, sprintf("APP UID %s => doc size: %s\r\n",
|
|
// $aAPPUID['APP_UID'], strlen($xmlCurrentDoc)));
|
|
fwrite($fh, sprintf("%s|%s|%s\r\n", $documentInformation ['APP_NUMBER'], $aAPPUID['APP_UID'], strlen($xmlCurrentDoc)));
|
|
fclose($fh);
|
|
}
|
|
}//End foreach APPUID
|
|
|
|
$xmlDoc .= "</add>\n";
|
|
|
|
/*
|
|
if($this->debug)
|
|
{
|
|
$fh = fopen("SolrIndexTime.txt", 'a') or die("can't open file to store Solr index time.");
|
|
fwrite($fh, sprintf("APP range => Get Data from DB (s): %s, Prepare DB data (s): %s, Create XML file(s): %s \r\n",
|
|
$this->getApplicationDataDBTime, $this->getPreparedApplicationDataDBTime, $this->getBuilXMLDocTime ));
|
|
fclose($fh);
|
|
} */
|
|
|
|
return $xmlDoc;
|
|
}
|
|
|
|
/**
|
|
* build Solr index document xml for an application
|
|
* @gearman = false
|
|
* @rest = false
|
|
* @background = false
|
|
*
|
|
* @param
|
|
* [in] array $documentData array of data for the xml document of
|
|
* application
|
|
* @param
|
|
* [in] array $dynaformFieldTypes array of dynaform field types, used
|
|
* to store the info of APP_DATA with types
|
|
* @param
|
|
* [in] array $appTitles array of array of application titles in all
|
|
* languages
|
|
* @param
|
|
* [in] array $proTitles array of array of process titles in all
|
|
* languages
|
|
* @param
|
|
* [in] array $assignedUsers array of array of uids of assigned users
|
|
* to Application UIDs
|
|
* @param
|
|
* [in] array $draftUsers array of array of uids of draft users to
|
|
* Application UIDs
|
|
* @param
|
|
* [in] array $participatedUsers array of array of participated users
|
|
* UIDs in application
|
|
* @param
|
|
* [in] array $unassignedUsers array of unassigned users UIDs
|
|
* @param
|
|
* [in] array $unassignedGroups array of unassigned groups UIDs
|
|
* @param
|
|
* [out] xml xml document
|
|
*
|
|
* $xmlDoc .= buildSearchIndexDocumentPMOS2($documentInformation,
|
|
* $dynaformFieldTypes,
|
|
* $lastUpdateDate, $maxPriority,
|
|
* $assignedUsers, $assignedUsersRead, $assignedUsersUnread,
|
|
* $draftUser,
|
|
* $participatedUsers, $participatedUsersStartedByUser,
|
|
* $participatedUsersCompletedByUser,
|
|
* $unassignedUsers, $unassignedGroups);*
|
|
*/
|
|
public function buildSearchIndexDocumentPMOS2($documentData, $dynaformFieldTypes, $lastUpdateDate, $maxPriority, $delLastIndex, $assignedUsers, $assignedUsersRead, $assignedUsersUnread, $draftUser, $participatedUsers, $participatedUsersStartedByUser, $participatedUsersCompletedByUser, $unassignedUsers, $unassignedGroups, $pausedtUser)
|
|
{
|
|
// build xml document
|
|
|
|
$writer = new XMLWriter();
|
|
$writer->openMemory();
|
|
$writer->setIndent(4);
|
|
|
|
$writer->startElement("doc");
|
|
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_UID');
|
|
$writer->text($documentData ['APP_UID']);
|
|
$writer->endElement();
|
|
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_NUMBER');
|
|
$writer->text($documentData ['APP_NUMBER']);
|
|
$writer->endElement();
|
|
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_STATUS');
|
|
$writer->text($documentData ['APP_STATUS']);
|
|
$writer->endElement();
|
|
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'PRO_UID');
|
|
$writer->text($documentData ['PRO_UID']);
|
|
$writer->endElement();
|
|
|
|
if (!empty($documentData ['APP_TITLE'])) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_TITLE');
|
|
$writer->text($documentData ['APP_TITLE']);
|
|
$writer->endElement();
|
|
} else {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_TITLE');
|
|
$writer->text("");
|
|
$writer->endElement();
|
|
}
|
|
|
|
if (!empty($documentData ['PRO_TITLE'])) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PRO_TITLE');
|
|
$writer->text($documentData ['PRO_TITLE']);
|
|
$writer->endElement();
|
|
} else {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PRO_TITLE');
|
|
$writer->text("");
|
|
$writer->endElement();
|
|
}
|
|
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_CREATE_DATE');
|
|
// convert date to UTC with gmdate
|
|
$writer->text(gmdate("Y-m-d\TH:i:s\Z", strtotime($documentData ['APP_CREATE_DATE'])));
|
|
$writer->endElement();
|
|
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'DEL_LAST_UPDATE_DATE');
|
|
// convert date to UTC with gmdate
|
|
$writer->text(gmdate("Y-m-d\TH:i:s\Z", strtotime($lastUpdateDate)));
|
|
$writer->endElement();
|
|
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'DEL_MAX_PRIORITY');
|
|
$writer->text($maxPriority);
|
|
$writer->endElement();
|
|
|
|
if (!empty($documentData["PRO_CATEGORY_UID"])) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute("name", "PRO_CATEGORY_UID_s");
|
|
$writer->text($documentData["PRO_CATEGORY_UID"]);
|
|
$writer->endElement();
|
|
}
|
|
|
|
foreach ($delLastIndex as $lastIndex) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'DEL_LAST_INDEX');
|
|
$writer->text($lastIndex);
|
|
$writer->endElement();
|
|
}
|
|
|
|
if (is_array($assignedUsers) && !empty($assignedUsers)) {
|
|
foreach ($assignedUsers as $userUID) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_ASSIGNED_USERS');
|
|
$writer->text($userUID ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
// add dynamic field for del_index information
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_ASSIGNED_USER_DEL_INDEX_' . trim($userUID ['USR_UID']) . '_txt');
|
|
$writer->text($userUID ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
if (is_array($assignedUsersRead) && !empty($assignedUsersRead)) {
|
|
foreach ($assignedUsersRead as $userUID) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_ASSIGNED_USERS_READ');
|
|
$writer->text($userUID ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
// add dynamic field for del_index information
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_ASSIGNED_USER_READ_DEL_INDEX_' . trim($userUID ['USR_UID']) . '_txt');
|
|
$writer->text($userUID ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
if (is_array($assignedUsersUnread) && !empty($assignedUsersUnread)) {
|
|
foreach ($assignedUsersUnread as $userUID) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_ASSIGNED_USERS_UNREAD');
|
|
$writer->text($userUID ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
// add dynamic field for del_index information
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_ASSIGNED_USER_UNREAD_DEL_INDEX_' . trim($userUID ['USR_UID']) . '_txt');
|
|
$writer->text($userUID ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
if (!empty($draftUser)) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_DRAFT_USER');
|
|
$writer->text($draftUser ['USR_UID']);
|
|
$writer->endElement();
|
|
}
|
|
|
|
if (is_array($participatedUsers) && !empty($participatedUsers)) {
|
|
foreach ($participatedUsers as $userUID) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PARTICIPATED_USERS');
|
|
$writer->text($userUID ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
// add dynamic field for del_index information
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PARTICIPATED_USER_DEL_INDEX_' . trim($userUID ['USR_UID']) . '_txt');
|
|
$writer->text($userUID ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
if (is_array($participatedUsersStartedByUser) && !empty($participatedUsersStartedByUser)) {
|
|
foreach ($participatedUsersStartedByUser as $userUID) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PARTICIPATED_USERS_STARTED');
|
|
$writer->text($userUID ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
// add dynamic field for del_index information
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PARTICIPATED_USER_STARTED_DEL_INDEX_' . trim($userUID ['USR_UID']) . '_txt');
|
|
$writer->text($userUID ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
if (is_array($participatedUsersCompletedByUser) && !empty($participatedUsersCompletedByUser)) {
|
|
foreach ($participatedUsersCompletedByUser as $userUID) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PARTICIPATED_USERS_COMPLETED');
|
|
$writer->text($userUID ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
// add dynamic field for del_index information
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PARTICIPATED_USER_COMPLETED_DEL_INDEX_' . trim($userUID ['USR_UID']) . '_txt');
|
|
$writer->text($userUID ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
if (is_array($unassignedUsers) && !empty($unassignedUsers)) {
|
|
foreach ($unassignedUsers as $userUID) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_UNASSIGNED_USERS');
|
|
$writer->text($userUID ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
// add dynamic field for del_index information
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_UNASSIGNED_USER_GROUP_DEL_INDEX_' . trim($userUID ['USR_UID']) . '_txt');
|
|
$writer->text($userUID ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
if (is_array($unassignedGroups) && !empty($unassignedGroups)) {
|
|
foreach ($unassignedGroups as $groupUID) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_UNASSIGNED_GROUPS');
|
|
$writer->text($groupUID ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
// add dynamic field for del_index information
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_UNASSIGNED_USER_GROUP_DEL_INDEX_' . trim($groupUID ['USR_UID']) . '_txt');
|
|
$writer->text($groupUID ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
if (!empty($pausedtUser)) {
|
|
foreach ($pausedtUser as $paused) {
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PAUSED_USERS');
|
|
$writer->text($paused ['USR_UID']);
|
|
$writer->endElement();
|
|
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', 'APP_PAUSED_USER_DEL_INDEX_' . trim($paused ['USR_UID']) . '_txt');
|
|
$writer->text($paused ['DEL_INDEX']);
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
// get the serialized fields
|
|
if (!empty($documentData ['APP_DATA']) && $documentData ['APP_DATA'] != "N;") {
|
|
$UnSerializedCaseData = unserialize($documentData ['APP_DATA']);
|
|
|
|
if ($UnSerializedCaseData === false) {
|
|
$UnSerializedCaseData = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $documentData ['APP_DATA']); // utf8_encode
|
|
$UnSerializedCaseData = unserialize($UnSerializedCaseData);
|
|
}
|
|
|
|
if (!$UnSerializedCaseData) {
|
|
// error unserializing
|
|
throw new ApplicationAppDataUnserializeException(date('Y-m-d H:i:s:u') . " Could not unserialize APP_DATA of APP_UID: " . $documentData ['APP_UID'] . "\n");
|
|
} else {
|
|
foreach ($UnSerializedCaseData as $k => $value) {
|
|
//This validation is only for the 'checkbox' control for the BPMN forms,
|
|
//the request is not made to the database to obtain the control
|
|
//associated with the variable so as not to decrease the performance.
|
|
if (is_array($value) && count($value) === 1 && isset($value[0]) && !is_object($value[0]) && !is_array($value[0])) {
|
|
$value = $value[0];
|
|
}
|
|
if (!is_array($value) && !is_object($value) && $value != '' && $k != 'SYS_LANG' && $k != 'SYS_SKIN' && $k != 'SYS_SYS') {
|
|
// search the field type in array of dynaform fields
|
|
if (!empty($dynaformFieldTypes) && array_key_exists(trim($k), $dynaformFieldTypes)) {
|
|
$type = $dynaformFieldTypes [trim($k)];
|
|
$typeSufix = '_t';
|
|
switch ($type) {
|
|
case 'text':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'Int':
|
|
if (intval($value) > 2147483647) {
|
|
$typeSufix = '_tl'; //for long values
|
|
$value = intval($value);
|
|
} else {
|
|
$typeSufix = '_ti';
|
|
$value = str_replace(',', '', $value);
|
|
$value = intval($value);
|
|
}
|
|
break;
|
|
case 'Real':
|
|
$typeSufix = '_td';
|
|
$value = str_replace(',', '', $value);
|
|
$value = floatval($value);
|
|
break;
|
|
case 'date':
|
|
$newdate = false;
|
|
$withHour = true;
|
|
// try to convert string to date
|
|
// TODO convert to php 5.2 format
|
|
/*
|
|
* $newdate = date_create_from_format ( 'Y-m-d H:i:s', $value
|
|
* ); if (! $newdate) { $newdate = date_create_from_format (
|
|
* 'Y-m-d', $value ); $withHour = false; } if (! $newdate) {
|
|
* $newdate = date_create_from_format ( 'd/m/Y', $value );
|
|
* $withHour = false; } if (! $newdate) { $newdate =
|
|
* date_create_from_format ( 'j/m/Y', $value ); $withHour =
|
|
* false; }
|
|
*/
|
|
$newdate = strtotime($value);
|
|
if (!$newdate) {
|
|
$typeSufix = '*'; // not store field
|
|
} else {
|
|
$typeSufix = '_tdt';
|
|
/*
|
|
* if ($withHour) //$value = gmdate ( "Y-m-d\TH:i:s\Z",
|
|
* $newdate->getTimestamp () ); $value = gmdate (
|
|
* "Y-m-d\TH:i:s\Z", $newdate ); else { $value = gmdate (
|
|
* "Y-m-d\T00:00:00\Z", $newdate ); }
|
|
*/
|
|
$value = gmdate("Y-m-d\T00:00:00\Z", $newdate);
|
|
}
|
|
break;
|
|
case 'dropdown':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'textarea':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'currency':
|
|
$typeSufix = '_td';
|
|
$value = floatval($value);
|
|
break;
|
|
case 'percentage':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'password':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'suggest':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'yesno':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'listbox':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'checkbox':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'checkgroup':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'radiogroup':
|
|
$typeSufix = '_t';
|
|
break;
|
|
case 'hidden':
|
|
$typeSufix = '_t';
|
|
break;
|
|
}
|
|
if ($typeSufix != '*') {
|
|
$value = trim($value);
|
|
$pairs = array(
|
|
"\x03" => "",
|
|
"\x04" => "",
|
|
"\x05" => "",
|
|
"\x06" => "",
|
|
"\x07" => "",
|
|
"\x08" => "",
|
|
"\x0E" => "",
|
|
"\x16" => "",
|
|
"\x00-" => "",
|
|
"\x09" => "",
|
|
"\x11" => "",
|
|
"\x12" => "",
|
|
"\x14-" => "",
|
|
"\x1f" => "",
|
|
"\x7f" => "",
|
|
);
|
|
$value = strtr($value, $pairs);
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', trim($k) . $typeSufix);
|
|
$writer->startCData();
|
|
$writer->text($value);
|
|
$writer->endCData();
|
|
$writer->endElement();
|
|
}
|
|
} else {
|
|
$value = trim($value);
|
|
$pairs = array(
|
|
"\x03" => "",
|
|
"\x04" => "",
|
|
"\x05" => "",
|
|
"\x06" => "",
|
|
"\x07" => "",
|
|
"\x08" => "",
|
|
"\x0E" => "",
|
|
"\x16" => "",
|
|
"\x00-" => "",
|
|
"\x09" => "",
|
|
"\x11" => "",
|
|
"\x12" => "",
|
|
"\x14-" => "",
|
|
"\x1f" => "",
|
|
"\x7f" => "",
|
|
);
|
|
$value = strtr($value, $pairs);
|
|
$writer->startElement("field");
|
|
$writer->writeAttribute('name', trim($k) . '_t');
|
|
$writer->startCData();
|
|
$writer->text($value);
|
|
$writer->endCData();
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
} // foreach unserialized data
|
|
}// else unserialize APP_DATA
|
|
} // empty APP_DATA
|
|
|
|
$writer->endElement(); // end /doc
|
|
|
|
return $writer->outputMemory(true);
|
|
}
|
|
|
|
/**
|
|
* Search records in specified application delegation data
|
|
*
|
|
* @param string $AppUID
|
|
* application identifier
|
|
* @param string $allAppDbData
|
|
* array of rows (array) with application data
|
|
* @throws ApplicationWithoutDelegationRecordsException
|
|
* @return array array of arrays with the following information(
|
|
* $documentInformation,
|
|
* $dynaformFieldTypes,
|
|
* $lastUpdateDate,
|
|
* $maxPriority,
|
|
* $delLastIndex,
|
|
* $assignedUsers,
|
|
* $assignedUsersRead,
|
|
* $assignedUsersUnread,
|
|
* $draftUser,
|
|
* $participatedUsers,
|
|
* $participatedUsersStartedByUser,
|
|
* $participatedUsersCompletedByUser,
|
|
* $unassignedUsers,
|
|
* $unassignedGroups
|
|
*/
|
|
public function getApplicationIndexData($AppUID, $allAppDbData)
|
|
{
|
|
// get all the application data
|
|
//$allAppDbData = $this->getApplicationDelegationData ($AppUID);
|
|
// check if the application record was found
|
|
// this case occurs when the application doesn't have related delegation
|
|
// records.
|
|
if (empty($allAppDbData) || !isset($allAppDbData [0])) {
|
|
throw new ApplicationWithoutDelegationRecordsException(date('Y-m-d H:i:s:u') . " Application without delegation records. APP_UID: " . $AppUID . "\n");
|
|
}
|
|
|
|
// copy the application information
|
|
$documentInformation = $allAppDbData [0];
|
|
|
|
// get the last delegate date using the del_delegate_date
|
|
$index = $this->aaGetMaximun($allAppDbData, 'DEL_DELEGATE_DATE', 'DATE');
|
|
|
|
$lastUpdateDate = $allAppDbData [$index] ['DEL_DELEGATE_DATE'];
|
|
|
|
// get the delegate with max priority => minimun value
|
|
$index2 = $this->aaGetMinimun($allAppDbData, 'DEL_PRIORITY', 'NUMBER', 'DEL_THREAD_STATUS', 'OPEN');
|
|
|
|
if ($index2 == null) {
|
|
// get the last priority
|
|
$maxPriority = $allAppDbData [$index] ['DEL_PRIORITY'];
|
|
} else {
|
|
$maxPriority = $allAppDbData [$index2] ['DEL_PRIORITY'];
|
|
}
|
|
|
|
//get last delegation
|
|
//in the case of parallel cases see the open cases
|
|
$delLastIndex = array();
|
|
$appStatus = $allAppDbData [0]['APP_STATUS'];
|
|
if ($appStatus == 'COMPLETED' || $appStatus == 'CANCELLED' || $appStatus == 'PAUSED') {
|
|
//case closed
|
|
//get the last delegation
|
|
//The correct would be to get all the cases paused in parallel cases
|
|
$index = $this->aaGetMaximun($allAppDbData, 'DEL_INDEX', 'NUMBER');
|
|
$delLastIndex[] = $allAppDbData [$index] ['DEL_INDEX'];
|
|
} else {
|
|
//case is vigent
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'DEL_THREAD_STATUS' => 'OPEN',
|
|
'DEL_FINISH_DATE' => 'NULL'
|
|
));
|
|
foreach ($indexes as $index) {
|
|
$delLastIndex[] = $allAppDbData [$index] ['DEL_INDEX'];
|
|
}
|
|
if (count($indexes) == 0) {
|
|
//verify if is a paused case
|
|
//show the last delegation
|
|
//the correct would be to identify multiple cases if paused
|
|
$index = $this->aaGetMaximun($allAppDbData, 'DEL_INDEX', 'NUMBER');
|
|
$delLastIndex[] = $allAppDbData [$index] ['DEL_INDEX'];
|
|
}
|
|
}
|
|
|
|
$assignedUsers = array();
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'DEL_THREAD_STATUS' => 'OPEN',
|
|
'DEL_FINISH_DATE' => 'NULL',
|
|
'APP_STATUS' => 'TO_DO', //, 'APP_THREAD_STATUS' => 'OPEN'
|
|
'APP_TYPE' => ''
|
|
));
|
|
foreach ($indexes as $index) {
|
|
$assignedUsers [] = array(
|
|
'USR_UID' => $allAppDbData [$index] ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$index] ['DEL_INDEX']
|
|
);
|
|
}
|
|
|
|
$assignedUsersRead = array();
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'DEL_THREAD_STATUS' => 'OPEN',
|
|
'DEL_FINISH_DATE' => 'NULL',
|
|
'APP_STATUS' => 'TO_DO', //, 'APP_THREAD_STATUS' => 'OPEN',
|
|
'DEL_INIT_DATE' => 'NOTNULL'
|
|
));
|
|
foreach ($indexes as $index) {
|
|
$assignedUsersRead [] = array(
|
|
'USR_UID' => $allAppDbData [$index] ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$index] ['DEL_INDEX']
|
|
);
|
|
}
|
|
|
|
$assignedUsersUnread = array();
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'DEL_THREAD_STATUS' => 'OPEN',
|
|
'DEL_FINISH_DATE' => 'NULL',
|
|
'APP_STATUS' => 'TO_DO', //, 'APP_THREAD_STATUS' => 'OPEN',
|
|
'DEL_INIT_DATE' => 'NULL'
|
|
));
|
|
foreach ($indexes as $index) {
|
|
$assignedUsersUnread [] = array(
|
|
'USR_UID' => $allAppDbData [$index] ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$index] ['DEL_INDEX']
|
|
);
|
|
}
|
|
|
|
$draftUser = array();
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'DEL_THREAD_STATUS' => 'OPEN',
|
|
'DEL_FINISH_DATE' => 'NULL',
|
|
'APP_STATUS' => 'DRAFT'//, 'APP_THREAD_STATUS' => 'OPEN'
|
|
));
|
|
if (!empty($indexes)) {
|
|
$draftUser = array(
|
|
'USR_UID' => $allAppDbData [$indexes [0]] ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$indexes [0]] ['DEL_INDEX']
|
|
);
|
|
}
|
|
|
|
$participatedUsers = array();
|
|
foreach ($allAppDbData as $row) {
|
|
$participatedUsers [] = array(
|
|
'USR_UID' => $row ['USR_UID'],
|
|
'DEL_INDEX' => $row ['DEL_INDEX']
|
|
);
|
|
}
|
|
|
|
$participatedUsersStartedByUser = array();
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'DEL_INDEX' => '1'
|
|
));
|
|
foreach ($indexes as $index) {
|
|
$participatedUsersStartedByUser [] = array(
|
|
'USR_UID' => $allAppDbData [$index] ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$index] ['DEL_INDEX']
|
|
);
|
|
}
|
|
|
|
$participatedUsersCompletedByUser = array();
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'APP_STATUS' => 'COMPLETED'
|
|
));
|
|
foreach ($indexes as $index) {
|
|
$participatedUsersCompletedByUser [] = array(
|
|
'USR_UID' => $allAppDbData [$index] ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$index] ['DEL_INDEX']
|
|
);
|
|
}
|
|
|
|
$pausedUsers = array();
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'APP_TYPE' => 'PAUSE'
|
|
));
|
|
foreach ($indexes as $index) {
|
|
if ($allAppDbData [$index] ['APP_DISABLE_ACTION_USER'] == null || $allAppDbData [$index] ['APP_DISABLE_ACTION_USER'] == 0) {
|
|
$pausedUsers [] = array(
|
|
'USR_UID' => $allAppDbData [$index] ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$index] ['DEL_INDEX']
|
|
);
|
|
}
|
|
}
|
|
// search information of unassigned users
|
|
// the unassigned users are the self service users and groups.
|
|
// the self service users are defined in the TASKs of the PROCESS.
|
|
$unassignedUsers = array();
|
|
$unassignedGroups = array();
|
|
//filter only the delegations that are in selfservice status
|
|
// `USR_UID` = '' AND `DEL_FINISH_DATE` IS NULL
|
|
$indexes = $this->aaSearchRecords($allAppDbData, array(
|
|
'USR_UID' => 'NULL',
|
|
'DEL_FINISH_DATE' => 'NULL' //, 'APP_THREAD_STATUS' => 'OPEN'
|
|
));
|
|
foreach ($indexes as $index) {
|
|
$unassignedUsersGroups = array();
|
|
// use cache
|
|
//$oMemcache = PMmemcached::getSingleton ($this->_solrInstance);
|
|
//$unassignedUsersGroups = $oMemcache->get ("SOLR_UNASSIGNED_USERS_GROUPS_" . $allAppDbData [$index] ['PRO_UID'] . "_" . $allAppDbData [$index] ['TAS_UID']);
|
|
//if (! $unassignedUsersGroups) {
|
|
|
|
$unassignedUsersGroups = $this->getTaskUnassignedUsersGroupsData($allAppDbData [$index] ['PRO_UID'], $allAppDbData [$index] ['TAS_UID']);
|
|
|
|
// if the task has unassigned users or groups add del_index of delegation
|
|
//foreach ($unassignedUsersGroups as $i => $newRow) {
|
|
// $unassignedUsersGroups [$i] ['DEL_INDEX'] = $allAppDbData [$index] ['DEL_INDEX'];
|
|
//}
|
|
// store in cache
|
|
//$oMemcache->set ("SOLR_UNASSIGNED_USERS_GROUPS_" . $allAppDbData [$index] ['PRO_UID'] . "_" . $allAppDbData [$index] ['TAS_UID'], $unassignedUsersGroups);
|
|
//}
|
|
// copy list of unassigned users and groups
|
|
foreach ($unassignedUsersGroups as $unassignedUserGroup) {
|
|
//unassigned users
|
|
if ($unassignedUserGroup ['TU_RELATION'] == 1) {
|
|
$unassignedUsers [] = array(
|
|
'USR_UID' => $unassignedUserGroup ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$index] ['DEL_INDEX'] //$unassignedUserGroup ['DEL_INDEX']
|
|
);
|
|
}
|
|
//unassigned groups
|
|
elseif ($unassignedUserGroup ['TU_RELATION'] == 2) {
|
|
$unassignedGroups [] = array(
|
|
'USR_UID' => $unassignedUserGroup ['USR_UID'],
|
|
'DEL_INDEX' => $allAppDbData [$index] ['DEL_INDEX'] //$unassignedUserGroup ['DEL_INDEX']
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get DataTypes of dynaforms
|
|
// use cache array to store the dynaform variables per process
|
|
// use memory array to store information of Datatypes of Dynaforms
|
|
// All the datatypes of the process => all variables in all dynaforms in the
|
|
// process
|
|
$dynaformFieldTypes = array();
|
|
|
|
// get cache instance
|
|
//$oMemcache = PMmemcached::getSingleton ($this->_solrInstance);
|
|
//$dynaformFieldTypes = $oMemcache->get ("SOLR_DYNAFORM_FIELD_TYPES_" . $documentInformation ['PRO_UID']);
|
|
//if (! $dynaformFieldTypes) {
|
|
$dynaformFileNames = $this->getProcessDynaformFileNames($documentInformation ['PRO_UID']);
|
|
$dynaformFields = array();
|
|
foreach ($dynaformFileNames as $dynaformFileName) {
|
|
if (is_file(PATH_DYNAFORM . $dynaformFileName ['DYN_FILENAME'] . '.xml') &&
|
|
filesize(PATH_DYNAFORM . $dynaformFileName ['DYN_FILENAME'] . '.xml') > 0) {
|
|
$dyn = new DynaformHandler(PATH_DYNAFORM . $dynaformFileName ['DYN_FILENAME'] . '.xml');
|
|
$dynaformFields [] = $dyn->getFields();
|
|
}
|
|
if (is_file(PATH_DYNAFORM . $dynaformFileName ['DYN_FILENAME'] . '.xml') &&
|
|
filesize(PATH_DYNAFORM . $dynaformFileName ['DYN_FILENAME'] . '.xml') == 0) {
|
|
throw new ApplicationWithCorruptDynaformException(date('Y-m-d H:i:s:u') . "Application with corrupt dynaform. APP_UID: " . $AppUID . "\n");
|
|
}
|
|
}
|
|
|
|
foreach ($dynaformFields as $aDynFormFields) {
|
|
foreach ($aDynFormFields as $field) {
|
|
// create array of fields and types
|
|
if ($field->getAttribute('validate') == 'Int') {
|
|
$dynaformFieldTypes [$field->nodeName] = 'Int';
|
|
} elseif ($field->getAttribute('validate') == 'Real') {
|
|
$dynaformFieldTypes [$field->nodeName] = 'Real';
|
|
} else {
|
|
$dynaformFieldTypes [$field->nodeName] = $field->getAttribute('type');
|
|
}
|
|
}
|
|
}
|
|
$dynaformFieldTypes = $this->getVariablesDynaform($documentInformation['PRO_UID'], $dynaformFieldTypes);
|
|
// create cache of dynaformfields
|
|
//$oMemcache->set ("SOLR_DYNAFORM_FIELD_TYPES_" . $documentInformation ['PRO_UID'], $dynaformFieldTypes);
|
|
//}
|
|
// return result values
|
|
$result = array(
|
|
$documentInformation,
|
|
$dynaformFieldTypes,
|
|
$lastUpdateDate,
|
|
$maxPriority,
|
|
$delLastIndex,
|
|
$assignedUsers,
|
|
$assignedUsersRead,
|
|
$assignedUsersUnread,
|
|
$draftUser,
|
|
$participatedUsers,
|
|
$participatedUsersStartedByUser,
|
|
$participatedUsersCompletedByUser,
|
|
$unassignedUsers,
|
|
$unassignedGroups,
|
|
$pausedUsers
|
|
);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
*
|
|
*
|
|
* @param array $dynaformFieldTypes
|
|
* @return array
|
|
*/
|
|
public function getVariablesDynaform($processUid, $dynaformFieldTypes = array())
|
|
{
|
|
$criteria = new Criteria();
|
|
$criteria->add(ProcessVariablesPeer::PRJ_UID, $processUid);
|
|
$ds = ProcessVariablesPeer::doSelectRS($criteria);
|
|
$ds->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
while ($ds->next()) {
|
|
$row = $ds->getRow();
|
|
$type = "text";
|
|
if ($row["VAR_FIELD_TYPE"] === "datetime") {
|
|
$type = "date";
|
|
}
|
|
$dynaformFieldTypes[$row["VAR_NAME"]] = $type;
|
|
}
|
|
return $dynaformFieldTypes;
|
|
}
|
|
|
|
/**
|
|
* Find the maximun value of the specified column in the array and return the
|
|
* row index
|
|
*
|
|
* @param array $arr
|
|
* array of arrays with the data
|
|
* @param string $column
|
|
* column name to search in
|
|
* @param string $columnType
|
|
* column type STRING, NUMBER, DATE
|
|
* @param string $columnCondition
|
|
* column condition
|
|
* @param string $condition
|
|
* the condition
|
|
* @return integer The index of the maximun record in array
|
|
*/
|
|
public function aaGetMaximun($arr, $column, $columnType = 'STRING', $columnCondition = "", $condition = "")
|
|
{
|
|
// get first value
|
|
$auxValue = $arr [0] [$column];
|
|
$index = null;
|
|
foreach ($arr as $i => $row) {
|
|
switch ($columnType) {
|
|
case 'STRING':
|
|
if ((strnatcmp($row [$column], $auxValue) >= 0) && (($columnCondition == "") || ($row [$columnCondition] == $condition))) {
|
|
$auxValue = $row [$column];
|
|
$index = $i;
|
|
}
|
|
break;
|
|
case 'NUMBER':
|
|
if (($row [$column] >= $auxValue) && (($columnCondition == "") || ($row [$columnCondition] == $condition))) {
|
|
$auxValue = $row [$column];
|
|
$index = $i;
|
|
}
|
|
break;
|
|
case 'DATE':
|
|
if ((strtotime($row [$column]) >= strtotime($auxValue)) && (($columnCondition == "") || ($row [$columnCondition] == $condition))) {
|
|
$auxValue = $row [$column];
|
|
$index = $i;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return $index;
|
|
}
|
|
|
|
/**
|
|
* Get minimum of array of arrays
|
|
*
|
|
* @param array $arr
|
|
* array of arrays with the data
|
|
* @param string $column
|
|
* the name of the column to search in
|
|
* @param string $columnType
|
|
* the column type STRING, NUMBER, DATE
|
|
* @param string $columnCondition
|
|
* the column condition
|
|
* @param string $condition
|
|
* the condition
|
|
* @return Ambigous <NULL, unknown> Index of the minimun value found
|
|
*/
|
|
public function aaGetMinimun($arr, $column, $columnType = 'STRING', $columnCondition = "", $condition = "")
|
|
{
|
|
// get first value
|
|
$auxValue = $arr [0] [$column];
|
|
$index = null;
|
|
foreach ($arr as $i => $row) {
|
|
switch ($columnType) {
|
|
case 'STRING':
|
|
if ((strnatcmp($row [$column], $auxValue) <= 0) && (($columnCondition == "") || ($row [$columnCondition] == $condition))) {
|
|
$auxValue = $row [$column];
|
|
$index = $i;
|
|
}
|
|
break;
|
|
case 'NUMBER':
|
|
if (($row [$column] <= $auxValue) && (($columnCondition == "") || ($row [$columnCondition] == $condition))) {
|
|
$auxValue = $row [$column];
|
|
$index = $i;
|
|
}
|
|
break;
|
|
case 'DATE':
|
|
if ((strtotime($row [$column]) <= strtotime($auxValue)) && (($columnCondition == "") || ($row [$columnCondition] == $condition))) {
|
|
$auxValue = $row [$column];
|
|
$index = $i;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return $index;
|
|
}
|
|
|
|
/**
|
|
* Search array of indexes that fullfill the conditions
|
|
*
|
|
* @param
|
|
* array of arrays $arr contains the arrays that are searched
|
|
* @param array $andColumnsConditions
|
|
* contain the conditions that must fullfill 'Column'=>'Condition'
|
|
* @return array of indexes with the found records
|
|
*/
|
|
public function aaSearchRecords($arr, $andColumnsConditions)
|
|
{
|
|
$indexes = array();
|
|
$isEqual = true;
|
|
foreach ($arr as $i => $row) {
|
|
$evaluateRow = false;
|
|
// evaluate each row
|
|
foreach ($andColumnsConditions as $column => $valueCondition) {
|
|
$condition = $valueCondition;
|
|
$isEqual = true;
|
|
if ($valueCondition == 'NULL') {
|
|
$isEqual = true;
|
|
$condition = '';
|
|
}
|
|
if ($valueCondition == 'NOTNULL') {
|
|
$isEqual = false;
|
|
$condition = '';
|
|
}
|
|
if ($isEqual) {
|
|
if ($row [$column] == $condition) {
|
|
$evaluateRow = true;
|
|
} else {
|
|
$evaluateRow = false;
|
|
break;
|
|
}
|
|
} else {
|
|
if ($row [$column] != $condition) {
|
|
$evaluateRow = true;
|
|
} else {
|
|
$evaluateRow = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// add row to indexes
|
|
if ($evaluateRow) {
|
|
$indexes [] = $i;
|
|
}
|
|
}
|
|
return $indexes;
|
|
}
|
|
|
|
/**
|
|
* Get application and delegation data from database
|
|
*
|
|
* @param string $AppUID
|
|
* the application identifier
|
|
* @return array of records from database
|
|
*/
|
|
public function getApplicationDelegationData($AppUID)
|
|
{
|
|
$allAppDbData = array();
|
|
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(ApplicationPeer::APP_UID);
|
|
$c->addSelectColumn(ApplicationPeer::APP_TITLE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_NUMBER);
|
|
$c->addSelectColumn(ApplicationPeer::APP_STATUS);
|
|
$c->addSelectColumn(ApplicationPeer::PRO_UID);
|
|
$c->addSelectColumn(ApplicationPeer::APP_CREATE_DATE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_FINISH_DATE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_UPDATE_DATE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_DATA);
|
|
|
|
$c->addSelectColumn(ProcessPeer::PRO_TITLE);
|
|
|
|
$c->addSelectColumn('ad.DEL_INDEX');
|
|
$c->addSelectColumn('ad.DEL_PREVIOUS');
|
|
$c->addSelectColumn('ad.TAS_UID');
|
|
$c->addSelectColumn('ad.USR_UID');
|
|
$c->addSelectColumn('ad.DEL_TYPE');
|
|
$c->addSelectColumn('ad.DEL_THREAD');
|
|
$c->addSelectColumn('ad.DEL_THREAD_STATUS');
|
|
$c->addSelectColumn('ad.DEL_PRIORITY');
|
|
$c->addSelectColumn('ad.DEL_DELEGATE_DATE');
|
|
$c->addSelectColumn('ad.DEL_INIT_DATE');
|
|
$c->addSelectColumn('ad.DEL_TASK_DUE_DATE');
|
|
$c->addSelectColumn('ad.DEL_FINISH_DATE');
|
|
$c->addSelectColumn('ad.DEL_DURATION');
|
|
$c->addSelectColumn('ad.DEL_QUEUE_DURATION');
|
|
$c->addSelectColumn('ad.DEL_DELAY_DURATION');
|
|
$c->addSelectColumn('ad.DEL_STARTED');
|
|
$c->addSelectColumn('ad.DEL_FINISHED');
|
|
$c->addSelectColumn('ad.DEL_DELAYED');
|
|
$c->addSelectColumn('ad.APP_OVERDUE_PERCENTAGE');
|
|
|
|
$c->addSelectColumn('at.APP_THREAD_INDEX');
|
|
$c->addSelectColumn('at.APP_THREAD_PARENT');
|
|
$c->addSelectColumn('at.APP_THREAD_STATUS');
|
|
|
|
$c->addAlias('ad', 'APP_DELEGATION');
|
|
$c->addAlias('at', 'APP_THREAD');
|
|
|
|
$c->addJoin(ApplicationPeer::PRO_UID, ProcessPeer::PRO_UID, Criteria::LEFT_JOIN);
|
|
$c->addJoin(ApplicationPeer::APP_UID, 'ad.APP_UID', Criteria::JOIN);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
'ad.APP_UID',
|
|
'at.APP_UID'
|
|
);
|
|
$aConditions [] = array(
|
|
'ad.DEL_THREAD',
|
|
'at.APP_THREAD_INDEX'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::JOIN);
|
|
|
|
$c->add(ApplicationPeer::APP_UID, $AppUID);
|
|
|
|
$rs = ApplicationPeer::doSelectRS($c);
|
|
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
|
|
while (is_array($row)) {
|
|
$allAppDbData [] = $row;
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
}
|
|
|
|
//Propel::close();
|
|
|
|
return $allAppDbData;
|
|
}
|
|
|
|
/**
|
|
* Get application and delegation data from database
|
|
*
|
|
* @param string $aAppUID
|
|
* array of application identifiers
|
|
* @return array of array of records from database
|
|
*/
|
|
public function getListApplicationUpdateDelegationData($aaAppUIDs)
|
|
{
|
|
$allAppDbData = array();
|
|
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(ApplicationPeer::APP_UID);
|
|
$c->addSelectColumn(ApplicationPeer::APP_TITLE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_NUMBER);
|
|
$c->addSelectColumn(ApplicationPeer::APP_STATUS);
|
|
$c->addSelectColumn(ApplicationPeer::PRO_UID);
|
|
$c->addSelectColumn(ApplicationPeer::APP_CREATE_DATE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_FINISH_DATE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_UPDATE_DATE);
|
|
$c->addSelectColumn(ApplicationPeer::APP_DATA);
|
|
|
|
$c->addSelectColumn('pro.PRO_TITLE');
|
|
|
|
$c->addSelectColumn('ad.DEL_INDEX');
|
|
$c->addSelectColumn('ad.DEL_PREVIOUS');
|
|
$c->addSelectColumn('ad.TAS_UID');
|
|
$c->addSelectColumn('ad.USR_UID');
|
|
$c->addSelectColumn('ad.DEL_TYPE');
|
|
$c->addSelectColumn('ad.DEL_THREAD');
|
|
$c->addSelectColumn('ad.DEL_THREAD_STATUS');
|
|
$c->addSelectColumn('ad.DEL_PRIORITY');
|
|
$c->addSelectColumn('ad.DEL_DELEGATE_DATE');
|
|
$c->addSelectColumn('ad.DEL_INIT_DATE');
|
|
$c->addSelectColumn('ad.DEL_TASK_DUE_DATE');
|
|
$c->addSelectColumn('ad.DEL_FINISH_DATE');
|
|
$c->addSelectColumn('ad.DEL_DURATION');
|
|
$c->addSelectColumn('ad.DEL_QUEUE_DURATION');
|
|
$c->addSelectColumn('ad.DEL_DELAY_DURATION');
|
|
$c->addSelectColumn('ad.DEL_STARTED');
|
|
$c->addSelectColumn('ad.DEL_FINISHED');
|
|
$c->addSelectColumn('ad.DEL_DELAYED');
|
|
$c->addSelectColumn('ad.APP_OVERDUE_PERCENTAGE');
|
|
|
|
$c->addSelectColumn('at.APP_THREAD_INDEX');
|
|
$c->addSelectColumn('at.APP_THREAD_PARENT');
|
|
$c->addSelectColumn('at.APP_THREAD_STATUS');
|
|
|
|
$c->addSelectColumn('ade.APP_DELAY_UID');
|
|
$c->addSelectColumn('ade.APP_TYPE');
|
|
$c->addSelectColumn('ade.APP_DISABLE_ACTION_USER');
|
|
|
|
$c->addAsColumn("PRO_CATEGORY_UID", "pro.PRO_CATEGORY");
|
|
|
|
$c->addAlias('ad', 'APP_DELEGATION');
|
|
$c->addAlias('at', 'APP_THREAD');
|
|
$c->addAlias('ade', 'APP_DELAY');
|
|
$c->addAlias("pro", ProcessPeer::TABLE_NAME);
|
|
|
|
$c->addJoin(ApplicationPeer::PRO_UID, ProcessPeer::PRO_UID, Criteria::LEFT_JOIN);
|
|
$c->addJoin(ApplicationPeer::APP_UID, 'ad.APP_UID', Criteria::JOIN);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
'ad.APP_UID',
|
|
'at.APP_UID'
|
|
);
|
|
$aConditions [] = array(
|
|
'ad.DEL_THREAD',
|
|
'at.APP_THREAD_INDEX'
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::JOIN);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
'ad.APP_UID',
|
|
'ade.APP_UID'
|
|
);
|
|
$aConditions [] = array(
|
|
'ad.DEL_INDEX',
|
|
'ade.APP_DEL_INDEX'
|
|
);
|
|
//$aConditions [] = array (
|
|
// 'ade.APP_DISABLE_ACTION_USER',
|
|
// DBAdapter::getStringDelimiter () . 'null' . DBAdapter::getStringDelimiter ()
|
|
//);
|
|
$aConditions [] = array(
|
|
'ade.APP_DISABLE_ACTION_USER',
|
|
DBAdapter::getStringDelimiter() . '0' . DBAdapter::getStringDelimiter()
|
|
);
|
|
$aConditions [] = array(
|
|
'ade.APP_TYPE',
|
|
DBAdapter::getStringDelimiter() . 'PAUSE' . DBAdapter::getStringDelimiter()
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::LEFT_JOIN);
|
|
|
|
|
|
$arrayCondition = array();
|
|
$arrayCondition[] = array(ApplicationPeer::PRO_UID, "pro.PRO_UID");
|
|
$c->addJoinMC($arrayCondition, Criteria::LEFT_JOIN);
|
|
|
|
$c->add(ApplicationPeer::APP_UID, $aaAppUIDs, Criteria::IN);
|
|
|
|
$rs = ApplicationPeer::doSelectRS($c);
|
|
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
|
|
while (is_array($row)) {
|
|
$allAppDbData [] = $row;
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
}
|
|
//Propel::close();
|
|
|
|
return $allAppDbData;
|
|
}
|
|
|
|
/**
|
|
* Get the list of groups of unassigned users of the specified task from
|
|
* database
|
|
*
|
|
* @param string $ProUID
|
|
* Process identifier
|
|
* @param string $TaskUID
|
|
* task identifier
|
|
* @return array of unassigned user groups
|
|
*/
|
|
public function getTaskUnassignedUsersGroupsData($ProUID, $TaskUID)
|
|
{
|
|
$unassignedUsersGroups = array();
|
|
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(TaskUserPeer::USR_UID);
|
|
$c->addSelectColumn(TaskUserPeer::TU_RELATION);
|
|
|
|
$aConditions = array();
|
|
$aConditions [] = array(
|
|
TaskPeer::TAS_UID,
|
|
TaskUserPeer::TAS_UID
|
|
);
|
|
$aConditions [] = array(
|
|
TaskPeer::TAS_ASSIGN_TYPE,
|
|
DBAdapter::getStringDelimiter() . 'SELF_SERVICE' . DBAdapter::getStringDelimiter()
|
|
);
|
|
$c->addJoinMC($aConditions, Criteria::JOIN);
|
|
|
|
$c->add(TaskPeer::PRO_UID, $ProUID);
|
|
$c->add(TaskPeer::TAS_UID, $TaskUID);
|
|
|
|
$rs = TaskPeer::doSelectRS($c);
|
|
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
// echo $c->toString();
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
|
|
while (is_array($row)) {
|
|
$unassignedUsersGroups [] = $row;
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
}
|
|
|
|
//Propel::close();
|
|
|
|
return $unassignedUsersGroups;
|
|
}
|
|
|
|
/**
|
|
* Get the list of dynaform file names associated with the specified process
|
|
* from database
|
|
*
|
|
* @param string $ProUID
|
|
* process identifier
|
|
* @return array of dynaform file names
|
|
*/
|
|
public function getProcessDynaformFileNames($ProUID)
|
|
{
|
|
$dynaformFileNames = array();
|
|
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(DynaformPeer::DYN_FILENAME);
|
|
|
|
$c->add(DynaformPeer::PRO_UID, $ProUID);
|
|
|
|
$rs = DynaformPeer::doSelectRS($c);
|
|
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
|
|
while (is_array($row)) {
|
|
$dynaformFileNames [] = $row;
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
}
|
|
|
|
//Propel::close();
|
|
|
|
return $dynaformFileNames;
|
|
}
|
|
|
|
/**
|
|
* Store a flag indicating if the application was updated in database
|
|
* table APP_SOLR_QUEUE
|
|
*
|
|
* @param string $AppUid
|
|
* applicatiom identifier
|
|
* @param integer $updated
|
|
* 0:false, not updated, 1: updated, 2:deleted
|
|
*/
|
|
public function applicationChangedUpdateSolrQueue($AppUid, $updated)
|
|
{
|
|
$traceData = $this->getCurrentTraceInfo();
|
|
//var_dump($traceData);
|
|
|
|
$oAppSolrQueue = new AppSolrQueue();
|
|
|
|
$oAppSolrQueue->createUpdate($AppUid, $traceData, $updated);
|
|
}
|
|
|
|
private function getCurrentTraceInfo()
|
|
{
|
|
$resultTraceString = "";
|
|
$traceData = debug_backtrace();
|
|
foreach ($traceData as $key => $value) {
|
|
if ($value['function'] != 'getCurrentTraceInfo' && $value['function'] != 'require_once') {
|
|
if (isset($value['file']) && isset($value['line']) && isset($value['function'])) {
|
|
$resultTraceString .= $value['file'] . " (" . $value['line'] . ") " . $value['function'] . "\n";
|
|
}
|
|
}
|
|
}
|
|
return $resultTraceString;
|
|
}
|
|
|
|
/**
|
|
* Update application records in Solr that are stored in APP_SOLR_QUEUE table
|
|
*/
|
|
public function synchronizePendingApplications()
|
|
{
|
|
if (!$this->isSolrEnabled()) {
|
|
throw new Exception(date('Y-m-d H:i:s:u') . " Error connecting to solr server.");
|
|
}
|
|
|
|
// check table of pending updates
|
|
$oAppSolrQueue = new AppSolrQueue();
|
|
|
|
$aAppSolrQueue = $oAppSolrQueue->getListUpdatedApplications();
|
|
|
|
$trunkSize = 100;
|
|
//filter updated cases
|
|
$aUpdatedApplications = array();
|
|
$aDeletedApplications = array();
|
|
foreach ($aAppSolrQueue as $oAppSolrQueueEntity) {
|
|
// call the syncronization function
|
|
if ($oAppSolrQueueEntity->appUpdated == 1) {
|
|
$aUpdatedApplications[] = array('APP_UID' => $oAppSolrQueueEntity->appUid);
|
|
}
|
|
if ($oAppSolrQueueEntity->appUpdated == 2) {
|
|
$aDeletedApplications[] = array('APP_UID' => $oAppSolrQueueEntity->appUid);
|
|
}
|
|
}
|
|
|
|
$totalCasesUpdated = count($aUpdatedApplications);
|
|
$loops = ((($totalCasesUpdated % $trunkSize) > 0) ? ($totalCasesUpdated / $trunkSize) + 1 : ($totalCasesUpdated / $trunkSize));
|
|
for ($i = 0; $i < $loops; $i++) {
|
|
//prepare trunk of appuids
|
|
$trunkUpdatedApplications = array_slice($aUpdatedApplications, $i * $trunkSize, $trunkSize);
|
|
|
|
$this->updateApplicationSearchIndex($trunkUpdatedApplications, true);
|
|
|
|
/* foreach($trunkUpdatedApplications as $appUid){
|
|
$this->applicationChangedUpdateSolrQueue ($appUid, 0);
|
|
} */
|
|
}
|
|
|
|
$totalCasesDeleted = count($aDeletedApplications);
|
|
$loops = ((($totalCasesDeleted % $trunkSize) > 0) ? ($totalCasesDeleted / $trunkSize) + 1 : ($totalCasesDeleted / $trunkSize));
|
|
for ($i = 0; $i < $loops; $i++) {
|
|
//prepare trunk of appuids
|
|
$trunkDeleteddApplications = array_slice($aDeletedApplications, $i * $trunkSize, $trunkSize);
|
|
|
|
$this->deleteApplicationSearchIndex($trunkDeleteddApplications, true);
|
|
|
|
/* foreach($trunkDeleteddApplications as $appUid){
|
|
$this->applicationChangedUpdateSolrQueue ($appUid, 0);
|
|
} */
|
|
}
|
|
|
|
/*
|
|
foreach ($aAppSolrQueue as $oAppSolrQueueEntity) {
|
|
// call the syncronization function
|
|
if($oAppSolrQueueEntity->appUpdated == 1){
|
|
$this->updateApplicationSearchIndex ($oAppSolrQueueEntity->appUid, false);
|
|
}
|
|
if($oAppSolrQueueEntity->appUpdated == 2){
|
|
$this->deleteApplicationSearchIndex ($oAppSolrQueueEntity->appUid, false);
|
|
}
|
|
$this->applicationChangedUpdateSolrQueue ($oAppSolrQueueEntity->appUid, 0);
|
|
} */
|
|
}
|
|
|
|
/**
|
|
* Get the total number of application records in database
|
|
*
|
|
* @return integer application counter
|
|
*/
|
|
public function getCountApplicationsPMOS2()
|
|
{
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(ApplicationPeer::APP_UID);
|
|
|
|
$count = ApplicationPeer::doCount($c);
|
|
|
|
//Propel::close();
|
|
|
|
return $count;
|
|
}
|
|
|
|
/**
|
|
* Get the total number of application records in search index
|
|
*
|
|
* @return integer application counter
|
|
*/
|
|
public function getCountApplicationsSearchIndex()
|
|
{
|
|
$searchIndex = new BpmnEngineServicesSearchIndex($this->_solrIsEnabled, $this->_solrHost);
|
|
// execute query
|
|
$count = $searchIndex->getNumberDocuments($this->_solrInstance);
|
|
|
|
return $count;
|
|
}
|
|
|
|
/**
|
|
* Optimize the records in search index
|
|
*
|
|
* @return
|
|
*/
|
|
public function optimizeSearchIndex()
|
|
{
|
|
$searchIndex = new BpmnEngineServicesSearchIndex($this->_solrIsEnabled, $this->_solrHost);
|
|
// execute query
|
|
$searchIndex->optimizeIndexChanges($this->_solrInstance);
|
|
}
|
|
|
|
/**
|
|
* Get a paginated list of application uids from database.
|
|
*
|
|
* @param integer $skip
|
|
* the offset from where to return the application records
|
|
* @param integer $pagesize
|
|
* the size of the page
|
|
* @return array of application id's in the specified page.
|
|
*/
|
|
public function getPagedApplicationUids($skip, $pagesize)
|
|
{
|
|
$c = new Criteria();
|
|
|
|
$c->addSelectColumn(ApplicationPeer::APP_UID);
|
|
$c->setOffset($skip);
|
|
$c->setLimit($pagesize);
|
|
|
|
$rs = ApplicationPeer::doSelectRS($c);
|
|
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
|
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
$appUIds = array();
|
|
while (is_array($row)) {
|
|
$appUIds [] = $row;
|
|
$rs->next();
|
|
$row = $rs->getRow();
|
|
}
|
|
|
|
//Propel::close();
|
|
|
|
return $appUIds;
|
|
}
|
|
|
|
/**
|
|
* Reindex all the application records in Solr server
|
|
* update applications in groups of 1000
|
|
*/
|
|
public function reindexAllApplications($SkipRecords = 0, $indexTrunkSize = 1000)
|
|
{
|
|
$trunk = $indexTrunkSize;
|
|
|
|
if (!$this->isSolrEnabled()) {
|
|
throw new Exception(date('Y-m-d H:i:s:u') . " Error connecting to solr server.");
|
|
}
|
|
|
|
// delete all documents to begin reindex
|
|
// deleteAllDocuments();
|
|
// commitChanges();
|
|
// print "Deleted all documents \n";
|
|
// search trunks of id's to regenerate index
|
|
$numRows = $this->getCountApplicationsPMOS2();
|
|
print "Total number of records: " . $numRows . "\n";
|
|
//
|
|
$initTimeAll = microtime(true);
|
|
|
|
for ($skip = $SkipRecords; $skip <= $numRows;) {
|
|
$aaAPPUIds = $this->getPagedApplicationUids($skip, $trunk);
|
|
printf("Indexing %d to %d \n", $skip, $skip + $trunk);
|
|
$initTimeDoc = microtime(true);
|
|
$this->updateApplicationSearchIndex($aaAPPUIds, false);
|
|
$curTimeDoc = gmdate('H:i:s', (microtime(true) - $initTimeDoc));
|
|
printf("Indexing document time: %s \n", $curTimeDoc);
|
|
$skip += $trunk;
|
|
}
|
|
$curTimeDoc = gmdate('H:i:s', (microtime(true) - $initTimeAll));
|
|
printf("Total reindex time: %s \n", $curTimeDoc);
|
|
printf("Reindex completed successfully!!.\n");
|
|
}
|
|
}
|