Commit 26f29ec8844085601747101dccbef631f6f77032
1 parent
aab4536c
More documentation
git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@3962 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
1 changed file
with
40 additions
and
1 deletions
lib/search/searchutil.inc.php
| @@ -15,6 +15,13 @@ class KTSearchUtil { | @@ -15,6 +15,13 @@ class KTSearchUtil { | ||
| 15 | $aSQL = array(); | 15 | $aSQL = array(); |
| 16 | $aJoinSQL = array(); | 16 | $aJoinSQL = array(); |
| 17 | $criteria_set = array(); | 17 | $criteria_set = array(); |
| 18 | + | ||
| 19 | + /* | ||
| 20 | + * First phase: get criterion object for search or the direct | ||
| 21 | + * SQL to use. | ||
| 22 | + * | ||
| 23 | + * XXX: Why is there $order there? | ||
| 24 | + */ | ||
| 18 | foreach ($aOneCriteriaSet as $order => $dataset) { | 25 | foreach ($aOneCriteriaSet as $order => $dataset) { |
| 19 | $type = KTUtil::arrayGet($dataset, "type"); | 26 | $type = KTUtil::arrayGet($dataset, "type"); |
| 20 | $sql = KTUtil::arrayGet($dataset, "sql"); | 27 | $sql = KTUtil::arrayGet($dataset, "sql"); |
| @@ -30,6 +37,10 @@ class KTSearchUtil { | @@ -30,6 +37,10 @@ class KTSearchUtil { | ||
| 30 | return PEAR::raiseError('Invalid criteria specified.'); | 37 | return PEAR::raiseError('Invalid criteria specified.'); |
| 31 | } | 38 | } |
| 32 | } | 39 | } |
| 40 | + | ||
| 41 | + /* | ||
| 42 | + * Second phase: Create an individual SQL query per criteria. | ||
| 43 | + */ | ||
| 33 | foreach ($criteria_set as $oCriterionPair) { | 44 | foreach ($criteria_set as $oCriterionPair) { |
| 34 | $oCriterion = $oCriterionPair[0]; | 45 | $oCriterion = $oCriterionPair[0]; |
| 35 | $aReq = $oCriterionPair[1]; | 46 | $aReq = $oCriterionPair[1]; |
| @@ -47,6 +58,10 @@ class KTSearchUtil { | @@ -47,6 +58,10 @@ class KTSearchUtil { | ||
| 47 | } | 58 | } |
| 48 | } | 59 | } |
| 49 | 60 | ||
| 61 | + /* | ||
| 62 | + * Third phase: build up $aCritQueries and $aCritParams, and put | ||
| 63 | + * parentheses around them. | ||
| 64 | + */ | ||
| 50 | $aCritParams = array(); | 65 | $aCritParams = array(); |
| 51 | $aCritQueries = array(); | 66 | $aCritQueries = array(); |
| 52 | foreach ($aSQL as $sSQL) { | 67 | foreach ($aSQL as $sSQL) { |
| @@ -85,7 +100,16 @@ class KTSearchUtil { | @@ -85,7 +100,16 @@ class KTSearchUtil { | ||
| 85 | $aJoinSQL = array(); | 100 | $aJoinSQL = array(); |
| 86 | $aSearchStrings = array(); | 101 | $aSearchStrings = array(); |
| 87 | $aParams = array(); | 102 | $aParams = array(); |
| 103 | + /* | ||
| 104 | + * XXX: We unnecessarily force the base criteria to have | ||
| 105 | + * subgroups at the top level, even though we most often only | ||
| 106 | + * have a single "subgroup". | ||
| 107 | + */ | ||
| 88 | foreach ($aCriteriaSet["subgroup"] as $k => $aOneCriteriaSet) { | 108 | foreach ($aCriteriaSet["subgroup"] as $k => $aOneCriteriaSet) { |
| 109 | + /* | ||
| 110 | + * Each subgroup will either have values or it will have | ||
| 111 | + * subgroups. They can't be mixed. | ||
| 112 | + */ | ||
| 89 | $aValues = KTUtil::arrayGet($aOneCriteriaSet, "values"); | 113 | $aValues = KTUtil::arrayGet($aOneCriteriaSet, "values"); |
| 90 | $aSubgroup = KTUtil::arrayGet($aOneCriteriaSet, "subgroup"); | 114 | $aSubgroup = KTUtil::arrayGet($aOneCriteriaSet, "subgroup"); |
| 91 | if (!empty($aValues)) { | 115 | if (!empty($aValues)) { |
| @@ -95,6 +119,11 @@ class KTSearchUtil { | @@ -95,6 +119,11 @@ class KTSearchUtil { | ||
| 95 | $tabs = str_repeat("\t", ($iRecurseLevel + 2)); | 119 | $tabs = str_repeat("\t", ($iRecurseLevel + 2)); |
| 96 | $aSearchStrings[] = "\n$tabs(\n$tabs\t" . join("\n " . KTUtil::arrayGet($aOneCriteriaSet, 'join', "AND") . " ", $aThisCritQueries) . "\n$tabs)"; | 120 | $aSearchStrings[] = "\n$tabs(\n$tabs\t" . join("\n " . KTUtil::arrayGet($aOneCriteriaSet, 'join', "AND") . " ", $aThisCritQueries) . "\n$tabs)"; |
| 97 | } else if (!empty($aSubgroup)) { | 121 | } else if (!empty($aSubgroup)) { |
| 122 | + /* | ||
| 123 | + * Recurse if we have a criteria set with subgroups. | ||
| 124 | + * Recurselevel makes the tabs increase as we recurse so | ||
| 125 | + * that the SQL statement is somewhat understandable. | ||
| 126 | + */ | ||
| 98 | list($sThisSearchString, $aThisParams, $sThisJoinSQL) = | 127 | list($sThisSearchString, $aThisParams, $sThisJoinSQL) = |
| 99 | KTSearchUtil::criteriaSetToSQL($aOneCriteriaSet, $iRecurseLevel + 1); | 128 | KTSearchUtil::criteriaSetToSQL($aOneCriteriaSet, $iRecurseLevel + 1); |
| 100 | $aJoinSQL[] = $sThisJoinSQL; | 129 | $aJoinSQL[] = $sThisJoinSQL; |
| @@ -190,8 +219,12 @@ class KTSearchUtil { | @@ -190,8 +219,12 @@ class KTSearchUtil { | ||
| 190 | $sToSearch = KTUtil::arrayGet($aOrigReq, 'fToSearch', 'Live'); // actually never present in this version. | 219 | $sToSearch = KTUtil::arrayGet($aOrigReq, 'fToSearch', 'Live'); // actually never present in this version. |
| 191 | 220 | ||
| 192 | list ($sPermissionString, $aPermissionParams, $sPermissionJoin) = KTSearchUtil::permissionToSQL($oUser, $sPermissionName); | 221 | list ($sPermissionString, $aPermissionParams, $sPermissionJoin) = KTSearchUtil::permissionToSQL($oUser, $sPermissionName); |
| 193 | - //$sQuery = DBUtil::compactQuery(" | ||
| 194 | 222 | ||
| 223 | + /* | ||
| 224 | + * This is to overcome the problem where $sPermissionString (or | ||
| 225 | + * even $sSQLSearchString) is empty, leading to leading or | ||
| 226 | + * trailing ANDs. | ||
| 227 | + */ | ||
| 195 | $aPotentialWhere = array($sPermissionString, 'SL.name = ?', "($sSQLSearchString)"); | 228 | $aPotentialWhere = array($sPermissionString, 'SL.name = ?', "($sSQLSearchString)"); |
| 196 | $aWhere = array(); | 229 | $aWhere = array(); |
| 197 | foreach ($aPotentialWhere as $sWhere) { | 230 | foreach ($aPotentialWhere as $sWhere) { |
| @@ -208,6 +241,7 @@ class KTSearchUtil { | @@ -208,6 +241,7 @@ class KTSearchUtil { | ||
| 208 | $sWhere = "\tWHERE " . join(" AND ", $aWhere); | 241 | $sWhere = "\tWHERE " . join(" AND ", $aWhere); |
| 209 | } | 242 | } |
| 210 | 243 | ||
| 244 | + //$sQuery = DBUtil::compactQuery(" | ||
| 211 | $sQuery = (" | 245 | $sQuery = (" |
| 212 | SELECT | 246 | SELECT |
| 213 | $sSelect | 247 | $sSelect |
| @@ -243,6 +277,11 @@ class KTSearchUtil { | @@ -243,6 +277,11 @@ class KTSearchUtil { | ||
| 243 | $oSearch =& KTUtil::getObject('KTSavedSearch', $oSearch); | 277 | $oSearch =& KTUtil::getObject('KTSavedSearch', $oSearch); |
| 244 | $iDocumentId = KTUtil::getId($oDocument); | 278 | $iDocumentId = KTUtil::getId($oDocument); |
| 245 | 279 | ||
| 280 | + /* | ||
| 281 | + * Make a new criteria set, an AND of the existing criteria set | ||
| 282 | + * and the sql statement requiring that D.id be the document id | ||
| 283 | + * given to us. | ||
| 284 | + */ | ||
| 246 | $aCriteriaSet = array( | 285 | $aCriteriaSet = array( |
| 247 | "join" => "AND", | 286 | "join" => "AND", |
| 248 | "subgroup" => array( | 287 | "subgroup" => array( |