diff --git a/workflow/engine/classes/AppSolr.php b/workflow/engine/classes/AppSolr.php index 88678d95a..b45e8a4c3 100644 --- a/workflow/engine/classes/AppSolr.php +++ b/workflow/engine/classes/AppSolr.php @@ -1,2270 +1,2168 @@ _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' - );*/ + private $_solrIsEnabled = false; + private $_solrHost = ""; + private $_solrInstance = ""; + private $debug = false; //false + private $debugAppInfo = false; + private $trunkSizeAcumulated; + private $totalTimeAcumulated; - $columsToInclude = array ( - 'APP_PRO_TITLE', - 'APP_TITLE', - 'APP_UID', - 'DEL_MAX_PRIORITY' - ); + public function __construct($SolrEnabled, $SolrHost, $SolrInstance) + { + // define solr availability + $this->_solrIsEnabled = $this->isSolrEnabled(); + $this->_solrHost = $SolrHost; + $this->_solrInstance = $SolrInstance; + } - // 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); + /** + * 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; + } - $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 "; - } + /** + * 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 - //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 = Entity_SolrRequestData::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; + $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'] = 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; + $result ['success'] = false; + $result ['message'] = "Error description."; - //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']; + try { + if ($this->debug) { + $this->initTimeAll = microtime(true); } - }*/ - 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); + // 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' + ); */ - //var_dump($delIndexes); + $columsToInclude = array( + 'APP_PRO_TITLE', + 'APP_TITLE', + 'APP_UID', + 'DEL_MAX_PRIORITY' + ); - foreach ($delIndexes as $delIndex) { - $aRow = array (); + // create pagination data + $solrSearchText = ""; + $sortableCols = array(); + $sortCols = array(); + $sortDir = array(); + $numSortingCols = 0; - //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 - } + // define sort conditions, default APP_NUMBER, desc + // only one column is sorted + $dir = strtolower($dir); - //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 (!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 ++; } - 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 . "]"; - } + // 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 { - $searchText = str_replace( "[", "", $searchText ); - $searchText = str_replace( "]", "", $searchText ); - $searchText = str_replace( ":", "", $searchText ); - $searchText = ":[" . $searchText . "T00:00:00Z TO " . $searchText . "T23:59:59.999Z]"; + $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 = "\n"; + $xmlDoc .= "\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 .= "\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'] + ); } } } - // 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; + // 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(); } - } - $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 = Entity_SolrUpdateDocument::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); + 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"); } } - } - 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 = "\n"; - $xmlDoc .= "\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 .= "\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]; + 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'); + } } - 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']; + $dynaformFieldTypes = $this->getVariablesDynaform($documentInformation['PRO_UID'], $dynaformFieldTypes); + // create cache of dynaformfields + //$oMemcache->set ("SOLR_DYNAFORM_FIELD_TYPES_" . $documentInformation ['PRO_UID'], $dynaformFieldTypes); //} - // 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'] - ); - } - } - - } + // return result values + $result = array( + $documentInformation, + $dynaformFieldTypes, + $lastUpdateDate, + $maxPriority, + $delLastIndex, + $assignedUsers, + $assignedUsersRead, + $assignedUsersUnread, + $draftUser, + $participatedUsers, + $participatedUsersStartedByUser, + $participatedUsersCompletedByUser, + $unassignedUsers, + $unassignedGroups, + $pausedUsers + ); - // 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 (); + return $result; + } - // 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 */ @@ -2285,462 +2183,455 @@ class AppSolr 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; - } + /** + * 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; } - 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 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; - } + + /** + * 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 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; } - 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; + + /** + * 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; - if ($valueCondition == 'NULL') { - $isEqual = true; - $condition = ''; - } - if ($valueCondition == 'NOTNULL') { - $isEqual = false; - $condition = ''; - } - if ($isEqual) { - if ($row [$column] == $condition) { - $evaluateRow = true; - } - else { + foreach ($arr as $i => $row) { $evaluateRow = false; - breaK; - } + // 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; + } } - else { - if ($row [$column] != $condition) { - $evaluateRow = true; - } - else { - $evaluateRow = false; - breaK; - } + 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(); } - } - // 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); + //Propel::close(); - $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 (); + return $allAppDbData; } - //Propel::close(); + /** + * 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(); - 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 = new Criteria(); - $c->addSelectColumn ('at.APP_THREAD_INDEX'); - $c->addSelectColumn ('at.APP_THREAD_PARENT'); - $c->addSelectColumn ('at.APP_THREAD_STATUS'); + $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 ('ade.APP_DELAY_UID'); - $c->addSelectColumn ('ade.APP_TYPE'); - $c->addSelectColumn ('ade.APP_DISABLE_ACTION_USER'); + $c->addSelectColumn('pro.PRO_TITLE'); - $c->addAsColumn("PRO_CATEGORY_UID", "pro.PRO_CATEGORY"); + $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->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); - + $c->addSelectColumn('at.APP_THREAD_INDEX'); + $c->addSelectColumn('at.APP_THREAD_PARENT'); + $c->addSelectColumn('at.APP_THREAD_STATUS'); - $arrayCondition = array(); - $arrayCondition[] = array(ApplicationPeer::PRO_UID, "pro.PRO_UID"); - $c->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); - - $c->add (ApplicationPeer::APP_UID, $aaAppUIDs, Criteria::IN); + $c->addSelectColumn('ade.APP_DELAY_UID'); + $c->addSelectColumn('ade.APP_TYPE'); + $c->addSelectColumn('ade.APP_DISABLE_ACTION_USER'); - $rs = ApplicationPeer::doSelectRS ($c); - $rs->setFetchmode (ResultSet::FETCHMODE_ASSOC); + $c->addAsColumn("PRO_CATEGORY_UID", "pro.PRO_CATEGORY"); - $rs->next (); - $row = $rs->getRow (); + $c->addAlias('ad', 'APP_DELEGATION'); + $c->addAlias('at', 'APP_THREAD'); + $c->addAlias('ade', 'APP_DELAY'); + $c->addAlias("pro", ProcessPeer::TABLE_NAME); - while (is_array ($row)) { - $allAppDbData [] = $row; - $rs->next (); - $row = $rs->getRow (); + $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; } - //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 (); + /** + * 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; } - - //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 (); + /** + * 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; } - - //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); + /** + * 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); - } + $oAppSolrQueue = new AppSolrQueue(); + + $oAppSolrQueue->createUpdate($AppUid, $traceData, $updated); + } private function getCurrentTraceInfo() { @@ -2756,184 +2647,184 @@ class AppSolr 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 (); + /** + * 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."); + } - $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 ); - } + // 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); + } */ } - $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); + /** + * Get the total number of application records in database + * + * @return integer application counter + */ + public function getCountApplicationsPMOS2() + { + $c = new Criteria(); - $this->updateApplicationSearchIndex ($trunkUpdatedApplications, true); + $c->addSelectColumn(ApplicationPeer::APP_UID); - /*foreach($trunkUpdatedApplications as $appUid){ - $this->applicationChangedUpdateSolrQueue ($appUid, 0); - }*/ + $count = ApplicationPeer::doCount($c); + + //Propel::close(); + + return $count; } - $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); + /** + * 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); - $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 (); + return $count; } - //Propel::close(); + /** + * Optimize the records in search index + * + * @return + */ + public function optimizeSearchIndex() + { + $searchIndex = new BpmnEngineServicesSearchIndex($this->_solrIsEnabled, $this->_solrHost); + // execute query + $searchIndex->optimizeIndexChanges($this->_solrInstance); + } - 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; + /** + * 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(); - if(!$this->isSolrEnabled()) - throw new Exception(date('Y-m-d H:i:s:u') . " Error connecting to solr server."); + $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 (); + $numRows = $this->getCountApplicationsPMOS2(); print "Total number of records: " . $numRows . "\n"; // - $initTimeAll = microtime (true); + $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); + $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"); } - $curTimeDoc = gmdate ('H:i:s', (microtime (true) - $initTimeAll)); - printf ("Total reindex time: %s \n", $curTimeDoc); - printf ("Reindex completed successfully!!.\n"); - } - } diff --git a/workflow/engine/classes/BpmnEngineSearchIndexAccessSolr.php b/workflow/engine/classes/BpmnEngineSearchIndexAccessSolr.php index 13192ef84..f50765c5e 100644 --- a/workflow/engine/classes/BpmnEngineSearchIndexAccessSolr.php +++ b/workflow/engine/classes/BpmnEngineSearchIndexAccessSolr.php @@ -6,6 +6,7 @@ class BpmnEngineSearchIndexAccessSolr { const SOLR_VERSION = '&version=2.2'; + private $_solrIsEnabled = false; private $_solrHost = ""; @@ -78,7 +79,7 @@ class BpmnEngineSearchIndexAccessSolr // verify the result of solr $responseSolrTotal = G::json_decode($responseTotal); if ($responseSolrTotal->responseHeader->status != 0) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error returning the total number of documents in Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error returning the total number of documents in Solr." . $solrIntruct . " response error: " . $response . "\n"); } $numTotalDocs = $responseSolrTotal->response->numFound; return $numTotalDocs; @@ -99,13 +100,13 @@ class BpmnEngineSearchIndexAccessSolr $workspace = $solrRequestData->workspace; // format request - $query = empty ($solrRequestData->searchText) ? '*:*' : $solrRequestData->searchText; + $query = empty($solrRequestData->searchText) ? '*:*' : $solrRequestData->searchText; $query = rawurlencode($query); $start = '&start=' . $solrRequestData->startAfter; $rows = '&rows=' . $solrRequestData->pageSize; $fieldList = ''; $cols = $solrRequestData->includeCols; - if (!empty ($cols)) { + if (!empty($cols)) { $fieldList = "&fl=" . implode(",", $cols); } $sort = ''; @@ -117,7 +118,7 @@ class BpmnEngineSearchIndexAccessSolr $sort = substr_replace($sort, "", -1); } - $resultFormat = empty ($solrRequestData->resultFormat) ? '' : '&wt=' . $solrRequestData->resultFormat; + $resultFormat = empty($solrRequestData->resultFormat) ? '' : '&wt=' . $solrRequestData->resultFormat; $filters = ''; $aFilters = explode(',', $solrRequestData->filterText); foreach ($aFilters as $value) { @@ -159,7 +160,7 @@ class BpmnEngineSearchIndexAccessSolr // decode $responseSolr = G::json_decode($response); if ($responseSolr->responseHeader->status != 0) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error executing query to Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error executing query to Solr." . $solrIntruct . " response error: " . $response . "\n"); } return $responseSolr; @@ -186,9 +187,8 @@ class BpmnEngineSearchIndexAccessSolr curl_setopt($handler, CURLOPT_HTTPHEADER, array( 'Content-type:application/xml' )); - curl_setopt($handler, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary + curl_setopt($handler, CURLOPT_BINARYTRANSFER, true); // --data-binary curl_setopt($handler, CURLOPT_POSTFIELDS, $solrUpdateDocument->document); // data - //Apply proxy settings $sysConf = PmSystem::getSystemConfiguration(); if ($sysConf['proxy_host'] != '') { @@ -207,7 +207,7 @@ class BpmnEngineSearchIndexAccessSolr $swOk = strpos($response, '0'); if (!$swOk) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error updating document in Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error updating document in Solr." . $solrIntruct . " response error: " . $response . "\n"); } } @@ -232,9 +232,8 @@ class BpmnEngineSearchIndexAccessSolr curl_setopt($handler, CURLOPT_HTTPHEADER, array( 'Content-type:application/xml' )); - curl_setopt($handler, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary + curl_setopt($handler, CURLOPT_BINARYTRANSFER, true); // --data-binary curl_setopt($handler, CURLOPT_POSTFIELDS, ""); // data - //Apply proxy settings $sysConf = PmSystem::getSystemConfiguration(); if ($sysConf['proxy_host'] != '') { @@ -253,7 +252,7 @@ class BpmnEngineSearchIndexAccessSolr $swOk = strpos($response, '0'); if (!$swOk) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error commiting changes in Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error commiting changes in Solr." . $solrIntruct . " response error: " . $response . "\n"); } } @@ -278,9 +277,8 @@ class BpmnEngineSearchIndexAccessSolr curl_setopt($handler, CURLOPT_HTTPHEADER, array( 'Content-type:application/xml' )); - curl_setopt($handler, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary + curl_setopt($handler, CURLOPT_BINARYTRANSFER, true); // --data-binary curl_setopt($handler, CURLOPT_POSTFIELDS, ""); // data - //Apply proxy settings $sysConf = PmSystem::getSystemConfiguration(); if ($sysConf['proxy_host'] != '') { @@ -299,7 +297,7 @@ class BpmnEngineSearchIndexAccessSolr $swOk = strpos($response, '0'); if (!$swOk) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error rolling back changes in Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error rolling back changes in Solr." . $solrIntruct . " response error: " . $response . "\n"); } } @@ -324,9 +322,8 @@ class BpmnEngineSearchIndexAccessSolr curl_setopt($handler, CURLOPT_HTTPHEADER, array( 'Content-type:application/xml' )); - curl_setopt($handler, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary + curl_setopt($handler, CURLOPT_BINARYTRANSFER, true); // --data-binary curl_setopt($handler, CURLOPT_POSTFIELDS, ""); // data - //Apply proxy settings $sysConf = PmSystem::getSystemConfiguration(); if ($sysConf['proxy_host'] != '') { @@ -345,7 +342,7 @@ class BpmnEngineSearchIndexAccessSolr $swOk = strpos($response, '0'); if (!$swOk) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error optimizing changes in Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error optimizing changes in Solr." . $solrIntruct . " response error: " . $response . "\n"); } } @@ -386,7 +383,7 @@ class BpmnEngineSearchIndexAccessSolr // decode $responseSolr = G::json_decode($response); if ($responseSolr->responseHeader->status != 0) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error getting index fields in Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error getting index fields in Solr." . $solrIntruct . " response error: " . $response . "\n"); } return $responseSolr; } @@ -413,13 +410,14 @@ class BpmnEngineSearchIndexAccessSolr curl_close($handler); //there's no response - if (!$response) + if (!$response) { return false; + } // decode $responseSolr = G::json_decode($response); if ($responseSolr->responseHeader->status != "OK") { - throw new Exception (date('Y-m-d H:i:s:u') . " Error pinging Solr server." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error pinging Solr server." . $solrIntruct . " response error: " . $response . "\n"); } return true; } @@ -445,9 +443,8 @@ class BpmnEngineSearchIndexAccessSolr curl_setopt($handler, CURLOPT_HTTPHEADER, array( 'Content-type:application/xml' )); - curl_setopt($handler, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary + curl_setopt($handler, CURLOPT_BINARYTRANSFER, true); // --data-binary curl_setopt($handler, CURLOPT_POSTFIELDS, "*:*"); // data - //Apply proxy settings $sysConf = PmSystem::getSystemConfiguration(); if ($sysConf['proxy_host'] != '') { @@ -467,7 +464,7 @@ class BpmnEngineSearchIndexAccessSolr $swOk = strpos($response, '0'); if (!$swOk) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error deleting all documents in Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error deleting all documents in Solr." . $solrIntruct . " response error: " . $response . "\n"); } } @@ -492,9 +489,8 @@ class BpmnEngineSearchIndexAccessSolr curl_setopt($handler, CURLOPT_HTTPHEADER, array( 'Content-type:application/xml' )); - curl_setopt($handler, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary + curl_setopt($handler, CURLOPT_BINARYTRANSFER, true); // --data-binary curl_setopt($handler, CURLOPT_POSTFIELDS, "" . $idQuery . ""); // data - //Apply proxy settings $sysConf = PmSystem::getSystemConfiguration(); if ($sysConf['proxy_host'] != '') { @@ -514,14 +510,14 @@ class BpmnEngineSearchIndexAccessSolr $swOk = strpos($response, '0'); if (!$swOk) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error deleting document in Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error deleting document in Solr." . $solrIntruct . " response error: " . $response . "\n"); } } /** * Execute a query in base to Request data * - * @param Entity_FacetRequest $facetRequestEntity + * @param EntityFacetRequest $facetRequestEntity * @return solr response: list of facets array */ public function getFacetsList($facetRequest) @@ -531,7 +527,7 @@ class BpmnEngineSearchIndexAccessSolr $workspace = $facetRequest->workspace; // format request - $query = empty ($facetRequest->searchText) ? '*:*' : $facetRequest->searchText; + $query = empty($facetRequest->searchText) ? '*:*' : $facetRequest->searchText; $query = rawurlencode($query); $start = '&start=0'; $rows = '&rows=0'; @@ -545,12 +541,12 @@ class BpmnEngineSearchIndexAccessSolr foreach ($facetRequest->facetQueries as $value) { $facets .= '&facet.query=' . $value; } - if (!empty ($facetRequest->facetDates)) { + if (!empty($facetRequest->facetDates)) { foreach ($facetRequest->facetDates as $value) { $facets .= '&facet.date=' . $value; } $facets .= '&facet.date.start=' . $facetRequest->facetDatesStart; - $facets .= '&facet.date.end=' . $facetRequest->facet | DatesEnd; + $facets .= '&facet.date.end=' . $facetRequest->facetDatesEnd; $facets .= '&facet.date.gap=' . $facetRequest->facetDateGap; } $filters = ''; @@ -595,7 +591,7 @@ class BpmnEngineSearchIndexAccessSolr // decode $responseSolr = G::json_decode($response); if ($responseSolr->responseHeader->status != 0) { - throw new Exception (date('Y-m-d H:i:s:u') . " Error getting faceted list from Solr." . $solrIntruct . " response error: " . $response . "\n"); + throw new Exception(date('Y-m-d H:i:s:u') . " Error getting faceted list from Solr." . $solrIntruct . " response error: " . $response . "\n"); } return $responseSolr; diff --git a/workflow/engine/classes/BpmnEngineServicesSearchIndex.php b/workflow/engine/classes/BpmnEngineServicesSearchIndex.php index 21df3695c..5d6687f33 100644 --- a/workflow/engine/classes/BpmnEngineServicesSearchIndex.php +++ b/workflow/engine/classes/BpmnEngineServicesSearchIndex.php @@ -74,7 +74,7 @@ class BpmnEngineServicesSearchIndex 'selectedFacetRemoveCondition' => $removeCondition ); - $aSelectedFacetGroups [] = Entity_SelectedFacetGroupItem::createForRequest($selectedFacetGroupData); + $aSelectedFacetGroups [] = EntitySelectedFacetGroupItem::createForRequest($selectedFacetGroupData); } // convert request to index request @@ -127,11 +127,11 @@ class BpmnEngineServicesSearchIndex $dataItem ['facetPrintName'] = $facetvalues [$i]; $dataItem ['facetCount'] = $facetvalues [$i + 1]; $dataItem ['facetSelectCondition'] = $facetRequestEntity->selectedFacetsString . (empty($facetRequestEntity->selectedFacetsString) ? '' : ',') . $data ['facetGroupName'] . '::' . $data ['facetGroupPrintName'] . ':::' . $dataItem ['facetName'] . '::' . $dataItem ['facetPrintName']; - $newFacetItem = Entity_FacetItem::createForInsert($dataItem); + $newFacetItem = EntityFacetItem::createForInsert($dataItem); $facetItems [] = $newFacetItem; } $data ['facetItems'] = $facetItems; - $newFacetGroup = Entity_FacetGroup::createForInsert($data); + $newFacetGroup = EntityFacetGroup::createForInsert($data); $facetGroups [] = $newFacetGroup; } @@ -165,13 +165,13 @@ class BpmnEngineServicesSearchIndex $dataItem ['facetCount'] = $facetvalues->$k; $dataItem ['facetSelectCondition'] = $facetRequestEntity->selectedFacetsString . (empty($facetRequestEntity->selectedFacetsString) ? '' : ',') . $data ['facetGroupName'] . '::' . $data ['facetGroupPrintName'] . ':::' . $dataItem ['facetName'] . '::' . $dataItem ['facetPrintName']; - $newFacetItem = Entity_FacetItem::createForInsert($dataItem); + $newFacetItem = EntityFacetItem::createForInsert($dataItem); $facetItems [] = $newFacetItem; } } $data ['facetItems'] = $facetItems; - $newFacetGroup = Entity_FacetGroup::createForInsert($data); + $newFacetGroup = EntityFacetGroup::createForInsert($data); $facetGroups [] = $newFacetGroup; } @@ -185,14 +185,14 @@ class BpmnEngineServicesSearchIndex $filterText .= $selectedFacetGroup->selectedFacetGroupName . ':' . urlencode($selectedFacetGroup->selectedFacetItemName) . ','; } $filterText = substr_replace($filterText, '', - 1); - + // Create result $dataFacetResult = array( 'aFacetGroups' => $facetGroups, 'aSelectedFacetGroups' => $aSelectedFacetGroups, 'sFilterText' => $filterText ); - $facetResult = Entity_FacetResult::createForRequest($dataFacetResult); + $facetResult = EntityFacetResult::createForRequest($dataFacetResult); return $facetResult; } @@ -266,7 +266,7 @@ class BpmnEngineServicesSearchIndex /** * Call Solr server to return the list of paginated pages. * @param FacetRequest $solrRequestData - * @return Entity_SolrQueryResult + * @return EntitySolrQueryResult */ public function getDataTablePaginatedList($solrRequestData) { @@ -285,7 +285,7 @@ class BpmnEngineServicesSearchIndex $numFound = $solrPaginatedResult->response->numFound; $docs = $solrPaginatedResult->response->docs; - + // insert list of names in docs result $data = array( "sEcho" => '', // must be completed in response @@ -310,7 +310,7 @@ class BpmnEngineServicesSearchIndex } } - $solrQueryResponse = Entity_SolrQueryResult::createForRequest($data); + $solrQueryResponse = EntitySolrQueryResult::createForRequest($data); return $solrQueryResponse; } @@ -332,7 +332,7 @@ class BpmnEngineServicesSearchIndex foreach ($solrFieldsData->fields as $key => $fieldData) { if (array_key_exists('dynamicBase', $fieldData)) { $originalFieldName = substr($key, 0, - strlen($fieldData->dynamicBase) + 1); - + // Maintain case sensitive variable names $listFields [$originalFieldName] = $key; } else { diff --git a/workflow/engine/classes/WsBase.php b/workflow/engine/classes/WsBase.php index e64c43a11..46661e383 100644 --- a/workflow/engine/classes/WsBase.php +++ b/workflow/engine/classes/WsBase.php @@ -307,7 +307,7 @@ class WsBase //Add del_index dynamic fields to list of resulting columns $columsToIncludeFinal = array_merge($columsToInclude, $delegationIndexes); - $solrRequestData = Entity_SolrRequestData::createForRequestPagination( + $solrRequestData = EntitySolrRequestData::createForRequestPagination( array( "workspace" => $solrEnv["solr_instance"], "startAfter" => 0, diff --git a/workflow/engine/classes/entities/EntityAppSolrQueue.php b/workflow/engine/classes/entities/EntityAppSolrQueue.php new file mode 100644 index 000000000..95c54094e --- /dev/null +++ b/workflow/engine/classes/entities/EntityAppSolrQueue.php @@ -0,0 +1,37 @@ +initializeObject($data); + + $requiredFields = array( + "appUid", + "appChangeDate", + "appChangeTrace", + "appUpdated" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntityBase.php b/workflow/engine/classes/entities/EntityBase.php new file mode 100644 index 000000000..55689d79a --- /dev/null +++ b/workflow/engine/classes/entities/EntityBase.php @@ -0,0 +1,148 @@ + $f) { + if (isset($this->temp [$f])) { + $fieldIsEmpty = false; + return $this->temp [$f]; + } + } + + // field empty means the user has not sent a value for this Field, so we are + // using the default value + if ($fieldIsEmpty) { + if ($default !== false) { + return $default; + } + } + } + + protected function validateRequiredFields($requiredFields = array()) + { + foreach ($requiredFields as $k => $field) { + if ($this->{$field} === null) { + throw (new Exception("Field $field is required in " . get_class($this))); + die(); + } + } + } + + /** + * Copy the values of the Entity to the array of aliases + * The array of aliases must be defined. + * + * @return Array of alias with the Entity values + */ + public function getAliasDataArray() + { + $aAlias = array(); + // get aliases from class + $className = get_class($this); + if (method_exists($className, 'GetAliases')) { + $aliases = call_user_func(array( + $className, + 'GetAliases' + )); + + foreach ($this as $field => $value) { + if (isset($aliases [$field])) { + // echo "Field exists in Aliases: " . $field . "\n"; + // echo "Alias Name:" . $aliases[$field] . "\n"; + // echo "Alias value:" . $value . "\n"; + $aAlias [$aliases [$field]] = $value; + } + } + } + + return $aAlias; + } + + /** + * Set the data from array of alias to Entity + * + * @param $aAliasData array of data of aliases + */ + public function setAliasDataArray($aAliasData) + { + // get aliases from class + $className = get_class($this); + if (method_exists($className, 'GetAliases')) { + $aliases = call_user_func(array( + $className, + 'GetAliases' + )); + // $aliases = $className::GetAliases (); + foreach ($this as $field => $value) { + if (isset($aliases [$field])) { + $this->{$field} = $aAliasData [$aliases [$field]]; + } + } + } + } + + /** + * Initialize object with values from $data. + * The values from data use properties or alias array. + * + * @param $data + */ + protected function initializeObject($data) + { + // get aliases from class + $className = get_class($this); + $aliases = array(); + $swAliases = false; + if (method_exists($className, 'GetAliases')) { + $aliases = call_user_func(array( + $className, + 'GetAliases' + )); + // $aliases = $className::GetAliases (); + $swAliases = true; + } + // use object properties or aliases to initialize + foreach ($this as $field => $value) { + if (isset($data [$field])) { + $this->$field = $data [$field]; + } elseif ($swAliases && isset($aliases [$field]) && isset($data [$aliases [$field]])) { + $this->$field = $data [$aliases [$field]]; + } + } + } + + public function serialize() + { + if (isset($this->temp)) { + unset($this->temp); + } + return serialize($this); + } + + public function unserialize($str) + { + $className = get_class($this); + $data = unserialize($str); + return new $className($data); + } +} diff --git a/workflow/engine/classes/entities/EntityFacetGroup.php b/workflow/engine/classes/entities/EntityFacetGroup.php new file mode 100644 index 000000000..045bc5284 --- /dev/null +++ b/workflow/engine/classes/entities/EntityFacetGroup.php @@ -0,0 +1,36 @@ +initializeObject($data); + + $requiredFields = array( + "facetGroupName", + "facetItems" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntityFacetInterfaceRequest.php b/workflow/engine/classes/entities/EntityFacetInterfaceRequest.php new file mode 100644 index 000000000..f1d6a94ae --- /dev/null +++ b/workflow/engine/classes/entities/EntityFacetInterfaceRequest.php @@ -0,0 +1,40 @@ +initializeObject($data); + + $requiredFields = array( + "searchText", + "selectedFacetsString" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntityFacetInterfaceResult.php b/workflow/engine/classes/entities/EntityFacetInterfaceResult.php new file mode 100644 index 000000000..651e54e3a --- /dev/null +++ b/workflow/engine/classes/entities/EntityFacetInterfaceResult.php @@ -0,0 +1,36 @@ +initializeObject($data); + + $requiredFields = array( + "aFacetGroup", + "aSelectedFacetGroupItem", + "sFilterText" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntityFacetItem.php b/workflow/engine/classes/entities/EntityFacetItem.php new file mode 100644 index 000000000..84df00cf9 --- /dev/null +++ b/workflow/engine/classes/entities/EntityFacetItem.php @@ -0,0 +1,36 @@ +initializeObject($data); + + $requiredFields = array( + "facetName", + "facetCount" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntityFacetRequest.php b/workflow/engine/classes/entities/EntityFacetRequest.php new file mode 100644 index 000000000..e8b38d989 --- /dev/null +++ b/workflow/engine/classes/entities/EntityFacetRequest.php @@ -0,0 +1,41 @@ +initializeObject($data); + + $requiredFields = array( + "workspace" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntityFacetResult.php b/workflow/engine/classes/entities/EntityFacetResult.php new file mode 100644 index 000000000..4ba58d9cb --- /dev/null +++ b/workflow/engine/classes/entities/EntityFacetResult.php @@ -0,0 +1,35 @@ +initializeObject($data); + + $requiredFields = array( + "aFacetGroups", + "aSelectedFacetGroups", + "sFilterText" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntitySelectedFacetGroupItem.php b/workflow/engine/classes/entities/EntitySelectedFacetGroupItem.php new file mode 100644 index 000000000..fcf6b5a14 --- /dev/null +++ b/workflow/engine/classes/entities/EntitySelectedFacetGroupItem.php @@ -0,0 +1,38 @@ +initializeObject($data); + + $requiredFields = array( + "selectedFacetGroupName", + "selectedFacetItemName" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntitySolrQueryResult.php b/workflow/engine/classes/entities/EntitySolrQueryResult.php new file mode 100644 index 000000000..355fb8f91 --- /dev/null +++ b/workflow/engine/classes/entities/EntitySolrQueryResult.php @@ -0,0 +1,38 @@ +initializeObject($data); + + $requiredFields = array( + 'sEcho', + 'iTotalRecords', + 'iTotalDisplayRecords', + 'aaData' + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntitySolrRequestData.php b/workflow/engine/classes/entities/EntitySolrRequestData.php new file mode 100644 index 000000000..9b3eea5b8 --- /dev/null +++ b/workflow/engine/classes/entities/EntitySolrRequestData.php @@ -0,0 +1,44 @@ +initializeObject($data); + + $requiredFields = array( + 'workspace' + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/EntitySolrUpdateDocument.php b/workflow/engine/classes/entities/EntitySolrUpdateDocument.php new file mode 100644 index 000000000..e132faf0a --- /dev/null +++ b/workflow/engine/classes/entities/EntitySolrUpdateDocument.php @@ -0,0 +1,33 @@ +initializeObject($data); + + $requiredFields = array( + "workspace", + "document" + ); + + $obj->validateRequiredFields($requiredFields); + + return $obj; + } +} diff --git a/workflow/engine/classes/entities/Entity_AppSolrQueue.php b/workflow/engine/classes/entities/Entity_AppSolrQueue.php deleted file mode 100644 index 724845498..000000000 --- a/workflow/engine/classes/entities/Entity_AppSolrQueue.php +++ /dev/null @@ -1,46 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "appUid", - "appChangeDate", - "appChangeTrace", - "appUpdated" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} diff --git a/workflow/engine/classes/entities/Entity_Base.php b/workflow/engine/classes/entities/Entity_Base.php deleted file mode 100644 index 9bcb878e1..000000000 --- a/workflow/engine/classes/entities/Entity_Base.php +++ /dev/null @@ -1,158 +0,0 @@ - $f) { - if (isset ($this->temp [$f])) { - $fieldIsEmpty = false; - return $this->temp [$f]; - } - } - - // field empty means the user has not sent a value for this Field, so we are - // using the default value - if ($fieldIsEmpty) { - if ($default !== false) { - return $default; - } - } - } - - protected function validateRequiredFields($requiredFields = array()) - { - foreach ($requiredFields as $k => $field) { - if ($this->{$field} === NULL) { - throw (new Exception ("Field $field is required in " . get_class ($this))); - die (); - } - } - } - - /** - * - * - * - * Copy the values of the Entity to the array of aliases - * The array of aliases must be defined. - * - * @return Array of alias with the Entity values - */ - public function getAliasDataArray() - { - $aAlias = array (); - // get aliases from class - $className = get_class ($this); - if (method_exists ($className, 'GetAliases')) { - $aliases = call_user_func (array ( - $className, - 'GetAliases' - )); - // $aliases = $className::GetAliases (); - foreach ($this as $field => $value) - if (isset ($aliases [$field])) { - // echo "Field exists in Aliases: " . $field . "\n"; - // echo "Alias Name:" . $aliases[$field] . "\n"; - // echo "Alias value:" . $value . "\n"; - $aAlias [$aliases [$field]] = $value; - } - } - - return $aAlias; - } - - /** - * - * - * - * Set the data from array of alias to Entity - * - * @param $aAliasData array - * of data of aliases - */ - public function setAliasDataArray($aAliasData) - { - // get aliases from class - $className = get_class ($this); - if (method_exists ($className, 'GetAliases')) { - $aliases = call_user_func (array ( - $className, - 'GetAliases' - )); - // $aliases = $className::GetAliases (); - foreach ($this as $field => $value) - if (isset ($aliases [$field])) - $this->{$field} = $aAliasData [$aliases [$field]]; - } - } - - /** - * - * - * - * Initialize object with values from $data. - * The values from data use properties or alias array. - * - * @param - * $data - */ - protected function initializeObject($data) - { - // get aliases from class - $className = get_class ($this); - $aliases = array (); - $swAliases = false; - if (method_exists ($className, 'GetAliases')) { - $aliases = call_user_func (array ( - $className, - 'GetAliases' - )); - // $aliases = $className::GetAliases (); - $swAliases = true; - } - // use object properties or aliases to initialize - foreach ($this as $field => $value) - if (isset ($data [$field])) { - $this->$field = $data [$field]; - } - elseif ($swAliases && isset ($aliases [$field]) && isset ($data [$aliases [$field]])) { - $this->$field = $data [$aliases [$field]]; - } - } - - public function serialize() - { - if (isset ($this->temp)) - unset ($this->temp); - return serialize ($this); - } - - public function unserialize($str) - { - $className = get_class ($this); - $data = unserialize ($str); - return new $className ($data); - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_FacetGroup.php b/workflow/engine/classes/entities/Entity_FacetGroup.php deleted file mode 100644 index cb6b6fdb9..000000000 --- a/workflow/engine/classes/entities/Entity_FacetGroup.php +++ /dev/null @@ -1,64 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "facetGroupName", - "facetItems" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_FacetInterfaceRequest.php b/workflow/engine/classes/entities/Entity_FacetInterfaceRequest.php deleted file mode 100644 index 0e2573b05..000000000 --- a/workflow/engine/classes/entities/Entity_FacetInterfaceRequest.php +++ /dev/null @@ -1,41 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "searchText", - "selectedFacetsString" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} diff --git a/workflow/engine/classes/entities/Entity_FacetInterfaceResult.php b/workflow/engine/classes/entities/Entity_FacetInterfaceResult.php deleted file mode 100644 index e7dbe8f32..000000000 --- a/workflow/engine/classes/entities/Entity_FacetInterfaceResult.php +++ /dev/null @@ -1,40 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "aFacetGroup", - "aSelectedFacetGroupItem", - "sFilterText" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_FacetItem.php b/workflow/engine/classes/entities/Entity_FacetItem.php deleted file mode 100644 index 37310aa0d..000000000 --- a/workflow/engine/classes/entities/Entity_FacetItem.php +++ /dev/null @@ -1,56 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "facetName", - "facetCount" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_FacetRequest.php b/workflow/engine/classes/entities/Entity_FacetRequest.php deleted file mode 100644 index 2a5d0c1e4..000000000 --- a/workflow/engine/classes/entities/Entity_FacetRequest.php +++ /dev/null @@ -1,44 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "workspace" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_FacetResult.php b/workflow/engine/classes/entities/Entity_FacetResult.php deleted file mode 100644 index 9e2dccfac..000000000 --- a/workflow/engine/classes/entities/Entity_FacetResult.php +++ /dev/null @@ -1,38 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "aFacetGroups", - "aSelectedFacetGroups", - "sFilterText" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_SelectedFacetGroupItem.php b/workflow/engine/classes/entities/Entity_SelectedFacetGroupItem.php deleted file mode 100644 index 90412e082..000000000 --- a/workflow/engine/classes/entities/Entity_SelectedFacetGroupItem.php +++ /dev/null @@ -1,41 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "selectedFacetGroupName", - "selectedFacetItemName" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_SolrQueryResult.php b/workflow/engine/classes/entities/Entity_SolrQueryResult.php deleted file mode 100644 index a2f67f3d6..000000000 --- a/workflow/engine/classes/entities/Entity_SolrQueryResult.php +++ /dev/null @@ -1,41 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - 'sEcho', - 'iTotalRecords', - 'iTotalDisplayRecords', - 'aaData' - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_SolrRequestData.php b/workflow/engine/classes/entities/Entity_SolrRequestData.php deleted file mode 100644 index 713516c22..000000000 --- a/workflow/engine/classes/entities/Entity_SolrRequestData.php +++ /dev/null @@ -1,47 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - 'workspace' - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/entities/Entity_SolrUpdateDocument.php b/workflow/engine/classes/entities/Entity_SolrUpdateDocument.php deleted file mode 100644 index 23cf1a437..000000000 --- a/workflow/engine/classes/entities/Entity_SolrUpdateDocument.php +++ /dev/null @@ -1,36 +0,0 @@ -initializeObject ($data); - - $requiredFields = array ( - "workspace", - "document" - ); - - $obj->validateRequiredFields ($requiredFields); - - return $obj; - } - -} \ No newline at end of file diff --git a/workflow/engine/classes/model/AppSolrQueue.php b/workflow/engine/classes/model/AppSolrQueue.php index 680481646..562b7b825 100644 --- a/workflow/engine/classes/model/AppSolrQueue.php +++ b/workflow/engine/classes/model/AppSolrQueue.php @@ -86,31 +86,31 @@ class AppSolrQueue extends BaseAppSolrQueue $updatedApplications = array (); try { $c = new Criteria(); - + $c->addSelectColumn(AppSolrQueuePeer::APP_UID); $c->addSelectColumn(AppSolrQueuePeer::APP_CHANGE_DATE); $c->addSelectColumn(AppSolrQueuePeer::APP_CHANGE_TRACE); $c->addSelectColumn(AppSolrQueuePeer::APP_UPDATED); - - //"WHERE - if($updated == true && $deleted == true){ - $c->add(AppSolrQueuePeer::APP_UPDATED, 0, Criteria::NOT_EQUAL); - } - if($updated == true && $deleted == false){ - $c->add(AppSolrQueuePeer::APP_UPDATED, 1, Criteria::EQUAL); - } - if($updated == false && $deleted == true){ - $c->add(AppSolrQueuePeer::APP_UPDATED, 2, Criteria::EQUAL); - } - - $rs = AppSolrQueuePeer::doSelectRS($c); - $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + //"WHERE + if($updated == true && $deleted == true){ + $c->add(AppSolrQueuePeer::APP_UPDATED, 0, Criteria::NOT_EQUAL); + } + if($updated == true && $deleted == false){ + $c->add(AppSolrQueuePeer::APP_UPDATED, 1, Criteria::EQUAL); + } + if($updated == false && $deleted == true){ + $c->add(AppSolrQueuePeer::APP_UPDATED, 2, Criteria::EQUAL); + } + + $rs = AppSolrQueuePeer::doSelectRS($c); + $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); //echo $c->toString(); $rs->next(); $row = $rs->getRow(); while (is_array( $row )) { - $appSolrQueue = Entity_AppSolrQueue::createEmpty(); + $appSolrQueue = EntityAppSolrQueue::createEmpty(); $appSolrQueue->appUid = $row["APP_UID"]; $appSolrQueue->appChangeDate = $row["APP_CHANGE_DATE"]; $appSolrQueue->appChangeTrace = $row["APP_CHANGE_TRACE"]; @@ -119,11 +119,11 @@ class AppSolrQueue extends BaseAppSolrQueue $rs->next(); $row = $rs->getRow(); } - + return $updatedApplications; } catch (Exception $e) { $con->rollback(); throw ($e); } } -} // AppSolrQueue +} // AppSolrQueue diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index b8af79742..7f821129f 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -402,7 +402,7 @@ class Cases $solrSearchText = "($solrSearchText)"; //Add del_index dynamic fields to list of resulting columns $columsToIncludeFinal = array_merge($columsToInclude, $delegationIndexes); - $solrRequestData = \Entity_SolrRequestData::createForRequestPagination( + $solrRequestData = \EntitySolrRequestData::createForRequestPagination( array( "workspace" => $solrEnv["solr_instance"], "startAfter" => 0,