Commit 258511d89086e9b2460b4e27c7cac0f0e3410089
1 parent
4efe9e34
Create testConditionOnDocument which does what it says - checks if a
condition applies to a document, returning true if it does, or false. Implement changes to make the query generated by criteriaToQuery more flexible, and make criteriaToLegacyQuery that does what the previous searches did. git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@3959 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
1 changed file
with
74 additions
and
12 deletions
lib/search/searchutil.inc.php
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | +require_once(KT_LIB_DIR . '/browse/Criteria.inc'); | |
| 4 | + | |
| 3 | 5 | class KTSearchUtil { |
| 4 | 6 | function _oneCriteriaSetToSQL($aOneCriteriaSet) { |
| 5 | 7 | $aSQL = array(); |
| ... | ... | @@ -83,6 +85,9 @@ class KTSearchUtil { |
| 83 | 85 | } |
| 84 | 86 | |
| 85 | 87 | function permissionToSQL($oUser, $sPermissionName) { |
| 88 | + if (is_null($oUser)) { | |
| 89 | + return array("", array(), ""); | |
| 90 | + } | |
| 86 | 91 | $oPermission =& KTPermission::getByName('ktcore.permissions.read'); |
| 87 | 92 | $sPermissionLookupsTable = KTUtil::getTableName('permission_lookups'); |
| 88 | 93 | $sPermissionLookupAssignmentsTable = KTUtil::getTableName('permission_lookup_assignments'); |
| ... | ... | @@ -100,30 +105,54 @@ class KTSearchUtil { |
| 100 | 105 | return array($sSQLString, $aParams, $sJoinSQL); |
| 101 | 106 | } |
| 102 | 107 | |
| 103 | - function criteriaToQuery($aCriteriaSet, $oUser, $sPermissionName) { | |
| 108 | + function criteriaToLegacyQuery($aCriteriaSet, $oUser, $sPermissionName) { | |
| 109 | + global $default; | |
| 110 | + $aOptions = array( | |
| 111 | + 'select' => "F.name AS folder_name, F.id AS folder_id, D.id AS document_id, D.name AS document_name, D.filename AS file_name, 'View' AS view", | |
| 112 | + 'join' => "INNER JOIN $default->folders_table AS F ON D.folder_id = F.id", | |
| 113 | + ); | |
| 114 | + return KTSearchUtil::criteriaToQuery($aCriteriaSet, $oUser, $sPermissionName, $aOptions); | |
| 115 | + } | |
| 116 | + | |
| 117 | + function criteriaToQuery($aCriteriaSet, $oUser, $sPermissionName, $aOptions = null) { | |
| 104 | 118 | global $default; |
| 105 | - list($sSQLSearchString, $aCritParams, $sJoinSQL) = KTSearchUtil::criteriaSetToSQL($aCriteriaSet); | |
| 119 | + $sSelect = KTUtil::arrayGet($aOptions, 'select', 'D.id AS document_id'); | |
| 120 | + $sInitialJoin = KTUtil::arrayGet($aOptions, 'join', ''); | |
| 121 | + | |
| 122 | + list($sSQLSearchString, $aCritParams, $sCritJoinSQL) = KTSearchUtil::criteriaSetToSQL($aCriteriaSet); | |
| 106 | 123 | |
| 107 | 124 | $sToSearch = KTUtil::arrayGet($aOrigReq, 'fToSearch', 'Live'); // actually never present in this version. |
| 108 | 125 | |
| 109 | 126 | list ($sPermissionString, $aPermissionParams, $sPermissionJoin) = KTSearchUtil::permissionToSQL($oUser, $sPermissionName); |
| 110 | 127 | //$sQuery = DBUtil::compactQuery(" |
| 128 | + | |
| 129 | + $aPotentialWhere = array($sPermissionString, 'SL.name = ?', "($sSQLSearchString)"); | |
| 130 | + $aWhere = array(); | |
| 131 | + foreach ($aPotentialWhere as $sWhere) { | |
| 132 | + if (empty($sWhere)) { | |
| 133 | + continue; | |
| 134 | + } | |
| 135 | + if ($sWhere == "()") { | |
| 136 | + continue; | |
| 137 | + } | |
| 138 | + $aWhere[] = $sWhere; | |
| 139 | + } | |
| 140 | + $sWhere = ""; | |
| 141 | + if ($aWhere) { | |
| 142 | + $sWhere = "\tWHERE " . join(" AND ", $aWhere); | |
| 143 | + } | |
| 144 | + | |
| 111 | 145 | $sQuery = (" |
| 112 | 146 | SELECT |
| 113 | - F.name AS folder_name, F.id AS folder_id, D.id AS document_id, | |
| 114 | - D.name AS document_name, D.filename AS file_name, COUNT(D.id) AS doc_count, 'View' AS view | |
| 147 | + $sSelect | |
| 115 | 148 | FROM |
| 116 | 149 | $default->documents_table AS D |
| 117 | - INNER JOIN $default->folders_table AS F ON D.folder_id = F.id | |
| 118 | - $sJoinSQL | |
| 119 | 150 | INNER JOIN $default->status_table AS SL on D.status_id=SL.id |
| 151 | + $sInitialJoin | |
| 152 | + $sCritJoinSQL | |
| 120 | 153 | $sPermissionJoin |
| 121 | - WHERE | |
| 122 | - $sPermissionString | |
| 123 | - AND SL.name = ? | |
| 124 | - AND ($sSQLSearchString) | |
| 125 | - GROUP BY D.id | |
| 126 | - ORDER BY doc_count DESC"); | |
| 154 | + $sWhere"); | |
| 155 | + // GROUP BY D.id | |
| 127 | 156 | |
| 128 | 157 | $aParams = array(); |
| 129 | 158 | $aParams = array_merge($aParams, $aPermissionParams); |
| ... | ... | @@ -132,5 +161,38 @@ class KTSearchUtil { |
| 132 | 161 | |
| 133 | 162 | return array($sQuery, $aParams); |
| 134 | 163 | } |
| 164 | + | |
| 165 | + function testConditionOnDocument($oSearch, $oDocument) { | |
| 166 | + $oSearch =& KTUtil::getObject('KTSavedSearch', $oSearch); | |
| 167 | + $iDocumentId = KTUtil::getId($oDocument); | |
| 168 | + | |
| 169 | + $aCriteriaSet = array( | |
| 170 | + "join" => "AND", | |
| 171 | + "subgroup" => array( | |
| 172 | + $oSearch->getSearch(), | |
| 173 | + array( | |
| 174 | + "join" => "AND", | |
| 175 | + "values" => array( | |
| 176 | + array( | |
| 177 | + "sql" => array("D.id = ?", array($iDocumentId)), | |
| 178 | + ), | |
| 179 | + ), | |
| 180 | + ), | |
| 181 | + ), | |
| 182 | + ); | |
| 183 | + $aOptions = array('select' => 'COUNT(DISTINCT(D.id)) AS cnt'); | |
| 184 | + $aQuery = KTSearchUtil::criteriaToQuery($aCriteriaSet, null, null, $aOptions); | |
| 185 | + $cnt = DBUtil::getOneResultKey($aQuery, 'cnt'); | |
| 186 | + if (PEAR::isError($cnt)) { | |
| 187 | + return $cnt; | |
| 188 | + } | |
| 189 | + if (is_null($cnt)) { | |
| 190 | + return false; | |
| 191 | + } | |
| 192 | + if (!is_numeric($cnt)) { | |
| 193 | + return PEAR::raiseError("Non-integer returned when looking for count"); | |
| 194 | + } | |
| 195 | + return $cnt > 0; | |
| 196 | + } | |
| 135 | 197 | } |
| 136 | 198 | ... | ... |