(
	IN p_Project_UUID VARCHAR(255),  
	IN p_VarName VARCHAR(250),
	IN p_DefinitionObject_UUID VARCHAR(32),
	IN p_StmtFrom INTEGER,
	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_IsStatementTypeFilter, v_ResourceID, v_ResourceTypeID INTEGER DEFAULT 0;
						  DECLARE v_VarName VARCHAR(250); 
						  DECLARE v_DefinitionObject_UUID VARCHAR(32) ; 
						  DECLARE v_ResourceTypeID_Prog INTEGER DEFAULT NULL;
		
					
						
					      DECLARE GLOBAL TEMPORARY TABLE SESSION.varf63
										(
										    VarID INTEGER
										)  WITH REPLACE 
                                           ON COMMIT PRESERVE ROWS
										   NOT LOGGED; 
										   
					    -- CREATE INDEX UNQIDX_varf63_VarID ON SESSION.varf63 (VarID);
					    
					      DECLARE GLOBAL TEMPORARY TABLE SESSION.stmtfrom
										(
										    ID INTEGER NOT NULL
										)  WITH REPLACE 
                                           ON COMMIT PRESERVE ROWS
										   NOT LOGGED; 				   
		         
		         
					      DECLARE GLOBAL TEMPORARY TABLE SESSION.varstmt63
							       (  
							          VarID             INTEGER
			                         ,VarIDConsolidate  INTEGER
			                         ,StatementCategory CHAR(1)
								     ,StatementTypeID   INTEGER
								     ,CopyID            INTEGER
								     ,CopyTypeID        INTEGER
								     ,ProgID            INTEGER
								     ,PathID            INTEGER
								     ,StartRow          INTEGER 
								     ,EndRow            INTEGER
								     ,StartCol          INTEGER 
								     ,EndCol            INTEGER	
								     ,UsedInCopy        SMALLINT
								     ,StmtRN            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), '');
							SET v_DefinitionObject_UUID    = COALESCE(TRIM(p_DefinitionObject_UUID), '');
					
			                SET v_ResourceTypeID_Prog = (SELECT ResourceID FROM ResourceTypes WHERE Name = 'PROGRAM' FETCH FIRST 1 ROWS ONLY) ;
			
							 -- CHECK if we have to filter by StatementTypeID	  
							IF EXISTS (SELECT 1 FROM SESSION.BRDStatementTypeInput)
							THEN
				                 SET v_IsStatementTypeFilter = 1 ;
				            END IF ;

                            /*0 stmt from programs, 1 stmt from copybooks, -1 stmt from copybooks and programs*/ 
                        	IF (COALESCE(p_StmtFrom, -1) > 0) 
                    	    THEN 
                    	        INSERT INTO SESSION.stmtfrom VALUES(1); 
                    	    END IF;
                        	IF (COALESCE(p_StmtFrom, -1) = 0) 
                    	    THEN 
                    	        INSERT INTO SESSION.stmtfrom VALUES(0); 
                    	    END IF;
                        	IF (COALESCE(p_StmtFrom, -1) < 0) 
                    	    THEN 
                    	        INSERT INTO SESSION.stmtfrom VALUES(0); 
                    	        INSERT INTO SESSION.stmtfrom VALUES(1); 
                    	    END IF;    
                    	    COMMIT;
                            	    


							-- DETERMINE definition resource
			                SELECT ResourceID, ResourceTypeID INTO v_ResourceID, v_ResourceTypeID FROM BRD_ResourceDetails WHERE ResourceHash LIKE v_DefinitionObject_UUID ;
			                SET    v_ResourceID     = COALESCE(v_ResourceID, 0) ;
							SET    v_ResourceTypeID = COALESCE(v_ResourceTypeID, 0) ;

                            -- CHECK IF THE Definition Resource is okay
							BEGIN
						                    
									DECLARE bad_resource CONDITION FOR SQLSTATE '80011';
									DECLARE EXIT HANDLER FOR SQLEXCEPTION RESIGNAL;  
				                   
								    IF (v_ResourceID = 0) -- this could be deactivated 
								      THEN
							                             SIGNAL bad_resource
							                             SET MESSAGE_TEXT = 'BRD - Bad Definition Object.!!!';
							                             
							                             RETURN ;	              
							          END IF ;	
									           
							 END;



	                         --3.2. DETERMINE Variable based on filters
							    INSERT INTO SESSION.varf63(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)
										AND  (CASE WHEN v_ResourceTypeID = 0                      THEN v_ResourceID
												   WHEN v_ResourceTypeID = v_ResourceTypeID_Prog  THEN v.ProgID
												   ELSE v.CopyID
											   END ) = v_ResourceID 
				                        AND  (CASE WHEN v_ResourceTypeID = 0                      THEN v_ResourceTypeID
												   WHEN v_ResourceTypeID = v_ResourceTypeID_Prog  THEN v_ResourceTypeID
												   ELSE v.CopyTypeID
											   END ) = v_ResourceTypeID ;
								 COMMIT;
							   

							   --3.3 DETERMINE Statements where variables are involved 
								INSERT INTO SESSION.varstmt63 (VarID ,VarIDConsolidate ,StatementCategory ,StatementTypeID  
								                               ,CopyID ,CopyTypeID ,ProgID 
								                               ,PathID ,StartRow ,EndRow ,StartCol ,EndCol 
								                               ,UsedInCopy ,StmtRN ,RN)
								SELECT  src2.VarID ,src2.VarIDConsolidate, src2.StatementCategory, src2.StatementTypeID 
									   ,src2.CopyId, src2.CopyTypeID, src2.ProgID
									   ,src2.PathID ,src2.StartRow ,src2.EndRow ,src2.StartCol ,src2.EndCol
									   ,src2.UsedInCopy, src2.StmtRN, src2.RN
								FROM (
										   SELECT   src1.VarID  , v.VarIDConsolidate
										           ,src1.StatementCategory, src1.StatementTypeID 
												   ,src1.CopyId, src1.CopyTypeID, src1.ProgID
												   ,src1.PathID ,src1.StartRow ,src1.EndRow ,src1.StartCol ,src1.EndCol
												   ,src1.UsedInCopy
												   ,ROW_NUMBER() OVER(PARTITION BY v.VarIDConsolidate, src1.StatementCategory, src1.StatementTypeID, src1.CopyId, src1.CopyTypeID, src1.PathID ,src1.StartRow ,src1.EndRow ,src1.StartCol ,src1.EndCol ORDER BY src1.ProgID) AS StmtRN 
												   -- try to identify statementes coming from Copy (and pick up only one time ...)
										           ,DENSE_RANK() OVER(ORDER BY CASE WHEN src1.CopyID IS NULL THEN 0 ELSE 1 END DESC, src1.CopyId DESC, src1.CopyTypeID, v.VarIDConsolidate, src1.StatementCategory, src1.StatementTypeID,  src1.PathID ,src1.StartRow ,src1.EndRow ,src1.StartCol ,src1.EndCol) AS RN
										   FROM (
		
														   SELECT DISTINCT 
														         'D' AS StatementCategory
																 ,ds.VarID 
																 ,ds.StatementTypeID
																 ,ds.ProgID
																 ,ds.CopyID
																 ,ds.CopyTypeID
																 ,ds.PathID
																 ,ds.StartRow
																 ,ds.EndRow
																 ,ds.StartCol
																 ,ds.EndCol
																,CASE WHEN ds.CopyID IS NOT NULL THEN 1 ELSE 0 END AS UsedInCopy
															FROM BRD_DirectStatements ds 
															WHERE EXISTS (SELECT 1 FROM SESSION.varf63 v WHERE ds.VarID = v.VarID)
																  AND ( 
																	  v_IsStatementTypeFilter = 0
																	  OR
																	  EXISTS (SELECT 1 FROM SESSION.BRDStatementTypeInput f WHERE ds.StatementTypeID = f.StatementTypeID)
																	  )
		
														   UNION 
		
														   SELECT DISTINCT 
														         'I' AS StatementCategory
																 ,vh.ChildVarID AS VarID 
																 ,ds.StatementTypeID
																 ,ds.ProgID
																 ,ds.CopyID
																 ,ds.CopyTypeID
																 ,ds.PathID
																 ,ds.StartRow
																 ,ds.EndRow
																 ,ds.StartCol
																 ,ds.EndCol
																 ,CASE WHEN ds.CopyID IS NOT NULL THEN 1 ELSE 0 END AS UsedInCopy
														   FROM BRD_DirectStatements ds 
															   INNER JOIN BRD_VariableHierarchy vh ON ds.VarID = vh.VarID 
															WHERE EXISTS (SELECT 1 FROM SESSION.varf63 v WHERE vh.ChildVarID = v.VarID)
															      AND (ds.IsFileIO + ds.IsMQ + ds.IsScreen + ds.Is88VarLvlCondition > 0) 
																  AND ( 
																	   v_IsStatementTypeFilter = 0
																	   OR
																	   EXISTS (SELECT 1 FROM SESSION.BRDStatementTypeInput f WHERE ds.StatementTypeID = f.StatementTypeID)
																	 )
												 )src1 
												      INNER JOIN BRD_Variables v ON src1.VarID = v.VarID
												  WHERE EXISTS (SELECT 1 FROM  SESSION.stmtfrom f WHERE f.ID = src1.UsedInCopy) 
								  )src2  ;
								  COMMIT ;  
								  
								  SET v_RC = COALESCE((SELECT MAX(RN) FROM SESSION.varstmt63), 0) ;  


                           -- 4 OUTPUT
	                           -- 4.1 Seconday Output	(CopyToPrograms )  
							   -- 4.1.1 CLEAN-UP output tables
							      DELETE FROM SESSION.BRDCopyToProgramsOutput WHERE 1 = 1;
							      DELETE FROM SESSION.BRDVariableHashAggregate WHERE 1 = 1;
					              COMMIT;
					              
					           -- -- Output 1 -> CopyToPrograms 
								  INSERT INTO SESSION.BRDCopyToProgramsOutput 
								                    (UsageObjectHash, UsingObjectHash, UsingObjectName, UsingObjecttype, UsingObjectPathStr, StartRow, EndRow, StartCol, EndCol)
								  SELECT   -- rd1.ResourceID    AS UsageObjectID
								           --,rd1.ResourceTypeID AS UsageObjectType
								           --,rd1.ResourceName  AS UsageObjectName,
								            rd1.ResourceHash  AS UsageObjectHash  
										   --,rd2.ResourceID    AS UsingObjectID
										   ,rd2.ResourceHash  AS UsingObjectHash								          
										   ,rd2.ResourceName  AS UsingObjectName
								           ,CASE WHEN rd2.ResourceTypeID = 5 THEN 0 ELSE 1 END AS UsingObjectType
										   --,c.ResourcePathID
										   ,pth.PathStr AS UsingObjectPathStr
										   ,c.StartRow, c.EndRow
										   ,c.StartCol, c.EndCol
									FROM (
											SELECT DISTINCT CopyId, CopyTypeID, ProgID
											FROM SESSION.varstmt63 
											WHERE CopyID IS NOT NULL 
													AND RN BETWEEN  v_StartPosition AND (v_StartPosition + v_NumberOfRows - 1) 
										) src
										    INNER JOIN BRD_ResourceDetails rd1 ON rd1.ResourceID = src.CopyID AND rd1.ResourceTypeID = src.CopyTypeID-- know for sure it is a copy
											INNER JOIN BRD_CopyToResources c ON c.CopyID =  rd1.ResourceID AND c.CopyTypeID = rd1.ResourceTypeID AND c.ResourceID = src.ProgID  
					                        INNER JOIN BRD_ResourceDetails rd2 ON  rd2.ResourceID = c.ResourceID AND rd2.ResourceTypeID = c.ResourceTypeID  
									        INNER JOIN BRD_Paths pth ON c.ResourcePathID = pth.PathID ;
									COMMIT ; 
					


                                -- Output 2 -> VarHash per statement 
					                INSERT INTO SESSION.BRDVariableHashAggregate (RN, VarHash)
									SELECT  src.RN, v.VariableHash 
									FROM (
												SELECT   DISTINCT VarID ,RN
												FROM SESSION.varstmt63 
											    WHERE RN BETWEEN  v_StartPosition AND (v_StartPosition + v_NumberOfRows - 1) 
										) src
											INNER JOIN BRD_Variables v ON src.VarID = v.VarID ;
                                    COMMIT ; 





				             --4.2. Main OUTPUT 
				             BEGIN
					             DECLARE crs CURSOR WITH RETURN FOR
						         SELECT  -- src.VarIDConsolidate,  
									     src.UsedInCopy 
										 --,src.UsageObjectID 
										 --,src.UsageObjectTypeID 
										 ,rd.ResourceHash AS UsageObjectHash  
									     ,rd.ResourceName AS UsageObjectName  
										 --,src.UsageObjectPathID 
										 ,pth1.PathStr AS UsageObjectPath
							             --,src.StatementCategory --,src.StatementTypeID 
										 ,st.Description AS StatementDescription 
										 ,src.StatementPositionStartRow ,src.StatementPositionEndRow 
										 ,src.StatementPositionStartCol ,src.StatementPositionEndCol
							             ,src.RN
									     ,v_RC AS NR
							      FROM (
									     SELECT    DISTINCT
									                --VarIDConsolidate,
										             UsedInCopy
												   , CASE WHEN CopyID IS NOT NULL THEN CopyID       ELSE ProgID                  END AS UsageObjectID
												   , CASE WHEN CopyID IS NOT NULL THEN CopyTypeID   ELSE v_ResourceTypeID_Prog   END AS UsageObjectTypeID
												   , PathID   AS UsageObjectPathID
												   , StatementCategory
												   , StatementTypeID
												   , StartRow   AS StatementPositionStartRow 
												   , EndRow     AS StatementPositionEndRow 
												   , StartCol   AS StatementPositionStartCol 
												   , EndCol     AS StatementPositionEndCol 
												   , StmtRN
												   , RN
										   FROM SESSION.varstmt63 
										   WHERE StmtRN = 1 -- this is for statements that reside in copybooks ... we have to keep only 1
										         AND RN BETWEEN  v_StartPosition AND (v_StartPosition + v_NumberOfRows - 1) 
										) src
										   INNER JOIN BRD_Paths pth1 ON src.UsageObjectPathID = pth1.PathID 
										   INNER JOIN Statements st ON st.StatementType = src.StatementTypeID
										   INNER JOIN BRD_ResourceDetails rd ON rd.ResourceID = src.UsageObjectID AND rd.ResourceTypeID = src.UsageObjectTypeID
								      ORDER BY src.RN
									  OPTIMIZE FOR 500 ROWS;
			
									  OPEN crs;
							
                             END;


             END;

  
END 
