Commit ede208a183744603a62019fbb4a4e92017bbdd12

Authored by Neil Blakey-Milner
1 parent 16a849f3

SearchUtil helps in searches, particularly in converting criteria sets

to SQL queries that will find the documents in question.


git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@3948 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing 1 changed file with 136 additions and 0 deletions
lib/search/searchutil.inc.php 0 → 100644
  1 +<?php
  2 +
  3 +class KTSearchUtil {
  4 + function _oneCriteriaSetToSQL($aOneCriteriaSet) {
  5 + $aSQL = array();
  6 + $aJoinSQL = array();
  7 + $criteria_set = array();
  8 + foreach ($aOneCriteriaSet as $order => $dataset) {
  9 + $type = KTUtil::arrayGet($dataset, "type");
  10 + $sql = KTUtil::arrayGet($dataset, "sql");
  11 + if (!empty($type)) {
  12 + $oCriterion = Criteria::getCriterionByNumber($dataset["type"]);
  13 + if (PEAR::isError($oCriterion)) {
  14 + return PEAR::raiseError('Invalid criteria specified.');
  15 + }
  16 + $criteria_set[] = array($oCriterion, $dataset["data"]);
  17 + } else if (!empty($sql)) {
  18 + $criteria_set[] = $sql;
  19 + } else {
  20 + return PEAR::raiseError('Invalid criteria specified.');
  21 + }
  22 + }
  23 + foreach ($criteria_set as $oCriterionPair) {
  24 + $oCriterion = $oCriterionPair[0];
  25 + $aReq = $oCriterionPair[1];
  26 + if (is_object($oCriterion)) {
  27 + $res = $oCriterion->searchSQL($aReq);
  28 + if (!is_null($res)) {
  29 + $aSQL[] = $res;
  30 + }
  31 + $res = $oCriterion->searchJoinSQL();
  32 + if (!is_null($res)) {
  33 + $aJoinSQL[] = $res;
  34 + }
  35 + } else {
  36 + $aSQL[] = array($oCriterion, $aReq);
  37 + }
  38 + }
  39 +
  40 + $aCritParams = array();
  41 + $aCritQueries = array();
  42 + foreach ($aSQL as $sSQL) {
  43 + if (is_array($sSQL)) {
  44 + $aCritQueries[] = '('.$sSQL[0].')';
  45 + $aCritParams = array_merge($aCritParams , $sSQL[1]);
  46 + } else {
  47 + $aCritQueries[] = '('.$sSQL.')';
  48 + }
  49 + }
  50 +
  51 + if (count($aCritQueries) == 0) {
  52 + return PEAR::raiseError("No search criteria were specified");
  53 + }
  54 +
  55 + return array($aCritQueries, $aCritParams, $aJoinSQL);
  56 + }
  57 +
  58 + function criteriaSetToSQL($aCriteriaSet, $iRecurseLevel = 0) {
  59 + $aJoinSQL = array();
  60 + $aSearchStrings = array();
  61 + $aParams = array();
  62 + foreach ($aCriteriaSet["subgroup"] as $k => $aOneCriteriaSet) {
  63 + $aValues = KTUtil::arrayGet($aOneCriteriaSet, "values");
  64 + $aSubgroup = KTUtil::arrayGet($aOneCriteriaSet, "subgroup");
  65 + if (!empty($aValues)) {
  66 + list($aThisCritQueries, $aThisParams, $aThisJoinSQL) = KTSearchUtil::_oneCriteriaSetToSQL($aOneCriteriaSet["values"]);
  67 + $aJoinSQL = array_merge($aJoinSQL, $aThisJoinSQL);
  68 + $aParams = array_merge($aParams, $aThisParams);
  69 + $tabs = str_repeat("\t", ($iRecurseLevel + 2));
  70 + $aSearchStrings[] = "\n$tabs(\n$tabs\t" . join("\n " . KTUtil::arrayGet($aOneCriteriaSet, 'join', "AND") . " ", $aThisCritQueries) . "\n$tabs)";
  71 + } else if (!empty($aSubgroup)) {
  72 + list($sThisSearchString, $aThisParams, $sThisJoinSQL) =
  73 + KTSearchUtil::criteriaSetToSQL($aOneCriteriaSet, $iRecurseLevel + 1);
  74 + $aJoinSQL[] = $sThisJoinSQL;
  75 + $aParams = array_merge($aParams, $aThisParams);
  76 + $aSearchStrings[] = $sThisSearchString;
  77 + }
  78 + }
  79 + $sJoinSQL = join(" ", $aJoinSQL);
  80 + $tabs = str_repeat("\t", $iRecurseLevel + 1);
  81 + $sSearchString = "\n$tabs(" . join("\n$tabs\t" . $aCriteriaSet['join'] . " ", $aSearchStrings) . "\n$tabs)";
  82 + return array($sSearchString, $aParams, $sJoinSQL);
  83 + }
  84 +
  85 + function permissionToSQL($oUser, $sPermissionName) {
  86 + $oPermission =& KTPermission::getByName('ktcore.permissions.read');
  87 + $sPermissionLookupsTable = KTUtil::getTableName('permission_lookups');
  88 + $sPermissionLookupAssignmentsTable = KTUtil::getTableName('permission_lookup_assignments');
  89 + $sPermissionDescriptorsTable = KTUtil::getTableName('permission_descriptors');
  90 + $sJoinSQL = "
  91 + INNER JOIN $sPermissionLookupsTable AS PL ON D.permission_lookup_id = PL.id
  92 + INNER JOIN $sPermissionLookupAssignmentsTable AS PLA ON PL.id = PLA.permission_lookup_id AND PLA.permission_id = ?
  93 + ";
  94 + $aGroups = GroupUtil::listGroupsForUserExpand($oUser);
  95 + $aPermissionDescriptors = KTPermissionDescriptor::getByGroups($aGroups, array('ids' => true));
  96 + $sPermissionDescriptors = DBUtil::paramArray($aPermissionDescriptors);
  97 + $sSQLString = "PLA.permission_descriptor_id IN ($sPermissionDescriptors)";
  98 + $aParams = array($oPermission->getId());
  99 + $aParams = array_merge($aParams, $aPermissionDescriptors);
  100 + return array($sSQLString, $aParams, $sJoinSQL);
  101 + }
  102 +
  103 + function criteriaToQuery($aCriteriaSet, $oUser, $sPermissionName) {
  104 + global $default;
  105 + list($sSQLSearchString, $aCritParams, $sJoinSQL) = KTSearchUtil::criteriaSetToSQL($aCriteriaSet);
  106 +
  107 + $sToSearch = KTUtil::arrayGet($aOrigReq, 'fToSearch', 'Live'); // actually never present in this version.
  108 +
  109 + list ($sPermissionString, $aPermissionParams, $sPermissionJoin) = KTSearchUtil::permissionToSQL($oUser, $sPermissionName);
  110 + //$sQuery = DBUtil::compactQuery("
  111 + $sQuery = ("
  112 + 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
  115 + FROM
  116 + $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
  120 + $sPermissionJoin
  121 + WHERE
  122 + $sPermissionString
  123 + AND SL.name = ?
  124 + AND ($sSQLSearchString)
  125 + GROUP BY D.id
  126 + ORDER BY doc_count DESC");
  127 +
  128 + $aParams = array();
  129 + $aParams = array_merge($aParams, $aPermissionParams);
  130 + $aParams[] = $sToSearch;
  131 + $aParams = array_merge($aParams, $aCritParams);
  132 +
  133 + return array($sQuery, $aParams);
  134 + }
  135 +}
  136 +
... ...