diff --git a/inc/inc.ClassDocument.php b/inc/inc.ClassDocument.php index f68df0275..86d67f1c2 100644 --- a/inc/inc.ClassDocument.php +++ b/inc/inc.ClassDocument.php @@ -91,6 +91,179 @@ class LetoDMS_Document return new LetoDMS_Document($resArr["id"], $resArr["name"], $resArr["comment"], $resArr["date"], $resArr["expires"], $resArr["owner"], $resArr["folder"], $resArr["inheritAccess"], $resArr["defaultAccess"], $lock, $resArr["keywords"], $resArr["sequence"]); } + /* + * Search the database for documents + * + * @param query string seach query with space separated words + * @param limit integer number of items in result set + * @param offset integer index of first item in result set + * @param mode string either AND or OR + * @param searchin array() list of fields to search in + * @param startFolder object search in the folder only (null for root folder) + * @param owner object search for documents owned by this user + * @param status array list of status + * @param creationstartdate array search for documents created after this date + * @param creationenddate array search for documents created before this date + * @return array containing the elements total and docs + */ + function search($query, $limit=0, $offset=0, $mode='AND', $searchin=array(), $startFolder=null, $owner=null, $status = array(), $creationstartdate=array(), $creationenddate=array()) { + GLOBAL $db; + + // Split the search string into constituent keywords. + $tkeys=array(); + if (strlen($query)>0) { + $tkeys = split("[\t\r\n ,]+", $query); + } + + // if none is checkd search all + if (count($searchin)==0) + $searchin=array( 0, 1, 2, 3); + + $searchKey = ""; + // Assemble the arguments for the concatenation function. This allows the + // search to be carried across all the relevant fields. + $concatFunction = ""; + if (in_array(1, $searchin)) { + $concatFunction = "`tblDocuments`.`keywords`"; + } + if (in_array(2, $searchin)) { + $concatFunction = (strlen($concatFunction) == 0 ? "" : $concatFunction.", ")."`tblDocuments`.`name`"; + } + if (in_array(3, $searchin)) { + $concatFunction = (strlen($concatFunction) == 0 ? "" : $concatFunction.", ")."`tblDocuments`.`comment`"; + } + + if (strlen($concatFunction)>0 && count($tkeys)>0) { + $concatFunction = "CONCAT_WS(' ', ".$concatFunction.")"; + foreach ($tkeys as $key) { + $key = trim($key); + if (strlen($key)>0) { + $searchKey = (strlen($searchKey)==0 ? "" : $searchKey." ".$mode." ").$concatFunction." LIKE '%".$key."%'"; + } + } + } + + // Check to see if the search has been restricted to a particular sub-tree in + // the folder hierarchy. + $searchFolder = ""; + if ($startFolder) { + $searchFolder = "`tblDocuments`.`folderList` LIKE '%:".$startFolder->getID().":%'"; + } + + // Check to see if the search has been restricted to a particular + // document owner. + $searchOwner = ""; + if ($owner) { + $searchOwner = "`tblDocuments`.`owner` = '".$owner->getId()."'"; + } + + // Is the search restricted to documents created between two specific dates? + $searchCreateDate = ""; + if ($creationstartdate) { + $startdate = makeTimeStamp(0, 0, 0, $createstartdate["year"], $createstartdate["month"], $createstartdate["day"]); + if ($startdate) { + $searchCreateDate .= "`tblDocuments`.`date` >= ".$startdate; + } + } + if ($creationenddate) { + $stopdate = makeTimeStamp(23, 59, 59, $createenddate["year"], $createenddate["month"], $createenddate["day"]); + if ($stopdate) { + if($startdate) + $searchCreateDate .= " AND "; + $searchCreateDate = "`tblDocuments`.`date` <= ".$stopdate; + } + } + + // ---------------------- Suche starten ---------------------------------- + + // + // Construct the SQL query that will be used to search the database. + // + + if (!$db->createTemporaryTable("ttcontentid") || !$db->createTemporaryTable("ttstatid")) { + return false; + } + + $searchQuery = "FROM `tblDocumentContent` ". + "LEFT JOIN `tblDocuments` ON `tblDocuments`.`id` = `tblDocumentContent`.`document` ". + "LEFT JOIN `tblDocumentStatus` ON `tblDocumentStatus`.`documentID` = `tblDocumentContent`.`document` ". + "LEFT JOIN `tblDocumentStatusLog` ON `tblDocumentStatusLog`.`statusID` = `tblDocumentStatus`.`statusID` ". + "LEFT JOIN `ttstatid` ON `ttstatid`.`maxLogID` = `tblDocumentStatusLog`.`statusLogID` ". + "LEFT JOIN `ttcontentid` ON `ttcontentid`.`maxVersion` = `tblDocumentStatus`.`version` AND `ttcontentid`.`document` = `tblDocumentStatus`.`documentID` ". + "LEFT JOIN `tblDocumentLocks` ON `tblDocuments`.`id`=`tblDocumentLocks`.`document` ". + "WHERE `ttstatid`.`maxLogID`=`tblDocumentStatusLog`.`statusLogID` ". + "AND `ttcontentid`.`maxVersion` = `tblDocumentContent`.`version`"; + + if (strlen($searchKey)>0) { + $searchQuery .= " AND (".$searchKey.")"; + } + if (strlen($searchFolder)>0) { + $searchQuery .= " AND ".$searchFolder; + } + if (strlen($searchOwner)>0) { + $searchQuery .= " AND (".$searchOwner.")"; + } + if (strlen($searchCreateDate)>0) { + $searchQuery .= " AND (".$searchCreateDate.")"; + } + + // status + if ($status) { + $searchQuery .= " AND `tblDocumentStatusLog`.`status` IN (".implode(',', $status).")"; + } + + // Count the number of rows that the search will produce. + $resArr = $db->getResultArray("SELECT COUNT(*) AS num ".$searchQuery); + $totalDocs = 0; + if (is_numeric($resArr[0]["num"]) && $resArr[0]["num"]>0) { + $totalDocs = (integer)$resArr[0]["num"]; + } + if($limit) { + $totalPages = (integer)($totalDocs/$limit); + if (($totalDocs%$limit) > 0) { + $totalPages++; + } + } else { + $totalPages = 1; + } + + // If there are no results from the count query, then there is no real need + // to run the full query. TODO: re-structure code to by-pass additional + // queries when no initial results are found. + + // Prepare the complete search query, including the LIMIT clause. + $searchQuery = "SELECT `tblDocuments`.*, ". + "`tblDocumentContent`.`version`, ". + "`tblDocumentStatusLog`.`status`, `tblDocumentLocks`.`userID` as `lockUser` ".$searchQuery; + + if($limit) { + $searchQuery .= " LIMIT ".$offset.",".$limit; + } + + // Send the complete search query to the database. + $resArr = $db->getResultArray($searchQuery); + + // ------------------- Ausgabe der Ergebnisse ---------------------------- + $numResults = count($resArr); + if ($numResults == 0) { + return array('totalDocs'=>$totalDocs, 'totalPages'=>$totalPages, 'docs'=>array()); + } + + foreach ($resArr as $docArr) { + + $document = new LetoDMS_Document( + $docArr["id"], $docArr["name"], + $docArr["comment"], $docArr["date"], + $docArr["expires"], $docArr["owner"], + $docArr["folder"], $docArr["inheritAccess"], + $docArr["defaultAccess"], $docArr["lockUser"], + $docArr["keywords"], $docArr["sequence"]); + + $docs[] = $document; + } + return(array('totalDocs'=>$totalDocs, 'totalPages'=>$totalPages, 'docs'=>$docs)); + } + function getDir() { global $settings; return $settings->_contentOffsetDir."/".$this->_id."/";