Commit 94ab7bd9c72dd854d9da02b7ae73842ba92127d8

Authored by bshuttle
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
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();
... ...