diff --git a/plugins/views_plugin_query_default.inc b/plugins/views_plugin_query_default.inc index 030c5ea..a09f13d 100644 --- a/plugins/views_plugin_query_default.inc +++ b/plugins/views_plugin_query_default.inc @@ -1205,7 +1205,9 @@ class views_plugin_query_default extends views_plugin_query { } // This is a formula, using no tables. elseif (empty($field['table'])) { - $non_aggregates[] = $fieldname; + if (!in_array($fieldname, $non_aggregates)) { + $non_aggregates[] = $fieldname; + } $placeholders = !empty($field['placeholders']) ? $field['placeholders'] : array(); $query->addExpression($string, $fieldname, $placeholders); } @@ -1213,10 +1215,15 @@ class views_plugin_query_default extends views_plugin_query { elseif ($this->distinct && !in_array($fieldname, $this->groupby)) { // d7cx: This code was there, apparently needed for PostgreSQL // $string = db_driver() == 'pgsql' ? "FIRST($string)" : $string; + if (!in_array($string, $non_aggregates)) { + $non_aggregates[] = $string; + } $query->addField(!empty($field['table']) ? $field['table'] : $this->base_table, $field['field'], $fieldname); } elseif (empty($field['aggregate'])) { - $non_aggregates[] = $fieldname; + if (!in_array($string, $non_aggregates)) { + $non_aggregates[] = $string; + } $query->addField(!empty($field['table']) ? $field['table'] : $this->base_table, $field['field'], $fieldname); } @@ -1248,7 +1255,7 @@ class views_plugin_query_default extends views_plugin_query { function query($get_count = FALSE) { // Check query distinct value. if (empty($this->no_distinct) && $this->distinct && !empty($this->fields)) { - if ($this->pure_distinct === FALSE){ + if ($this->pure_distinct === FALSE) { $base_field_alias = $this->add_field($this->base_table, $this->base_field); $this->add_groupby($base_field_alias); } diff --git a/tests/views_groupby.test b/tests/views_groupby.test index 718d8dc..943679e 100644 --- a/tests/views_groupby.test +++ b/tests/views_groupby.test @@ -108,6 +108,88 @@ class ViewsQueryGroupByTest extends ViewsSqlTest { } /** + * Tests aggregate count feature. + */ + public function testAggregateAmbiguity() { + // Create 4 nodes of type1 + $type1 = $this->drupalCreateContentType(); + + $node_1 = array( + 'type' => $type1->type, + ); + $this->drupalCreateNode($node_1); + $this->drupalCreateNode($node_1); + $this->drupalCreateNode($node_1); + $this->drupalCreateNode($node_1); + + $view = $this->viewsAggregateAmbiguityView(); + $output = $view->execute_display(); + + $this->assertEqual(count($view->result), 1, 'Make sure there are no ambiguity problems with the group by operation.'); + } + + public function viewsAggregateAmbiguityView() { + $view = new view(); + $view->name = 'aggregate_ambiguity'; + $view->description = ''; + $view->tag = 'default'; + $view->base_table = 'node'; + $view->human_name = ''; + $view->core = 7; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Master */ + $handler = $view->new_display('default', 'Master', 'default'); + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['group_by'] = TRUE; + $handler->display->display_options['access']['type'] = 'none'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['style_plugin'] = 'default'; + $handler->display->display_options['row_plugin'] = 'fields'; + /* Field: COUNT(Content revision: Nid) */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'node_revision'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['group_type'] = 'count'; + $handler->display->display_options['fields']['nid']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['nid']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['nid']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['nid']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['nid']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['nid']['alter']['trim'] = 0; + $handler->display->display_options['fields']['nid']['alter']['html'] = 0; + $handler->display->display_options['fields']['nid']['hide_empty'] = 0; + $handler->display->display_options['fields']['nid']['empty_zero'] = 0; + /* Field: Content: Nid */ + $handler->display->display_options['fields']['nid_1']['id'] = 'nid_1'; + $handler->display->display_options['fields']['nid_1']['table'] = 'node'; + $handler->display->display_options['fields']['nid_1']['field'] = 'nid'; + $handler->display->display_options['fields']['nid_1']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['nid_1']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['nid_1']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['nid_1']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['nid_1']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['nid_1']['alter']['trim'] = 0; + $handler->display->display_options['fields']['nid_1']['alter']['html'] = 0; + $handler->display->display_options['fields']['nid_1']['hide_empty'] = 0; + $handler->display->display_options['fields']['nid_1']['empty_zero'] = 0; + /* Contextual filter: Content: Type */ + $handler->display->display_options['arguments']['type']['id'] = 'type'; + $handler->display->display_options['arguments']['type']['table'] = 'node'; + $handler->display->display_options['arguments']['type']['field'] = 'type'; + $handler->display->display_options['arguments']['type']['default_action'] = 'summary'; + $handler->display->display_options['arguments']['type']['default_argument_type'] = 'fixed'; + $handler->display->display_options['arguments']['type']['summary']['format'] = 'default_summary'; + + + return $view; + } + + /** * @param $group_by * Which group_by function should be used, for example sum or count. */