Commit 6ff10a4fdae5472f092a75ba52ee593cd6c1b8f9
1 parent
a8c5ce54
Merged in from DEV trunk...
KTS-2810 "RSS plugin slows down the dashboard" Fixed. Cut down the number of times the database has to be accessed. Optimised the code. Committed by: Megan Watson Reviewed by: Conrad Vermeulen git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/STABLE/branches/3.4.6-Release-Branch@7903 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
1 changed file
with
140 additions
and
81 deletions
plugins/rssplugin/KTrss.inc.php
| ... | ... | @@ -64,18 +64,42 @@ class KTrss{ |
| 64 | 64 | |
| 65 | 65 | // Gets full listing of data of documents and folders subscribed to |
| 66 | 66 | function getInternalFeed($iUserId){ |
| 67 | - $documents=KTrss::getDocuments($iUserId); | |
| 68 | - $folders=KTrss::getFolders($iUserId); | |
| 67 | + $documents = KTrss::getDocuments($iUserId); | |
| 68 | + $folders = KTrss::getFolders($iUserId); | |
| 69 | + | |
| 69 | 70 | if (is_null($documents)) $documents=array(); |
| 70 | 71 | if (is_null($folders)) $folders=array(); |
| 71 | - $aFullList = array_merge($documents,$folders ); | |
| 72 | - if($aFullList){ | |
| 72 | + | |
| 73 | + $response = ''; | |
| 74 | + $aFullList = kt_array_merge($documents,$folders ); | |
| 75 | + if(!empty($aFullList)){ | |
| 73 | 76 | $internalFeed = KTrss::arrayToXML($aFullList); |
| 74 | 77 | $response = rss2arrayBlock($internalFeed); |
| 75 | 78 | } |
| 76 | 79 | return $response; |
| 77 | 80 | } |
| 78 | 81 | |
| 82 | + // Get the data for the document or folder | |
| 83 | + function getExternalInternalFeed($sFeed, $iUserId){ | |
| 84 | + $aRss = array(); | |
| 85 | + $pos = strpos($sFeed, 'docId'); | |
| 86 | + | |
| 87 | + if($pos === false){ | |
| 88 | + $pos = strpos($sFeed, 'folderId'); | |
| 89 | + $folderId = substr($sFeed, $pos+9); | |
| 90 | + $aRss[] = KTrss::getOneFolder($folderId); | |
| 91 | + }else{ | |
| 92 | + $docId = substr($sFeed, $pos+6); | |
| 93 | + $aRss[] = KTrss::getOneDocument($docId, $iUserId); | |
| 94 | + } | |
| 95 | + | |
| 96 | + if($aRss){ | |
| 97 | + $internalFeed = KTrss::arrayToXML($aRss); | |
| 98 | + $response = rss2arrayBlock($internalFeed); | |
| 99 | + } | |
| 100 | + return $response; | |
| 101 | + } | |
| 102 | + | |
| 79 | 103 | // Get list of document subscriptions |
| 80 | 104 | function getDocumentList($iUserId){ |
| 81 | 105 | $sQuery = "SELECT document_id as id FROM document_subscriptions WHERE user_id = ?"; |
| ... | ... | @@ -95,7 +119,7 @@ class KTrss{ |
| 95 | 119 | function getFolderList($iUserId){ |
| 96 | 120 | $sQuery = "SELECT folder_id as id FROM folder_subscriptions WHERE user_id = ?"; |
| 97 | 121 | $aParams = array($iUserId); |
| 98 | - $aFolderList = DBUtil::getResultArrayKey(array($sQuery, $aParams), 'id'); | |
| 122 | + $aFolderList = DBUtil::getResultArrayKey(array($sQuery, $aParams), 'id'); | |
| 99 | 123 | |
| 100 | 124 | if (PEAR::isError($aFolderList)) { |
| 101 | 125 | // XXX: log error |
| ... | ... | @@ -131,9 +155,8 @@ class KTrss{ |
| 131 | 155 | $aFList = KTrss::getFolderList($iUserId); |
| 132 | 156 | |
| 133 | 157 | if($aFList){ |
| 134 | - foreach($aFList as $folderElement){ | |
| 135 | - $folder_id = $folderElement['id']; | |
| 136 | - $folder = KTrss::getOneFolder($folder_id, $iUserId); | |
| 158 | + foreach($aFList as $folder_id){ | |
| 159 | + $folder = KTrss::getOneFolder($folder_id); | |
| 137 | 160 | if($folder){ |
| 138 | 161 | $aFolders[] = $folder; |
| 139 | 162 | } |
| ... | ... | @@ -150,44 +173,53 @@ class KTrss{ |
| 150 | 173 | } |
| 151 | 174 | |
| 152 | 175 | function getChildrenFolderTransactions($iParentFolderId, $depth = '1'){ |
| 153 | - if($depth == '1'){ | |
| 154 | - $sQuery = "SELECT id from folders WHERE parent_folder_ids LIKE ?"; | |
| 155 | - $aParams = array('%'.$iParentFolderId); | |
| 156 | - }//else | |
| 176 | + $aParams = array($iParentFolderId); | |
| 177 | + | |
| 178 | + if($depth == '1'){ | |
| 179 | + // Get direct child folder id's | |
| 180 | + $sQuery = "SELECT id FROM folders WHERE parent_id = ?"; | |
| 181 | + }else{ | |
| 182 | + // Get all child folders | |
| 183 | + if($iParentFolderId == 1){ | |
| 184 | + $sQuery = "SELECT id FROM folders WHERE parent_folder_ids LIKE '?' OR parent_folder_ids LIKE '?,%'"; | |
| 185 | + } | |
| 186 | + $sQuery = "SELECT id FROM folders WHERE parent_folder_ids LIKE '%,?' OR parent_folder_ids LIKE '%,?,%'"; | |
| 187 | + $aParams[] = $iParentFolderId; | |
| 188 | + } | |
| 189 | + | |
| 190 | + $aFolderList = DBUtil::getResultArrayKey(array($sQuery, $aParams), 'id'); | |
| 157 | 191 | |
| 158 | - $aFolderList = DBUtil::getResultArray(array($sQuery, $aParams)); | |
| 159 | 192 | if (PEAR::isError($aFolderList)) { |
| 160 | 193 | // XXX: log error |
| 161 | 194 | return false; |
| 162 | 195 | } |
| 163 | - if ($aFolderList) { | |
| 164 | - foreach($aFolderList as $folderElement){ | |
| 165 | - $folder_id = $folderElement['id']; | |
| 166 | - $aFolderTransactions = array_merge($aFolderTransactions, KTrss::getFolderTransactions($folder_id)); | |
| 167 | - } | |
| 168 | - } | |
| 169 | - if ($aFolderTransactions){ | |
| 170 | - return $aFolderTransactions; | |
| 171 | - } | |
| 196 | + return $aFolderList; | |
| 172 | 197 | } |
| 173 | 198 | |
| 174 | 199 | function getChildrenDocumentTransactions($iParentFolderId, $depth = '1'){ |
| 175 | - if($depth == '1'){ | |
| 176 | - $sQuery = "SELECT id from documents WHERE parent_folder_ids LIKE ? "; | |
| 177 | - $aParams = array('%'.$iParentFolderId); | |
| 178 | - }//else | |
| 200 | + $aParams = array($iParentFolderId); | |
| 201 | + | |
| 202 | + if($depth == '1'){ | |
| 203 | + // Get direct child document id's | |
| 204 | + $sQuery = "SELECT id FROM documents WHERE folder_id = ?"; | |
| 205 | + }else{ | |
| 206 | + // Get all documents in child folders | |
| 207 | + if($iParentFolderId == 1){ | |
| 208 | + $sQuery = "SELECT id FROM documents WHERE parent_folder_ids LIKE '?' OR parent_folder_ids LIKE '?,%'"; | |
| 209 | + } | |
| 210 | + $sQuery = "SELECT id FROM documents WHERE parent_folder_ids LIKE '%,?' OR parent_folder_ids LIKE '%,?,%'"; | |
| 211 | + $aParams[] = $iParentFolderId; | |
| 212 | + } | |
| 179 | 213 | |
| 180 | - $aDocumentList = DBUtil::getResultArray(array($sQuery, $aParams)); | |
| 214 | + $aDocumentList = DBUtil::getResultArrayKey(array($sQuery, $aParams), 'id'); | |
| 181 | 215 | |
| 182 | 216 | if (PEAR::isError($aDocumentList)) { |
| 183 | 217 | // XXX: log error |
| 184 | 218 | return false; |
| 185 | 219 | } |
| 220 | + | |
| 186 | 221 | if ($aDocumentList) { |
| 187 | - foreach($aDocumentList as $documentElement){ | |
| 188 | - $document_id = $documentElement['id']; | |
| 189 | - $aDocumentTransactions = kt_array_merge($aDocumentTransactions, KTrss::getDocumentTransactions($document_id)); | |
| 190 | - } | |
| 222 | + $aDocumentTransactions = KTrss::getDocumentTransactions($aDocumentList); | |
| 191 | 223 | } |
| 192 | 224 | if ($aDocumentTransactions){ |
| 193 | 225 | return $aDocumentTransactions; |
| ... | ... | @@ -197,7 +229,8 @@ class KTrss{ |
| 197 | 229 | // get information on document |
| 198 | 230 | function getOneDocument($iDocumentId, $iUserId){ |
| 199 | 231 | $aDData = KTrss::getDocumentData($iUserId, $iDocumentId); |
| 200 | - $aDTransactions = KTrss::getDocumentTransactions($iDocumentId); | |
| 232 | + $aDTransactions = KTrss::getDocumentTransactions(array($iDocumentId)); | |
| 233 | + | |
| 201 | 234 | if($aDData){ |
| 202 | 235 | $aDData['itemType'] = 'document'; |
| 203 | 236 | |
| ... | ... | @@ -219,22 +252,41 @@ class KTrss{ |
| 219 | 252 | |
| 220 | 253 | // get information for folder |
| 221 | 254 | function getOneFolder($iFolderId){ |
| 255 | + $aFolder = array(); | |
| 222 | 256 | $aFData = KTrss::getFolderData($iFolderId); |
| 223 | - $aFTransactions = kt_array_merge(KTrss::getChildrenFolderTransactions($iFolderId), KTrss::getFolderTransactions($iFolderId)); | |
| 224 | - $aFTransactions = kt_array_merge($aFTransactions, KTrss::getChildrenDocumentTransactions($iFolderId)); | |
| 225 | 257 | |
| 226 | - $code = 'if (strtotime($a[datetime]) == strtotime($b[datetime])){ | |
| 227 | - return 0; | |
| 228 | - } | |
| 229 | - return (strtotime($a[datetime]) > strtotime($b[datetime])) ? -1 : 1;'; | |
| 258 | + if (PEAR::isError($aFData)) { | |
| 259 | + return false; | |
| 260 | + } | |
| 230 | 261 | |
| 231 | - $compare = create_function('$a,$b', $code); | |
| 262 | + // Get child folder ids | |
| 263 | + $aFolderIds = KTrss::getChildrenFolderTransactions($iFolderId); | |
| 232 | 264 | |
| 233 | - usort($aFTransactions, $compare); | |
| 234 | - for($i=0; $i<4; $i++){ | |
| 235 | - $aFTransactions_new[] = $aFTransactions[$i]; | |
| 236 | - } | |
| 237 | - $aFTransactions = $aFTransactions_new; | |
| 265 | + // Get folder transactions | |
| 266 | + $aFolderIds[] = $iFolderId; | |
| 267 | + $aFTransactions = KTrss::getFolderTransactions($aFolderIds); | |
| 268 | + | |
| 269 | + if(PEAR::isError($aFTransactions)){ | |
| 270 | + return false; | |
| 271 | + } | |
| 272 | + | |
| 273 | + // Get child document transactions | |
| 274 | + $aDocTransactions = KTrss::getChildrenDocumentTransactions($iFolderId); | |
| 275 | + | |
| 276 | + if(!empty($aDocTransactions)){ | |
| 277 | + $aFTransactions = array_merge($aFTransactions, $aDocTransactions); | |
| 278 | + | |
| 279 | + // Sort the child folder and document transactions by date and reduce to 4 | |
| 280 | + $code = 'if (strtotime($a[datetime]) == strtotime($b[datetime])){ | |
| 281 | + return 0; | |
| 282 | + } | |
| 283 | + return (strtotime($a[datetime]) > strtotime($b[datetime])) ? -1 : 1;'; | |
| 284 | + | |
| 285 | + $compare = create_function('$a,$b', $code); | |
| 286 | + | |
| 287 | + usort($aFTransactions, $compare); | |
| 288 | + $aFTransactions = array_slice($aFTransactions, 0, 4); | |
| 289 | + } | |
| 238 | 290 | |
| 239 | 291 | if($aFData){ |
| 240 | 292 | $aFData['itemType'] = 'folder'; |
| ... | ... | @@ -245,10 +297,6 @@ class KTrss{ |
| 245 | 297 | |
| 246 | 298 | $aFolder[] = $aFData; |
| 247 | 299 | $aFolder[] = $aFTransactions; |
| 248 | - $aFolderBox[] = $aFolder; | |
| 249 | - } | |
| 250 | - if (PEAR::isError($aFData)) { | |
| 251 | - return false; | |
| 252 | 300 | } |
| 253 | 301 | if ($aFolder){ |
| 254 | 302 | return $aFolder; |
| ... | ... | @@ -271,7 +319,15 @@ class KTrss{ |
| 271 | 319 | // Build path to host |
| 272 | 320 | $aPath = explode('/', trim($_SERVER['PHP_SELF'])); |
| 273 | 321 | global $default; |
| 274 | - $hostPath = "http" . ($default->sslEnabled ? "s" : "") . "://".$_SERVER['HTTP_HOST']."/".$aPath[1]."/"; | |
| 322 | + if(count($aPath) > 2){ | |
| 323 | + for($i = 0; $i < count($aPath)-1; $i++){ | |
| 324 | + $sSuffix .= $aPath[$i]; | |
| 325 | + } | |
| 326 | + $sSuffix = $aPath[1]."/"; | |
| 327 | + }else{ | |
| 328 | + $sSuffix = ''; | |
| 329 | + } | |
| 330 | + $hostPath = "http" . ($default->sslEnabled ? "s" : "") . "://".$_SERVER['HTTP_HOST']."/".$sSuffix; | |
| 275 | 331 | $feed = "<?xml version=\"1.0\"?>\n"; |
| 276 | 332 | $feed .= "<rss version=\"2.0\">\n". |
| 277 | 333 | "<channel>\n" . |
| ... | ... | @@ -331,7 +387,7 @@ class KTrss{ |
| 331 | 387 | "<td></td>\n". |
| 332 | 388 | "</tr>\n". |
| 333 | 389 | "</table><br>\n". |
| 334 | - "Transaction Summary (Last 3)\n". | |
| 390 | + "Transaction Summary (Last 4)\n". | |
| 335 | 391 | "<hr>\n". |
| 336 | 392 | "<table width='100%'>\n"; |
| 337 | 393 | foreach($aItems[1] as $item){ |
| ... | ... | @@ -618,38 +674,41 @@ class KTrss{ |
| 618 | 674 | } |
| 619 | 675 | |
| 620 | 676 | // get a listing of the latest 3 transactions for a document |
| 621 | - function getDocumentTransactions($iDocumentId){ | |
| 622 | - $sQuery = "SELECT DT.datetime AS datetime, 'Document' AS type, DMV.name, D.full_path AS fullpath, DTT.name AS transaction_name, U.name AS user_name, DT.version AS version, DT.comment AS comment " . | |
| 623 | - "FROM document_transactions AS DT INNER JOIN users AS U ON DT.user_id = U.id " . | |
| 624 | - "INNER JOIN document_transaction_types_lookup AS DTT ON DTT.namespace = DT.transaction_namespace " . | |
| 625 | - "LEFT JOIN document_metadata_version AS DMV ON DT.document_id = DMV.document_id " . | |
| 626 | - "LEFT JOIN documents AS D ON DT.document_id = D.id " . | |
| 627 | - "WHERE DT.document_id = ? " . | |
| 628 | - "ORDER BY DT.datetime DESC " . | |
| 629 | - "LIMIT 4"; | |
| 630 | - | |
| 631 | - $aParams = array($iDocumentId); | |
| 632 | - $aDocumentTransactions = DBUtil::getResultArray(array($sQuery, $aParams)); | |
| 633 | - if($aDocumentTransactions){ | |
| 634 | - return $aDocumentTransactions; | |
| 635 | - } | |
| 677 | + function getDocumentTransactions($aDocumentIds){ | |
| 678 | + $sDocumentIds = implode(', ', $aDocumentIds); | |
| 679 | + | |
| 680 | + $sQuery = "SELECT DT.datetime AS datetime, 'Document' AS type, DMV.name, D.full_path AS fullpath, | |
| 681 | + DTT.name AS transaction_name, U.name AS user_name, DT.version AS version, DT.comment AS comment | |
| 682 | + FROM document_transactions AS DT | |
| 683 | + INNER JOIN users AS U ON DT.user_id = U.id | |
| 684 | + INNER JOIN document_transaction_types_lookup AS DTT ON DTT.namespace = DT.transaction_namespace | |
| 685 | + LEFT JOIN documents AS D ON DT.document_id = D.id | |
| 686 | + LEFT JOIN document_metadata_version AS DMV ON D.metadata_version_id = DMV.id | |
| 687 | + WHERE DT.document_id IN ($sDocumentIds) | |
| 688 | + ORDER BY DT.datetime DESC | |
| 689 | + LIMIT 4"; | |
| 690 | + | |
| 691 | + $aDocumentTransactions = DBUtil::getResultArray($sQuery); | |
| 692 | + if(!PEAR::isError($aDocumentTransactions)){ | |
| 693 | + return $aDocumentTransactions; | |
| 694 | + } | |
| 636 | 695 | } |
| 637 | 696 | |
| 638 | - // Get a listing of the latest 3 transactions for a folder | |
| 639 | - function getFolderTransactions($iFolderId){ | |
| 640 | - $sQuery = "SELECT FT.datetime AS datetime, 'Folder' AS type, F.name, F.full_path AS fullpath, DTT.name AS transaction_name, U.name AS user_name, FT.comment AS comment " . | |
| 641 | - "FROM folder_transactions AS FT LEFT JOIN users AS U ON FT.user_id = U.id " . | |
| 642 | - "LEFT JOIN document_transaction_types_lookup AS DTT ON DTT.namespace = FT.transaction_namespace " . | |
| 643 | - "LEFT JOIN folders AS F ON FT.folder_id = F.id " . | |
| 644 | - "WHERE FT.folder_id = ? " . | |
| 645 | - "ORDER BY FT.datetime DESC " . | |
| 646 | - "LIMIT 4"; | |
| 647 | - | |
| 648 | - $aParams = array($iFolderId); | |
| 649 | - $aFolderTransactions = DBUtil::getResultArray(array($sQuery, $aParams)); | |
| 650 | - if($iFolderId){ | |
| 651 | - return $aFolderTransactions; | |
| 652 | - } | |
| 697 | + // Get a listing of the latest transactions for a folder and its child folders | |
| 698 | + function getFolderTransactions($aFolderIds){ | |
| 699 | + $sFolderIds = implode(', ', $aFolderIds); | |
| 700 | + | |
| 701 | + $sQuery = "SELECT FT.datetime AS datetime, 'Folder' AS type, F.name, F.full_path AS fullpath, | |
| 702 | + DTT.name AS transaction_name, U.name AS user_name, FT.comment AS comment | |
| 703 | + FROM folder_transactions AS FT LEFT JOIN users AS U ON FT.user_id = U.id | |
| 704 | + LEFT JOIN document_transaction_types_lookup AS DTT ON DTT.namespace = FT.transaction_namespace | |
| 705 | + LEFT JOIN folders AS F ON FT.folder_id = F.id | |
| 706 | + WHERE FT.folder_id IN ($sFolderIds) | |
| 707 | + ORDER BY FT.datetime DESC | |
| 708 | + LIMIT 4"; | |
| 709 | + | |
| 710 | + $aFolderTransactions = DBUtil::getResultArray($sQuery); | |
| 711 | + return $aFolderTransactions; | |
| 653 | 712 | } |
| 654 | 713 | } |
| 655 | 714 | -?> |
| 715 | +?> | |
| 656 | 716 | \ No newline at end of file | ... | ... |