<?php

/*******************************************************************************
*  Implementation of hook_install();
*/
function tripal_search_feature_install(){

   // create the module's data directory
   tripal_create_moddir('tripal_search_feature');
	
	// Create a sequence as the primiry key for the feature_for_search
	$sql = "DROP SEQUENCE IF EXISTS feature_for_search_id; CREATE SEQUENCE feature_for_search_id";
	chado_query($sql);	

	$view_name = 'feature_for_search';
   // Drop the MView table if it exists
   $mview_id = tripal_mviews_get_mview_id($view_name);
   if($mview_id){
      tripal_mviews_action("delete",$mview_id);
   }

   $schema = " feature_for_search_id integer, 
   							  feature_id integer,
   							  feature_type character varying(1024),
   							  feature_name character varying(1024),
   							  feature_uniquename text,
   							  feature_is_obsolete boolean,
   							  organism_common_name character varying(255),
   							  feature_seqlen integer,
   							  go_term character varying(1024),
   							  unigene character varying(255),
   							  blast_value text,
   							  kegg_value text,
   							  interpro_value text
   							  ";
   
   $index = "feature_id, go_term, blast_value, kegg_value, interpro_value";
   
   $sql = "SELECT nextval ('feature_for_search_id') AS feature_for_search_id, T.* FROM (
						SELECT F.feature_id AS feature_id, 
										(SELECT name FROM cvterm WHERE F.type_id = cvterm_id) AS feature_type,
										F.name AS feature_name, 
										F.uniquename AS feature_uniquename,
										F.is_obsolete AS feature_is_obsolete,
										O.common_name AS organism_common_name, 
										F.seqlen AS feature_seqlen, 
										C.name AS go_term,
										UNIGENE.name AS unigene_name,
										BLAST.value AS blast_value, 
										KEGG.value AS KEGG_value, 
										INTERPRO.value AS interpro_value 
						FROM feature F
						LEFT JOIN organism O ON F.organism_id = O.organism_id 
						LEFT JOIN feature_cvterm FC ON F.feature_id = FC.feature_id 
						LEFT JOIN cvterm C ON FC.cvterm_id = C.cvterm_id 
						LEFT JOIN (SELECT * FROM analysisfeatureprop AFP
													INNER JOIN analysisfeature AF ON AF.analysisfeature_id = AFP.analysisfeature_id
													WHERE type_id = (SELECT cvterm_id FROM cvterm 
																								WHERE name = 'analysis_blast_besthit_description' 
																								AND cv_id = (SELECT cv_id FROM cv WHERE name = 'tripal')
																								)
													) BLAST ON BLAST.feature_id = F.feature_id
						LEFT JOIN (SELECT * FROM analysisfeatureprop AFP
													INNER JOIN analysisfeature AF ON AF.analysisfeature_id = AFP.analysisfeature_id
													WHERE type_id = (SELECT cvterm_id FROM cvterm 
																								WHERE name = 'analysis_kegg_output_keywords' 
																								AND cv_id = (SELECT cv_id FROM cv WHERE name = 'tripal')
																								)			
													) KEGG ON KEGG.feature_id = F.feature_id
						LEFT JOIN (SELECT * FROM analysisfeatureprop AFP
													INNER JOIN analysisfeature AF ON AF.analysisfeature_id = AFP.analysisfeature_id
													WHERE type_id = (SELECT cvterm_id FROM cvterm
																								WHERE name = 'analysis_interpro_output_keywords' 
																								AND cv_id = (SELECT cv_id FROM cv WHERE name = 'tripal')
																								)
													) INTERPRO ON INTERPRO.feature_id = F.feature_id 
						LEFT JOIN (SELECT * FROM analysisfeature AF 
													INNER JOIN analysis A ON A.analysis_id = AF.analysis_id 
													INNER JOIN analysisprop AP ON AF.analysis_id = AP.analysis_id
													WHERE AP.type_id = (SELECT cvterm_id FROM cvterm
																								WHERE name = 'analysis_type' 
																								AND cv_id = (SELECT cv_id FROM cv WHERE name = 'tripal')
																								)
													AND value = 'tripal_analysis_unigene') UNIGENE ON F.feature_id = UNIGENE.feature_id
						) T";
   
      // Create the MView
      tripal_add_mview(
      // view name
      $view_name,
      // tripal module name
      ' tripal_search_feature',
      // table name
      $view_name,
      // table schema definition
		$schema,
      // columns for indexing
      $index,
      // SQL statement to populate the view
      $sql,
      // special index
      ''
   );

   // add a job to the job queue so this view gets updated automatically next
   // time the job facility is run
   $mview_id = tripal_mviews_get_mview_id($view_name);
   if($mview_id){
      tripal_mviews_action('update',$mview_id);
   }

}

/*******************************************************************************
 * Implementation of hook_uninstall()
 */
function tripal_search_feature_uninstall(){
	$view_name = 'feature_for_search';
	// Drop the MView table if it exists
	$mview_id = tripal_mviews_get_mview_id($view_name);
	if($mview_id){
		tripal_mviews_action("delete",$mview_id);
	}
	 
	// Drop the sequence
	$sql = "DROP SEQUENCE IF EXISTS feature_for_search_id";
	chado_query($sql);
}

/*******************************************************************************
 * Implementation of hook_requirements(). Make sure 'Tripal Core' is enabled
 * before installation
 */
function tripal_search_feature_requirements($phase) {
   $requirements = array();
   if ($phase == 'install') {
      if (!function_exists('tripal_create_moddir')) {
         $requirements ['tripal_search_feature'] = array(
            'title' => "tripal_search_feature",
            'value' => "error. Some required modules are just being installed. Please try again.",
            'severity' => REQUIREMENT_ERROR,
         );
      }
   }
   return $requirements;
}