(
	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 INTEGER;
					      DECLARE v_RC, v_chk, v_RealStartPosition, v_RealEndPosition INTEGER DEFAULT 0;
						  DECLARE v_VarName  VARCHAR(250); 
						  DECLARE v_ResourceTypeID_Prog INTEGER DEFAULT NULL; 
			
					      DECLARE GLOBAL TEMPORARY TABLE SESSION.varf8
										(
										    VarID INTEGER,
										    VarFlag INTEGER
										)  WITH REPLACE 
                                           ON COMMIT PRESERVE ROWS
										   NOT LOGGED; 


                          DECLARE GLOBAL TEMPORARY TABLE SESSION.stmt81
							       (
							               VarID INTEGER,
							               OriginalVarID INTEGER,
							               StatementTypeID INTEGER,
							               ProgID INTEGER, 
										   OccurID INTEGER,
										   PathID INTEGER,
										   StartRow INTEGER,
										   EndRow INTEGER,
										   StartCol INTEGER,
										   EndCol INTEGER,
										   IsCalculation SMALLINT,
					                       IsCondition   SMALLINT,
					                       IsAssignment  SMALLINT,
										   VarFlag INTEGER   
									 ) WITH REPLACE 
                                       ON COMMIT PRESERVE ROWS
									   NOT LOGGED;  


                             DECLARE GLOBAL TEMPORARY TABLE SESSION.stmt82
							       (
							               ProgramName VARCHAR(250),
							               ProgID INTEGER, 
							               PathID INTEGER,
							               StatementTypeID INTEGER,
										   StartRow INTEGER,
										   EndRow INTEGER,
										   StartCol INTEGER,
										   EndCol INTEGER,
							               OccurID INTEGER,
							               VarID INTEGER,
							               StatementMark VARCHAR(50),
										   RN INTEGER
									 ) WITH REPLACE 
                                       ON COMMIT PRESERVE ROWS
									   NOT LOGGED;  
									   
									   
                              DECLARE GLOBAL TEMPORARY TABLE SESSION.stmt83
							       (
							               ProgramName VARCHAR(250),
							               ProgID INTEGER, 
							               PathID INTEGER,
							               StatementTypeID INTEGER,
										   StartRow INTEGER,
										   EndRow INTEGER,
										   StartCol INTEGER,
										   EndCol INTEGER,
							               OccurID INTEGER,
							               VarID INTEGER,
							               StatementMark VARCHAR(50),
										   RN INTEGER,
										   GlobalRN 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), '');
                            SET v_ResourceTypeID_Prog = (SELECT ResourceID FROM ResourceTypes WHERE Name = 'PROGRAM' FETCH FIRST 1 ROWS ONLY) ;
			                
                            SET v_chk = COALESCE((SELECT COUNT(DISTINCT VarName) FROM SESSION.BRDVariableNameInput), 0) + 1;  
               
               
	                         --3.2. DETERMINE variable to deal with
							    -- get VarID for main variable
							    INSERT INTO SESSION.varf8(VarID, VarFlag)
							    SELECT v.VarID, 1 AS VarFlag
							    FROM   BRD_Variables v
							    WHERE  v.VarName  = v_VarName 
                                       AND EXISTS (SELECT 1 FROM SESSION.BRDVariableHashInput hi WHERE v.VariableHash = hi.VarHash) ;  
	                            COMMIT;
	                            
	                            
							    -- get VarID's for the affinity variable names
							    INSERT INTO SESSION.varf8(VarID, VarFlag)
							    SELECT v.VarID, 1 + f.VarFlag
							    FROM BRD_Variables v
							         INNER JOIN ( SELECT s.VarName AS VarName, ROW_NUMBER() OVER(ORDER BY s.VarName) AS VarFlag 
								                  FROM (SELECT DISTINCT VarName AS VarName FROM SESSION.BRDVariableNameInput) s  
											  ) f ON v.VarName = f.VarName ; 
	                            COMMIT;

 


                                 --3.3. GET STATEMENTS for VARIABLEs
			                    IF( v_chk > 1 AND v_chk = (SELECT MAX(VarFlag) FROM SESSION.varf8)) -- go further only there are, at least, main_variable + one more variable 
							    THEN 
			
			                                 
			                                   INSERT INTO SESSION.stmt81
			                                           ( VarID, OriginalVarID, StatementTypeID, ProgID, OccurID, PathID
			                                            ,StartRow, EndRow, StartCol, EndCol 
			                                            ,IsCalculation, IsCondition, IsAssignment
			                                            ,VarFlag)
			                                    SELECT VarID, OriginalVarID, StatementTypeID, ProgID, OccurID, PathID
						                              ,StartRow, EndRow, StartCol, EndCol 
						                              ,IsCalculation, IsCondition, IsAssignment
						                              ,VarFlag
												FROM (	  
														SELECT DISTINCT
														         ds1.VarID ,ds1.VarID AS OriginalVarID
														        ,ds1.StatementTypeID, ds1.ProgID, ds1.OccurID, ds1.PathID
																,ds1.StartRow ,ds1.EndRow ,ds1.StartCol ,ds1.EndCol
																,ds1.IsCalculation ,ds1.IsCondition ,ds1.IsAssignment
																,f1.VarFlag
														FROM BRD_DirectStatements ds1
																INNER JOIN SESSION.varf8 f1 ON ds1.VarID = f1.VarID 
														WHERE ds1.IsCalculation + ds1.IsCondition + ds1.IsAssignment > 0
											   
											            UNION
														-- indirect statements
														SELECT DISTINCT 
														         vh2.ChildVarID AS VarID ,ds2.VarID AS OriginalVarID 
						                                        ,ds2.StatementTypeID, ds2.ProgID, ds2.OccurID, ds2.PathID
																,ds2.StartRow ,ds2.EndRow ,ds2.StartCol ,ds2.EndCol
																,ds2.IsCalculation ,ds2.IsCondition ,ds2.IsAssignment
																,f2.VarFlag
														FROM BRD_DirectStatements ds2 
															INNER JOIN BRD_VariableHierarchy vh2 ON ds2.VarID = vh2.VarID AND vh2.ChildLevel = 10088
						                                    INNER JOIN SESSION.varf8 f2 ON vh2.ChildVarID = f2.VarID 
														WHERE ds2.Is88VarLvlCondition = 1 
												      ) x ;         

									           COMMIT; 
									END IF;           
				            
						            
	            

						         --3.4. DETERMINE statements where all variables are used together 
						           INSERT INTO SESSION.stmt82
					                       (ProgramName, ProgID, PathID, StatementTypeID 
										   ,StartRow, EndRow, StartCol, EndCol
										   ,OccurID, VarID, StatementMark, RN)
					               SELECT   rd.ResourceName AS ProgramName, src1.ProgID, src1.PathID, src1.StatementTypeID 
										   ,src1.StartRow, src1.EndRow,  src1.StartCol, src1.EndCol
										   ,src1.OccurID ,src1.VarID 
										   ,COALESCE(bc.CategoryShortAlias, '') AS StatementMark 
										   ,ROW_NUMBER() OVER(ORDER BY rd.ResourceName, src1.ProgID, src1.PathID, src1.StatementTypeID, src1.StartRow, src1.EndRow, src1.StartCol, src1.EndCol, src1.StatementMark, src1.OccurID, src1.VarID) AS RN
								   FROM 
								       (	SELECT    DISTINCT s.ProgID, s.PathID, s.StatementTypeID, s.OccurID, s.StartRow , s.EndRow, s.StartCol, s.EndCol , s.VarID
													 ,CASE   WHEN s.IsCalculation = 1   THEN 1
														     WHEN s.IsCondition   = 1   THEN 2
														     WHEN s.IsAssignment  = 1   THEN 7
														     ELSE CAST(NULL AS SMALLINT)
													 END AS StatementMark
										    FROM SESSION.stmt81 s
										    WHERE s.OccurID IN  ( 
																	        SELECT x.OccurID 
																			FROM SESSION.stmt81 x
																			WHERE  NOT EXISTS (
																								SELECT 1 
																								FROM ( 
																										-- parent (VarFlag=1)-> child (VarFlag>1)		
																											SELECT s1.OccurID 
																											FROM SESSION.stmt81 s1
																											WHERE s1.IsCondition = 1
																												AND EXISTS (SELECT 1 FROM SESSION.varf8 f1 WHERE f1.VarFlag = 1 AND f1.VarID = s1.VarID)
																												AND EXISTS (SELECT 1 FROM SESSION.varf8 f2 WHERE f2.VarFlag > 1 AND f2.VarID = s1.OriginalVarID) 
																											UNION
																											-- child (VarFlag=1)-> parent (VarFlag>1)	
																											SELECT s2.OccurID 
																											FROM SESSION.stmt81 s2
																											WHERE s2.IsCondition = 1
																												AND EXISTS (SELECT 1 FROM SESSION.varf8 f1 WHERE f1.VarFlag > 1 AND f1.VarID = s2.VarID)
																												AND EXISTS (SELECT 1 FROM SESSION.varf8 f2 WHERE f2.VarFlag = 1 AND f2.VarID = s2.OriginalVarID)    
																										) f WHERE f.OccurID = x.OccurID
																								)
																			GROUP BY x.OccurID 
																			HAVING COUNT(DISTINCT x.VarFlag) = (SELECT MAX(VarFlag) FROM SESSION.varf8) -- all variables together into same statement
       
										                         )   			      
										)src1
										    INNER JOIN BRD_ResourceDetails rd ON rd.ResourceID = src1.ProgID  AND rd.ResourceTypeID = v_ResourceTypeID_Prog
					                        LEFT OUTER JOIN BRD_Category bc ON src1.StatementMark = bc.CategoryID AND bc.IsActive = 1 ;     
								     
								     GET DIAGNOSTICS v_RC = ROW_COUNT; 	             
					                 COMMIT;



                                   --3.5. DETERMINE GlobalRN
							    	 INSERT INTO SESSION.stmt83
					                       (ProgramName, ProgID, PathID, StatementTypeID 
										   ,StartRow, EndRow, StartCol, EndCol
										   ,OccurID, VarID, StatementMark, RN, GlobalRN)	
									SELECT  src1.ProgramName, src1.ProgID, src1.PathID, src1.StatementTypeID 
										   ,src1.StartRow, src1.EndRow,  src1.StartCol, src1.EndCol
										   ,src1.OccurID, src1.VarID 
										   ,src1.StatementMark 
										   ,src1.RN
										   ,DENSE_RANK() OVER(ORDER BY src2.MIN_RN) AS GlobalRN -- for paging purpose (provide compact blocks/statements)
									 FROM SESSION.stmt82 src1
									      INNER JOIN (  SELECT OccurID, MIN(RN) AS MIN_RN
										                FROM SESSION.stmt82
												        GROUP BY OccurID
										            ) src2 ON src1.OccurID = src2.OccurID  ; 
							                  
					                 COMMIT;
                                 


				             --3.6.OUTPUT 
				             BEGIN

					 				   DECLARE crs CURSOR WITH RETURN FOR	
									   SELECT
										        /* v_Project_UUID AS Project_UUID,*/
										        src.ProgramName
											    ,src.ProgID AS ProgramID
											    ,pth.PathStr
											    ,src.OccurID
											    ,st.Description
											    ,src.StartRow, src.EndRow, src.StartCol, src.EndCol
											    ,v.VariableHash AS Variable_UUID , v.VarName
											    ,src.StatementMark 
											    ,src.GlobalRN ,src.RN ,v_RC AS NR
										    FROM (
												      SELECT   ProgramName, ProgID, PathID, StatementTypeID 
														      ,StartRow ,EndRow ,StartCol ,EndCol
														      ,OccurID ,VarID ,StatementMark 
														      ,RN ,GlobalRN
								                      FROM SESSION.stmt83
												      WHERE GlobalRN BETWEEN  v_RealStartPosition  AND  v_RealEndPosition 	 
												  )src
												     INNER JOIN BRD_Variables v ON v.VarID = src.VarID
													 INNER JOIN Statements st ON st.StatementType = src.StatementTypeID
													 INNER JOIN BRD_Paths pth ON pth.PathID = src.PathID
						 					 ORDER BY src.RN
				                             OPTIMIZE FOR 500 ROWS;
				             
                                             SET  v_RealStartPosition =  COALESCE( (SELECT GlobalRN FROM SESSION.stmt83 WHERE RN = v_StartPosition), v_StartPosition);
				                             SET  v_RealEndPosition   =  COALESCE( (SELECT GlobalRN FROM SESSION.stmt83 WHERE RN = (v_StartPosition + v_NumberOfRows - 1)), (v_StartPosition + v_NumberOfRows - 1));
                                      
					 					     OPEN crs;   
					 					     		     

                             END;
				


             END;


	  
END 
