function views_plugin_query_default::execute

Same name in other branches
  1. 6.x-3.x plugins/views_plugin_query_default.inc \views_plugin_query_default::execute()

Executes the query and fills the associated view object with according values.

Values to set: $view->result, $view->total_rows, $view->execute_time, $view->current_page.

Overrides views_plugin_query::execute

File

plugins/views_plugin_query_default.inc, line 1475

Class

views_plugin_query_default
Object used to create a SELECT query.

Code

public function execute(&$view) {
    // Whether this query will run against an external database.
    $query = $view->build_info['query'];
    $count_query = $view->build_info['count_query'];
    $query->addMetaData('view', $view);
    $count_query->addMetaData('view', $view);
    if (empty($this->options['disable_sql_rewrite'])) {
        $base_table_data = views_fetch_data($this->base_table);
        if (isset($base_table_data['table']['base']['access query tag'])) {
            $access_tag = $base_table_data['table']['base']['access query tag'];
            $query->addTag($access_tag);
            $count_query->addTag($access_tag);
        }
    }
    if ($query) {
        $additional_arguments = module_invoke_all('views_query_substitutions', $view);
        // Count queries must be run through the preExecute() method.
        // If not, then hook_query_node_access_alter() may munge the count by
        // adding a distinct against an empty query string
        // (e.g. COUNT DISTINCT(1) ...) and no pager will return.
        // @see pager.inc > PagerDefault::execute()
        // @see http://api.drupal.org/api/drupal/includes--pager.inc/function/PagerDefault::execute/7
        // @see http://drupal.org/node/1046170.
        $count_query->preExecute();
        // Build the count query.
        $count_query = $count_query->countQuery();
        // Add additional arguments as a fake condition.
        // XXX: this doesn't work... because PDO mandates that all bound arguments
        // are used on the query. TODO: Find a better way to do this.
        if (!empty($additional_arguments)) {
            // $query->where('1 = 1', $additional_arguments);
            // $count_query->where('1 = 1', $additional_arguments);
        }
        $start = microtime(TRUE);
        try {
            if ($this->pager
                ->use_count_query() || !empty($view->get_total_rows)) {
                $this->pager
                    ->execute_count_query($count_query);
            }
            $this->pager
                ->pre_execute($query);
            $result = $query->execute();
            $view->result = array();
            foreach ($result as $item) {
                $view->result[] = $item;
            }
            $this->pager
                ->post_execute($view->result);
            if ($this->pager
                ->use_count_query() || !empty($view->get_total_rows)) {
                $view->total_rows = $this->pager
                    ->get_total_items();
            }
        } catch (Exception $e) {
            $view->result = array();
            if (!empty($view->live_preview)) {
                drupal_set_message($e->getMessage(), 'error');
            }
            else {
                vpr('Exception in @human_name[@view_name]: @message', array(
                    '@human_name' => $view->human_name,
                    '@view_name' => $view->name,
                    '@message' => $e->getMessage(),
                ));
            }
        }
    }
    else {
        $start = microtime(TRUE);
    }
    $view->execute_time = microtime(TRUE) - $start;
}