database_test.module

File

drupal/core/modules/system/tests/modules/database_test/database_test.module
View source
<?php

use Drupal\Core\Database\Query\AlterableInterface;
use Symfony\Component\HttpFoundation\JsonResponse;

/**
 * Implements hook_query_alter().
 */
function database_test_query_alter(AlterableInterface $query) {
  if ($query
    ->hasTag('database_test_alter_add_range')) {
    $query
      ->range(0, 2);
  }
  if ($query
    ->hasTag('database_test_alter_add_join')) {
    $people_alias = $query
      ->join('test', 'people', "test_task.pid = %alias.id");
    $name_field = $query
      ->addField($people_alias, 'name', 'name');
    $query
      ->condition($people_alias . '.id', 2);
  }
  if ($query
    ->hasTag('database_test_alter_change_conditional')) {
    $conditions =& $query
      ->conditions();
    $conditions[0]['value'] = 2;
  }
  if ($query
    ->hasTag('database_test_alter_change_fields')) {
    $fields =& $query
      ->getFields();
    unset($fields['age']);
  }
  if ($query
    ->hasTag('database_test_alter_change_expressions')) {
    $expressions =& $query
      ->getExpressions();
    $expressions['double_age']['expression'] = 'age*3';
  }
}

/**
 * Implements hook_query_TAG_alter().
 *
 * Called by DatabaseTestCase::testAlterRemoveRange.
 */
function database_test_query_database_test_alter_remove_range_alter(AlterableInterface $query) {
  $query
    ->range();
}

/**
 * Implements hook_menu().
 */
function database_test_menu() {
  $items['database_test/db_query_temporary'] = array(
    'access callback' => TRUE,
    'page callback' => 'database_test_db_query_temporary',
  );
  $items['database_test/pager_query_even'] = array(
    'access callback' => TRUE,
    'page callback' => 'database_test_even_pager_query',
  );
  $items['database_test/pager_query_odd'] = array(
    'access callback' => TRUE,
    'page callback' => 'database_test_odd_pager_query',
  );
  $items['database_test/tablesort'] = array(
    'access callback' => TRUE,
    'page callback' => 'database_test_tablesort',
  );
  $items['database_test/tablesort_first'] = array(
    'access callback' => TRUE,
    'page callback' => 'database_test_tablesort_first',
  );
  $items['database_test/tablesort_default_sort'] = array(
    'access callback' => TRUE,
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'database_test_theme_tablesort',
    ),
  );
  return $items;
}

/**
 * Runs db_query_temporary() and outputs the table name and its number of rows.
 *
 * We need to test that the table created is temporary, so we run it here, in a
 * separate menu callback request; After this request is done, the temporary
 * table should automatically dropped.
 */
function database_test_db_query_temporary() {
  $table_name = db_query_temporary('SELECT age FROM {test}', array());
  return new JsonResponse(array(
    'table_name' => $table_name,
    'row_count' => db_select($table_name)
      ->countQuery()
      ->execute()
      ->fetchField(),
  ));
}

/**
 * Runs a pager query and returns the results.
 *
 * This function does care about the page GET parameter, as set by the
 * simpletest HTTP call.
 */
function database_test_even_pager_query($limit) {
  $query = db_select('test', 't');
  $query
    ->fields('t', array(
    'name',
  ))
    ->orderBy('age');

  // This should result in 2 pages of results.
  $query = $query
    ->extend('Drupal\\Core\\Database\\Query\\PagerSelectExtender')
    ->limit($limit);
  $names = $query
    ->execute()
    ->fetchCol();
  return new JsonResponse(array(
    'names' => $names,
  ));
}

/**
 * Runs a pager query and returns the results.
 *
 * This function does care about the page GET parameter, as set by the
 * simpletest HTTP call.
 */
function database_test_odd_pager_query($limit) {
  $query = db_select('test_task', 't');
  $query
    ->fields('t', array(
    'task',
  ))
    ->orderBy('pid');

  // This should result in 4 pages of results.
  $query = $query
    ->extend('Drupal\\Core\\Database\\Query\\PagerSelectExtender')
    ->limit($limit);
  $names = $query
    ->execute()
    ->fetchCol();
  return new JsonResponse(array(
    'names' => $names,
  ));
}

