Przeglądaj źródła

working go loading algorithm for testings

Shawna 7 lat temu
rodzic
commit
080bd8ea4f

+ 79 - 26
tripal_chado/api/modules/tripal_chado.cv.api.inc

@@ -392,8 +392,9 @@ function tripal_update_cvtermpath_bak($cv_id, $job_id = NULL){
 
     // Iterate through each root level term.
     $record = $result->fetchAll();
+    $roots = array();
     foreach ($record as $item){
-      tripal_update_cvtermpath_root_loop($item->cvterm_id, $item->cv_id);
+      tripal_update_cvtermpath_root_loop($item->cvterm_id, $item->cv_id, $roots);
     }
   }
   catch (Exception $e) {
@@ -417,7 +418,7 @@ function tripal_update_cvtermpath_bak($cv_id, $job_id = NULL){
  * @param $cvid
  *   The controlled vocabulary ID from the cv table of Chado (i.e. cv.cv_id).
  */
-function tripal_update_cvtermpath_root_loop($rootid, $cvid){
+function tripal_update_cvtermpath_root_loop($rootid, $cvid, &$roots){
 
   // Get's the cvterm record for this "root".
   $ttype = db_select('cvterm', 'cv')
@@ -428,10 +429,20 @@ function tripal_update_cvtermpath_root_loop($rootid, $cvid){
   $ttype->condition($db_or);
   $result = $ttype->execute()->fetchObject();
 
+  $term_id = $rootid . '|' . $rootid . '|' . $cvid . '|' . $result->cvterm_id;
+  // If the child_id matches any other id in the array then we've hit a loop.
+  foreach ($roots as $element_id) {
+    if ($element_id == $term_id) {
+      return;
+    }
+  }
+  // Then add that new entry to the $tree_path.
+  $roots[] =  $term_id;
+
   // Descends through the branch starting at this "root" term.
   $visited = array();
   $depth = 0;
-  tripal_update_cvtermpath_loop($rootid, $rootid, $rootid, $cvid, $result->cvterm_id, $depth, $visited);
+  tripal_update_cvtermpath_loop($rootid, $rootid, $cvid, $result->cvterm_id, $depth, 0, $visited);
 
   // Get's the children terms of this "root" term and then recursively calls
   // this function making each child root.
@@ -443,7 +454,7 @@ function tripal_update_cvtermpath_root_loop($rootid, $cvid){
     array(':rootid' => $rootid)
   );
   while($cterm_result = $cterm->fetchAssoc()) {
-    tripal_update_cvtermpath_root_loop($cterm_result['subject_id'], $cvid);
+    tripal_update_cvtermpath_root_loop($cterm_result['subject_id'], $cvid, $roots);
   }
 }
 
@@ -460,12 +471,24 @@ function tripal_update_cvtermpath_root_loop($rootid, $cvid){
  *   The relationship type between the origin term and the child.
  * @param $depth
  *   The depth of the recursion.
- * @param $visited.
- *   An array of every term visited in the descent of the ontology tree.
+ * @param $increment_of_depth.
+ *   An integer ??
+ * @param $tree_path.
+ *   The array of every term between the current child and the origin. Each
+ *   element in the array is an associative array with the keys:
+ *     -build_id: an string identifier for the child that combines the origin,
+ *      child cvterm_id,cv_id, and the type_id.
+ *     -depth: the depth that a child was inserted into the cvtermpath table.
+ * @return multitype:
  */
-function tripal_update_cvtermpath_loop($origin, $parent_id, $child_id, $cv_id, $type_id, $depth, &$visited){
+$loop_data;
 
+function tripal_update_cvtermpath_loop($origin, $child_id, $cv_id, $type_id, $depth,
+                                       $increment_of_depth, $tree_path){
+  // An array of
+  global $loop_data;
   // Check to see if a row with these values already exists.
+  chado_set_active('chado');
   $count =  db_query(
     'SELECT *
      FROM cvtermpath
@@ -477,25 +500,43 @@ function tripal_update_cvtermpath_loop($origin, $parent_id, $child_id, $cv_id, $
     array(':cvid' => $cv_id, ':origin' => $origin, ':child_id' => $child_id, ':depth' => $depth)
   );
   $count_total = $count->rowCount();
-
-  // Build the ID.
-  $memory = number_format(memory_get_usage());
-  $term_id = $origin . '|' . $parent_id . '|' . $child_id . '|' . $cv_id . '|' . $type_id;
-  print($depth . "\t" .$term_id . "\t" . $memory . " bytes\n" );
-
   // If we've already seen this term then just return, we don't want
   // to insert it again.
   if ($count_total > 0) {
-    return;
+    return $loop_data;
   }
-
-  // If the child_id matches any other id in the array then we've hit a loop.
-  foreach ($visited as $element_id) {
-    if ($element_id == $term_id) {
-      return;
+  // Build the ID.
+  $term_id = $origin . '|' . $child_id . '|' . $cv_id . '|' . $type_id;
+  // Now check if the most recent entry already exists in the array.
+  if ($increment_of_depth != 0 && empty($loop_data)) {
+    // Search the $tree_path for the new $child_id in the build_id column.
+    foreach ($tree_path as $parent) {
+      // If this child is the same as a parent term that has already been
+      // processed then we have a potential loop.
+      if ($parent['build_id'] == $term_id) {
+        // The loop checker function below.
+        $result_of_loop_checker = tripal_update_cvtermpath_loop_checker($origin,
+          $child_id, $cv_id, $type_id, $depth, $increment_of_depth, 0,
+          $parent, array(), $depth);
+        if (!empty($result_of_loop_checker)) {
+          $loop_data = $result_of_loop_checker;
+          //Find the depth of the loop start by finding it in the array_of_children
+          foreach($tree_path as $children => $child){
+            if($child['build_id'] == $loop_data['build_id']){
+              $loop_location = $child['depth'];
+            }
+          }
+          $array_loop_data = (array)$loop_data;
+          $array_loop_data['depth'] = $loop_location;
+          $loop_data = $array_loop_data;
+          break;
+        }
+      }
+      if (!empty($loop_data)) {
+        return $loop_data;
+      }
     }
   }
-
   // We have not detected a loop, so it's safe to insert the term.
   $query = db_insert('cvtermpath')
     ->fields([
@@ -506,10 +547,11 @@ function tripal_update_cvtermpath_loop($origin, $parent_id, $child_id, $cv_id, $
       'pathdistance' => $depth,
     ]);
   $rows = $query->execute();
-
   // Then add that new entry to the $tree_path.
-  $visited[] =  $term_id;
-
+  $tree_path[$increment_of_depth] = [
+    'build_id' => $term_id,
+    'depth' => $depth
+  ];
   // Get all of the relationships of this child term, and recursively
   // call the tripal_update_cvtermpath_loop() function to continue
   // descending down the tree.
@@ -519,9 +561,20 @@ function tripal_update_cvtermpath_loop($origin, $parent_id, $child_id, $cv_id, $
     ->execute();
   $cterm_relationships = $query->fetchAll();
   foreach ($cterm_relationships as $item) {
-    $next_depth = $depth + 1;
-    tripal_update_cvtermpath_loop($origin, $child_id, $item->subject_id, $cv_id,
-        $item->type_id, $next_depth, $visited);
+    if (!empty($loop_data)) {
+      if ($loop_data['depth'] < $depth) {
+        break;
+      }
+      elseif ($loop_data['depth'] > $depth) {
+        $loop_data = NULL;
+        break;
+      }
+    }
+    else {
+      $increment_of_depth++;
+      tripal_update_cvtermpath_loop($origin, $item->subject_id, $cv_id,
+        $item->type_id, $depth + 1, $increment_of_depth, $tree_path);
+    }
   }
 }
 

+ 2 - 2
tripal_ds/tripal_ds.module

@@ -515,10 +515,10 @@ function tripal_ds_find_field_group_parent($field_name, $entity_type, $bundle, $
   foreach ($fg_for_bundle as $field_groups => $field_group) {
    $field_group_data = unserialize($field_group->data);
    // There is a separate function to deal with tables, so disregard.
-    /*if ($field_group_data['format_type'] == 'table'){
+    if ($field_group_data['format_type'] == 'table'){
       // Do nothing
     }
-    else*/if (!empty($field_group_data['children'][0])) {
+    elseif (!empty($field_group_data['children'][0])) {
       $children = $field_group_data['children'];
       //If there is more than one child all need to be checked.
       if (count($children) > 1) {