Index: views_query.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/views/views_query.inc,v retrieving revision 1.48 diff -u -r1.48 views_query.inc --- views_query.inc 7 Sep 2006 17:18:07 -0000 1.48 +++ views_query.inc 14 Sep 2006 14:33:12 -0000 @@ -551,7 +551,10 @@ if (isset($joininfo['extra'])) { foreach ($joininfo['extra'] as $field => $value) { $joins .= " AND $table_alias.$field"; - if ($value !== NULL) { + if (is_array($value) && count($value)) { + $joins .= " IN ('". implode("','", $value) ."')"; + } + else if ($value !== NULL) { $joins .= " = '$value'"; } } Index: modules/views_taxonomy.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/views/modules/views_taxonomy.inc,v retrieving revision 1.20 diff -u -r1.20 views_taxonomy.inc --- modules/views_taxonomy.inc 7 Sep 2006 17:42:26 -0000 1.20 +++ modules/views_taxonomy.inc 14 Sep 2006 14:33:12 -0000 @@ -21,9 +21,8 @@ 'notafield' => true, )); - views_table_add_filter($table, 'tid', 'Taxonomy: Term', 'When filtering by taxonomy term you may specify the "depth" as an option. Please see the taxonomy help for more information.', array( + views_table_add_filter($table, 'tid', 'Taxonomy: Term', 'Filtering by taxonomy term. Add the "Node: Distinct" filter if desired. Please see the taxonomy help for more information.', array( 'list' => 'views_handler_filter_tid', - 'option' => 'string', 'operator' => 'views_handler_operator_andor', 'handler' => 'views_handler_filter_tid_custom', 'value-type' => 'array', @@ -67,7 +66,6 @@ 'name' => t('Taxonomy: Terms for %voc-name', array('%voc-name' => $voc->name)), 'list' => 'views_handler_filter_tid_by_voc', 'value-type' => 'array', - 'option' => 'string', 'operator' => 'views_handler_operator_andor', 'handler' => 'views_handler_filter_tid_custom', 'vocabulary' => $voc->vid, @@ -294,7 +292,7 @@ } else { $values = _views_break_phrase($arg); - _views_add_taxonomy(strtoupper($values[0]), $values[1], $argtype['options'], $query); + _views_add_taxonomy(strtoupper($values[0]), $values[1], $query); } break; case 'link': @@ -416,12 +414,7 @@ * add custom WHERE clauses and joins to a query based on taxonomy. */ function views_handler_filter_tid_custom($op, $filter, $filterinfo, &$query) { - // When filtering via depth, we have to add a chain. If it's an or query - // we add 1 chain, but in an and query we actually basically have to add - // a 2 dimensional array. - - _views_add_taxonomy($filter['operator'], $filter['value'], $filter['options'], $query); - + _views_add_taxonomy($filter['operator'], $filter['value'], $query); } /* @@ -440,72 +433,38 @@ * Add custom WHERE and JOIN clauses based on taxonomy vocabularies. */ function views_handler_filter_voc($op, $filter, $filterinfo, &$query) { - _views_add_vocabulary($filter['operator'], $filter['value'], $filter['options'], $query); + _views_add_vocabulary($filter['operator'], $filter['value'], $query); } /* * Add a where clause views_get_titled on taxonomy. This is a pretty exciting piece of * code because the clause and the JOINs are a bit complicated. */ -function _views_add_taxonomy($op, $value, $depth, &$query) { - // When filtering via depth, we have to add a chain. If it's an or query - // we add 1 chain, but in an and query we actually basically have to add - // a 2 dimensional array. - -// $query->ensure_table('term_data'); // this is to make sure the views_get_title table comes first. +function _views_add_taxonomy($op, $value, &$query) { if ($op == 'OR') { - $clause = "'" . implode("','", $value) . "'"; - // views_get_title tables - - // Any number of things might have already added a term_node table, but - // if they have and are filtering on it the query is going to be borken - // anyway. If it's been added and unfiltered, and we ignore it, we get - // bad results. - - // However, if they added multiple or filters, we do have to separate - // them a bit. - if ($query->added_taxonomy_or) { - $num = $query->add_table('term_node'); - } - else { - $num = 1; - $query->ensure_table('term_node'); - $query->added_taxonomy_or = TRUE; - } + $table_data = _views_get_tables(); + // For every term we have to match, add a views_get_title table + $joininfo = $table_data['term_node']['join']; + $joininfo['extra']['tid'] = $value; + $joininfo['type'] = 'inner'; + $num = $query->add_table('term_node', false, 1, $joininfo); + } + else if ($op == 'NOR') { + $table_data = _views_get_tables(); + // For every term we have to match, add a views_get_title table + $joininfo = $table_data['term_node']['join']; + $joininfo['extra']['tid'] = $value; + $num = $query->add_table('term_node', false, 1, $joininfo); $tablename = $query->get_table_name('term_node', $num); - $where = "$tablename.tid IN ($clause)"; - - // for each depth > 0, add the next child in term_hierarchy to the join - for ($i = 0; $i < $depth; $i++) { - $thnum = $query->add_table('term_hierarchy', false, 1, array('left' => array('table' => $tablename, 'field' => 'tid'), 'right' => array('field' => 'tid'))); - $thname = $query->get_table_name('term_hierarchy', $thnum); - $num = $query->add_table('term_data', false, 1, array('left' => array('table' => $thname, 'field' => 'parent'), 'right' => array('field' => 'tid'))); - $tablename = $query->get_table_name('term_data', $num); - $where .= " OR $tablename.tid IN ($clause)"; - } - $query->add_where("$where"); + $query->add_where("$tablename.tid IS NULL"); } else { - if ($op == 'NOR') { - $not = "!"; - } foreach ($value as $tid) { // For every term we have to match, add a views_get_title table - $num = 1; $num = $query->add_table('term_node'); $tablename = $query->get_table_name('term_node', $num); - $where = "$tablename.tid = '$tid'"; - - // for each depth > 0, add the next child in term_hierarchy to the join - for ($i = 0; $i < $depth; $i++) { - $thnum = $query->add_table('term_hierarchy', false, 1, array('left' => array('table' => $tablename, 'field' => 'tid'), 'right' => array('field' => 'tid'))); - $thname = $query->get_table_name('term_hierarchy', $thnum); - $num = $query->add_table('term_data', false, 1, array('left' => array('table' => $thname, 'field' => 'parent'), 'right' => array('field' => 'tid'))); - $tablename = $query->get_table_name('term_data', $num); - $where .= " OR $tablename.tid = '$tid'"; - } - $query->add_where("$not($where)"); + $query->add_where("$tablename.tid = '$tid'"); } } } @@ -513,28 +472,29 @@ /* * Add a WHERE clause views_get_title on taxonomy vocabulary */ -function _views_add_vocabulary($op, $value, $depth, &$query) { +function _views_add_vocabulary($op, $value, &$query) { if ($op == 'OR' || $op == 'NOR') { - if ($op == 'NOR') { - $not = 'NOT'; + $num = $query->add_table('term_node'); + $tablename1 = $query->get_table_name('term_node', $num); + $joininfo = array('left' => array('table' => $tablename1, 'field' => 'tid'), 'right' => array('field' => 'tid')); + $joininfo['extra'] = array('vid' => $value); + $num = $query->add_table('term_data', false, 1, $joininfo); + $tablename2 = $query->get_table_name('term_data', $num); + if ($op == 'OR') { + $query->add_where("$tablename1.tid IS NOT NULL"); + $query->add_where("$tablename2.tid IS NOT NULL"); } - if (($op == 'NOR' || count($value) > 1) && count($query->fields)) { - // group by views_title_table.views_title_field - // count($query->fields) == 0 will break this code (can this happen?) - $field = $query->fields[0]; - $query->add_groupby($field); - $query->set_count_field("DISTINCT($field)"); + else { + $query->add_where("($tablename1.tid IS NULL AND $tablename2.tid IS NULL)"); } - $query->ensure_table('term_data'); - $clause = "'" . implode("','", $value) . "'"; - $query->add_where("term_data.vid $not IN ($clause)"); } else { foreach ($value as $vid) { // For every vocabulary we have to match, add a views_get_title table $num = $query->add_table('term_node'); $tablename = $query->get_table_name('term_node', $num); - $num = $query->add_table('term_data', false, 1, array('left' => array('table' => $tablename, 'field' => 'tid'), 'right' => array('field' => 'tid'))); + $joininfo = array('left' => array('table' => $tablename, 'field' => 'tid'), 'right' => array('field' => 'tid')); + $num = $query->add_table('term_data', false, 1, $joininfo); $tablename = $query->get_table_name('term_data', $num); $query->add_where("$tablename.vid = '$vid'"); }