Browse Source

turning the problematic stored procedure into php functions

Shawna Spoor 8 years ago
parent
commit
ec2f879280

+ 94 - 0
tripal_chado/api/modules/tripal_chado.cv.api.inc

@@ -352,6 +352,7 @@ function tripal_update_cvtermpath($cv_id, $job_id = NULL) {
   $previous = chado_set_active('chado');
   try {
     $sql = "SELECT * FROM fill_cvtermpath(:name)";
+
     db_query($sql, array(':name' => $cv->name));
     chado_set_active($previous);
   }
@@ -364,6 +365,99 @@ function tripal_update_cvtermpath($cv_id, $job_id = NULL) {
   return TRUE;
 }
 
+
+
+function tripal_update_cvtermpath_bak($cv_id, $job_id = NULL){
+  $depth= 0;
+  chado_set_active('chado');
+  $result = db_query('
+            SELECT DISTINCT t.* from cvterm t 
+            LEFT JOIN cvterm_relationship r 
+            ON (t.cvterm_id = r.subject_id) 
+            INNER JOIN cvterm_relationship r2 
+            ON (t.cvterm_id = r2.object_id) 
+            WHERE t.cv_id = :cvid 
+            AND r.subject_id is null',
+            array(':cvid' => $cv_id)
+  );
+
+  $record = $result->fetchObject();
+  watchdog('debug', '<pre>tripal_update_cvtermpath_bak  $record: '. print_r($record, TRUE) .'</pre>');
+
+  tripal_update_cvtermpath_root_loop($record->cvterm_id, $record->cv_id);
+}
+
+function tripal_update_cvtermpath_root_loop($rootid, $cvid){
+  chado_set_active('chado');
+  watchdog('debug', '<pre>tripal_update_cvtermpath_root_loop  $rootid: '. print_r($rootid, TRUE) .'</pre>');
+  watchdog('debug', '<pre>tripal_update_cvtermpath_root_loop  $cvid: '. print_r($cvid, TRUE) .'</pre>');
+
+  $ttype = db_select('cvterm', 'cv')
+          ->fields('cv', array('cvterm_id'));
+  $db_or = db_or();
+  $db_or->condition('cv.name', "isa", '=' );
+  $db_or->condition('cv.name', "is_a", '=' );
+  $ttype->condition($db_or);
+  $result = $ttype->execute()->fetchAll();
+  watchdog('debug', '<pre>tripal_update_cvtermpath_root_loop  $result: '. print_r($result, TRUE) .'</pre>');
+
+  tripal_update_cvtermpath_loop($rootid, $rootid, $cvid, $result['cvterm_id'], 0);
+
+  $cterm = db_query(
+           'SELECT * FROM cvterm_relationship 
+            WHERE object_id = :rootid',
+            array(':rootid' => $rootid)
+    );
+
+  while($cterm_result = $cterm->fetchAssoc()) {
+    watchdog('debug', '<pre>tripal_update_cvtermpath_root_loop  $cterm_result: '. print_r($cterm_result, TRUE) .'</pre>');
+    tripal_update_cvtermpath_root_loop($cterm_result['subject_id'], $cvid);
+  };
+
+}
+
+function tripal_update_cvtermpath_loop($origin, $subject_id, $cv_id, $type_id, $depth){
+  chado_set_active('chado');
+  watchdog('debug', '<pre>tripal_update_cvtermpath_loop  $subject_id: '. print_r($subject_id, TRUE) .'</pre>');
+
+  $count =  db_query('SELECT * FROM cvtermpath
+           WHERE cv_id = :cvid AND object_id = :origin
+           AND subject_id = :child_id
+           AND pathdistance = :depth',
+    array(':cvid' => $cv_id, ':origin' => $origin, ':child_id' => $subject_id, ':depth' => $depth)
+  );
+  $count_total = $count->rowCount();
+
+  /*if ($count == 0) {
+    db_update("cvtermpath")
+      ->fields(array("object_id", "subject_id", "cv_id", "type_id", "pathdistance"))
+      ->values(array(
+        "origin" => ,
+        "child_id" => ,
+        "cvid" => ,
+        "typeid" => ,
+        "depth" =>
+      ));
+  } */
+  $cterm = array();
+
+  $query = db_select('cvterm_relationship', 'cvtr')
+          ->fields('cvtr')
+          ->condition('cvtr.object_id', $subject_id, '=' )
+          ->execute();
+
+  while($loop_item = $query->fetchAssoc()){
+    watchdog('debug', '<pre>tripal_update_cvtermpath_loop  $loop_item: '. print_r($loop_item, TRUE) .'</pre>');
+    tripal_update_cvtermpath_loop($origin, $loop_item['subject_id'], $cv_id, $loop_item['type_id'], $depth + 1 );
+  };
+
+
+  return $cterm;
+
+}
+
+
+
 /**
  * Adds a controlled vocabular to the CV table of Chado.
  *

+ 2 - 2
tripal_chado/includes/loaders/tripal_chado.obo_loader.inc

@@ -510,7 +510,7 @@ function tripal_chado_load_update_cvtermpath($newcvs, $jobid) {
  */
 function tripal_chado_load_obo_v1_2($file, $jobid = NULL, &$newcvs) {
 
-  $transaction = db_transaction();
+  //$transaction = db_transaction();
   print "\nNOTE: Loading of this OBO file is performed using a database transaction. \n" .
       "If the load fails or is terminated prematurely then the entire set of \n" .
       "insertions/updates is rolled back and will not be found in the database\n\n";
@@ -570,7 +570,7 @@ function tripal_chado_load_obo_v1_2($file, $jobid = NULL, &$newcvs) {
     }
   }
   catch (Exception $e) {
-    $transaction->rollback();
+   //$transaction->rollback();
     print "\n"; // make sure we start errors on new line
     print "FAILED. Rolling back database changes...\n";
     watchdog_exception('T_obo_loader', $e);

+ 1684 - 0
tripal_chado/includes/tripal_chado.fields.inc.orig

@@ -0,0 +1,1684 @@
+<?php
+
+/**
+ * Implements hook_field_create_info().
+ *
+ * This is a Tripal defined hook that supports integration with the
+ * TripalEntity field.
+ */
+function tripal_chado_bundle_create_fields($entity_type, $bundle, $chado_bundle) {
+
+  // Get the details about the mapping of this bundle to the Chado table:
+  $details = array(
+    'chado_cvterm_id' => $chado_bundle['type_id'],
+    'chado_table' => $chado_bundle['data_table'],
+    'chado_type_table' => $chado_bundle['type_linker_table'],
+    'chado_type_column' => $chado_bundle['type_column'],
+  );
+
+  $info = array();
+
+  // Create the fields for each column in the table.
+  tripal_chado_bundle_create_fields_base($info, $details, $entity_type, $bundle);
+
+  // Create custom fields.
+  tripal_chado_bundle_create_fields_custom($info, $details, $entity_type, $bundle);
+
+  // Create fields for linking tables.
+  tripal_chado_bundle_create_fields_linker($info, $details, $entity_type, $bundle);
+
+  foreach ($info as $field_name => $details) {
+    $field_type = $details['type'];
+
+    // If the field already exists then skip it.
+    $field = field_info_field($details['field_name']);
+    if ($field) {
+      continue;
+    }
+
+    // Create the field.
+    $field = field_create_field($details);
+    if (!$field) {
+      tripal_set_message(t("Could not create new field: %field.",
+          array('%field' =>  $details['field_name'])), TRIPAL_ERROR);
+    }
+  }
+}
+/**
+ *
+ * @param unknown $details
+ */
+function tripal_chado_bundle_create_fields_base(&$info, $details, $entity_type, $bundle) {
+
+  $table_name = $details['chado_table'];
+  $type_table = $details['chado_type_table'];
+  $type_field = $details['chado_type_column'];
+  $cvterm_id  = $details['chado_cvterm_id'];
+
+  // Iterate through the columns of the table and see if fields have been
+  // created for each one. If not, then create them.
+  $schema = chado_get_schema($table_name);
+  if (!$schema) {
+    return;
+  }
+
+  $pkey = $schema['primary key'][0];
+
+
+  // Get the list of columns for this table and create a new field for each one.
+  $columns = $schema['fields'];
+  foreach ($columns as $column_name => $details) {
+    // Don't create base fields for the primary key and the type_id field.
+    if ($column_name == $pkey or $column_name == $type_field) {
+      continue;
+    }
+    $cvterm = tripal_get_chado_semweb_term($table_name, $column_name, array('return_object' => TRUE));
+    if (!$cvterm) {
+      tripal_report_error('tripal', TRIPAL_ERROR,
+        'Cannot create field for "%table_name.%column_name". Missing an appropriate vocabulary term',
+         array('%table_name' => $table_name, '%column_name' => $column_name));
+      drupal_set_message(t('Cannot create field for "%table_name.%column_name". Missing an appropriate vocabulary term',
+        array('%table_name' => $table_name, '%column_name' => $column_name)), 'error');
+      continue;
+    }
+    $field_name = strtolower($cvterm->dbxref_id->db_id->name . '__' . preg_replace('/ /', '_', $cvterm->name));
+
+    // Skip the primary key field.
+    if ($column_name == $schema['primary key'][0]) {
+      continue;
+    }
+
+    // Skip the type field.
+    if ($table_name == $type_table and $column_name == $type_field) {
+      continue;
+    }
+
+    // Set some defaults for the field.
+    $base_info = array(
+      'field_name' => $field_name,
+      'type' => '',
+      'cardinality' => 1,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+
+    // Alter the field info array depending on the column details.
+    switch($details['type']) {
+      case 'char':
+        $base_info['type'] = 'text';
+        $base_info['settings']['max_length'] = $details['length'];
+        break;
+      case 'varchar':
+        $base_info['type'] = 'text';
+        $base_info['settings']['max_length'] = $details['length'];
+        break;
+      case 'text':
+        $base_info['type'] = 'text';
+        $base_info['settings']['max_length'] = 17179869184;
+        $base_info['settings']['text_processing'] = 1;
+        break;
+      case 'blob':
+        // not sure how to support a blob field.
+        continue;
+        break;
+      case 'int':
+        $base_info['type'] = 'number_integer';
+        break;
+      case 'float':
+        $base_info['type'] = 'number_float';
+        $base_info['settings']['precision'] = 10;
+        $base_info['settings']['scale'] = 2;
+        $base_info['settings']['decimal_separator'] = '.';
+        break;
+      case 'numeric':
+        $base_info['type'] = 'number_decimal';
+        break;
+      case 'serial':
+        // Serial fields are most likely not needed as a field.
+        break;
+      case 'boolean':
+        $base_info['type'] = 'list_boolean';
+        $base_info['settings']['allowed_values'] = array(0 => "No", 1 => "Yes");
+        break;
+      case 'datetime':
+        // Use the Drupal Date and Date API to create the field/widget
+        $base_info['type'] = 'datetime';
+        break;
+    }
+
+    // Set some default semantic web information
+    if ($column_name == 'uniquename') {
+      $base_info['settings']['text_processing'] = 0;
+    }
+    //
+    // PUB TABLE
+    //
+    elseif ($table_name == 'pub' and $column_name == 'uniquename') {
+      $base_info['type'] = 'text';
+      $base_info['settings']['text_processing'] = 0;
+    }
+
+    //
+    // ANALYSIS TABLE
+    //
+    elseif ($table_name == 'analysis' and $column_name == 'sourceuri') {
+      $base_info['type'] = 'text';
+      $base_info['settings']['text_processing'] = 0;
+    }
+
+    $info[$field_name] = $base_info;
+  }
+}
+
+/**
+ *
+ * @param unknown $details
+ */
+function tripal_chado_bundle_create_fields_custom(&$info, $details, $entity_type, $bundle) {
+  $table_name = $details['chado_table'];
+  $type_table = $details['chado_type_table'];
+  $type_field = $details['chado_type_column'];
+  $cvterm_id  = $details['chado_cvterm_id'];
+
+  $schema = chado_get_schema($table_name);
+
+  // BASE ORGANISM_ID
+  if ($table_name != 'organism' and
+      array_key_exists('organism_id', $schema['fields'])) {
+    $field_name = 'obi__organism';
+    $field_type = 'obi__organism';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => 1,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // BASE DBXREF
+  if (array_key_exists('dbxref_id', $schema['fields'])) {
+    $field_name = 'data__accession';
+    $field_type = 'data__accession';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => 1,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // FEATURE MD5CHECKSUM
+  if ($table_name == 'feature') {
+    $field_name = 'data__sequence_checksum';
+    $field_type = 'data__sequence_checksum';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => 1,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // FEATURE RESIDUES
+  if ($table_name == 'feature') {
+    $field_name = 'data__sequence';
+    $field_type = 'data__sequence';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => 1,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // FEATURE SEQLEN
+  if ($table_name == 'feature') {
+    $field_name = 'data__sequence_length';
+    $field_type = 'data__sequence_length';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => 1,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // GENE TRANSCRIPTS
+  $rel_table = $table_name . '_relationship';
+  if (chado_table_exists($rel_table) and $bundle->label == 'gene') {
+    $field_name = 'so__transcript';
+    $field_type = 'so__transcript';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // ORGANISM TYPE_ID
+//   if ($table_name == 'organism' and array_key_exists('type_id', $schema['fields'])) {
+//     $field_name = 'taxarank__infraspecific_taxon';
+//     $field_type = 'taxarank__infraspecific_taxon';
+//     $info[$field_name] = array(
+//       'field_name' => $field_name,
+//       'type' => $field_type,
+//       'cardinality' => 1,
+//       'locked' => TRUE,
+//       'storage' => array(
+//         'type' => 'field_chado_storage',
+//       ),
+//       'settings' => array(
+//       ),
+//     );
+//   }
+}
+
+/**
+ *
+ * @param unknown $details
+ */
+function tripal_chado_bundle_create_fields_linker(&$info, $details, $entity_type, $bundle) {
+
+  $table_name = $details['chado_table'];
+  $type_table = $details['chado_type_table'];
+  $type_field = $details['chado_type_column'];
+  $cvterm_id  = $details['chado_cvterm_id'];
+
+  // CONTACTS
+  $contact_table = $table_name . '_contact';
+  if (chado_table_exists($contact_table)) {
+    $schema = chado_get_schema($contact_table);
+    $pkey = $schema['primary key'][0];
+    $field_name = $table_name . '_contact';
+    $field_type = 'chado_linker__contact';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => 1,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // DBXREF
+  $dbxref_table = $table_name . '_dbxref';
+  if (chado_table_exists($dbxref_table)) {
+    $field_name = 'sbo__database_cross_reference';
+    $field_type = 'sbo__database_cross_reference';
+    $info[$field_name] = array(
+      'field_name' =>  $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // EXPRESSION
+  $expression_table = $table_name . '_expression';
+  if (chado_table_exists($expression_table)) {
+    $field_name = 'go__gene_expression';
+    $field_type = 'go__gene_expression';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // FEATURELOC
+  if ($table_name == 'feature') {
+    $field_name = 'data__sequence_coordinates';
+    $field_type = 'data__sequence_coordinates';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // FEATUREPOS
+  if ($table_name == 'feature') {
+    $field_name = 'ogi__location_on_map';
+    $field_type = 'ogi__location_on_map';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // GENOTYPE
+  $genotype_table = $table_name . '_genotype';
+  if (chado_table_exists($genotype_table)) {
+    $field_name = 'so__genotype';
+    $field_type = 'so__genotype';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // PHENOTYPE
+  $phenotype_table = $table_name . '_phenotype';
+  if (chado_table_exists($phenotype_table)) {
+    $field_name = 'sbo__phenotype';
+    $field_type = 'sbo__phenotype';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // PROPERTIES
+  $prop_table = $table_name . 'prop';
+  if (chado_table_exists($prop_table)) {
+    // Get the list of existing property types for this table.
+    $sql = 'SELECT DISTINCT type_id FROM {' . $prop_table . '}';
+    $props = chado_query($sql);
+    while ($prop = $props->fetchObject()) {
+      $term = chado_generate_var('cvterm', array('cvterm_id' => $prop->type_id));
+      $field_name = strtolower(preg_replace('/[^\w]/','_', $term->dbxref_id->db_id->name . '__' . $term->name));
+      $field_type = 'chado_linker__prop';
+      $info[$field_name] = array(
+        'field_name' => $field_name,
+        'type' => $field_type,
+        'cardinality' => 1,
+        'locked' => FALSE,
+        'storage' => array(
+          'type' => 'field_chado_storage',
+        ),
+      );
+    }
+  }
+
+  // PUBLICATIONS
+  $pub_table = $table_name . '_pub';
+  if (chado_table_exists($pub_table)) {
+    $field_name = 'schema__publication';
+    $field_type = 'schema__publication';
+    $info[$field_name] =  array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // RELATIONSHIPS
+  // If the linker table does not exists then we don't want to add attach.
+  $rel_table = $table_name . '_relationship';
+  if (chado_table_exists($rel_table)) {
+    $field_name = 'sbo__relationship';
+    $field_type = 'sbo__relationship';
+    $info[$field_name] =  array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+    );
+  }
+
+  // SYNONYMS
+  $syn_table = $table_name . '_synonym';
+  if (chado_table_exists($syn_table)) {
+    $field_name = 'schema__alternate_name';
+    $field_type = 'schema__alternate_name';
+    $info[$field_name] =  array(
+      'field_name' => $field_name,
+      'type' => $field_type,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'locked' => TRUE,
+      'storage' => array(
+        'type' => 'field_chado_storage',
+      ),
+      'settings' => array(
+      ),
+    );
+  }
+}
+
+/**
+ * Impelments hook_create_tripalfield_instance().
+ *
+ * This is a Tripal defined hook that supports integration with the
+ * TripalEntity field.
+ */
+function tripal_chado_bundle_create_instances($entity_type, $bundle, $chado_bundle) {
+
+  $details = array(
+    'chado_cvterm_id' => $chado_bundle['type_id'],
+    'chado_table' => $chado_bundle['data_table'],
+    'chado_type_table' => $chado_bundle['type_linker_table'],
+    'chado_type_column' => $chado_bundle['type_column'],
+  );
+
+  tripal_chado_bundle_create_instances_base($info, $entity_type, $bundle, $details);
+  tripal_chado_bundle_create_instances_custom($info, $entity_type, $bundle, $details);
+  tripal_chado_bundle_create_instances_linker($info, $entity_type, $bundle, $details);
+
+  foreach ($info as $field_name => $details) {
+    // If the field is already attached to this bundle then skip it.
+    $field = field_info_field($details['field_name']);
+    if ($field and array_key_exists('bundles', $field) and
+        array_key_exists('TripalEntity', $field['bundles']) and
+        in_array($bundle->name, $field['bundles']['TripalEntity'])) {
+      continue;
+    }
+    // Create the field instance.
+    $instance = field_create_instance($details);
+  }
+
+}
+/**
+ * Helper function for the hook_create_tripalfield_instance().
+ *
+ * Add the field instances that corresond to the columns of the base table.
+ *
+ * @param $entity_type
+ * @param $bundle
+ * @param $details
+ */
+function tripal_chado_bundle_create_instances_base(&$info, $entity_type, $bundle, $details) {
+  $fields = array();
+
+  // Get Chado information
+  $table_name = $details['chado_table'];
+  $type_table = $details['chado_type_table'];
+  $type_field = $details['chado_type_column'];
+  $cvterm_id  = $details['chado_cvterm_id'];
+
+  // Iterate through the columns of the table and see if fields have been
+  // created for each one. If not, then create them.
+  $schema = chado_get_schema($table_name);
+  if (!$schema) {
+    return;
+  }
+
+  $pkey = $schema['primary key'][0];
+
+  $columns = $schema['fields'];
+  foreach ($columns as $column_name => $details) {
+    // Don't create base fields for the primary key and the type_id field.
+    if ($column_name == $pkey or $column_name == $type_field) {
+      continue;
+    }
+    $cvterm = tripal_get_chado_semweb_term($table_name, $column_name, array('return_object' => TRUE));
+    if (!$cvterm) {
+      // We already provided an error when creating the base field.  So
+      // don't create another one here.
+      continue;
+    }
+
+    $field_name = strtolower($cvterm->dbxref_id->db_id->name . '__' . preg_replace('/ /', '_', $cvterm->name));
+
+    // Skip the primary key field.
+    if ($column_name == $schema['primary key'][0]) {
+      continue;
+    }
+
+    // Skip the type field.
+    if ($table_name == $type_table and $column_name == $type_field) {
+      continue;
+    }
+
+    $base_info =  array(
+      'field_name' => $field_name,
+      'entity_type' => 'TripalEntity',
+      'bundle' => $bundle->name,
+      'label' => ucwords(preg_replace('/_/', ' ', $column_name)),
+      'description' => '',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => TRUE,
+        'term_vocabulary' => $cvterm->dbxref_id->db_id->name,
+        'term_name' => $cvterm->name,
+        'term_accession' => $cvterm->dbxref_id->accession,
+        'chado_table' => $table_name,
+        'chado_column' => $column_name,
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'inline',
+          'settings' => array(),
+        ),
+      ),
+    );
+
+    // Determine if the field is required.
+    if (array_key_exists('not null', $details) and $details['not null'] === TRUE) {
+      $base_info['required'] = TRUE;
+    }
+
+    // Alter the field info array depending on the column details.
+    switch($details['type']) {
+      case 'char':
+        $base_info['widget']['type'] = 'text_textfield';
+        break;
+      case 'varchar':
+        $base_info['widget']['type'] = 'text_textfield';
+        break;
+      case 'text':
+        $base_info['widget']['type'] = 'text_textarea';
+        $base_info['widget']['settings']['format'] = filter_default_format();
+        break;
+      case 'blob':
+        // not sure how to support a blob field.
+        continue;
+        break;
+      case 'int':
+        $base_info['widget']['type'] = 'number';
+        break;
+      case 'float':
+        $base_info['widget']['type'] = 'number';
+        break;
+      case 'numeric':
+        $base_info['widget']['type'] = 'number';
+        break;
+      case 'serial':
+        // Serial fields are most likely not needed as a field.
+        break;
+      case 'boolean':
+        $base_info['widget']['type'] = 'options_onoff';
+        $base_info['required'] = FALSE;
+        break;
+      case 'datetime':
+        $base_info['widget']['type'] = 'date_select';
+        $base_info['widget']['settings']['increment'] = 1;
+        $base_info['widget']['settings']['tz_handling'] = 'none';
+        $base_info['widget']['settings']['collapsible'] = TRUE;
+
+        // TODO: Add settings so that the minutes increment by 1.
+        // And turn off the timezone, as the Chado field doesn't support it.
+        break;
+    }
+
+    // Set some default semantic web information
+    if ($column_name == 'uniquename') {
+      $base_info['label'] = 'Identifier';
+      $base_info['widget_type'] = 'text_textfield';
+    }
+    elseif ($base_info['label'] == 'Timeaccessioned') {
+      $base_info['label'] = 'Time Accessioned';
+      $base_info['description'] = 'Please enter the time that this record was first added to the database.';
+    }
+    elseif ($base_info['label'] == 'Timelastmodified') {
+      $base_info['label'] = 'Time Last Modified';
+      $base_info['description'] = 'Please enter the time that this record was last modified. The default is the current time.';
+    }
+    //
+    // ORGANISM TABLE
+    //
+    elseif ($table_name == 'organism' and $column_name == 'comment') {
+      $base_info['label'] = 'Description';
+    }
+    //
+    // PUB TABLE
+    //
+    elseif ($table_name == 'pub' and $column_name == 'uniquename') {
+      $base_info['widget_type'] = 'text_textfield';
+    }
+
+    //
+    // ANALYSIS TABLE
+    //
+    elseif ($table_name == 'analysis' and $column_name == 'program') {
+      $base_info['description'] = 'The program name (e.g. blastx, blastp, sim4, genscan. If the analysis was not derived from a software package then provide a very brief description of the pipeline, workflow or method.';
+      $base_info['label'] = 'Program, Pipeline, Workflow or Method Name.';
+    }
+    elseif ($table_name == 'analysis' and $column_name == 'sourceuri') {
+      $base_info['widget_type'] = 'text_textfield';
+      $base_info['label'] = 'Source URL';
+      $base_info['description'] = 'The URL where the original source data was derived.  Ideally, this should link to the page where more information about the source data can be found.';
+    }
+    elseif ($table_name == 'analysis' and $column_name == 'sourcename') {
+      $base_info['label'] = 'Source Name';
+      $base_info['description'] = 'The name of the source data. This could be a file name, data set or a small description for how the data was collected. For long descriptions use the larger description field.';
+    }
+    elseif ($table_name == 'analysis' and $column_name == 'sourceversion') {
+      $base_info['label'] = 'Source Version';
+      $base_info['description'] = 'If hte source data set has a version include it here.';
+    }
+    elseif ($table_name == 'analysis' and $column_name == 'algorithm') {
+      $base_info['label'] = 'Source Version';
+      $base_info['description'] = 'The name of the algorithm used to produce the dataset if different from the program.';
+    }
+    elseif ($table_name == 'analysis' and $column_name == 'programversion') {
+      $base_info['label'] = 'Program Version';
+      $base_info['description'] = 'The version of the program used to perform this analysis. (e.g. TBLASTX 2.0MP-WashU [09-Nov-2000]. Enter "n/a" if no version is available or applicable.';
+    }
+    //
+    // PROJECT TABLE
+    //
+    elseif ($table_name == 'project' and $column_name == 'description') {
+      $base_info['label'] = 'Short Description';
+    }
+    $info[$field_name] = $base_info;
+  }
+}
+
+/**
+ * Helper function for the hook_create_tripalfield_instance().
+ *
+ * Adds custom fields for base fields.  These override the settings provided
+ * in the tripal_chado_create_tripalfield_instance_base() function.
+ *
+ * @param $entity_type
+ * @param $bundle
+ * @param $details
+ */
+function tripal_chado_bundle_create_instances_custom(&$info, $entity_type, $bundle, $details) {
+  $table_name = $details['chado_table'];
+  $type_table = $details['chado_type_table'];
+  $type_field = $details['chado_type_column'];
+  $cvterm_id  = $details['chado_cvterm_id'];
+  $schema = chado_get_schema($table_name);
+
+  // BASE ORGANISM_ID
+  if ($table_name != 'organism' and array_key_exists('organism_id', $schema['fields'])) {
+    $field_name = 'obi__organism';
+    $is_required = FALSE;
+    if (array_key_exists('not null', $schema['fields']['organism_id']) and
+        $schema['fields']['organism_id']['not null']) {
+      $is_required = TRUE;
+    }
+    $info[$field_name] =  array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Organism',
+      'description' => 'Select an organism.',
+      'required' => $is_required,
+      'settings' => array(
+        'auto_attach' => TRUE,
+        'chado_table' => $table_name,
+        'chado_column' => 'organism_id',
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'obi__organism_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'inline',
+          'type' => 'obi__organism_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // BASE DBXREF
+  if (array_key_exists('dbxref_id', $schema['fields'])) {
+    $field_name = 'data__accession';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Accession',
+      'description' => 'This field specifies the unique stable accession (ID) for
+        this record. It requires that this site have a database entry.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => TRUE,
+        'chado_table' => $table_name,
+        'chado_column' => 'dbxref_id',
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'data__accession_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'inline',
+          'type' => 'data__accession_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // FEATURE MD5CHECKSUM
+  if ($table_name == 'feature') {
+    $field_name = 'data__sequence_checksum';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Sequence Checksum',
+      'description' => 'The MD5 checksum for the sequence. The checksum here
+        will always be unique for the raw unformatted sequence. To verify that the
+        sequence has not been corrupted, download the raw sequence and use an MD5 tool
+        to calculate the value. If the value calculated is identical the one shown
+        here, then the downloaded sequence is uncorrupted.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => TRUE,
+        'chado_table' => $table_name,
+        'chado_column' => 'md5checksum',
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'data__sequence_checksum_widget',
+        'settings' => array(
+          'display_label' => 1,
+          'md5_fieldname' => 'feature__md5checksum',
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'inline',
+          'type' => 'data__sequence_checksum_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // FEATURE RESIDUES
+  if ($table_name == 'feature') {
+    $field_name = 'data__sequence';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Sequence',
+      'description' => 'All available sequences for this record.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $table_name,
+        'chado_column' => 'residues',
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'data__sequence_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'data__sequence_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // FEATURE SEQLEN
+  if ($table_name == 'feature') {
+    $field_name = 'data__sequence_length';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Sequence Length',
+      'description' => 'The number of residues in the raw sequence.  This length
+        is only for the assigned raw sequence and does not represent the length of any
+        sequences derived from alignments. If this value is zero but aligned sequences
+        are present then this record has no official assigned sequence.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => TRUE,
+        'chado_table' => $table_name,
+        'chado_column' => 'seqlen',
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'data__sequence_length_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'inline',
+          'type' => 'data__sequence_length_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // GENE TRANSCRIPTS
+  $rel_table = $table_name . '_relationship';
+  if (chado_table_exists($rel_table) and $bundle->label == 'gene') {
+    $field_name = 'so__transcript';
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Transcripts',
+      'description' => 'Transcripts that are part of this gene.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $rel_table,
+        'chado_column' => '',
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'so__transcript_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'so__transcript_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // ORGANISM TYPE_ID
+//   if ($table_name == 'organism' and array_key_exists('type_id', $schema['fields'])) {
+//     $field_name = 'taxarank__infraspecific_taxon';
+//     $info[$field_name] = array(
+//       'field_name' => $field_name,
+//       'entity_type' => $entity_type,
+//       'bundle' => $bundle->name,
+//       'label' => 'Infraspecific Taxon',
+//       'description' => 'The Infraspecific Taxon.',
+//       'required' => FALSE,
+//       'settings' => array(
+//         'auto_attach' => TRUE,
+//         'chado_table' => 'organism',
+//         'chado_column' => 'type_id',
+//         'base_table' => 'organism',
+//       ),
+//       'widget' => array(
+//         'type' => 'taxarank__infraspecific_taxon_widget',
+//         'settings' => array(
+//           'display_label' => 1,
+//         ),
+//       ),
+//       'display' => array(
+//         'default' => array(
+//           'label' => 'inline',
+//           'type' => 'taxarank__infraspecific_taxon_formatter',
+//           'settings' => array(),
+//         ),
+//       ),
+//     );
+//   }
+}
+
+/**
+ *
+ * @param unknown $entity_type
+ * @param unknown $bundle
+ * @param unknown $details
+ */
+function tripal_chado_bundle_create_instances_linker(&$info, $entity_type, $bundle, $details) {
+
+  $table_name = $details['chado_table'];
+  $type_table = $details['chado_type_table'];
+  $type_field = $details['chado_type_column'];
+  $cvterm_id  = $details['chado_cvterm_id'];
+
+  // CONTACTS
+  $contact_table = $table_name . '_contact';
+  if (chado_table_exists($contact_table)) {
+    $field_name = $table_name . '_contact';
+    $info[$field_name] =     $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Contact',
+      'description' => 'Associates an indviddual or organization with this record',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $contact_table,
+        'base_table' => $table_name,
+        'chado_column' => 'contact_id',
+      ),
+      'widget' => array(
+        'type' => 'local__contact_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'local__contact_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // DBXREF
+  $dbxref_table = $table_name . '_dbxref';
+  if (chado_table_exists($dbxref_table)) {
+    $field_name = 'sbo__database_cross_reference';
+    $schema = chado_get_schema($dbxref_table);
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] =  array(
+      'field_name' =>  $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Database Cross Reference',
+      'description' => 'The IDs where this record may be available in other external online databases.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $dbxref_table,
+        'chado_column' => $pkey,
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'sbo__database_cross_reference_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'inline',
+          'type' => 'sbo__database_cross_reference_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // EXPRESSION
+  $expression_table = $table_name . '_expression';
+  if (chado_table_exists($expression_table)) {
+    $field_name = 'go__gene_expression';
+    $schema = chado_get_schema($expression_table);
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Gene expression',
+      'description' => 'Information about the expression of this record.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $expression_table,
+        'chado_column' => $pkey,
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'go__gene_expression_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'go__gene_expression_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // FEATURELOC
+  if ($table_name == 'feature') {
+    $field_name = 'data__sequence_coordinates';
+    $schema = chado_get_schema('featureloc');
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Sequence Coordinates',
+      'description' => 'The locations on other genomic sequences where this
+        record has been aligned.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => 'featureloc',
+        'chado_column' => $pkey,
+        'base_table' => 'feature',
+      ),
+      'widget' => array(
+        'type' => 'data__sequence_coordinates_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'data__sequence_coordinates_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // FEATUREPOS
+  if ($table_name == 'feature') {
+    $field_name = 'ogi__location_on_map';
+    $schema = chado_get_schema('featurepos');
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Location on Map',
+      'description' => 'The positions on a genetic map.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => 'featurepos',
+        'chado_column' => $pkey,
+        'base_table' => 'feature',
+      ),
+      'widget' => array(
+        'type' => 'ogi__location_on_map_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'ogi__location_on_map_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // GENOTYPE
+  $genotype_table = $table_name . '_genotype';
+  if (chado_table_exists($genotype_table)) {
+    $field_name = 'so__genotype';
+    $schema = chado_get_schema($genotype_table);
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Genotype',
+      'description' => 'The genotypes associated with this record.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $genotype_table,
+        'chado_column' => $pkey,
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'so__genotype_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'so__genotype_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // PHENOTYPE
+  $phenotype_table = $table_name . '_phenotype';
+  if (chado_table_exists($phenotype_table)) {
+    $field_name = 'sbo__phenotype';
+    $schema = chado_get_schema($phenotype_table);
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Phenotype',
+      'description' => 'The phenotypes associated with this record.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $phenotype_table,
+        'chado_column' => $pkey,
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'sbo__phenotype_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'sbo__phenotype_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // PROPERTIES
+  $prop_table = $table_name . 'prop';
+  if (chado_table_exists($prop_table)) {
+     // Get the list of existing property types for this table.
+     $sql = 'SELECT DISTINCT type_id FROM {' . $prop_table . '}';
+     $props = chado_query($sql);
+     $schema = chado_get_schema($prop_table);
+     $pkey = $schema['primary key'][0];
+     while ($prop = $props->fetchObject()) {
+       $term = chado_generate_var('cvterm', array('cvterm_id' => $prop->type_id));
+       $field_name = strtolower(preg_replace('/[^\w]/','_', $term->dbxref_id->db_id->name . '__' . $term->name));
+       $info[$field_name] = array(
+         'field_name' => $field_name,
+         'entity_type' => $entity_type,
+         'bundle' => $bundle->name,
+         'label' => ucwords(preg_replace('/_/', ' ', $term->name)),
+         'description' => $term->definition,
+         'required' => FALSE,
+         'settings' => array(
+           'auto_attach' => TRUE,
+           'term_vocabulary' => $term->dbxref_id->db_id->name,
+           'term_accession' => $term->dbxref_id->accession,
+           'term_name' => $term->name,
+           'base_table' => $table_name,
+           'chado_table' => $prop_table,
+           'chado_column' => $pkey,
+         ),
+         'widget' => array(
+           'type' => 'chado_linker__prop_widget',
+           'settings' => array(
+             'display_label' => 1,
+           ),
+         ),
+         'display' => array(
+           'default' => array(
+             'label' => 'inline',
+             'type' => 'chado_linker__prop_formatter',
+             'settings' => array(),
+           ),
+         ),
+       );
+     }
+   }
+
+
+  // PUBLICATIONS
+  $pub_table = $table_name . '_pub';
+  if (chado_table_exists($pub_table)) {
+    $field_name = 'schema__publication';
+    $schema = chado_get_schema($pub_table);
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Publication',
+      'description' => 'This record has been referenced or is sourced from these publications.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $pub_table,
+        'chado_column' => $pkey,
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'schema__publication_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'schema__publication_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // RELATIONSHIPS
+  // If the linker table does not exists then we don't want to add attach.
+  $rel_table = $table_name . '_relationship';
+  if (chado_table_exists($rel_table)) {
+    $field_name = 'sbo__relationship';
+    $schema = chado_get_schema($rel_table);
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Relationship',
+      'description' => 'Other records with relationships to this record.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $rel_table,
+        'chado_column' => $pkey,
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'sbo__relationship_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'sbo__relationship_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+
+  // SYNONYMS
+  $syn_table = $table_name . '_synonym';
+  if (chado_table_exists($syn_table)) {
+    $field_name = 'schema__alternate_name';
+    $schema = chado_get_schema($syn_table);
+    $pkey = $schema['primary key'][0];
+    $info[$field_name] = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle->name,
+      'label' => 'Synonyms',
+      'description' => 'Alternate names, aliases or synonyms for this record.',
+      'required' => FALSE,
+      'settings' => array(
+        'auto_attach' => FALSE,
+        'chado_table' => $syn_table,
+        'chado_column' => $pkey,
+        'base_table' => $table_name,
+      ),
+      'widget' => array(
+        'type' => 'schema__alternate_name_widget',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'inline',
+          'type' => 'schema__alternate_name_formatter',
+          'settings' => array(),
+        ),
+      ),
+    );
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * The field_ui_field_overview_form is used for ordering and configuring the
+ * fields attached to an entity.
+ *
+ * This function removes the property adder field as that is really not meant
+ * for users to show or manage.
+ */
+function tripal_chado_form_field_ui_field_overview_form_alter(&$form, &$form_state, $form_id) {
+
+  // Remove the kvproperty_addr field as it isn't ever displayed. It's just used
+  // on the add/edit form of an entity for adding new property fields.
+  $fields_names = element_children($form['fields']);
+  foreach ($fields_names as $field_name) {
+    $field_info = field_info_field($field_name);
+    if ($field_info['type'] == 'kvproperty_adder') {
+      unset($form['fields'][$field_name]);
+    }
+    if ($field_info['type'] == 'cvterm_class_adder') {
+      unset($form['fields'][$field_name]);
+    }
+  }
+}
+
+/**
+ * Implements hook_form_field_ui_field_overview_add_new().
+ */
+function tripal_chado_form_field_ui_field_overview_add_new($new_field, $bundle) {
+  // Get the table this bundle is mapped to.
+  $term = tripal_load_term_entity(array('term_id' => $bundle->term_id));
+  $vocab = $term->vocab;
+  $params = array(
+    'vocabulary' => $vocab->vocabulary,
+    'accession' => $term->accession,
+  );
+  $mapped_table = chado_get_cvterm_mapping($params);
+  $chado_table = $mapped_table->chado_table;
+  $chado_type_table = $mapped_table->chado_table;
+  $chado_type_column = $mapped_table->chado_field;
+
+  // We allow site admins to add new chado_linker__prop fields to an entity.
+  // This function will allow us to properly add them.  But at this point we
+  // don't know the controlled vocabulary term.  We'll have to use the
+  // defaults and let the user set it using the interface.
+  if ($new_field['type'] == 'chado_linker__prop') {
+    $table_name = $chado_table . 'prop';
+
+    if (chado_table_exists($table_name)) {
+      $schema = chado_get_schema($table_name);
+      $pkey = $schema['primary key'][0];
+      $field_name = $new_field['field_name'];
+      $field_type = 'chado_linker__prop';
+
+      // First add the field.
+      field_create_field(array(
+        'field_name' => $field_name,
+        'type' => $field_type,
+        'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+        'locked' => FALSE,
+        'storage' => array(
+          'type' => 'field_chado_storage',
+        ),
+        'settings' => array(
+          'base_table' => $chado_table,
+          'chado_table' => $table_name,
+          'chado_column' => $pkey,
+        ),
+      ));
+
+      // Now add the instance
+      field_create_instance(array(
+        'field_name' => $field_name,
+        'entity_type' => 'TripalEntity',
+        'bundle' => $bundle->name,
+        'label' => $new_field['label'],
+        'description' => '',
+        'required' => FALSE,
+        'settings' => array(
+          'auto_attach' => TRUE,
+        ),
+        'widget' => array(
+          'type' => 'chado_linker__prop_widget',
+          'settings' => array(
+            'display_label' => 1,
+          ),
+        ),
+        'display' => array(
+          'default' => array(
+            'label' => 'inline',
+            'type' => 'chado_linker__prop_formatter',
+            'settings' => array(),
+          ),
+        ),
+      ));
+    }
+    else {
+      drupal_set_message('Cannot add a property field to this entity. Chado does not support properties for this data type.', 'error');
+    }
+  }
+
+  // We allow site admins to add new chado_linker__cvterm fields to an entity.
+  // This function will allow us to properly add them.  But at this point we
+  // don't know the controlled vocabulary term.  We'll have to use the
+  // defaults and let the user set it using the interface.
+
+  if ($new_field['type'] == 'chado_linker__cvterm') {
+    $table_name = $chado_table . '_cvterm';
+
+    if (chado_table_exists($table_name)) {
+      $schema = chado_get_schema($table_name);
+      $pkey = $schema['primary key'][0];
+      $field_name = $new_field['field_name'];
+      $field_type = 'chado_linker__cvterm';
+
+      // First add the field.
+      field_create_field(array(
+        'field_name' => $field_name,
+        'type' => $field_type,
+        'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+        'locked' => FALSE,
+        'storage' => array(
+          'type' => 'field_chado_storage',
+        ),
+        'settings' => array(
+          'base_table' => $chado_table,
+          'chado_table' => $table_name,
+          'chado_column' => $pkey,
+        ),
+      ));
+
+      // Now add the instance
+      field_create_instance(array(
+        'field_name' => $field_name,
+        'entity_type' => 'TripalEntity',
+        'bundle' => $bundle->name,
+        'label' => $new_field['label'],
+        'description' => '',
+        'required' => FALSE,
+        'settings' => array(
+          'auto_attach' => TRUE,
+        ),
+        'widget' => array(
+          'type' => 'chado_linker__cvterm_widget',
+          'settings' => array(
+            'display_label' => 1,
+          ),
+        ),
+        'display' => array(
+          'default' => array(
+            'label' => 'above',
+            'type' => 'chado_linker__cvterm_formatter',
+            'settings' => array(),
+          ),
+        ),
+      ));
+    }
+    else {
+      drupal_set_message('Cannot add a property field to this entity. Chado does not support annotations for this data type.', 'error');
+    }
+  }
+}
+
+
+/**
+ * Allows for altering of a field's instance setting form.
+ *
+ * This appears to be a Drupal hook but is actually a custom function created
+ * by this module. It is called by the tripal_form_alter() function of this
+ * module.
+ *
+ * Here we put additional form elements for any field, regardless if it is
+ * a tripalField or not.
+ *
+ * @param $form
+ *   The form array.  Alterations to the form can be made within this array.
+ * @param $form_state
+ *   The form state array.
+ */
+function tripal_chado_field_instance_settings_form_alter(&$form, $form_state) {
+  global $language;
+  $field = $form['#field'];
+  $instance = $form['#instance'];
+
+  // Only show the Chado mapping information for field instances that map
+  // to Chado.
+  if (!array_key_exists('chado_table',$instance['settings'])) {
+    return;
+  }
+
+  // Construct a table for the vocabulary information.
+  $headers = array();
+  $rows = array();
+  $rows[] = array(
+    array(
+      'data' => 'Base Table',
+      'header' => TRUE,
+      'width' => '20%',
+    ),
+    $instance['settings']['base_table']
+  );
+  $rows[] = array(
+    array(
+      'data' => 'Record Table',
+      'header' => TRUE,
+      'width' => '20%',
+    ),
+    $instance['settings']['chado_table']
+  );
+  $rows[] = array(
+    array(
+      'data' => 'ID Column',
+      'header' => TRUE,
+      'width' => '20%',
+    ),
+    $instance['settings']['chado_column']
+  );
+  $table = array(
+    'header' => $headers,
+    'rows' => $rows,
+    'attributes' => array(
+    ),
+    'sticky' => FALSE,
+    'caption' => '',
+    'colgroups' => array(),
+    'empty' => '',
+  );
+
+  $form['chado_mapping'] = array(
+    '#type' => 'fieldset',
+    '#title' => 'Chado Mapping',
+    '#description' => t('This field maps to data in Chado to the following table:'),
+  );
+  $form['chado_mapping']['details'] = array(
+    '#type' => 'item',
+    '#markup' => theme_table($table),
+  );
+
+}
+<<<<<<< HEAD
+=======
+
+/**
+ * Implements hook_form_FROM_ID_alter()
+ */
+function tripal_chado_form_tripalbundle_form_alter(&$form, $form_state) {
+  global $language;
+  $bundle = $form['#bundle'];
+
+  $term = entity_load('TripalTerm', array('id' => $bundle->term_id));
+  $term = reset($term);
+  $vocab = $term->vocab;
+  $params = array(
+    'vocabulary' => $vocab->vocabulary,
+    'accession' => $term->accession,
+  );
+  $mapped_table = chado_get_cvterm_mapping($params);
+  $chado_table = $mapped_table->chado_table;
+  $chado_column = $mapped_table->chado_field;
+
+  // Construct a table for the vocabulary information.
+  $headers = array();
+  $rows = array();
+  $rows[] = array(
+    array(
+      'data' => 'Chado Table',
+      'header' => TRUE,
+      'width' => '20%',
+    ),
+    $chado_table
+  );
+  $rows[] = array(
+    array(
+      'data' => 'Type Column',
+      'header' => TRUE,
+      'width' => '20%',
+    ),
+    $chado_column
+  );
+  $table = array(
+    'header' => $headers,
+    'rows' => $rows,
+    'attributes' => array(
+    ),
+    'sticky' => FALSE,
+    'caption' => '',
+    'colgroups' => array(),
+    'empty' => '',
+  );
+
+  $form['chado_mapping'] = array(
+    '#type' => 'item',
+    '#title' => 'Chado Mapping',
+    '#markup' => theme_table($table),
+    '#description' => t('This content type maps to the table in Chado
+        listed above.  Chado allows multiple data types to be housed
+        in a single table. Therefore, the column that is used to
+        differentiate between data types is also listed above.'),
+    '#weight' => 0,
+  );
+}
+>>>>>>> a584591704c14877292a457afa4b1e793853f9f6