|  | @@ -343,11 +343,8 @@ function tripal_feature_block($op = 'list', $delta = 0, $edit=array()) {
 | 
	
		
			
				|  |  |        $blocks['alignments']['info'] = t('Tripal Feature Alignments');
 | 
	
		
			
				|  |  |        $blocks['alignments']['cache'] = BLOCK_NO_CACHE;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      $blocks['object_relationships']['info'] = t('Tripal Feature Object Relationships');
 | 
	
		
			
				|  |  | -      $blocks['object_relationships']['cache'] = BLOCK_NO_CACHE;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      $blocks['subject_relationships']['info'] = t('Tripal Feature Subject Relationships');
 | 
	
		
			
				|  |  | -      $blocks['subject_relationships']['cache'] = BLOCK_NO_CACHE;
 | 
	
		
			
				|  |  | +      $blocks['relationships']['info'] = t('Tripal Feature Relationships');
 | 
	
		
			
				|  |  | +      $blocks['relationships']['cache'] = BLOCK_NO_CACHE;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        $blocks['org_feature_counts']['info'] = t('Tripal Organism Feature Counts');
 | 
	
		
			
				|  |  |        $blocks['org_feature_counts']['cache'] = BLOCK_NO_CACHE;
 | 
	
	
		
			
				|  | @@ -397,13 +394,9 @@ function tripal_feature_block($op = 'list', $delta = 0, $edit=array()) {
 | 
	
		
			
				|  |  |            $block['subject'] = t('Alignments');
 | 
	
		
			
				|  |  |            $block['content'] = theme('tripal_feature_alignments', $node);
 | 
	
		
			
				|  |  |            break;
 | 
	
		
			
				|  |  | -        case 'object_relationships':
 | 
	
		
			
				|  |  | -          $block['subject'] = t('Object Relationships');
 | 
	
		
			
				|  |  | -          $block['content'] = theme('tripal_feature_object_relationships', $node);
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        case 'subject_relationships':
 | 
	
		
			
				|  |  | -          $block['subject'] = t('Subject Relationships');
 | 
	
		
			
				|  |  | -          $block['content'] = theme('tripal_feature_object_relationships', $node);
 | 
	
		
			
				|  |  | +        case 'relationships':
 | 
	
		
			
				|  |  | +          $block['subject'] = t('Relationships');
 | 
	
		
			
				|  |  | +          $block['content'] = theme('tripal_feature_relationships', $node);
 | 
	
		
			
				|  |  |            break;
 | 
	
		
			
				|  |  |          case 'org_feature_counts':
 | 
	
		
			
				|  |  |            $block['subject'] = t('Feature Type Summary');
 | 
	
	
		
			
				|  | @@ -1847,69 +1840,201 @@ function tripal_feature_theme() {
 | 
	
		
			
				|  |  |    return array(
 | 
	
		
			
				|  |  |      'tripal_feature_search_index' => array(
 | 
	
		
			
				|  |  |        'arguments' => array('node'),
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_search_results' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node'),
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_organism_feature_browser' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_organism_feature_browser',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_organism_feature_counts' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_organism_feature_counts',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_library_feature_browser' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_library_feature_browser',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_analysis_feature_browser' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_analysis_feature_browser',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_base' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_feature_base',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_sequence' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_feature_sequence',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_synonyms' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_feature_synonyms',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_featureloc_sequences' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_feature_featureloc_sequences',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_references' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_feature_references',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_properties' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_feature_properties',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_alignments' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  |         'template' => 'tripal_feature_alignments',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | -    'tripal_feature_object_relationships' => array(
 | 
	
		
			
				|  |  | -       'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  | -       'template' => 'tripal_feature_object_relationships',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | -    'tripal_feature_subject_relationships' => array(
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  | +    'tripal_feature_relationships' => array(
 | 
	
		
			
				|  |  |         'arguments' => array('node' => NULL),
 | 
	
		
			
				|  |  | -       'template' => 'tripal_feature_subject_relationships',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +       'template' => 'tripal_feature_relationships',
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |      'tripal_feature_edit_ALL_properties_form' => array(
 | 
	
		
			
				|  |  |        'arguments' => array('form' => NULL),
 | 
	
		
			
				|  |  |        'function' => 'theme_tripal_feature_edit_ALL_properties_form',
 | 
	
		
			
				|  |  | -  ),
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  |    );
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ingroup tripal_feature
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function tripal_feature_preprocess_tripal_feature_relationships(&$variables) {
 | 
	
		
			
				|  |  | +  // we want to provide a new variable that contains the matched features.
 | 
	
		
			
				|  |  | +  $feature = $variables['node']->feature;
 | 
	
		
			
				|  |  | +   
 | 
	
		
			
				|  |  | +  // expand the feature object to include the feature relationships.
 | 
	
		
			
				|  |  | +  $feature = tripal_core_expand_chado_vars($feature,
 | 
	
		
			
				|  |  | +     'table','feature_relationship', array('order_by'=>array('rank' => 'ASC')));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // get the subject relationships
 | 
	
		
			
				|  |  | +  $srelationships = $feature->feature_relationship->subject_id;
 | 
	
		
			
				|  |  | +  if (!$srelationships) {
 | 
	
		
			
				|  |  | +     $srelationships = array();
 | 
	
		
			
				|  |  | +  } 
 | 
	
		
			
				|  |  | +  elseif (!is_array($srelationships)) { 
 | 
	
		
			
				|  |  | +     $srelationships = array($srelationships); 
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // get the object relationships
 | 
	
		
			
				|  |  | +  $orelationships = $feature->feature_relationship->object_id;
 | 
	
		
			
				|  |  | +  if (!$orelationships) {
 | 
	
		
			
				|  |  | +     $orelationships = array();
 | 
	
		
			
				|  |  | +  } 
 | 
	
		
			
				|  |  | +  elseif (!is_array($orelationships)) { 
 | 
	
		
			
				|  |  | +     $orelationships = array($orelationships); 
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // get alignment as child
 | 
	
		
			
				|  |  | +  $cfeaturelocs = $feature->featureloc->feature_id;
 | 
	
		
			
				|  |  | +  if (!$cfeaturelocs) {
 | 
	
		
			
				|  |  | +     $cfeaturelocs = array();
 | 
	
		
			
				|  |  | +  } 
 | 
	
		
			
				|  |  | +  elseif (!is_array($cfeaturelocs)) { 
 | 
	
		
			
				|  |  | +     $cfeaturelocs = array($cfeaturelocs); 
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // prepare the SQL statement to get the featureloc for the 
 | 
	
		
			
				|  |  | +  // feature in the relationships. 
 | 
	
		
			
				|  |  | +  if(!tripal_core_is_sql_prepared('sel_featureloc_preprocess_relationships')){
 | 
	
		
			
				|  |  | +    $psql = "PREPARE sel_featureloc_preprocess_relationships (int, int) AS " .
 | 
	
		
			
				|  |  | +            "SELECT FL.featureloc_id, F.name as srcfeature_name, FL.srcfeature_id, ".
 | 
	
		
			
				|  |  | +            "  FL.feature_id, FL.fmin, FL.fmax, FL.strand, FL.phase ".
 | 
	
		
			
				|  |  | +            "FROM featureloc FL " .
 | 
	
		
			
				|  |  | +            "  INNER JOIN feature F ON F.feature_id = FL.srcfeature_id ".
 | 
	
		
			
				|  |  | +            "WHERE FL.feature_id = $1 and FL.srcfeature_id = $2";
 | 
	
		
			
				|  |  | +    $prepared = chado_query($psql);
 | 
	
		
			
				|  |  | +    if(!$prepared){
 | 
	
		
			
				|  |  | +      watchdog('tripal_feature', "tripal_feature_preprocess_tripal_feature_relationships: not able to prepare '%name' statement for: %sql", array('%name' => 'sel_featureloc_preprocess_relationships', '%sql' => $psql), 'WATCHDOG ERROR');
 | 
	
		
			
				|  |  | +      return FALSE;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }  
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // combine both object and subject relationshisp into a single array
 | 
	
		
			
				|  |  | +  $relationships = array();
 | 
	
		
			
				|  |  | +  $relationships['object'] = array();
 | 
	
		
			
				|  |  | +  $relationships['subject'] = array();
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // iterate through the object relationships
 | 
	
		
			
				|  |  | +  foreach ($orelationships as $relationship) {
 | 
	
		
			
				|  |  | +     $rel = new stdClass(); 
 | 
	
		
			
				|  |  | +     // get locations where the child feature and this feature overlap with the
 | 
	
		
			
				|  |  | +     // same landmark feature.
 | 
	
		
			
				|  |  | +     $rel->child_featurelocs = array();     
 | 
	
		
			
				|  |  | +     foreach ($cfeaturelocs as $featureloc) {
 | 
	
		
			
				|  |  | +        $res = chado_query("EXECUTE sel_featureloc_preprocess_relationships (%d, %d)", 
 | 
	
		
			
				|  |  | +          $relationship->subject_id->feature_id, 
 | 
	
		
			
				|  |  | +          $featureloc->srcfeature_id->feature_id);        
 | 
	
		
			
				|  |  | +        while ($loc = db_fetch_object($res)){
 | 
	
		
			
				|  |  | +           // add in the node id of the src feature if it exists and save this location
 | 
	
		
			
				|  |  | +           $loc->nid = $featureloc->srcfeature_id->nid;
 | 
	
		
			
				|  |  | +           $rel->child_featurelocs[] = $loc;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +     }
 | 
	
		
			
				|  |  | +     $rel->record = $relationship;    
 | 
	
		
			
				|  |  | +     
 | 
	
		
			
				|  |  | +     // get the relationship and child types
 | 
	
		
			
				|  |  | +     $rel_type = t(preg_replace('/_/'," ",$relationship->type_id->name));
 | 
	
		
			
				|  |  | +     $child_type = $relationship->subject_id->type_id->name;
 | 
	
		
			
				|  |  | +     
 | 
	
		
			
				|  |  | +     // get the node id of the subject
 | 
	
		
			
				|  |  | +     $sql = "SELECT nid FROM chado_feature WHERE feature_id = %d";
 | 
	
		
			
				|  |  | +     $n = db_fetch_object(db_query($sql,$relationship->subject_id->feature_id));
 | 
	
		
			
				|  |  | +     if($n){
 | 
	
		
			
				|  |  | +        $rel->record->nid = $n->nid;
 | 
	
		
			
				|  |  | +     }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +     if (!array_key_exists($rel_type, $relationships['object'])) {
 | 
	
		
			
				|  |  | +       $relationships['object'][$rel_type] = array();   
 | 
	
		
			
				|  |  | +     }
 | 
	
		
			
				|  |  | +     if (!array_key_exists($child_type, $relationships['object'][$rel_type])) {
 | 
	
		
			
				|  |  | +       $relationships['object'][$rel_type][$child_type] = array();   
 | 
	
		
			
				|  |  | +     }
 | 
	
		
			
				|  |  | +     $relationships['object'][$rel_type][$child_type][] = $rel;     
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // now add in the subject relationships
 | 
	
		
			
				|  |  | +  foreach ($srelationships as $relationship) {
 | 
	
		
			
				|  |  | +     $rel = new stdClass(); 
 | 
	
		
			
				|  |  | +     // get locations where this feature overlaps with the parent
 | 
	
		
			
				|  |  | +     $rel->parent_featurelocs = array();     
 | 
	
		
			
				|  |  | +     foreach ($cfeaturelocs as $featureloc) {
 | 
	
		
			
				|  |  | +        $res = chado_query("EXECUTE sel_featureloc_preprocess_relationships (%d, %d)", 
 | 
	
		
			
				|  |  | +          $relationship->object_id->feature_id, 
 | 
	
		
			
				|  |  | +          $featureloc->srcfeature_id->feature_id);
 | 
	
		
			
				|  |  | +        while ($loc = db_fetch_object($res)){
 | 
	
		
			
				|  |  | +           // add in the node id of the src feature if it exists and save this location
 | 
	
		
			
				|  |  | +           $loc->nid = $featureloc->srcfeature_id->nid;
 | 
	
		
			
				|  |  | +           $rel->parent_featurelocs[] = $loc;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +     }
 | 
	
		
			
				|  |  | +     $rel->record = $relationship;
 | 
	
		
			
				|  |  | +     $rel_type = t(preg_replace('/_/'," ",$relationship->type_id->name));
 | 
	
		
			
				|  |  | +     $parent_type = $relationship->object_id->type_id->name;
 | 
	
		
			
				|  |  | +     
 | 
	
		
			
				|  |  | +     // get the node id of the subject
 | 
	
		
			
				|  |  | +     $sql = "SELECT nid FROM chado_feature WHERE feature_id = %d";
 | 
	
		
			
				|  |  | +     $n = db_fetch_object(db_query($sql,$relationship->object_id->feature_id));
 | 
	
		
			
				|  |  | +     if($n){
 | 
	
		
			
				|  |  | +        $rel->record->nid = $n->nid;
 | 
	
		
			
				|  |  | +     }
 | 
	
		
			
				|  |  | +     
 | 
	
		
			
				|  |  | +     if (!array_key_exists($rel_type, $relationships['subject'])) {
 | 
	
		
			
				|  |  | +       $relationships['subject'][$rel_type] = array();   
 | 
	
		
			
				|  |  | +     }
 | 
	
		
			
				|  |  | +     if (!array_key_exists($child_type, $relationships['subject'][$rel_type])) {
 | 
	
		
			
				|  |  | +       $relationships['subject'][$rel_type][$parent_type] = array();   
 | 
	
		
			
				|  |  | +     }
 | 
	
		
			
				|  |  | +     $relationships['subject'][$rel_type][$parent_type][] = $rel;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  $feature->all_relationships = $relationships;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   *
 |