You are here

QueryTest.php in Views (for Drupal 7) 8.3

File

tests/views_test_data/lib/Drupal/views_test_data/Plugin/views/query/QueryTest.php
View source
<?php

/**
 * @file
 * Definition of Drupal\views_test_data\Plugin\views\query\QueryTest.
 */
namespace Drupal\views_test_data\Plugin\views\query;

use Drupal\views\Plugin\views\query\QueryPluginBase;
use Drupal\views\Plugin\views\join\JoinPluginBase;
use Drupal\views\ViewExecutable;
use Drupal\Core\Annotation\Plugin;
use Drupal\Core\Annotation\Translation;

/**
 * Defines a query test plugin.
 *
 * @Plugin(
 *   id = "query_test",
 *   title = @Translation("Query test")
 * )
 */
class QueryTest extends QueryPluginBase {
  protected $conditions = array();
  protected $fields = array();
  protected $allItems = array();
  protected $orderBy = array();

  /**
   * Sets the allItems property.
   *
   * @param array $allItems
   *   An array of stdClasses.
   */
  public function setAllItems($allItems) {
    $this->allItems = $allItems;
  }
  public function add_where($group, $field, $value = NULL, $operator = NULL) {
    $this->conditions[] = array(
      'field' => $field,
      'value' => $value,
      'operator' => $operator,
    );
  }
  public function add_field($table, $field, $alias = '', $params = array()) {
    $this->fields[$field] = $field;
    return $field;
  }
  public function add_orderby($table, $field = NULL, $order = 'ASC', $alias = '', $params = array()) {
    $this->orderBy = array(
      'field' => $field,
      'order' => $order,
    );
  }
  public function ensure_table($table, $relationship = NULL, JoinPluginBase $join = NULL) {

    // There is no concept of joins.
  }

  /**
   * Implements Drupal\views\Plugin\views\query\QueryPluginBase::build().
   *
   * @param Drupal\views\ViewExecutable $view
   */
  public function build(ViewExecutable $view) {
    $this->view = $view;

    // @todo Support pagers for know, a php based one would probably match.
    // @todo You could add a string representatin of the query.
    $this->view->build_info['query'] = "";
    $this->view->build_info['count_query'] = "";
  }

  /**
   * Implements Drupal\views\Plugin\views\query\QueryPluginBase::execute().
   */
  public function execute(ViewExecutable $view) {
    $result = array();
    foreach ($this->allItems as $element) {

      // Run all conditions on the element, and add it to the result if they
      // match.
      $match = TRUE;
      foreach ($this->conditions as $condition) {
        $match &= $this
          ->match($element, $condition);
      }
      if ($match) {

        // If the query explicit defines fields to use, filter all others out.
        // Filter out fields
        if ($this->fields) {
          $element = array_intersect_key($element, $this->fields);
        }
        $result[] = (object) $element;
      }
    }
    $this->view->result = $result;
  }

  /**
   * Check a single condition for a single element.
   *
   * @param array $element
   *   The element which should be checked.
   * @param array $condition
   *   An associative array containing:
   *   - field: The field to by, for example id.
   *   - value: The expected value of the element.
   *   - operator: The operator to compare the element value with the expected
   *     value.
   *
   * @return bool
   *   Returns whether the condition matches with the element.
   */
  public function match($element, $condition) {
    $value = $element[$condition['field']];
    switch ($condition['operator']) {
      case '=':
        return $value == $condition['value'];
      case 'IN':
        return in_array($value, $condition['value']);
    }
    return FALSE;
  }

}

Classes

Namesort descending Description
QueryTest Defines a query test plugin.