(
	IN p_ForwardOrBackward SMALLINT
)
CALLED ON NULL INPUT
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN 

      -- A. DECLARATION AREA
      DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
      DECLARE SQLCODE INTEGER DEFAULT 0;  
     
      
       --1. CLEAN UP TEMP/SESSION TABLE IF EXISTS
	  BEGIN 
					DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
					BEGIN END;
					
					COMMIT;
				    DROP TABLE SESSION.CTMJobRelations;		
				    DROP TABLE SESSION.CTMJobFilter;	                
	  END;
	  

        --2. MAIN DATA STREAM
       BEGIN

						  --2.0. DECLARATION AREA
					       DECLARE v_IsJobFilter SMALLINT DEFAULT 0; 
                           DECLARE v_ForwardOrBackward SMALLINT DEFAULT 0;/* 1 Forward  and  -1 Backward */ 
      
                           
			
			               DECLARE GLOBAL TEMPORARY TABLE SESSION.CTMJobFilter ( 
												 JobGeneralID               INTEGER 
						   )  ON COMMIT PRESERVE ROWS
							   NOT LOGGED; 
			
			
					       DECLARE GLOBAL TEMPORARY TABLE SESSION.CTMJobRelations ( 
												 JobFromGeneralID               INTEGER 
												,JobToGeneralID                 INTEGER 
												,ConditionGeneralID             INTEGER
												,ConditionName                  VARCHAR(255)
												,ConditionAndOr                 VARCHAR(5)
												,ConditionOdate                 VARCHAR(5)
												,Flag                           SMALLINT
						   )  ON COMMIT PRESERVE ROWS
							   NOT LOGGED; 
							   
							   
						    --2.1. SET FINAL VALUES FOR WORK VARIABLES
							SET v_ForwardOrBackward = CASE COALESCE(p_ForwardOrBackward, 1) WHEN 1 THEN 0 ELSE 1 END ;  -- default will be forward -> 0 
							
               


							-- IF all projects have been sent as input then cancel this filter 
							IF EXISTS (SELECT 1 FROM SESSION.numeric_param_temp)         
							THEN

				                  IF EXISTS ( -- check if is a real filter (not all projects) 
											         SELECT 1 
													 FROM CTM_JobDetails 
													 WHERE JobGeneralID NOT IN (SELECT ProgramID FROM SESSION.numeric_param_temp) 					 
										    ) 
								  THEN
								       SET v_IsJobFilter = 1;
								  END IF;
				   
							END	IF;	

               
            IF ( v_IsJobFilter  = 1 )
            THEN 
						BEGIN 
						
								 IF (v_ForwardOrBackward = 0)
								 THEN
										 BEGIN  -- if forward (chaining)
													INSERT INTO SESSION.CTMJobFilter(JobGeneralID)
													SELECT jc.JobToGeneralID AS JobGeneralID 
													FROM  CTM_JobChainingsF jc
													WHERE EXISTS (SELECT 1 FROM SESSION.numeric_param_temp f WHERE f.ProgramID = jc.JobRootGeneralID)
													GROUP BY jc.JobToGeneralID ;  
                                          END;
                                   ELSE
										  BEGIN  -- if backward (chaining)
													INSERT INTO SESSION.CTMJobFilter(JobGeneralID)
													SELECT jc.JobToGeneralID AS JobGeneralID 
													FROM  CTM_JobChainingsB jc
													WHERE EXISTS (SELECT 1 FROM SESSION.numeric_param_temp f WHERE f.ProgramID = jc.JobRootGeneralID)
													GROUP BY jc.JobToGeneralID ; 
	                                       END;
	                               END IF;      
                                   COMMIT;         
                                            
	                                -- all common relations
									INSERT INTO SESSION.CTMJobRelations (JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,Flag)
									SELECT m.JobFromGeneralID ,m.JobToGeneralID ,m.ConditionGeneralID ,m.ConditionName ,m.ConditionAndOr ,m.ConditionOdate ,0 AS Flag
									FROM  CTM_JobToCTMJobRelations m 
									WHERE   EXISTS (SELECT 1 FROM SESSION.CTMJobFilter f1  WHERE m.JobFromGeneralID = f1.JobGeneralID)
											AND 
											EXISTS (SELECT 1 FROM SESSION.CTMJobFilter f2  WHERE m.JobToGeneralID = f2.JobGeneralID);
								     

									-- add orphan relations
									INSERT INTO SESSION.CTMJobRelations (JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,Flag)
									SELECT CASE IsInCondition WHEN 0 THEN m.JobGeneralID                  ELSE CAST(NULL AS INTEGER) END AS JobFromGeneralID 
									      ,CASE IsInCondition WHEN 0 THEN CAST(NULL AS INTEGER)    ELSE m.JobGeneralID               END AS JobToGeneralID 
									      ,m.ConditionGeneralID 
										  ,m.ConditionName
										  ,m.ConditionAndOr
										  ,m.ConditionOdate
										  ,1 AS Flag
									FROM  CTM_JobToConditions m
									WHERE EXISTS (SELECT 1 FROM SESSION.CTMJobFilter f WHERE m.JobGeneralID = f.JobGeneralID)
											AND m.IsOrphanCondition = 1
											AND m.IsInCondition = v_ForwardOrBackward;
											


									--add isolated nodes
									INSERT INTO SESSION.CTMJobRelations (JobFromGeneralID ,Flag)
									SELECT m.JobGeneralID AS JobFromGeneralID ,2 AS Flag
									FROM  CTM_JobDetails m
									WHERE EXISTS (SELECT 1 FROM SESSION.CTMJobFilter f WHERE m.JobGeneralID = f.JobGeneralID)
											AND m.IsolationLevel = 0 ; 

                                 

									--add jobs in end/start position (if the case)
									-- fastest version in case of many jobs have to be returned
		                   			INSERT INTO SESSION.CTMJobRelations (JobFromGeneralID ,Flag) 
									SELECT m.JobGeneralID AS JobFromGeneralID ,3 AS Flag
									FROM (  
											SELECT JobGeneralID FROM SESSION.CTMJobFilter 
									        EXCEPT
											SELECT JobGeneralID 
											FROM (
													SELECT f.JobGeneralID
													FROM  SESSION.CTMJobFilter f
													WHERE EXISTS (SELECT 1 FROM SESSION.CTMJobRelations r1 WHERE r1.JobFromGeneralID = f.JobGeneralID)
													UNION									
													SELECT f.JobGeneralID	 
													FROM SESSION.CTMJobFilter f
													WHERE EXISTS (SELECT 1 FROM SESSION.CTMJobRelations r2 WHERE r2.JobToGeneralID = f.JobGeneralID)
												   ) x
										  ) m ;  
									        
                                            
				        END; 
            ELSE
				        BEGIN            --no job filter so direction is not important / also orphan condition are included too
			                             -- all common relations
										INSERT INTO SESSION.CTMJobRelations (JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,Flag)
										SELECT m.JobFromGeneralID ,m.JobToGeneralID ,m.ConditionGeneralID ,m.ConditionName ,m.ConditionAndOr ,m.ConditionOdate ,0 AS Flag
										FROM  CTM_JobToCTMJobRelations m ;
									     
	
										-- add orphan relations
										INSERT INTO SESSION.CTMJobRelations (JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,Flag)
										SELECT CASE IsInCondition WHEN 0 THEN m.JobGeneralID                  ELSE CAST(NULL AS INTEGER) END AS JobFromGeneralID 
										      ,CASE IsInCondition WHEN 0 THEN CAST(NULL AS INTEGER)    ELSE m.JobGeneralID               END AS JobToGeneralID 
										      ,m.ConditionGeneralID 
											  ,m.ConditionName
											  ,m.ConditionAndOr
											  ,m.ConditionOdate
											  ,1 AS Flag
										FROM  CTM_JobToConditions m
										WHERE m.IsOrphanCondition = 1 ;
												
	
	
										--add isolated nodes
										INSERT INTO SESSION.CTMJobRelations (JobFromGeneralID ,Flag)
										SELECT m.JobGeneralID AS JobFromGeneralID ,2 AS Flag
										FROM  CTM_JobDetails m
										WHERE m.IsolationLevel = 0 ; 
		 
                        END;
			END IF; 
            COMMIT;	


             --3.OUTPUT 
             BEGIN

	 				   DECLARE crs CURSOR WITH RETURN FOR	
		               SELECT  o.JobFromGeneralID 
							   --,jd1.JobName AS JobFromName ,jd1.ProcName AS JobFromProcName ,jd1.JobDescription AS JobFromDescription
							  ,o.JobToGeneralID   
							   --,jd2.JobName AS JobToName   ,jd2.ProcName AS JobToProcName   ,jd2.JobDescription AS JobToDescription
							  ,o.ConditionGeneralID AS ConditionGeneralID 
							  ,o.ConditionName 
							  ,o.ConditionAndOr
							  ,o.ConditionOdate
							  --,o.Flag
						FROM SESSION.CTMJobRelations o 
							--LEFT OUTER JOIN CTM_JobDetails jd1       ON o.JobFromGeneralID = jd1.JobGeneralID
							--LEFT OUTER JOIN CTM_JobDetails jd2       ON o.JobToGeneralID   = jd2.JobGeneralID
						ORDER BY o.JobFromGeneralID ,o.JobToGeneralID ,o.ConditionGeneralID;

	 				    OPEN crs;   
	 					     		     
             END;
				
       END; 
            
END
