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 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  
... ...