Commit 258511d89086e9b2460b4e27c7cac0f0e3410089

Authored by nbm
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 <?php 1 <?php
2 2
  3 +require_once(KT_LIB_DIR . '/browse/Criteria.inc');
  4 +
3 class KTSearchUtil { 5 class KTSearchUtil {
4 function _oneCriteriaSetToSQL($aOneCriteriaSet) { 6 function _oneCriteriaSetToSQL($aOneCriteriaSet) {
5 $aSQL = array(); 7 $aSQL = array();
@@ -83,6 +85,9 @@ class KTSearchUtil { @@ -83,6 +85,9 @@ class KTSearchUtil {
83 } 85 }
84 86
85 function permissionToSQL($oUser, $sPermissionName) { 87 function permissionToSQL($oUser, $sPermissionName) {
  88 + if (is_null($oUser)) {
  89 + return array("", array(), "");
  90 + }
86 $oPermission =& KTPermission::getByName('ktcore.permissions.read'); 91 $oPermission =& KTPermission::getByName('ktcore.permissions.read');
87 $sPermissionLookupsTable = KTUtil::getTableName('permission_lookups'); 92 $sPermissionLookupsTable = KTUtil::getTableName('permission_lookups');
88 $sPermissionLookupAssignmentsTable = KTUtil::getTableName('permission_lookup_assignments'); 93 $sPermissionLookupAssignmentsTable = KTUtil::getTableName('permission_lookup_assignments');
@@ -100,30 +105,54 @@ class KTSearchUtil { @@ -100,30 +105,54 @@ class KTSearchUtil {
100 return array($sSQLString, $aParams, $sJoinSQL); 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 global $default; 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 $sToSearch = KTUtil::arrayGet($aOrigReq, 'fToSearch', 'Live'); // actually never present in this version. 124 $sToSearch = KTUtil::arrayGet($aOrigReq, 'fToSearch', 'Live'); // actually never present in this version.
108 125
109 list ($sPermissionString, $aPermissionParams, $sPermissionJoin) = KTSearchUtil::permissionToSQL($oUser, $sPermissionName); 126 list ($sPermissionString, $aPermissionParams, $sPermissionJoin) = KTSearchUtil::permissionToSQL($oUser, $sPermissionName);
110 //$sQuery = DBUtil::compactQuery(" 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 $sQuery = (" 145 $sQuery = ("
112 SELECT 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 FROM 148 FROM
116 $default->documents_table AS D 149 $default->documents_table AS D
117 - INNER JOIN $default->folders_table AS F ON D.folder_id = F.id  
118 - $sJoinSQL  
119 INNER JOIN $default->status_table AS SL on D.status_id=SL.id 150 INNER JOIN $default->status_table AS SL on D.status_id=SL.id
  151 + $sInitialJoin
  152 + $sCritJoinSQL
120 $sPermissionJoin 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 $aParams = array(); 157 $aParams = array();
129 $aParams = array_merge($aParams, $aPermissionParams); 158 $aParams = array_merge($aParams, $aPermissionParams);
@@ -132,5 +161,38 @@ class KTSearchUtil { @@ -132,5 +161,38 @@ class KTSearchUtil {
132 161
133 return array($sQuery, $aParams); 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