Commit 94ab7bd9c72dd854d9da02b7ae73842ba92127d8
1 parent
64052a0a
adding BL for boolean search.
git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@3699 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
1 changed file
with
119 additions
and
0 deletions
presentation/lookAndFeel/knowledgeTree/search/booleanSearch.php
| ... | ... | @@ -8,6 +8,7 @@ require_once(KT_LIB_DIR . "/database/dbutil.inc"); |
| 8 | 8 | require_once(KT_LIB_DIR . "/util/ktutil.inc"); |
| 9 | 9 | require_once(KT_LIB_DIR . "/dispatcher.inc.php"); |
| 10 | 10 | require_once(KT_LIB_DIR . "/browse/Criteria.inc"); |
| 11 | +require_once(KT_LIB_DIR . "/visualpatterns/PatternBrowsableSearchResults.inc"); | |
| 11 | 12 | |
| 12 | 13 | // specific includes |
| 13 | 14 | |
| ... | ... | @@ -38,6 +39,124 @@ class BooleanSearchDispatcher extends KTStandardDispatcher { |
| 38 | 39 | $main->setCentralPayload($data); |
| 39 | 40 | $main->render(); |
| 40 | 41 | } |
| 42 | + | |
| 43 | + function do_performSearch() { | |
| 44 | + // TODO first extract environ vars | |
| 45 | + // TODO second create criterion objects (see getAdvancedSearchResults for this. | |
| 46 | + // TODO third get each one to generate the SQL snippet. (ENSURE that they are wrapped in '('..')' ) | |
| 47 | + // TODO fourth array().join(' AND ') where appropriate | |
| 48 | + // TODO finally return via PatternBrowseableSearchResults (urgh.) | |
| 49 | + | |
| 50 | + $datavars = KTUtil::arrayGet($_REQUEST, 'boolean_search'); | |
| 51 | + $booleanJoinName = KTUtil::arrayGet($_REQUEST, 'boolean_condition'); | |
| 52 | + | |
| 53 | + if (empty($datavars)) { | |
| 54 | + $this->errorRedirectToMain('You need to have at least 1 condition.'); | |
| 55 | + } | |
| 56 | + if (empty($booleanJoinName)) { | |
| 57 | + $this->errorRedirectToMain('You need to specify which kind of search (ALL/ANY) you wish to perform.'); | |
| 58 | + } | |
| 59 | + | |
| 60 | + | |
| 61 | + // Step 1: extract the criteria selection, and create an array of criteria. | |
| 62 | + $criteria_set = array(); | |
| 63 | + foreach ($datavars as $order => $dataset) { | |
| 64 | + | |
| 65 | + $oCriterion =& Criteria::getCriterionByNumber($dataset["type"]); | |
| 66 | + if (PEAR::isError($oCriterion)) { | |
| 67 | + $this->errorRedirectToMain('Invalid criteria specified.'); | |
| 68 | + } | |
| 69 | + | |
| 70 | + $criteria_set[] = array($oCriterion, $dataset['data']); | |
| 71 | + } | |
| 72 | + | |
| 73 | + $res = $this->handleCriteriaSet($criteria_set, $booleanJoinName); | |
| 74 | + | |
| 75 | + return $res; | |
| 76 | + } | |
| 77 | + | |
| 78 | + function handleCriteriaSet($aCriteriaSet, $mergeType='AND') { | |
| 79 | + global $default; | |
| 80 | + $aSQL = array(); | |
| 81 | + $aJoinSQL = array(); | |
| 82 | + foreach ($aCriteriaSet as $oCriterionPair) { | |
| 83 | + $oCriterion = $oCriterionPair[0]; | |
| 84 | + $aReq = $oCriterionPair[1]; | |
| 85 | + $res = $oCriterion->searchSQL($aReq); | |
| 86 | + if (!is_null($res)) { | |
| 87 | + $aSQL[] = $res; | |
| 88 | + } | |
| 89 | + $res = $oCriterion->searchJoinSQL(); | |
| 90 | + if (!is_null($res)) { | |
| 91 | + $aJoinSQL[] = $res; | |
| 92 | + } | |
| 93 | + } | |
| 94 | + | |
| 95 | + $aCritParams = array(); | |
| 96 | + $aCritQueries = array(); | |
| 97 | + foreach ($aSQL as $sSQL) { | |
| 98 | + if (is_array($sSQL)) { | |
| 99 | + $aCritQueries[] = '('.$sSQL[0].')'; | |
| 100 | + $aCritParams = array_merge($aCritParams , $sSQL[1]); | |
| 101 | + } else { | |
| 102 | + $aCritQueries[] = '('.$sSQL.')'; | |
| 103 | + } | |
| 104 | + } | |
| 105 | + | |
| 106 | + if (count($aCritQueries) == 0) { | |
| 107 | + $this->errorRedirectToMain("No search criteria were specified"); | |
| 108 | + exit(0); | |
| 109 | + } | |
| 110 | + | |
| 111 | + $sSQLSearchString = join("\n ".$mergeType." ", $aCritQueries); | |
| 112 | + $sJoinSQL = join(" ", $aJoinSQL); | |
| 113 | + | |
| 114 | + $sToSearch = KTUtil::arrayGet($aOrigReq, 'fToSearch', 'Live'); // actually never present in this version. | |
| 115 | + | |
| 116 | + $sQuery = DBUtil::compactQuery(" | |
| 117 | + SELECT | |
| 118 | + F.name AS folder_name, F.id AS folder_id, D.id AS document_id, | |
| 119 | + D.name AS document_name, D.filename AS file_name, COUNT(D.id) AS doc_count, 'View' AS view | |
| 120 | + FROM | |
| 121 | + $default->documents_table AS D | |
| 122 | + INNER JOIN $default->folders_table AS F ON D.folder_id = F.id | |
| 123 | + $sJoinSQL | |
| 124 | + INNER JOIN $default->search_permissions_table AS SDUL ON SDUL.document_id = D.id | |
| 125 | + INNER JOIN $default->status_table AS SL on D.status_id=SL.id | |
| 126 | + WHERE | |
| 127 | + (F.is_public OR | |
| 128 | + SDUL.user_id = ?) | |
| 129 | + AND SL.name = ? | |
| 130 | + AND ($sSQLSearchString) | |
| 131 | + GROUP BY D.id | |
| 132 | + ORDER BY doc_count DESC"); | |
| 133 | + | |
| 134 | + $aParams = array(); | |
| 135 | + $aParams[] = $_SESSION["userID"]; | |
| 136 | + $aParams[] = $sToSearch; | |
| 137 | + $aParams = array_merge($aParams, $aCritParams); | |
| 138 | + | |
| 139 | + //'<pre>'.var_dump(DBUtil::getResultArray(array($sQuery, $aParams))); | |
| 140 | + //exit(0); | |
| 141 | + //return '<pre>'.print_r(DBUtil::getResultArray(array($sQuery, $aParams)), true).'</pre>'; | |
| 142 | + | |
| 143 | + $aColumns = array("folder_name", "file_name", "document_name", "doc_count", "view"); | |
| 144 | + $aColumnTypes = array(3,3,3,1,3); | |
| 145 | + $aColumnHeaders = array("<font color=\"ffffff\"><img src=$default->graphicsUrl/widgets/dfolder.gif>" . _("Folder") . "</font>", "<font color=\"ffffff\">" . _("Name") . "</font>", "<font color=\"ffffff\">" . _("Title") . "</font>", "<font color=\"ffffff\">" . _("Matches") . "</font>", "<font color=\"ffffff\">" . _("View") . "</font>"); | |
| 146 | + $aLinkURLs = array("$default->rootUrl/control.php?action=browse","$default->rootUrl/control.php?action=viewDocument", "$default->rootUrl/control.php?action=viewDocument", null, "$default->rootUrl/control.php?action=downloadDocument"); | |
| 147 | + $aDBQueryStringColumns = array("document_id","folder_id"); | |
| 148 | + $aQueryStringVariableNames = array("fDocumentID", "fFolderID"); | |
| 149 | + | |
| 150 | + $oPatternBrowse = & new PatternBrowseableSearchResults(array($sQuery, $aParams), 10, $aColumns, $aColumnTypes, $aColumnHeaders, $aLinkURLs, $aDBQueryStringColumns, $aQueryStringVariableNames); | |
| 151 | + $oPatternBrowse->setStartIndex($iStartIndex); | |
| 152 | + $oPatternBrowse->setSearchText(""); | |
| 153 | + $oPatternBrowse->setRememberValues($aReq); | |
| 154 | + $sForSearch = "<input type=\"hidden\" name=\"fForSearch\" value=\"1\" />"; | |
| 155 | + | |
| 156 | + return renderHeading(_("Advanced Search")) . $oPatternBrowse->render() . $sForSearch . $sRefreshMessage; | |
| 157 | + | |
| 158 | + //return '<pre>'.$sSQLSearchString.'</pre>'; | |
| 159 | + } | |
| 41 | 160 | } |
| 42 | 161 | |
| 43 | 162 | $oDispatcher = new BooleanSearchDispatcher(); | ... | ... |