Selaa lähdekoodia

Fixed bug I caused in bulk loader for optinal inserts/selects

spficklin 12 vuotta sitten
vanhempi
commit
ac5ec3b4b7

+ 1 - 1
tripal_bulk_loader/tripal_bulk_loader.admin.templates.inc

@@ -170,7 +170,7 @@ function tripal_bulk_loader_modify_template_base_form($form_state = NULL, $mode)
         $form['records']['records-data'][$priority] = array(
           'title' => array(
             '#type' => 'markup',
-            '#value' => filter_xss($table_array['record_id']),
+            '#value' => filter_xss($priority . ". " . $table_array['record_id']),
           ),
           'chado_table' => array(
             '#type' => 'markup',

+ 43 - 29
tripal_bulk_loader/tripal_bulk_loader.loader.inc

@@ -446,37 +446,29 @@ function process_data_array_for_line($priority, &$data, &$default_data, $addt) {
 
   //watchdog('T_bulk_loader','Original:<pre>'.print_r($table_data, TRUE).'</pre>', array(), WATCHDOG_NOTICE);
 
-  //print 'default values:'.print_r($values,TRUE)."\n";
   if ($table_data['need_further_processing']) {
+
     $values = tripal_bulk_loader_add_spreadsheetdata_to_values($values, $addt->line, $addt->field2column[$priority]);
     if (!$values) {
       //watchdog('T_bulk_loader', 'Line ' . $addt->line_num . ' Data File Added:' . print_r($values, TRUE), array(), WATCHDOG_NOTICE);
     }
 
     $values = tripal_bulk_loader_add_foreignkey_to_values($values, $data, $addt->record2priority);
+
     if (!$values) {
       //watchdog('T_bulk_loader', 'Line ' . $addt->line_num . ' FK Added:<pre>' . print_r($values, TRUE) . print_r($data[$priority], TRUE) . '</pre>', array(), WATCHDOG_NOTICE);
     }
+
   }
   $values = tripal_bulk_loader_regex_tranform_values($values, $table_data, $addt->line);
   if (!$values) {
     //watchdog('T_bulk_loader', 'Line ' . $addt->line_num . ' Regex:<pre>' . print_r($values, TRUE) . print_r($table_data, TRUE) . '</pre>' . '</pre>', array(), WATCHDOG_NOTICE);
   }
 
-// SPF: commented out 9/5/2012... It is possible a record has no values (it's optional). The
-// checks below I think negate the need for this check, so commented out.
-//  if (!$values) {
-//    $msg = 'Line ' . $addt->line_num . ' ' . $table_data['record_id'] . ' (' . $table_data['mode'] . ') Aborted due to error in previous record. Values of current record:' . print_r($table_data['values_array'], TRUE);
-//    watchdog('T_bulk_loader', $msg, array(), WATCHDOG_WARNING);
-//    print "ERROR: " . $msg . "\n";
-//    $data[$priority]['error'] = TRUE;
-//    $no_errors = FALSE;
-//  }
-
   // get the table description
   $table_desc = tripal_core_get_chado_table_schema($table);
   
-  // check that all database required fields are present if this is in an insert
+  // for an insert, check that all database required fields are present in the values array
   // we check for 'optional' in the mode for backwards compatibility. The 'optional' 
   // mode used to be a type of insert
   if (preg_match('/insert/', $table_data['mode']) or preg_match('/optional/', $table_data['mode'])) {
@@ -484,29 +476,38 @@ function process_data_array_for_line($priority, &$data, &$default_data, $addt) {
     $fields = $table_desc['fields'];
     foreach ($fields as $field => $def) {
       // a field is considered missing if it cannot be null and there is no default
-      // value for it or it is not of type 'serial'{
+      // value for it or it is not of type 'serial'
       if ($def['not null'] == 1 and 
           !array_key_exists($field, $values) and 
           !isset($def['default']) and 
           strcmp($def['type'], serial) != 0) {
-        $msg = 'Line ' . $addt->line_num . ' ' . $table_data['record_id'] . ' (' . $table_data['mode'] . ') Missing Database Required Value: ' . $table . '.' . $field;
+        $msg = "\nLine " . $addt->line_num . ' ' . $table_data['record_id'] . ' (' . $table_data['mode'] . ') Missing Database Required Value: ' . $table . '.' . $field;
         watchdog('T_bulk_loader', $msg, array(), WATCHDOG_NOTICE);
         $data[$priority]['error'] = TRUE;
       }
     }
   } 
 
-  // Check required fields are present if a required field is missing and this
+  // Check that template required fields are present. if a required field is 
+  // missing and this
   // is an optional record then just return. otherwise raise an error
+  $skip_optional = 0;
   foreach ($table_data['required'] as $field => $required) {
     if ($required) {
       // check if the field has no value (or array is empty)
       if (!isset($values[$field]) or (is_array($values[$field]) and count($values[$field]) == 0)){
-        if ($table_data['optional']) {
-          return $no_errors;
+        // check if the record is optional.  For backwards compatiblity we need to
+        // check if the 'mode' is set to 'optional'
+        if ($table_data['optional'] or preg_match('/optional/', $table_data['mode'])) {
+          $skip_optional = 1;
+          // set the values array to be empty since we all required fields are
+          // optional and we can't do a select/insert so we don't want to keep
+          // the values if this record is used in a later FK relationship.
+          $values = array();
         }
         else {
-          $msg = 'Line ' . $addt->line_num . ' ' . $table_data['record_id'] . ' (' . $table_data['mode'] . ') Missing Template Required Value: ' . $table . '.' . $field;
+          $msg = "\nLine " . $addt->line_num . ' "' . $table_data['record_id'] . 
+            '" (' . $table_data['mode'] . ') Missing template required value: ' . $table . '.' . $field;
           watchdog('T_bulk_loader', $msg, array(), WATCHDOG_WARNING);
           $data[$priority]['error'] = TRUE;
           $no_errors = FALSE;
@@ -517,6 +518,16 @@ function process_data_array_for_line($priority, &$data, &$default_data, $addt) {
 
   // add new values array into the data array
   $data[$priority]['values_array'] = $values;
+  
+  // if there was an error already -> don't insert
+  if ($data[$priority]['error']) {
+    return $no_errors;
+  }
+  
+  // skip optional fields 
+  if ($skip_optional) {
+    return $no_errors;
+  }
 
   // check if it is already inserted
   if ($table_data['inserted']) {
@@ -524,11 +535,6 @@ function process_data_array_for_line($priority, &$data, &$default_data, $addt) {
     return $no_errors;
   }
 
-  // if there was an error already -> don't insert
-  if ($data[$priority]['error']) {
-    return $no_errors;
-  }
-
   $header = '';
   if (isset($values['feature_id'])) {
     $header = $values['feature_id']['uniquename'] . ' ' . $table_data['record_id'];
@@ -572,7 +578,7 @@ function process_data_array_for_line($priority, &$data, &$default_data, $addt) {
     $record = tripal_core_chado_insert($table, $values, $options);
 
     if (!$record) {
-      $msg = 'Line ' . $addt->line_num . ' ' . $table_data['record_id'] . ' (' . $table_data['mode'] . ') Unable to insert record into ' . $table . ' where values:' . print_r($values, TRUE);
+      $msg = "\nLine " . $addt->line_num . ' ' . $table_data['record_id'] . ' (' . $table_data['mode'] . ') Unable to insert record into ' . $table . ' where values:' . print_r($values, TRUE);
       watchdog('T_bulk_loader', $msg, array(), WATCHDOG_ERROR);
       print "ERROR: " . $msg . "\n";
       $data[$priority]['error'] = TRUE;
@@ -621,7 +627,7 @@ function process_data_array_for_line($priority, &$data, &$default_data, $addt) {
     // if the record doesn't exists and it's not optional then generate an error
     if (!$exists and $table_data['optional'] != 1) {
       // No record on select
-      $msg = 'Line ' . $addt->line_num . ' ' . $table_data['record_id'] . ' (' . $table_data['mode'] . ') No Matching record in ' . $table . ' where values:' . print_r($values, TRUE);
+      $msg = "\nLine " . $addt->line_num . ' ' . $table_data['record_id'] . ' (' . $table_data['mode'] . ') No Matching record in ' . $table . ' where values:' . print_r($values, TRUE);
       watchdog('T_bulk_loader', $msg, array(), WATCHDOG_WARNING);
       $data[$priority]['error'] = TRUE;
       $no_errors = FALSE;
@@ -676,16 +682,24 @@ function tripal_bulk_loader_add_spreadsheetdata_to_values($values, $line, $field
 function tripal_bulk_loader_add_foreignkey_to_values($values, $data, $record2priority) {
 
   foreach ($values as $field => $value) {
+    // if the field value is an array then it is an FK
     if (is_array($value)) {
-      $foreign_record = $value['foreign record'];
+   
+      // get the name of the foreign record
+      $foreign_record   = $value['foreign record'];
+      
+      // get the corresponding priority of the foreign record
       $foreign_priority = $record2priority[$foreign_record];
-      $foreign_values = $data[$foreign_priority]['values_array'];
-
-      // add to current values array
+      
+      // get the values of the foreign record
+      $foreign_values   = $data[$foreign_priority]['values_array'];
+      
+      // substitue the foreign values for this fields values
       $values[$field] = $foreign_values;
     }
   }
 
+  // return the updated field values
   return $values;
 }