You are here

function _support_solr_build_subquery in Support Ticketing System 6

Creates a Solr query for a given user

Parameters

$account an account to get grants for and build a solr query:

Throws

Exception

1 call to _support_solr_build_subquery()
support_solr_apachesolr_modify_query in support_solr/support_solr.module
Implementation of hook_apachesolr_modify_query().

File

support_solr/support_solr.module, line 29
Apache Solr search for support module.

Code

function _support_solr_build_subquery($account) {
  if (!user_access('access content', $account)) {
    throw new Exception('No access');
  }
  $node_access_query = apachesolr_drupal_query();
  if (empty($node_access_query)) {
    throw new Exception('No query object in apachesolr_nodeaccess');
  }
  if (user_access('administer nodes', $account)) {

    // Access all content from the current site, or public content.

    //$node_access_query->add_filter('nodeaccess_all', 0);

    //$node_access_query->add_filter('hash', apachesolr_site_hash());
  }
  else {
    $clients = support_search_available_clients();
    if (!empty($clients)) {
      if (user_access('view other users tickets', $account) || user_access('administer support', $account) || user_access('edit any ticket', $account) || user_access('delete any ticket', $account)) {

        // Allow non support tickets (client 0)
        $node_access_query
          ->add_filter('is_support_client', 0);

        // OR check for each possible client...
        foreach ($clients as $client) {
          $node_access_query
            ->add_filter('is_support_client', $client);
        }
        return $node_access_query;
      }
      else {

        // Allow non support tickets (client 0)
        $node_access_query
          ->add_filter('is_support_client', 0);

        // Set up a subquery to support the AND on the uid
        $sq = apachesolr_drupal_query();

        // Set up a sub-subquery to support the OR of the clients.
        $ssq = apachesolr_drupal_query();
        foreach ($clients as $client) {
          $ssq
            ->add_filter('is_support_client', $client);
        }
        $sq
          ->add_subquery($ssq, 'OR');
        $sq
          ->add_filter('uid', $account->uid);
        $node_access_query
          ->add_subquery($sq, 'AND');

        // client is one of the available clients AND ticket is authored by the user...
        return $node_access_query;
      }
    }
    else {

      // No access, filter out support tickets
      return $node_access_query
        ->add_filter('type', 'support_ticket', TRUE);
    }
  }
  return $node_access_query;
}