<?php
// $Id$

/**
 * Implements hook_query_alter().
 */
function database_test_query_alter(QueryAlterableInterface $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(QueryAlterableInterface $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',
  );

  return $items;
}

/**
 * Run a db_query_temporary and output 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 status FROM {system}', array());
  drupal_json_output(array(
    'table_name' => $table_name,
    'row_count' => db_select($table_name)->countQuery()->execute()->fetchField(),
  ));
  exit;
}

/**
 * Run a pager query and return 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('PagerDefault')->limit($limit);

  $names = $query->execute()->fetchCol();

  drupal_json_output(array(
    'names' => $names,
  ));
  exit;
}

/**
 * Run a pager query and return 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('PagerDefault')->limit($limit);

  $names = $query->execute()->fetchCol();

  drupal_json_output(array(
    'names' => $names,
  ));
  exit;
}

/**
 * Run a tablesort query and return 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('TableSort')->orderByHeader($header);

  // We need all the results at once to check the sort.
  $tasks = $query->execute()->fetchAll();

  drupal_json_output(array(
    'tasks' => $tasks,
  ));
  exit;
}

/**
 * Run a tablesort query with a second order_by after and return 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('TableSort')->orderByHeader($header)->orderBy('priority');

  // We need all the results at once to check the sort.
  $tasks = $query->execute()->fetchAll();

  drupal_json_output(array(
    'tasks' => $tasks,
  ));
  exit;
}
