function biblio_build_query in Bibliography Module 7.2
Same name and namespace in other branches
- 6.2 includes/biblio.pages.inc \biblio_build_query()
- 6 biblio.pages.inc \biblio_build_query()
- 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,
);
}