/**
 * Runs a tablesort query and returns the results.
 *
 * This function does care about the page GET parameter, as set by the
 * simpletest HTTP call.
 */
function database_test_tablesort() {
  $header = array(
    'tid' => array(
      'data' => t('Task ID'),
      'field' => 'tid',
      'sort' => 'desc',
    ),
    'pid' => array(
      'data' => t('Person ID'),
      'field' => 'pid',
    ),
    'task' => array(
      'data' => t('Task'),
      'field' => 'task',
    ),
    'priority' => array(
      'data' => t('Priority'),
      'field' => 'priority',
    ),
  );
  $query = db_select('test_task', 't');
  $query
    ->fields('t', array(
    'tid',
    'pid',
    'task',
    'priority',
  ));
  $query = $query
    ->extend('Drupal\\Core\\Database\\Query\\TableSortExtender')
    ->orderByHeader($header);

  // We need all the results at once to check the sort.
  $tasks = $query
    ->execute()
    ->fetchAll();
  return new JsonResponse(array(
    'tasks' => $tasks,
  ));
}

/**
 * Runs a tablesort query with a second order_by after and returns the results.
 *
 * This function does care about the page GET parameter, as set by the
 * simpletest HTTP call.
 */
function database_test_tablesort_first() {
  $header = array(
    'tid' => array(
      'data' => t('Task ID'),
      'field' => 'tid',
      'sort' => 'desc',
    ),
    'pid' => array(
      'data' => t('Person ID'),
      'field' => 'pid',
    ),
    'task' => array(
      'data' => t('Task'),
      'field' => 'task',
    ),
    'priority' => array(
      'data' => t('Priority'),
      'field' => 'priority',
    ),
  );
  $query = db_select('test_task', 't');
  $query
    ->fields('t', array(
    'tid',
    'pid',
    'task',
    'priority',
  ));
  $query = $query
    ->extend('Drupal\\Core\\Database\\Query\\TableSortExtender')
    ->orderByHeader($header)
    ->orderBy('priority');

  // We need all the results at once to check the sort.
  $tasks = $query
    ->execute()
    ->fetchAll();
  return new JsonResponse(array(
    'tasks' => $tasks,
  ));
}

/**
 * Outputs a form without setting a header sort.
 */
function database_test_theme_tablesort($form, &$form_state) {
  $header = array(
    'username' => array(
      'data' => t('Username'),
      'field' => 'u.name',
    ),
    'status' => array(
      'data' => t('Status'),
      'field' => 'u.status',
    ),
  );
  $query = db_select('users', 'u');
  $query
    ->condition('u.uid', 0, '<>');
  user_build_filter_query($query);
  $count_query = clone $query;
  $count_query
    ->addExpression('COUNT(u.uid)');
  $query = $query
    ->extend('Drupal\\Core\\Database\\Query\\PagerSelectExtender')
    ->extend('Drupal\\Core\\Database\\Query\\TableSortExtender');
  $query
    ->fields('u', array(
    'uid',
    'name',
    'status',
    'created',
    'access',
  ))
    ->limit(50)
    ->orderByHeader($header)
    ->setCountQuery($count_query);
  $result = $query
    ->execute();
  $options = array();
  $status = array(
    t('blocked'),
    t('active'),
  );
  $accounts = array();
  foreach ($result as $account) {
    $options[$account->uid] = array(
      'username' => check_plain($account->name),
      'status' => $status[$account->status],
    );
  }
  $form['accounts'] = array(
    '#type' => 'tableselect',
    '#header' => $header,
    '#options' => $options,
    '#empty' => t('No people available.'),
  );
  return $form;
}

Functions

Namesort descending Description
database_test_db_query_temporary Runs db_query_temporary() and outputs the table name and its number of rows.
database_test_even_pager_query Runs a pager query and returns the results.
database_test_menu Implements hook_menu().
database_test_odd_pager_query Runs a pager query and returns the results.
database_test_query_alter Implements hook_query_alter().
database_test_query_database_test_alter_remove_range_alter Implements hook_query_TAG_alter().
database_test_tablesort Runs a tablesort query and returns the results.
database_test_tablesort_first Runs a tablesort query with a second order_by after and returns the results.
database_test_theme_tablesort Outputs a form without setting a header sort.