function tripal_views_get_integration_array_for_chado_table

2.x tripal_views_integration.inc tripal_views_get_integration_array_for_chado_table($table_name, $base_table = TRUE, $priority = 9)
1.x tripal_views.api.inc tripal_views_get_integration_array_for_chado_table($table_name, $base_table = TRUE, $priority = 9)

Returns the array needed to integrate a given chado table with views

Parameters

$tablename: The table to generate the tripal views integration array for

Return value

The tripal views integration array which is the parameter for tripal_add_views_integration($defn_array)

Related topics

1 call to tripal_views_get_integration_array_for_chado_table()
tripal_views_integrate_all_chado_tables in tripal_views/includes/tripal_views_integration.inc
Integrate all chado tables in the schema api. This integration only occurs once and sets all Chado tables to a priority of 10

File

tripal_views/includes/tripal_views_integration.inc, line 93
Contains functions used to manage tripal views integrations

Code

function tripal_views_get_integration_array_for_chado_table($table_name, $base_table = TRUE, $priority = 9) {

  // Get the schema for this table (via the chado schema api)
  $schema = chado_get_schema($table_name);

  // Base definition array
  $defn_array = array(
    'table' => $table_name,
    'type' => 'chado',
    'name' => 'Chado ' . ucwords(str_replace('_', ' ', $table_name)),
    'description' => (!empty($schema['description'])) ? $schema['description'] : ' ',
    'priority' => $priority,
    'base_table' => $base_table,
    'fields' => array(),
  );
  // Add fields
  if (!isset($schema['fields'])) {
    tripal_report_error('tripal_views', TRIPAL_NOTICE, 
    'There are no fields defined for %table in the Chado Schema API.', array('%table' => $table_name));
    return FALSE;
  }
  foreach ($schema['fields'] as $field_name => $field_schema) {

    // Base field definition
    if (!empty($field_name) && !empty($field_schema['type'])) {
      $defn_array['fields'][$field_name] = array(
        'name' => $field_name,
        'title' => ucwords(str_replace('_', ' ', $field_name)),
        'type' => $field_schema['type'],
        'description' => (!empty($field_schema['description'])) ? $field_schema['description'] : ucwords(str_replace('_', ' ', $field_name)),
        'handlers' => array(),
        'joins' => array()
      );

      // Add handlers based on type
      if (preg_match('/^int/', $field_schema['type'])) {
        $defn_array['fields'][$field_name]['handlers'] = array(
          
          'field' => array('name' => 'views_handler_field_numeric'),
          'filter' => array('name' => 'views_handler_filter_numeric'),
          'sort' => array('name' => 'views_handler_sort'),
          'argument' => array('name' => 'views_handler_argument_numeric'),
        );
      }
      // Set the defaults for a serial type.
      elseif (preg_match('/^serial/', $field_schema['type'])) {
        $defn_array['fields'][$field_name]['handlers'] = array(
          
          'field' => array('name' => 'views_handler_field_numeric'),
          'filter' => array('name' => 'views_handler_filter_numeric'),
          'sort' => array('name' => 'views_handler_sort'),
          'argument' => array('name' => 'views_handler_argument_numeric'),
        );
        $defn_array['fields'][$field_name]['type'] = 'int';
      }
      // Set the defaults for a varchar type.
      elseif (preg_match('/^varchar/', $field_schema['type'])) {
        $defn_array['fields'][$field_name]['handlers'] = array(
          
          'field' => array('name' => 'views_handler_field'),
          'filter' => array('name' => 'views_handler_filter_string'),
          'sort' => array('name' => 'views_handler_sort'),
          'argument' => array('name' => 'views_handler_argument_string'),
        );
      }
      // Set the defaults for a text type.
      elseif (preg_match('/^text/', $field_schema['type'])) {
        $defn_array['fields'][$field_name]['handlers'] = array(
          
          'field' => array('name' => 'views_handler_field'),
          'filter' => array('name' => 'views_handler_filter_string'),
          'sort' => array('name' => 'views_handler_sort'),
          'argument' => array('name' => 'views_handler_argument_string'),
        );
      }
      // Set the defaults for a char type.
      elseif (preg_match('/^char/', $field_schema['type'])) {
        $defn_array['fields'][$field_name]['handlers'] = array(
          
          'field' => array('name' => 'views_handler_field'),
          'filter' => array('name' => 'views_handler_filter_string'),
          'sort' => array('name' => 'views_handler_sort'),
          'argument' => array('name' => 'views_handler_argument_string'),
        );
      }
      // Set the defaults for a boolean type.
      elseif (preg_match('/^boolean/', $field_schema['type'])) {
        $defn_array['fields'][$field_name]['handlers'] = array(
          
          'field' => array('name' => 'views_handler_field_boolean'),
          'filter' => array('name' => 'views_handler_filter_boolean_operator'),
          'sort' => array('name' => 'views_handler_sort'),
        );
      }
      // Set the defaults for a datatime type.
      elseif (preg_match('/^datetime/', $field_schema['type'])) {
        $defn_array['fields'][$field_name]['handlers'] = array(
          
          'field' => array('name' => 'views_handler_field_date'),
          'filter' => array('name' => 'views_handler_filter_date'),
          'sort' => array('name' => 'views_handler_sort_date'),
          'argument' => array('name' => 'views_handler_argument_date'),
        );
      }
      // Set the defaults for a float type.
      elseif (preg_match('/^float/', $field_schema['type'])) {
        $defn_array['fields'][$field_name]['handlers'] = array(
          'field' => array('name' => 'views_handler_field_numeric'),
          'filter' => array('name' => 'views_handler_filter_numeric'),
          'sort' => array('name' => 'views_handler_sort'),
          'argument' => array('name' => 'views_handler_argument_numeric'),
        );
      }
      // If the type is not recognize the default to a string handler.
      else {
        $defn_array['fields'][$field_name]['handlers'] = array(
          
          'field' => array('name' => 'views_handler_field'),
          'filter' => array('name' => 'views_handler_filter_string'),
          'sort' => array('name' => 'views_handler_sort'),
          'argument' => array('name' => 'views_handler_argument_string'),
        );
      }

      // Specify specialty handlers
      if ($field_name == 'type_id' OR $field_name == 'cvterm_id') {
        $defn_array['fields'][$field_name]['handlers']['filter']['name'] = 'tripal_views_handler_filter_select_cvterm';
      }
      if (preg_match('/name/', $field_name)) {
        $defn_array['fields'][$field_name]['handlers']['filter']['name'] = 'tripal_views_handler_filter_select_string';
      }
    }
  }

  // Add Joins & Relationships for foreign keys to fields
  if (!isset($schema['foreign keys'])) {
    $schema['foreign keys'] = array();
  }
  foreach ($schema['foreign keys'] as $foreign_key_schema) {
    foreach ($foreign_key_schema['columns'] as $left_field => $right_field) {

      // Note: Even though there can only be a single join  for a foreign key
      // we make the joins an array keyed by left_field to ensure that both
      // foeign key and referring_tables (see below) can be processed the same.
      $defn_array['fields'][$left_field]['joins'][$foreign_key_schema['table']][$right_field] = array(
        'table' => $foreign_key_schema['table'],
        'field' => $right_field,
        'handler' => 'views_handler_join',
        'relationship_handler' => 'views_handler_relationship',
      );
    }
  }

  // Add in reverse relationships
  // Note: The array structure is set up with the left_field keyed array to
  // handle more than one join between the same set of tables on different
  // fields. For example, the reverse relationship between feature &
  // feature_relationship needs to join on both the subject_id and object_id.
  if (isset($schema['referring_tables'])) {
    foreach ($schema['referring_tables'] as $referring_table) {

      // D7 @todo: fix referring_tables in schema to list the keys like foreign keys does
      $referring_schema = chado_get_schema($referring_table);
      $referring_schema_fk_columns = $referring_schema['foreign keys'][$table_name]['columns'];
      foreach ($referring_schema_fk_columns as $left_field => $right_field) {

        // Also notice that it doesn't matter whether this is the first or second
        // reverse join on this table ($referring_table) to be added since
        // having $left_field as the key keeps them separate.
        $defn_array['fields'][$right_field]['joins'][$referring_table][$left_field] = array(
          'table' => $referring_table,
          'field' => $left_field,
          'relationship_handler' => 'views_handler_relationship',
          'relationship_only' => 1
        );

      }
    }
  }

  return $defn_array;
}