Browse Source

Merge branch '7.x-3.x' into 531-t3-relationship_widget

Lacey-Anne Sanderson 6 years ago
parent
commit
af29f94a76

+ 71 - 0
legacy/tripal_stock/tripal_stock.install

@@ -101,3 +101,74 @@ function tripal_stock_schema() {
 
   return $schema;
 }
+
+/**
+ * Creates a materialized view that stores the type & number of stocks per organism
+ *
+ * @ingroup tripal_stock
+ */
+function tripal_stock_add_organism_count_mview() {
+  $view_name = 'organism_stock_count';
+  $comment = 'Stores the type and number of stocks per organism';
+
+  $schema = array(
+    'description' => $comment,
+    'table' => $view_name,
+    'fields' => array(
+      'organism_id' => array(
+        'size' => 'big',
+        'type' => 'int',
+        'not null' => TRUE,
+      ),
+      'genus' => array(
+        'type' => 'varchar',
+        'length' => '255',
+        'not null' => TRUE,
+      ),
+      'species' => array(
+        'type' => 'varchar',
+        'length' => '255',
+        'not null' => TRUE,
+      ),
+      'common_name' => array(
+        'type' => 'varchar',
+        'length' => '255',
+        'not null' => FALSE,
+      ),
+      'num_stocks' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+      ),
+      'cvterm_id' => array(
+        'size' => 'big',
+        'type' => 'int',
+        'not null' => TRUE,
+      ),
+      'stock_type' => array(
+        'type' => 'varchar',
+        'length' => '255',
+        'not null' => TRUE,
+      ),
+    ),
+    'indexes' => array(
+      'organism_stock_count_idx1' => array('organism_id'),
+      'organism_stock_count_idx2' => array('cvterm_id'),
+      'organism_stock_count_idx3' => array('stock_type'),
+    ),
+  );
+
+  $sql = "
+    SELECT
+        O.organism_id, O.genus, O.species, O.common_name,
+        count(S.stock_id) as num_stocks,
+        CVT.cvterm_id, CVT.name as stock_type
+     FROM organism O
+        INNER JOIN stock S  ON O.Organism_id = S.organism_id
+        INNER JOIN cvterm CVT ON S.type_id     = CVT.cvterm_id
+     GROUP BY
+        O.Organism_id, O.genus, O.species, O.common_name, CVT.cvterm_id, CVT.name
+  ";
+
+  tripal_add_mview($view_name, 'tripal_stock', $schema, $sql, $comment);
+}
+

+ 18 - 3
tripal_chado/includes/TripalFields/sbo__relationship/sbo__relationship.inc

@@ -464,6 +464,22 @@ class sbo__relationship extends ChadoField {
       return;
     }
 
