فهرست منبع

Issue #2624452: tripal_insert_cvterm(), ensure the accession can be updated correctly in the rare case that it needs to be.

Lacey Sanderson 10 سال پیش
والد
کامیت
a75d8b31d0
1فایلهای تغییر یافته به همراه47 افزوده شده و 9 حذف شده
  1. 47 9
      tripal_cv/api/tripal_cv.api.inc

+ 47 - 9
tripal_cv/api/tripal_cv.api.inc

@@ -524,9 +524,9 @@ function tripal_insert_cvterm($term, $options = array()) {
   }
   }
 
 
   // This SQL statement will be used a lot to find a cvterm so just set it
   // This SQL statement will be used a lot to find a cvterm so just set it
-  // here for easy reference below.  Because CV terms can change their names
-  // but accessions don't change, the following SQL finds cvterms based on
-  // their accession rather than the name.
+  // here for easy reference below.  The following SQL tries to cover both the following:
+  // 1) The cvterm name may have changed but the accession remains constant
+  // 2) The cvterm name remains constant but the daccession/db may have changed (rare).
   $cvtermsql = "
   $cvtermsql = "
     SELECT CVT.name, CVT.cvterm_id, CV.cv_id, CV.name as cvname,
     SELECT CVT.name, CVT.cvterm_id, CV.cv_id, CV.name as cvname,
       DB.name as dbname, DB.db_id, DBX.accession
       DB.name as dbname, DB.db_id, DBX.accession
@@ -534,7 +534,7 @@ function tripal_insert_cvterm($term, $options = array()) {
       INNER JOIN {dbxref} DBX on CVT.dbxref_id = DBX.dbxref_id
       INNER JOIN {dbxref} DBX on CVT.dbxref_id = DBX.dbxref_id
       INNER JOIN {db} DB on DBX.db_id = DB.db_id
       INNER JOIN {db} DB on DBX.db_id = DB.db_id
       INNER JOIN {cv} CV on CV.cv_id = CVT.cv_id
       INNER JOIN {cv} CV on CV.cv_id = CVT.cv_id
-    WHERE DBX.accession = :accession and DB.name = :name
+    WHERE (DBX.accession = :accession and DB.name = :dbname) OR (CVT.name = :term and CV.name = :cvname)
   ";
   ";
 
 
   // Add the database. The function will just return the DB object if the
   // Add the database. The function will just return the DB object if the
@@ -648,7 +648,7 @@ function tripal_insert_cvterm($term, $options = array()) {
         }
         }
       }
       }
       // get the original cvterm with the same name and return that.
       // get the original cvterm with the same name and return that.
-      $result = chado_query($cvtermsql, array(':accession' => $dbxref->accession, ':name' => $dbname));
+      $result = chado_query($cvtermsql, array(':accession' => $dbxref->accession, ':dbname' => $dbname, ':term' => $name, ':cvname' => $cvname));
       $cvterm = $result->fetchObject();
       $cvterm = $result->fetchObject();
       return $cvterm;
       return $cvterm;
     }
     }
@@ -658,7 +658,7 @@ function tripal_insert_cvterm($term, $options = array()) {
   }
   }
 
 
   // Get the CVterm record.  If it doesn't exist then create it.
   // Get the CVterm record.  If it doesn't exist then create it.
-  $result = chado_query($cvtermsql, array(':accession' => $accession, ':name' => $dbname));
+  $result = chado_query($cvtermsql, array(':accession' => $dbxref->accession, ':dbname' => $dbname, ':term' => $name, ':cvname' => $cvname));
   $cvterm = $result->fetchObject();
   $cvterm = $result->fetchObject();
   if (!$cvterm) {
   if (!$cvterm) {
 
 
@@ -705,11 +705,13 @@ function tripal_insert_cvterm($term, $options = array()) {
       tripal_report_error('tripal_cv', TRIPAL_WARNING, "The dbxref already exists for another cvterm record: $name (cv: " . $cvname . " db: $dbname)", NULL);
       tripal_report_error('tripal_cv', TRIPAL_WARNING, "The dbxref already exists for another cvterm record: $name (cv: " . $cvname . " db: $dbname)", NULL);
       return 0;
       return 0;
     }
     }
-    $result = chado_query($cvtermsql, array(':accession' => $accession, ':name' => $dbname));
+    $result = chado_query($cvtermsql, array(':accession' => $dbxref->accession, ':dbname' => $dbname, ':term' => $name, ':cvname' => $cvname));
     $cvterm = $result->fetchObject();
     $cvterm = $result->fetchObject();
   }
   }
   // Update the cvterm.
   // Update the cvterm.
   elseif ($update) {
   elseif ($update) {
+
+    // First, basic update of the term.
     $match = array('cvterm_id' => $cvterm->cvterm_id);
     $match = array('cvterm_id' => $cvterm->cvterm_id);
     $upd_values = array(
     $upd_values = array(
       'name'                => $name,
       'name'                => $name,
@@ -723,7 +725,43 @@ function tripal_insert_cvterm($term, $options = array()) {
       tripal_report_error('tripal_cv', TRIPAL_WARNING, "Failed to update the term: $name", NULL);
       tripal_report_error('tripal_cv', TRIPAL_WARNING, "Failed to update the term: $name", NULL);
       return 0;
       return 0;
     }
     }
-    $result = chado_query($cvtermsql, array(':accession' => $accession, ':name' => $dbname));
+
+    // Second, check that the dbxref has not changed and if it has then update it.
+    $checksql = "
+      SELECT cvterm_id
+      FROM {cvterm} CVT
+        INNER JOIN {dbxref} DBX on CVT.dbxref_id = DBX.dbxref_id
+        INNER JOIN {db} DB on DBX.db_id = DB.db_id
+        INNER JOIN {cv} CV on CV.cv_id = CVT.cv_id
+      WHERE DBX.accession = :accession and DB.name = :dbname and CVT.name = :term and CV.name = :cvname
+    ";
+    $check = chado_query($checksql, array(':accession' => $dbxref->accession, ':dbname' => $dbname, ':term' => $name, ':cvname' => $cvname))->fetchObject();
+    if (!$check) {
+
+      // check to see if the dbxref exists if not, add it.
+      $dbxref =  tripal_insert_dbxref(array(
+        'db_id' => $db->db_id,
+        'accession' => $accession
+      ));
+      if (!$dbxref) {
+        tripal_report_error('tripal_cv', TRIPAL_WARNING, "Failed to find or insert the dbxref record for cvterm, " .
+          "$name (id: $accession), for database $dbname", NULL);
+        return 0;
+      }
+
+      $match = array('cvterm_id' => $cvterm->cvterm_id);
+      $upd_values = array(
+        'dbxref_id' => $dbxref->dbxref_id,
+      );
+      $success = chado_update_record('cvterm', $match, $upd_values);
+      if (!$success) {
+        tripal_report_error('tripal_cv', TRIPAL_WARNING, "Failed to update the term $name with new accession $db:$accession", NULL);
+        return 0;
+      }
+    }
+
+    // Finally grab the updated details.
+    $result = chado_query($cvtermsql, array(':accession' => $dbxref->accession, ':dbname' => $dbname, ':term' => $name, ':cvname' => $cvname));
     $cvterm = $result->fetchObject();
     $cvterm = $result->fetchObject();
   }
   }
   else {
   else {
@@ -1111,4 +1149,4 @@ function tripal_get_cvterm_default_select_options($table, $field, $field_desc) {
   }
   }
 
 
   return $options;
   return $options;
-}
+}