(
	IN p_Project_UUID  VARCHAR(255),  
	IN p_VarName       VARCHAR(250),
	IN p_StartPosition INTEGER,
	IN p_NumberOfRows  INTEGER
)
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN


      DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
      DECLARE SQLCODE INTEGER DEFAULT 0;  
      DECLARE v_Project_UUID VARCHAR(255);
      
      SET v_Project_UUID = COALESCE(TRIM(p_Project_UUID), '!'); 
      
      --2. CHECK IF THE PROJECT IS OK
	  BEGIN
                    DECLARE v_Project_UUID_real VARCHAR(255);
                 
                    DECLARE bad_project CONDITION FOR SQLSTATE '80009';
					DECLARE EXIT HANDLER FOR SQLEXCEPTION RESIGNAL;  
                   
                    SELECT ProjectGUID INTO v_Project_UUID_real
	                FROM  BRD_Status 
			        WHERE BRDID = (SELECT MAX(BRDID) FROM BRD_Status WHERE BRDProcessStatusTypeID = 2) -- last BRD succssfull
			        WITH UR ;	

                    SET v_Project_UUID_real = COALESCE(TRIM(v_Project_UUID_real), '?');  
                     
				    IF (v_Project_UUID != v_Project_UUID_real) 
				      THEN
			                             SIGNAL bad_project
			                             SET MESSAGE_TEXT = 'BRD - wrong project!!!';
			                             
			                             RETURN ;	
			                           
			          END IF ;	
			           
	   END;
	

       --3. MAIN DATA STREAM
       BEGIN

						  --3.0. DECLARATION AREA
					      DECLARE v_StartPosition, v_NumberOfRows, v_RC INTEGER;
						  DECLARE v_VarName  VARCHAR(250); 
		

					      DECLARE GLOBAL TEMPORARY TABLE SESSION.varf7
										(
										    VarID INTEGER
										)  WITH REPLACE 
                                           ON COMMIT PRESERVE ROWS
										   NOT LOGGED; 
										   
										   
						  DECLARE GLOBAL TEMPORARY TABLE SESSION.vh7
										(
										    VarID INTEGER NOT NULL,
										    ChildVarID INTEGER NOT NULL
										)  WITH REPLACE 
                                           ON COMMIT PRESERVE ROWS
										   NOT LOGGED; 				   
										   
										   	 
					      DECLARE GLOBAL TEMPORARY TABLE SESSION.stmt71
							       (
							               VarID INTEGER ,
										   OccurID INTEGER,
										   IsCalculation SMALLINT,
										   IsCondition   SMALLINT,
										   IsAssignment  SMALLINT
									 ) WITH REPLACE 
                                       ON COMMIT PRESERVE ROWS
									   NOT LOGGED;  
									
									
									   
						    DECLARE GLOBAL TEMPORARY TABLE SESSION.stmt72
							       (
							               VarID INTEGER ,
							               VarName VARCHAR(250),
							               VarHash VARCHAR(32),
										   TogetherInCalculation SMALLINT, 
						                   TogetherInCondition   SMALLINT, 
									       TogetherInAssignment  SMALLINT, 
                                           ProgID INTEGER
									 ) WITH REPLACE 
                                       ON COMMIT PRESERVE ROWS
									   NOT LOGGED; 			   
									   
	   
									   	   
                           DECLARE GLOBAL TEMPORARY TABLE SESSION.stmt73
							       (
							               VarName VARCHAR(250),
										   NrTogetherInCalculation INTEGER, 
						                   NrTogetherInCondition   INTEGER, 
									       NrTogetherInAssignment  INTEGER, 
										   Total INTEGER, 
										   NrPrograms INTEGER,
										   RN INTEGER
									 ) WITH REPLACE 
                                       ON COMMIT PRESERVE ROWS
									   NOT LOGGED; 
	
			     

							    --3.1. SET FINAL VALUES FOR WORK VARIABLES
								SET v_StartPosition =  COALESCE(NULLIF(p_StartPosition, -1), 1);
							    SET v_NumberOfRows  =  COALESCE(NULLIF(p_NumberOfRows,  -1), 2147480000); 
						        SET v_VarName     =  COALESCE(TRIM(p_VarName), '');
			      


		                         --3.2. DETERMINE Variable based on filters
		                         -- table is usefull when we deal with VArName since there are many VarID's under a name
								    INSERT INTO SESSION.varf7(VarID)
								    SELECT v.VarID
								    FROM  BRD_Variables v 
								    WHERE v.VarName = v_VarName 
								          AND EXISTS (SELECT 1 FROM SESSION.BRDVariableHashInput hi WHERE v.VariableHash = hi.VarHash);
		                            COMMIT;
						          

                                   INSERT INTO SESSION.vh7 (VarID, ChildVarID)
								   SELECT x.VarID ,x.ChildVarID
								   FROM (
											SELECT DISTINCT h1.VarID ,h1.ChildVarID
											FROM BRD_VariableHierarchy h1
											WHERE EXISTS (SELECT 1 FROM SESSION.varf7 f WHERE h1.VarID = f.VarID) 
												  AND  h1.ChildLevel = 10088
											
											UNION
						
											SELECT DISTINCT h2.VarID ,h2.ChildVarID
											FROM BRD_VariableHierarchy h2
											WHERE  EXISTS (SELECT 1 FROM SESSION.varf7 f WHERE h2.ChildVarID = f.VarID)
												AND h2.ChildLevel = 10088
									     )x;
                                   COMMIT; 


                                 --3.3. GET Statements for main variables
                                   INSERT INTO SESSION.stmt71
                                          (VarID, OccurID, IsCalculation, IsCondition, IsAssignment)
						           SELECT VarID  ,OccurID ,IsCalculation ,IsCondition ,IsAssignment
						           FROM (  
											SELECT DISTINCT ds.VarID ,ds.OccurID ,ds.IsCalculation ,ds.IsCondition ,ds.IsAssignment
											FROM BRD_DirectStatements ds
											WHERE EXISTS (SELECT 1 FROM SESSION.varf7 f WHERE ds.VarID = f.VarID) 
													AND ds.IsCalculation + ds.IsCondition + ds.IsAssignment > 0 
								  
								            UNION
						                    -- indirect statements
											SELECT DISTINCT vh.ChildVarID AS VarID ,ds.OccurID ,ds.IsCalculation ,ds.IsCondition ,ds.IsAssignment 
											FROM BRD_DirectStatements ds 
												INNER JOIN BRD_VariableHierarchy vh ON ds.VarID = vh.VarID AND vh.ChildLevel = 10088
											WHERE EXISTS (SELECT 1 FROM SESSION.varf7 f WHERE vh.ChildVarID = f.VarID)  
												  AND ds.Is88VarLvlCondition = 1 
							        	) x ;
							       COMMIT;
							        						         
					         
						         
						         

	                                 --3.4. DETERMINE Statements for related variables
	                                  INSERT INTO SESSION.stmt72
							                (VarID, VarName, VarHash, TogetherInCalculation, TogetherInCondition, TogetherInAssignment, ProgID)
	                                  SELECT v.VarID, v.VarName, v.VariableHash, src.TogetherInCalculation, src.TogetherInCondition, src.TogetherInAssignment, src.ProgID
	                                  FROM
											  (          SELECT   DISTINCT
																   ds.OccurID           
															      ,ds.VarID
															   --,st.VarID AS BaseVarID
															   ,CASE WHEN ds.IsCalculation = 1 AND st.IsCalculation = 1 THEN 1
																	 ELSE 0
															   END AS TogetherInCalculation
															   ,CASE WHEN ds.IsCondition = 1 AND st.IsCondition = 1 THEN 1
																	 ELSE 0
															   END AS TogetherInCondition
															   ,CASE WHEN ds.IsAssignment = 1 AND st.IsAssignment = 1 THEN 1
																	 ELSE 0
															   END AS TogetherInAssignment
															   ,ds.ProgID
														FROM   (
																		SELECT  
																		         ds1.OccurID           
																				,ds1.VarID
																				,ds1.IsCalculation 
																				,ds1.IsCondition  ,ds1.IsAssignment  ,ds1.ProgID
																		FROM BRD_DirectStatements ds1
																		WHERE  NOT EXISTS (SELECT 1 FROM SESSION.varf7 f WHERE ds1.VarID = f.VarID) 
																				AND  ds1.IsCalculation + ds1.IsCondition + ds1.IsAssignment > 0
												                       
																		UNION ALL
												                        -- indirect statements
																		SELECT   
																		         ds2.OccurID           
																				,vh.ChildVarID AS VarID
																				,ds2.IsCalculation 
																				,ds2.IsCondition  ,ds2.IsAssignment  ,ds2.ProgID
																		FROM BRD_DirectStatements ds2 
																				INNER JOIN BRD_VariableHierarchy vh ON ds2.VarID = vh.VarID AND vh.ChildLevel = 10088 
																		WHERE NOT EXISTS (SELECT 1 FROM SESSION.varf7 f WHERE vh.ChildVarID = f.VarID)  
																		      AND ds2.Is88VarLvlCondition = 1      	 
														       ) ds 
														          INNER JOIN SESSION.stmt71 st  ON st.OccurID = ds.OccurID      AND st.VarID != ds.VarID
														          LEFT OUTER JOIN SESSION.vh7 h1 ON ds.IsCondition = 1 AND st.VarID   = h1.VarID        AND ds.VarID = h1.ChildVarID
														          LEFT OUTER JOIN SESSION.vh7 h2 ON st.IsCondition = 1 AND st.VarID   = h2.ChildVarID   AND ds.VarID = h2.VarID
														WHERE h1.VarID IS NULL AND h2.VarID IS NULL  	   
											    ) src
											    INNER JOIN BRD_Variables v ON v.VarID = src.VarID
										 WHERE src.TogetherInCalculation +  src.TogetherInCondition +  src.TogetherInAssignment > 0 ;
	                                 
	                                 
	                                 
	                                 --3.5 GET Statements for related variables and check affinity
									  INSERT INTO SESSION.stmt73
							                       (VarName, NrTogetherInCalculation, NrTogetherInCondition, NrTogetherInAssignment, Total, NrPrograms, RN)
									  SELECT    src.VarName   
											    ,SUM(src.TogetherInCalculation) AS NrTogetherInCalculation  
											    ,SUM(src.TogetherInCondition) AS NrTogetherInCondition 
											    ,SUM(src.TogetherInAssignment) AS NrTogetherInAssignment
											    ,SUM(src.TogetherInCalculation + src.TogetherInCondition + src.TogetherInAssignment) AS Total
											    ,COUNT(DISTINCT src.ProgID) AS NrPrograms
											    ,ROW_NUMBER() OVER(ORDER BY SUM(src.TogetherInCalculation + src.TogetherInCondition + src.TogetherInAssignment) DESC, src.VarName) AS RN     
									  FROM SESSION.stmt72 src
									  GROUP BY src.VarName;

							          GET DIAGNOSTICS v_RC = ROW_COUNT; 
									  COMMIT; 
						         
	
                                     -- 3.6.OUTPUT
			                         --3.6.1 GET VarName and VarHash for variables directed on output  
			                          DELETE FROM SESSION.BRDVariableHashOutput WHERE 1 = 1;
			                          COMMIT;
			                          INSERT INTO SESSION.BRDVariableHashOutput (VarName, VarHash)
			                          SELECT DISTINCT st2.VarName, st2.VarHash
				                      FROM SESSION.stmt72 st2 
				                           INNER JOIN SESSION.stmt73 st3 ON st2.VarName = st3.VarName 
				                                                            AND st3.RN BETWEEN  v_StartPosition AND (v_StartPosition + v_NumberOfRows - 1); 
			                          COMMIT;
			                         
			                         

		                             -- 3.6.2 OUTPUT General
						             BEGIN
							                DECLARE crs CURSOR WITH RETURN FOR				 
							                SELECT  /*v_Project_UUID AS Project_UUID,*/
												    VarName, NrTogetherInCalculation, NrTogetherInCondition, NrTogetherInAssignment, NrPrograms, /*NrFiles, Total,*/ RN
												   ,v_RC AS NR
											FROM  SESSION.stmt73
											WHERE RN BETWEEN  v_StartPosition AND (v_StartPosition + v_NumberOfRows - 1)  
							 				ORDER BY RN
											OPTIMIZE FOR 500 ROWS;
		
										    OPEN crs;
						
		                             END;
				

	

             END;


	  
END 
