|
@@ -400,7 +400,7 @@ function tripal_update_cvtermpath_root_loop($rootid, $cvid){
|
|
|
$ttype->condition($db_or);
|
|
|
$result = $ttype->execute()->fetchObject();
|
|
|
|
|
|
- tripal_update_cvtermpath_loop($rootid, $rootid, $cvid, $result->cvterm_id, 0);
|
|
|
+ tripal_update_cvtermpath_loop($rootid, $rootid, $cvid, $result->cvterm_id, 0, 0, array());
|
|
|
|
|
|
$cterm = db_query(
|
|
|
'SELECT *
|
|
@@ -425,7 +425,9 @@ function tripal_update_cvtermpath_root_loop($rootid, $cvid){
|
|
|
* @param $depth
|
|
|
* @return multitype:
|
|
|
*/
|
|
|
-function tripal_update_cvtermpath_loop($origin, $child_id, $cv_id, $type_id, $depth){
|
|
|
+function tripal_update_cvtermpath_loop($origin, $child_id, $cv_id, $type_id, $depth, $increment_of_depth, $array_of_children){
|
|
|
+
|
|
|
+ // Check to see if a row with these values already exists.
|
|
|
chado_set_active('chado');
|
|
|
$count = db_query(
|
|
|
'SELECT *
|
|
@@ -439,14 +441,149 @@ function tripal_update_cvtermpath_loop($origin, $child_id, $cv_id, $type_id, $de
|
|
|
);
|
|
|
$count_total = $count->rowCount();
|
|
|
|
|
|
+ try{
|
|
|
+ if($count_total == 0) {
|
|
|
+ // If row with values does not already exist write to table.
|
|
|
+ chado_set_active('chado');
|
|
|
+
|
|
|
+ $query = db_insert('cvtermpath')
|
|
|
+ ->fields(array(
|
|
|
+ 'object_id' => $origin,
|
|
|
+ 'subject_id' => $child_id,
|
|
|
+ 'cv_id' => $cv_id,
|
|
|
+ 'type_id' => $type_id,
|
|
|
+ 'pathdistance' => $depth,
|
|
|
+ ));
|
|
|
+ $rows = $query->execute();
|
|
|
+ }
|
|
|
+
|
|
|
+ // Build the ID.
|
|
|
+ $children_id = $origin.$child_id.$cv_id.$type_id;
|
|
|
+ // Then add that new entry to the $array_of_children.
|
|
|
+ $array_of_children[$increment_of_depth] = array('build_id'=>$children_id, 'depth' => $depth);
|
|
|
+ // Now check if the most recent entry already exists in the array.
|
|
|
+ if($increment_of_depth != 0){
|
|
|
+ // Search the $array_of_children for the new $child_id in the build_id column.
|
|
|
+ $possible_loop_starts = array_keys(array_column($array_of_children, 'build_id'), $children_id);
|
|
|
+
|
|
|
+ // If the search returns something check for a possible loop.
|
|
|
+ if(!empty($possible_loop_starts)){
|
|
|
+ foreach($possible_loop_starts as $possible_loop_start){
|
|
|
+ // Call the loop checker function.
|
|
|
+ $result_of_loop_checker = tripal_update_cvtermpath_loop_checker($origin, $child_id, $cv_id, $type_id, $depth, $increment_of_depth, 0, $possible_loop_start, array());
|
|
|
+ if($result_of_loop_checker == TRUE){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($count_total == 0) {
|
|
|
+ chado_set_active('chado');
|
|
|
+
|
|
|
+ $query = db_select('cvterm_relationship', 'cvtr')
|
|
|
+ ->fields('cvtr')
|
|
|
+ ->condition('cvtr.object_id', $child_id, '=')
|
|
|
+ ->execute();
|
|
|
+ $cterm = $query->fetchAll();
|
|
|
+
|
|
|
+ foreach ($cterm as $item) {
|
|
|
+ //watchdog('debug', '<pre>tripal_ds_preprocess_TripalEntity $item ' . print_r($item, TRUE) . '</pre>');
|
|
|
+ $increment_of_depth++;
|
|
|
+ tripal_update_cvtermpath_loop($origin, $item->subject_id, $cv_id, $item->type_id, $depth + 1, $increment_of_depth, $array_of_children);
|
|
|
+ };
|
|
|
+ //}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch(Exception $e){
|
|
|
+ watchdog_exception('tripal_ds', $e);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 1;
|
|
|
+
|
|
|
+}
|
|
|
+/**
|
|
|
+ *
|
|
|
+ * @param $origin
|
|
|
+ * @param $subject_id
|
|
|
+ * @param $cv_id
|
|
|
+ * @param $type_id
|
|
|
+ * @param $depth
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+function tripal_update_cvtermpath_loop_checker($origin, $child_id, $cv_id, $type_id, $depth, $increment_of_depth, $distance_between_parent_child, $possible_start_of_loop, $array_of_possible_loop){
|
|
|
+
|
|
|
+ if ($distance_between_parent_child > 1) {
|
|
|
+ // Search the $array_of_children for the new $child_id in the build_id column.
|
|
|
+ $possible_loop_starts = array_keys(array_column($array_of_possible_loop, 'build_id'), $possible_start_of_loop);
|
|
|
+ // If the search returns something check for a possible loop.
|
|
|
+ if (!empty($possible_loop_starts)) {
|
|
|
+ foreach ($possible_loop_starts as $possible_loop_start) {
|
|
|
+ // Check the depth measurements, if the depth is equal to the $distance_between_parent_child it's a loop.
|
|
|
+ if ($possible_loop_start->depth == $distance_between_parent_child) {
|
|
|
+ //This is a loop so it needs to be terminated.
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ chado_set_active('chado');
|
|
|
+ $query = db_select('cvterm_relationship', 'cvtr')
|
|
|
+ ->fields('cvtr')
|
|
|
+ ->condition('cvtr.object_id', $child_id, '=')
|
|
|
+ ->execute();
|
|
|
+ $cterm = $query->fetchAll();
|
|
|
+
|
|
|
+ foreach ($cterm as $item) {
|
|
|
+ //watchdog('debug', '<pre>tripal_ds_preprocess_TripalEntity $item ' . print_r($item, TRUE) . '</pre>');
|
|
|
+ $increment_of_depth++;
|
|
|
+ $distance_between_parent_child++;
|
|
|
+ $children_id = $origin . $item->subject_id . $cv_id . $item->type_id;
|
|
|
+ $array_of_possible_loop[ $distance_between_parent_child ] = array('build_id' => $children_id, 'depth' => $depth);
|
|
|
+ tripal_update_cvtermpath_loop_checker($origin, $item->subject_id, $cv_id, $item->type_id, $depth + 1, $increment_of_depth, $distance_between_parent_child, $possible_start_of_loop, $array_of_possible_loop);
|
|
|
+ };
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+}
|
|
|
+/*
|
|
|
+ *
|
|
|
+ * @param $origin
|
|
|
+ * @param $subject_id
|
|
|
+ * @param $cv_id
|
|
|
+ * @param $type_id
|
|
|
+ * @param $depth
|
|
|
+ * @return multitype:
|
|
|
+
|
|
|
+function tripal_update_cvtermpath_loop($origin, $child_id, $cv_id, $type_id, $depth){
|
|
|
+ // Variables and arrays needed for loop checking.
|
|
|
+ $array_of_children;
|
|
|
+ $array_of_possible_loop;
|
|
|
+ $possible_start_of_loop;
|
|
|
+ $distance_between_parent_child;
|
|
|
+ $increment_of_depth;
|
|
|
+
|
|
|
+
|
|
|
+ chado_set_active('chado');
|
|
|
+ $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' => $child_id, ':depth' => $depth)
|
|
|
+ );
|
|
|
+ $count_total = $count->rowCount();
|
|
|
+
|
|
|
//Loop check
|
|
|
chado_set_active('chado');
|
|
|
$loop = db_query(
|
|
|
'SELECT *
|
|
|
FROM cvtermpath
|
|
|
- WHERE cv_id = :cvid
|
|
|
+ WHERE cv_id = :cvid
|
|
|
AND object_id = :origin
|
|
|
- AND subject_id = :child_id
|
|
|
+ AND subject_id = :child_id
|
|
|
AND type_id = :type_id
|
|
|
',
|
|
|
array(':cvid' => $cv_id, ':origin' => $origin, ':child_id' => $child_id, ':type_id' => $type_id,)
|
|
@@ -460,8 +597,8 @@ function tripal_update_cvtermpath_loop($origin, $child_id, $cv_id, $type_id, $de
|
|
|
}
|
|
|
}
|
|
|
else {*/
|
|
|
- //If no loop proceed.
|
|
|
- try{
|
|
|
+ //If no loop proceed.
|
|
|
+ /*try{
|
|
|
if($count_total == 0) {
|
|
|
chado_set_active('chado');
|
|
|
|
|
@@ -499,7 +636,7 @@ function tripal_update_cvtermpath_loop($origin, $child_id, $cv_id, $type_id, $de
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+*/
|
|
|
/**
|
|
|
*
|
|
|
* @param $origin
|