You are here

public function revisioning_handler_filter_revision_state::query in Revisioning 7

Same name and namespace in other branches
  1. 8 views/revisioning_handler_filter_revision_state.inc \revisioning_handler_filter_revision_state::query()
  2. 6.4 views/revisioning_handler_filter_revision_state.inc \revisioning_handler_filter_revision_state::query()
  3. 6.3 views/revisioning_handler_filter_revision_state.inc \revisioning_handler_filter_revision_state::query()

Override the query, in particular the WHERE clause.

Overrides views_handler_filter_in_operator::query

File

views/revisioning_handler_filter_revision_state.inc, line 15
revisioning_handler_filter_revision_state.inc

Class

revisioning_handler_filter_revision_state
@file revisioning_handler_filter_revision_state.inc

Code

public function query() {
  if (empty($this->value)) {
    return;
  }
  $revisions_table = $this
    ->ensure_my_table();
  $node_table = $this->query
    ->ensure_table('node', $this->relationship);
  if (!$node_table) {
    $node_table = $this->query
      ->ensure_table('node');

    // If we are using a relationship we need to try again because the alias
    // is not going to be node!
    if (!$node_table) {
      $node_table = $this->query
        ->ensure_table('node_' . $revisions_table);
    }
    if (!$node_table) {

      // Final desperate guess ...
      $node_table = 'node';
    }
  }
  $subclauses = array();
  foreach ($this->value as $state_code) {
    switch ($state_code) {
      case REVISION_ARCHIVED:
        $subclauses[] = "({$revisions_table}.vid<{$node_table}.vid)";
        break;
      case REVISION_CURRENT:
        $subclauses[] = "({$revisions_table}.vid={$node_table}.vid AND {$node_table}.status=1)";
        break;
      case REVISION_PENDING:
        $subclauses[] = "({$revisions_table}.vid>{$node_table}.vid OR ({$node_table}.status=0 AND (SELECT COUNT(vid) FROM {" . $revisions_table . "} WHERE nid={$node_table}.nid)=1))";

        // Only add this join if there is not already a 'Revision NID of the
        // content revision' contextual filter relationship.
        if (empty($this->query->relationships[$node_table])) {

          // Make sure UNIQUE is set!
          $this->query->table_queue[$revisions_table]['join'] = new views_join();
          $this->query->table_queue[$revisions_table]['join']
            ->construct($node_table, $revisions_table, 'nid', 'nid');
        }
        break;
    }
  }
  if (!empty($subclauses)) {
    $where_expression = implode(' OR ', $subclauses);
    if ($this->operator == 'not in') {
      $where_expression = '!' . $where_expression;
    }
    $this->query
      ->add_where_expression($this->options['group'], $where_expression);
  }
}