+    // Not all tables have the columns named 'subject_id' and 'object_id'.
+    // some have variations on that name and we need to determine what they are.
+    $fkeys = $schema['foreign keys'];
+    $subject_id_key = 'subject_id';
+    $object_id_key = 'object_id';
+    foreach ($fkeys as $fktable => $details) {
+      foreach ($details['columns'] as $fkey_lcolumn => $fkey_rcolumn) {
+        if (preg_match('/^subject_.*id/', $fkey_lcolumn)) {
+          $subject_id_key = $fkey_lcolumn;
+        }
+        if (preg_match('/^object_.*id/', $fkey_lcolumn)) {
+          $object_id_key = $fkey_lcolumn;
+        }
+      }
+    }
+
     // Set some defaults for the empty record.
     $entity->{$field_name}['und'][0] = array(
       'value' => '',
@@ -933,9 +949,8 @@ class sbo__relationship extends ChadoField {
     $type_id = $item['chado-' . $field_table . '__type_id'];
     $type_id = isset($item['type_id']) ? $item['chado-' . $field_table . '__type_id'] : $type_id;
     $type_name = isset($item['type_name']) ? $item['type_name'] : '';
-    $voc_id = isset($item['vocabulary']) ? $item['vocabulary'] : '';
-    $subject_name = $item['subject_name'];
-    $object_name = $item['object_name'];
+    $subject_name = isset($item['subject_name']) ? $items['subject_name'] : '';
+    $object_name = isset($item['object_name']) ? $item['object_name'] : '';
 
     // If the row is empty then just continue, there's nothing to validate.
     if (!$type_id and !$type_name and !$subject_name and !$object_name) {

+ 12 - 10
tripal_chado/includes/TripalFields/sbo__relationship/sbo__relationship_widget.inc

@@ -134,7 +134,7 @@ class sbo__relationship_widget extends ChadoFieldWidget {
 
     // Check $form_state['values'] to see if an AJAX call set the values.
     if (array_key_exists('values', $form_state) and
-        array_key_exists($field_name, $form_state['values'])) {
+      array_key_exists($field_name, $form_state['values'])) {
       $record_id = $form_state['values'][$field_name]['und'][$delta]['chado-' . $field_table . '__' . $pkey];
       $subject_id = $form_state['values'][$field_name]['und'][$delta]['chado-' . $field_table . '__' . $subject_id_key];
       $object_id = $form_state['values'][$field_name]['und'][$delta]['chado-' . $field_table . '__' . $object_id_key];
@@ -152,6 +152,8 @@ class sbo__relationship_widget extends ChadoFieldWidget {
       //@debug dpm(array($subject_id, $type_id, $object_id), 'have an item (AJAX)!');
     }
 
+    $widget['#table_name'] = $field_table;
+
     // Getting default values for the relationship type element.
     $default_voc = '';
     if (isset($form_state['field'][$field_name]['und']['instance']['default_value'][0]['vocabulary'])) {
@@ -336,10 +338,10 @@ class sbo__relationship_widget extends ChadoFieldWidget {
     $type_name = array_key_exists('type_name', $form_state['values'][$field_name][$langcode][$delta]) ? $form_state['values'][$field_name][$langcode][$delta]['type_name'] : '';
     $subject_id = isset($form_state['values'][$field_name][$langcode][$delta]['chado-' . $field_table . '__' . $subject_id_key]) ? $form_state['values'][$field_name][$langcode][$delta]['chado-' . $field_table . '__' . $subject_id_key] : '';
     $object_id = isset($form_state['values'][$field_name][$langcode][$delta]['chado-' . $field_table . '__' . $object_id_key]) ? $form_state['values'][$field_name][$langcode][$delta]['chado-' . $field_table . '__' . $object_id_key]: '';
-    $type_id = $form_state['values'][$field_name][$langcode][$delta]['chado-' . $field_table . '__type_id'];
+    $type_id = isset($form_state['values'][$field_name][$langcode][$delta]['chado-' . $field_table . '__type_id']) ? $form_state['values'][$field_name][$langcode][$delta]['chado-' . $field_table . '__type_id'] : '';
 
-    $subject_name = $form_state['values'][$field_name][$langcode][$delta]['subject_name'];
-    $object_name = $form_state['values'][$field_name][$langcode][$delta]['object_name'];
+    $subject_name = isset($form_state['values'][$field_name][$langcode][$delta]['subject_name']) ? $form_state['values'][$field_name][$langcode][$delta]['subject_name']: '';
+    $object_name = isset($form_state['values'][$field_name][$langcode][$delta]['object_name']) ? $form_state['values'][$field_name][$langcode][$delta]['object_name'] : '';
 
     // Validation:
     //------------
@@ -351,7 +353,7 @@ class sbo__relationship_widget extends ChadoFieldWidget {
 
     // Do not proceed if subject ID or object ID does not exist
     if (!key_exists($subject_id_key, $fkeys[$base_table]['columns']) ||
-        !key_exists($object_id_key, $fkeys[$base_table]['columns'])) {
+      !key_exists($object_id_key, $fkeys[$base_table]['columns'])) {
       return;
     }
 
@@ -487,19 +489,19 @@ class sbo__relationship_widget extends ChadoFieldWidget {
     $layout = "
       <div class=\"chado-linker--relationship-widget\">
         <div class=\"chado-linker--relationship-widget-item\">" .
-          drupal_render($element['subject_name']) . "
+      drupal_render($element['subject_name']) . "
         </div>
         <div class=\"chado-linker--relationship-widget-item\">" .
-          drupal_render($element['vocabulary']) . "
+      drupal_render($element['vocabulary']) . "
         </div>
         <div class=\"chado-linker--relationship-widget-item\">" .
-          drupal_render($element['type_name']) . "
+      drupal_render($element['type_name']) . "
         </div>
         <div class=\"chado-linker--relationship-widget-item\">" .
-          drupal_render($element['type_id']) . "
+      drupal_render($element['type_id']) . "
         </div>
         <div>" .
-          drupal_render($element['object_name']) . "
+      drupal_render($element['object_name']) . "
         </div>
       </div>
     ";