You are here

function views_many_to_one_helper::ensure_my_table in Views (for Drupal 7) 6.2

Same name and namespace in other branches
  1. 6.3 includes/handlers.inc \views_many_to_one_helper::ensure_my_table()
  2. 7.3 includes/handlers.inc \views_many_to_one_helper::ensure_my_table()

Override ensure_my_table so we can control how this joins in. The operator actually has influence over joining.

File

includes/handlers.inc, line 643
handlers.inc Defines the various handler objects to help build and display views.

Class

views_many_to_one_helper
This many to one helper object is used on both arguments and filters.

Code

function ensure_my_table() {
  if (!isset($this->handler->table_alias)) {

    // For 'or' if we're not reducing duplicates, we get the absolute simplest:
    $field = $this->handler->table . '.' . $this->handler->field;
    if ($this->handler->operator == 'or' && empty($this->handler->options['reduce_duplicates'])) {
      if (empty($this->handler->options['add_table']) && empty($this->handler->view->many_to_one_tables[$field])) {

        // query optimization, INNER joins are slightly faster, so use them
        // when we know we can.
        $join = $this
          ->get_join();
        $join->type = 'INNER';
        $this->handler->table_alias = $this->handler->query
          ->ensure_table($this->handler->table, $this->handler->relationship, $join);
        $this->handler->view->many_to_one_tables[$field] = $this->handler->value;
      }
      else {
        $join = $this
          ->get_join();
        $join->type = 'LEFT';
        if (!empty($this->handler->view->many_to_one_tables[$field])) {
          foreach ($this->handler->view->many_to_one_tables[$field] as $value) {
            $join->extra = array(
              array(
                'field' => $this->handler->real_field,
                'operator' => '!=',
                'value' => $value,
                'numeric' => !empty($this->handler->definition['numeric']),
              ),
            );
          }
        }
        $this->handler->table_alias = $this
          ->add_table($join);
      }
      return $this->handler->table_alias;
    }
    if ($this->handler->operator != 'not') {

      // If it's an and or an or, we do one join per selected value.
      // Clone the join for each table:
      $this->handler->table_aliases = array();
      foreach ($this->handler->value as $value) {
        $join = $this
          ->get_join();
        if ($this->handler->operator == 'and') {
          $join->type = 'INNER';
        }
        $join->extra = array(
          array(
            'field' => $this->handler->real_field,
            'value' => $value,
            'numeric' => !empty($this->handler->definition['numeric']),
          ),
        );

        // The table alias needs to be unique to this value across the
        // multiple times the filter or argument is called by the view.
        if (!isset($this->handler->view->many_to_one_aliases[$field][$value])) {
          if (!isset($this->handler->view->many_to_one_count[$this->handler->table])) {
            $this->handler->view->many_to_one_count[$this->handler->table] = 0;
          }
          $this->handler->view->many_to_one_aliases[$field][$value] = $this->handler->table . '_value_' . $this->handler->view->many_to_one_count[$this->handler->table]++;
        }
        $alias = $this->handler->table_aliases[$value] = $this
          ->add_table($join, $this->handler->view->many_to_one_aliases[$field][$value]);

        // and set table_alias to the first of these.
        if (empty($this->handler->table_alias)) {
          $this->handler->table_alias = $alias;
        }
      }
    }
    else {

      // For not, we just do one join. We'll add a where clause during
      // the query phase to ensure that $table.$field IS NULL.
      $join = $this
        ->get_join();
      $join->type = 'LEFT';
      $join->extra = array();
      $join->extra_type = 'OR';
      foreach ($this->handler->value as $value) {
        $join->extra[] = array(
          'field' => $this->handler->real_field,
          'value' => $value,
          'numeric' => !empty($this->handler->definition['numeric']),
        );
      }
      $this->handler->table_alias = $this
        ->add_table($join);
    }
  }
  return $this->handler->table_alias;
}