? patch
Index: includes/views/content.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/includes/views/Attic/content.views.inc,v
retrieving revision 1.1.2.25
diff -u -p -r1.1.2.25 content.views.inc
--- includes/views/content.views.inc	11 Apr 2009 14:50:53 -0000	1.1.2.25
+++ includes/views/content.views.inc	30 Jun 2009 15:00:15 -0000
@@ -60,6 +60,9 @@ function content_views_handlers() {
       'content_handler_filter_many_to_one' => array(
         'parent' => 'views_handler_filter_many_to_one',
       ),
+      'content_handler_filter_associate_delta' => array(
+        'parent' => 'views_handler_filter',
+      ),
 
       // relationship handlers
       'content_handler_relationship' => array(
@@ -308,6 +311,68 @@ function content_views_field_views_data(
 }
 
 /**
+ * Implementation of hook_views_data_alter().
+ */
+function content_views_data_alter(&$data) {
+  $field_types = _content_field_types();
+  $fields = content_fields();
+  foreach ($fields as $field) {
+    $table_alias = content_views_tablename($field);
+    // Check that this field's table has data in the $data object.
+    if (isset($data[$table_alias])) {
+      $db_info = content_database_info($field);
+    
+      // Fill $types with the content type names which contain this field.
+      $types = array();
+      foreach (content_types() as $type) {
+        if (isset($type['fields'][$field['field_name']])) {
+          $types[] = $type['name'];
+        }
+      }
+      
+      $db_columns = array();
+      $additional_fields = array();
+      foreach ($db_info['columns'] as $column => $attributes) {
+        // Select explicitly enabled field columns.
+        if (!empty($attributes['views'])) {
+          $db_columns[$column] = $attributes;
+        }
+        // Ensure all columns are retrieved.
+        $additional_fields[$attributes['column']] = $attributes['column'];
+      }
+      
+      $multigroups = array();
+      $multigroup_results = db_query("SELECT cgf.group_name FROM {". fieldgroup_fields_tablename() ."} cgf
+                                     INNER JOIN {". fieldgroup_tablename() ."} cg on (cgf.group_name = cg.group_name AND cg.group_type = 'multigroup')
+                                     WHERE cgf.field_name = '%s'", $field['field_name']);
+      while ($group = db_fetch_array($multigroup_results)) {
+        $multigroups[] = $group['group_name'];
+      }
+      foreach ($multigroups as $group_name) {
+        $db_field = $group_name;
+        $label_truncated = truncate_utf8(t($field['widget']['label']), 10, TRUE);
+        $title = t('@label (!name) - !column', array('@label' => t($field['widget']['label']), '!name' => $field['field_name'], '!column' => $db_field));
+        $title_short = t('@label-truncated - !column', array('@label-truncated' => $label_truncated, '!column' => $db_field));
+        $data[$table_alias][$db_field] = array(
+          'group' => t('Content'),
+          'title' => $title,
+          'title short' => $title_short,
+          'help' =>  t($field_types[$field['type']]['label']) .' - '. t('Appears in: @types', array('@types' => implode(', ', $types))),
+        );
+        $data[$table_alias][$db_field]['filter'] = array(
+          'field' => $db_field,
+          'table' => $db_info['table'],
+          'handler' => 'content_multi_delta_handler_filter',
+          'additional fields' => array($field['field_name'] .'_value' => $field['field_name'] .'_value'),
+          'content_field_name' => $field['field_name'],
+          'allow empty' => TRUE,
+        );
+      }
+    }
+  }
+}
+
+/**
  * Helper function so it is possible to change the Views tablename
  * in the future without re-writing code.
  */
Index: includes/views/handlers/content_handler_filter_associate_delta.inc
===================================================================
RCS file: includes/views/handlers/content_handler_filter_associate_delta.inc
diff -N includes/views/handlers/content_handler_filter_associate_delta.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ includes/views/handlers/content_handler_filter_associate_delta.inc	30 Jun 2009 15:00:15 -0000
@@ -0,0 +1,94 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Defines a content_handler_filter_associate_delta filter object in views.
+ *
+ * This filter allows you to associate the deltas in a multigroup so that views doesn't do a cross-join across all values in
+ * multivalue cck fields.
+ */
+class content_handler_filter_associate_delta extends views_handler_filter {
+  
+  function init(&$view, $options) {
+    parent::init($view, $options);
+  }
+  
+  function can_expose() {
+    return FALSE;
+  }
+  
+  function options(&$options) {
+    parent::options($options);
+    $options['content_multi_delta_fields'] = array();
+  }
+  
+  function option_definition() {
+    $options = parent::option_definition();
+    return $options;
+  }
+  
+  function options_form(&$form, &$form_state) {
+    $fields = content_fields();
+    $options = array();
+    foreach ($fields as $name => $field) {
+      // Only need to filter $options to those that are multivalue and on the same node type
+      $type_name = $field['type_name'];
+      if (($name != $this->definition['content_field_name']) && $this->_is_field_multivalue($name) && $this->_is_field_multigroup($type_name, $name, $this->field)) {
+        $table_alias = content_views_tablename($field);
+        $options[$table_alias] = $field['widget']['label'];
+      }
+    }
+
+    $form['content_multi_delta_fields'] = array(
+      '#title' => t('Content field(s)'),
+      '#type' => 'checkboxes',
+      '#options' => $options,
+      '#default_value' => $this->options['content_multi_delta_fields'],
+      '#multiple' => TRUE,
+      '#description' => t('Select fields to filter deltas against.'),
+    );
+  }
+  
+  /**
+   * Checks to see if a field is listed as multivalue - if the result is '1' then it is.
+   */
+  function _is_field_multivalue($name) {
+    $multivalue = db_result(db_query(
+      "SELECT multiple FROM {". content_field_tablename() ."} WHERE field_name = '%s'", $name
+    ));
+    return ($multivalue == 1); 
+  }
+  
+  /**
+   * Checks to see if the field_name is part of a multigroup with the $group_name name.
+   */
+  function _is_field_multigroup($type_name, $field_name, $group_name) {
+    $multigroup = db_result(db_query(
+      "SELECT group_type FROM {".
+      fieldgroup_fields_tablename()
+      ."} cgf INNER JOIN {".
+      fieldgroup_tablename()
+      ."} cg ON (cgf.group_name = cg.group_name) WHERE cgf.type_name = '%s' AND cgf.field_name = '%s' AND cgf.group_name = '%s'",
+      $type_name, $field_name, $group_name
+    ));
+    return ($multigroup == 'multigroup');
+  }
+  
+  function options_submit(&$form, &$form_state) {
+    $option_tables = array();
+    foreach ($form_state['values']['options']['content_multi_delta_fields'] as $table => $value) {
+      if (!empty($value)) {
+        $option_tables[] = $table; 
+      }
+    }
+    $form_state['values']['options']['content_multi_delta_fields'] = $option_tables;
+  }
+  
+  function query() {
+    $this->ensure_my_table();
+    foreach ($this->options['content_multi_delta_fields'] as $option_table) {
+      $this->query->add_where($this->options['group'], "$this->table_alias.delta = %s.delta", $option_table);
+    }
+  }
+}
\ No newline at end of file
