Index: includes/view.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/views/includes/view.inc,v retrieving revision 1.123 diff -u -r1.123 view.inc --- includes/view.inc 14 Aug 2008 22:17:11 -0000 1.123 +++ includes/view.inc 4 Sep 2008 08:52:06 -0000 @@ -492,7 +492,9 @@ $this->base_database = $views_data['table']['base']['database']; } views_include('query'); - $this->query = new views_query($this->base_table, $this->base_field); + $query_class = empty($views_data['table']['base']['query class']) ? + 'views_query' : $views_data['table']['base']['query class']; + $this->query = new $query_class($this->base_table, $this->base_field); // Call a module hook and see if it wants to present us with a // pre-built query or instruct us not to build the query for @@ -567,14 +569,17 @@ // Allow style handler to affect the query: $this->style_plugin->query(); - if (variable_get('views_sql_signature', FALSE)) { + if (variable_get('views_sql_signature', FALSE) && $query_class == 'views_query') { $this->query->add_field(NULL, "'" . $this->name . ':' . $this->current_display . "'", 'view_name'); } // Let modules modify the query just prior to finalizing it. - foreach (module_implements('views_query_alter') as $module) { - $function = $module . '_views_query_alter'; - $function($this, $this->query); + // Only do this, if the default query class is used. + if ($query_class == 'views_query') { + foreach (module_implements('views_query_alter') as $module) { + $function = $module . '_views_query_alter'; + $function($this, $this->query); + } } $this->build_info['query'] = $this->query->query(); @@ -619,81 +624,7 @@ return TRUE; } - $query = db_rewrite_sql($this->build_info['query'], $this->base_table, $this->base_field, array('view' => &$this)); - - $args = $this->build_info['query_args']; - - vpr($query); - - $items = array(); - if ($query) { - $replacements = module_invoke_all('views_query_substitutions', $this); - $query = str_replace(array_keys($replacements), $replacements, $query); - - if (is_array($args)) { - foreach ($args as $id => $arg) { - $args[$id] = str_replace(array_keys($replacements), $replacements, $arg); - } - } - - // Allow for a view to query an external database. - if (isset($this->base_database)) { - db_set_active($this->base_database); - $external = TRUE; - } - - // make count from subselect now - $count_query = "SELECT COUNT(*) FROM ($query) AS count_alias"; - - $start = microtime(); - if (!empty($this->pager['items_per_page'])) { - // We no longer use pager_query() here because pager_query() does not - // support an offset. This is fine as we don't actually need pager - // query; we've already been doing most of what it does, and we - // just need to do a little more playing with globals. - if (!empty($this->pager['use_pager']) || !empty($this->get_total_rows)) { - $this->total_rows = db_result(db_query($count_query, $args)); - } - - if (!empty($this->pager['use_pager'])) { - // dump information about what we already know into the globals - global $pager_page_array, $pager_total, $pager_total_items; - // total rows in query - $pager_total_items[$this->pager['element']] = $this->total_rows; - // total pages - $pager_total[$this->pager['element']] = ceil($pager_total_items[$this->pager['element']] / $this->pager['items_per_page']); - - // What page was requested: - $pager_page_array = isset($_GET['page']) ? explode(',', $_GET['page']) : array(); - - // If the requested page was within range. $this->pager['current_page'] - // defaults to 0 so we don't need to set it in an out-of-range condition. - if (!empty($pager_page_array[$this->pager['element']])) { - $page = intval($pager_page_array[$this->pager['element']]); - if ($page > 0 && $page < $pager_total[$this->pager['element']]) { - $this->pager['current_page'] = $page; - } - } - $pager_page_array[$this->pager['element']] = $this->pager['current_page']; - } - - $offset = $this->pager['current_page'] * $this->pager['items_per_page'] + $this->pager['offset']; - $result = db_query_range($query, $args, $offset, $this->pager['items_per_page']); - - } - else { - $result = db_query($query, $args); - } - - $this->result = array(); - while ($item = db_fetch_object($result)) { - $this->result[] = $item; - } - if (!empty($external)) { - db_set_active(); - } - } - $this->execute_time = microtime() - $start; + $this->query->execute($this); $this->executed = TRUE; } Index: includes/query.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/views/includes/query.inc,v retrieving revision 1.25 diff -u -r1.25 query.inc --- includes/query.inc 14 Aug 2008 22:17:10 -0000 1.25 +++ includes/query.inc 4 Sep 2008 08:52:06 -0000 @@ -917,5 +917,86 @@ } return $args; } -} + + /** + * Executes the query and fills the associated view object with according + * values. + * + * Values to set: $view->result, $view->total_rows, $view->execute_time, + * $view->pager['current_page']. + */ + function execute(&$view) { + $query = db_rewrite_sql($view->build_info['query'], $view->base_table, $view->base_field, array('view' => &$view)); + $args = $view->build_info['query_args']; + vpr($query); + + $items = array(); + $results = NULL; + if ($query) { + $replacements = module_invoke_all('views_query_substitutions', $view); + $query = str_replace(array_keys($replacements), $replacements, $query); + + if (is_array($args)) { + foreach ($args as $id => $arg) { + $args[$id] = str_replace(array_keys($replacements), $replacements, $arg); + } + } + + // Allow for a view to query an external database. + if (isset($view->base_database)) { + db_set_active($view->base_database); + $external = TRUE; + } + + // make count from subselect now + $count_query = "SELECT COUNT(*) FROM ($query) AS count_alias"; + + $start = microtime(); + if (!empty($view->pager['items_per_page'])) { + // We no longer use pager_query() here because pager_query() does not + // support an offset. This is fine as we don't actually need pager + // query; we've already been doing most of what it does, and we + // just need to do a little more playing with globals. + $view->total_rows = db_result(db_query($count_query, $args)); + + if (!empty($view->pager['use_pager'])) { + // dump information about what we already know into the globals + global $pager_page_array, $pager_total, $pager_total_items; + // total rows in query + $pager_total_items[$view->pager['element']] = $view->total_rows; + // total pages + $pager_total[$view->pager['element']] = ceil($pager_total_items[$view->pager['element']] / $view->pager['items_per_page']); + + // What page was requested: + $pager_page_array = isset($_GET['page']) ? explode(',', $_GET['page']) : array(); + + // If the requested page was within range. $view->pager['current_page'] + // defaults to 0 so we don't need to set it in an out-of-range condition. + if (!empty($pager_page_array[$view->pager['element']])) { + $page = intval($pager_page_array[$view->pager['element']]); + if ($page > 0 && $page < $pager_total[$view->pager['element']]) { + $view->pager['current_page'] = $page; + } + } + $pager_page_array[$view->pager['element']] = $view->pager['current_page']; + } + + $offset = $view->pager['current_page'] * $view->pager['items_per_page'] + $view->pager['offset']; + $result = db_query_range($query, $args, $offset, $view->pager['items_per_page']); + } + else { + $result = db_query($query, $args); + } + + $view->result = array(); + while ($item = db_fetch_object($result)) { + $view->result[] = $item; + } + if (!empty($external)) { + db_set_active(); + } + $view->execute_time = microtime() - $start; + } + } +} \ No newline at end of file