You are here

function biblio_build_query in Bibliography Module 7.2

Same name and namespace in other branches
  1. 6.2 includes/biblio.pages.inc \biblio_build_query()
  2. 6 biblio.pages.inc \biblio_build_query()
  3. 7 includes/biblio.pages.inc \biblio_build_query()
3 calls to biblio_build_query()
biblio_export in includes/biblio.import.export.inc
Export nodes in a given file format.
biblio_page in includes/biblio.pages.inc
biblio_profile_page in includes/biblio.pages.inc

File

includes/biblio.pages.inc, line 294

Code

function biblio_build_query($arg_list) {
  global $user;
  static $bcc = 0;

  //biblio_contributor (bc) count , increase for every invocation
  static $bkd = 0;
  static $tcc = 0;

  //term counter, increase for every invocation
  $rss_info['feed'] = FALSE;
  $rss_info['title'] = variable_get('biblio_base_title', 'Biblio');
  $rss_info['link'] = '';
  $rss_info['description'] = '';
  if ($arg_list['page_limit'] > 0) {
    $query = db_select('biblio', 'b')
      ->extend('PagerDefault');
    $query
      ->limit($arg_list['page_limit']);
  }
  else {
    $query = db_select('biblio', 'b');
  }

  //add a tag of "node_access" to ensure that only nodes to which the user has access are retrieved
  $query
    ->addTag('biblio_access');
  $query
    ->addField('b', 'bid');
  $type_name = $query
    ->addField('b', 'publication_type', 'pt');

  //  $query->leftJoin('biblio', 'b', 'n.vid=b.vid');
  //  $query->innerJoin('biblio_types', 'bt', 'b.biblio_type=bt.tid');
  //  $query->distinct();
  // POSIX regular expression matching, case insensitive
  $match_op = db_driver() == 'pgsql' ? '~*' : 'RLIKE';
  $limit = '';

  //@todo add this functionality

  //  if (variable_get('biblio_view_only_own', 0) ) {
  //    $limit .= " AND n.uid = $user->uid ";
  //  }
  if (!isset($arg_list['s'])) {
    $arg_list['s'] = variable_get('biblio_sort', 'year');
  }
  if (!isset($arg_list['o'])) {
    $arg_list['o'] = strtolower(variable_get('biblio_order', 'desc'));
  }
  if (!isset($_SESSION['biblio_filter']) || !is_array($_SESSION['biblio_filter'])) {
    $_SESSION['biblio_filter'] = array();
  }
  $session =& $_SESSION['biblio_filter'];
  if (!in_array('no_filters', $arg_list)) {
    foreach ($session as $filter) {
      $arg_list = array_merge($arg_list, $filter);
    }
  }
  switch ($arg_list['s']) {
    case 'type':

      //$sortby = "ORDER BY bt.name %s, b.biblio_year DESC ";
      $query
        ->addField('b', 'publication_type');
      $query
        ->orderBy($type_name, $arg_list['o']);
      $query
        ->orderBy('biblio_sort_title', $arg_list['o']);
      break;
    case 'title':
      $query
        ->addField('fdbt', 'biblio_title_value');
      $query
        ->join('field_data_biblio_title', 'fdbt', 'fdbt.entity_id = b.bid');
      $query
        ->orderBy('biblio_sort_title', $arg_list['o']);
      break;

    // @todo: get functionality for contributor data
    //    case 'author':
    //      //$last_name = $query->addField('bcd', 'lastname');
    //      $query->innerJoin('biblio_contributor', 'bc', 'b.vid = bc.vid');
    //      $query->join('biblio_contributor_data', 'bcd', 'bc.cid = bcd.cid');
    //      $query->condition('bc.rank', 0);
    //      $query->addField('bcd', 'lastname');
    //      $query->orderBy('bcd.lastname', $arg_list['o']);
    //      // $query->condition('bc.auth_category', 1);
    //      break;
    // @todo: get functionality for keywords working
    //    case 'keyword': // added msh 070808
    //      $word = $query->addField('bkd', 'word', 'biblio_keyword');
    //      $query->orderBy($word, $arg_list['o']);
    //      $query->innerJoin('biblio_keyword', 'bk', 'b.vid = bk.vid');
    //      $query->innerJoin('biblio_keyword_data', 'bkd', 'bk.kid = bkd.kid');
    //      break;
    //    case 'year':
    default:
      $query
        ->addField('fdby', 'biblio_year_value');
      $query
        ->leftJoin('field_data_biblio_year', 'fdby', 'fdby.entity_id = b.bid');
      $query
        ->addField('fdbd', 'biblio_date_value');
      $query
        ->leftJoin('field_data_biblio_date', 'fdbd', 'fdbd.entity_id = b.bid');
      $query
        ->orderBy('biblio_year_value', $arg_list['o']);
      $query
        ->orderBy('biblio_sort_title');
  }

  //end switch
  if (isset($arg_list['f']) && count($arg_list['f'])) {
    $fields = biblio_get_db_fields();
    foreach ($arg_list['f'] as $type => $value) {
      $tables = array_keys($query
        ->getTables());
      switch ($type) {
        case 'no_filters':
          break;
        case 'and':
          $operator = " AND ";
          break;
        case 'or':
          $operator = " OR ";
          break;
        case 'rss.xml':
          $rss_info['feed'] = TRUE;
          $query
            ->limit(variable_get('biblio_rss_number_of_entries', 10));
          break;
        case 'term':
        case 'term_id':
          $query
            ->innerJoin('taxonomy_index', "ti{$tcc}", "n.nid = ti{$tcc}.nid");
          if ($type == 'term') {
            $query
              ->innerJoin('taxonomy_term_data', 'td', "ti{$tcc}.tid = td.tid");
            $query
              ->condition('td.name', $value);
          }
          elseif ($type == 'term_id') {
            $query
              ->condition("ti{$tcc}.tid", $value);
          }
          $tcc++;
          break;
        case 'tg':
          $query
            ->where("UPPER(substring(biblio_sort_title,1 ,1)) = :letter", array(
            ':letter' => $value,
          ));
          break;
        case 'ag':

          //selects entries whoose authors firstname starts with the letter provided
          $query
            ->where(" UPPER(substring(bcd.lastname,1,1)) = :letter ", array(
            ':letter' => $value,
          ));

          //$where['bc-rank'] = "bc.rank=0";
          if ($arg_list['s'] != 'author') {
            $query
              ->innerJoin('biblio_contributor', 'bc', 'b.vid = bc.vid');
            $query
              ->innerJoin('biblio_contributor_data', 'bcd', 'bc.cid = bcd.cid');
          }
          break;
        case 'cid':
        case 'aid':
          $bcc++;
          $query
            ->innerJoin('biblio_contributor', "bc{$bcc}", "n.vid = bc{$bcc}.vid");
          $query
            ->condition("bc{$bcc}.cid", $value);
          break;
        case 'author':
          $bcc++;
          if (array_search('bc', $tables) === FALSE) {
            $query
              ->innerJoin('biblio_contributor', 'bc', 'n.vid = bc.vid');
          }
          if (is_numeric($value)) {
            $cids = db_query('SELECT cid FROM {biblio_contributor_data}
                              WHERE cid = :cid OR
                              (aka = (SELECT aka FROM {biblio_contributor_data} WHERE cid = :cdid AND aka != 0))', array(
              ':cid' => $value,
              ':cdid' => $value,
            ));
            $cid_count = 0;
            $or = db_or();
            foreach ($cids as $cid) {
              $or
                ->condition("bc.cid", $cid->cid);
              $cid_count++;
            }
            if ($cid_count == 0) {
              $query
                ->condition("bc.cid", -1);
            }
            else {
              $query
                ->condition($or);
            }
          }
          else {
            if (array_search('bcd', $tables) === FALSE) {
              $query
                ->innerJoin('biblio_contributor_data', 'bcd', 'bcd.cid = bc.cid');
            }
            $query
              ->condition('bcd.name', "[[:<:]]" . $value . "[[:>:]]", $match_op);
            $rss_info['title'] = t("Publications by @value", array(
              '@value' => $value,
            ));
            $rss_info['description'] = t("These publications by %author are part of the works listed at %sitename", array(
              '%author' => $value,
              '%sitename' => variable_get('site_name', 'Drupal'),
            ));
            $rss_info['link'] = '/author/' . $value;
          }
          break;
        case 'publisher':
          $query
            ->condition('b.biblio_publisher', "[[:<:]]" . $value . "[[:>:]]", $match_op);
          break;
        case 'year':
          $query
            ->condition('b.biblio_year', $value);
          break;
        case 'uid':
          $query
            ->addField('n', 'uid');
          $query
            ->condition('n.uid', $value);
          break;
        case 'keyword':
          $bkd++;
          if (array_search('bk', $tables) === FALSE) {
            $query
              ->innerJoin('biblio_keyword', 'bk', 'n.vid = bk.vid');
          }
          if (is_numeric($value)) {
            $query
              ->condition('bk.kid', $value);
          }
          else {
            if (array_search('bkd', $tables) === FALSE) {
              $query
                ->innerJoin('biblio_keyword_data', 'bkd', 'bkd.kid = bk.kid');
            }
            if (strlen($value) == 1) {

              // $query->condition('',  $value, 'SUBSTR(bkd.word, 1, 1) =');
              $query
                ->where(" UPPER(substring(bkd.word,1,1)) = :letter ", array(
                ':letter' => $value,
              ));
            }
            else {
              $query
                ->condition('bkd.word', "[[:<:]]" . $value . "[:>:]]", 'LIKE');
            }
            $rss_info['title'] = t("Keyword @value", array(
              '@value' => $value,
            ));
            $rss_info['description'] = t("These publications, containing the keyword: %keyword, are part of the works listed at %sitename", array(
              '%keyword' => $value,
              '%sitename' => variable_get('site_name', 'Drupal'),
            ));
            $rss_info['link'] = '/keyword/' . $value;
          }
          break;
        case 'citekey':
          $query
            ->condition('b.biblio_citekey', $value);
          break;
        case 'type':
          $query
            ->condition('b.biblio_type', $value);
          break;
        case 'search':
          $search_nids = array();
          $search_nids = biblio_search_query($value);
          if (empty($search_nids)) {
            $search_nids[] = -1;

            // if we didn't find anything, then add one value of -1 since there will never be a node id == -1
          }
          $query
            ->condition('n.nid', $search_nids, 'IN');
          break;
        default:
          if (in_array("biblio_{$type}", $fields)) {
            $query
              ->condition("b.biblio_{$type} ", $value, 'LIKE');
          }
          break;
      }
    }
  }

  // show unpublished nodes to users with uid = 1 or  with 'Administer Biblio' permissions
  if ($user->uid != 1 && !biblio_access('admin')) {

    // $query->condition('n.status', 1);
  }
  $result = $query
    ->execute();
  $bids = array();
  $extras = array();
  foreach ($result as $biblio) {
    $bids[] = $biblio->bid;
    if (isset($biblio->biblio_year)) {
      unset($biblio->biblio_year);
    }
    $extras[] = $biblio;
  }
  return array(
    $bids,
    $extras,
    $rss_info,
  );
}