LANGUAGE SQL
sp:BEGIN   

	BEGIN
      COMMIT; 
      TRUNCATE TABLE cacheEZViewer_Usage_IMSDB_Logical ;
    END;

	-- clean up temp table if exists 
	BEGIN
		DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
		BEGIN END;
		
		COMMIT;
		DROP TABLE SESSION.programWithAlias;
		
	 END;


      BEGIN		

        DECLARE GLOBAL TEMPORARY TABLE SESSION.programWithAlias
		( 
             ProgramID     INTEGER,
			 ProgramName   VARCHAR(256),
			 ProgramTypeID INTEGER,
			 OccurID       INTEGER,
			 AncestorID    INTEGER,
			 Ancestor      VARCHAR(256)
		) ON COMMIT PRESERVE ROWS
		  NOT LOGGED;

         INSERT INTO SESSION.programWithAlias (ProgramID, ProgramName, ProgramTypeID, OccurID, AncestorID, Ancestor)
         SELECT t.ProgramID, t.ProgramName, t.ProgramTypeID, t.OccurID, t.AncestorID, t.AncestorName
         FROM TABLE( 
		            fGetProgram_Ancestor_Aliases( CAST(NULL AS INTEGER) ) 
		         )t;
		COMMIT;

        BEGIN

                LOCK TABLE   cacheEZViewer_Usage_IMSDB_Logical IN EXCLUSIVE MODE ;-- lock table 
				INSERT INTO  cacheEZViewer_Usage_IMSDB_Logical    
				SELECT   LogicalSegmentId, LogicalSegmentName,  
				         LogicalSegmentStartRow, LogicalSegmentStartCol, LogicalSegmentEndRow, LogicalSegmentEndCol, 
				
				         LogicalSegmentDBId, LogicalSegmentDBName, LogicalSegmentDBAccessTypeId AS LogicalAccessTypeId, 
					    LogicalSegmentDBStartRow AS LogicalIMSDBStartRow, LogicalSegmentDBStartCol AS LogicalIMSDBStartCol, LogicalSegmentDBEndRow AS LogicalIMSDBEndRow, LogicalSegmentDBEndCol AS LogicalIMSDBEndCol, pth1.PathStr AS LogicalIMSDBPath,
					   
				
					    PhysicalSegmentId AS SegmentId, PhysicalSegmentName AS SegmentName,
					    PhysicalSegmentStartRow AS SegmentStartRow, PhysicalSegmentStartCol AS SegmentStartCol, PhysicalSegmentEndRow AS SegmentEndRow,  PhysicalSegmentEndCol AS SegmentEndCol, 
				
				
				         PhysicalSegmentDBId AS DBId, PhysicalSegmentDBName AS DBName, PhysicalSegmentDBAccessTypeId AS AccessTypeId,
					    PhysicalSegmentDBStartRow AS IMSDBStartRow, PhysicalSegmentDBStartCol AS IMSDBStartCol, PhysicalSegmentDBEndRow AS IMSDBEndRow,  PhysicalSegmentDBEndCol AS IMSDBEndCol,  pth2.PathStr AS IMSDBPath,
				
				
				        StatementTypeId, Description, StatementStartRow, StatementStartColumn, StatementEndRow, StatementEndColumn, pth3.PathStr AS StmtPathStr,
				        ProgramName, ProgramID, ProgramTypeID, pth4.PathStr AS ProgramPath, ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, Ancestor, AncestorID, AncestorTypeID,
						FieldID, FieldName, pth5.PathStr AS FieldPath, FieldStartRow, FieldStartCol, FieldEndRow, FieldEndCol, FieldSeq
				FROM (
					  SELECT 
					         sgmt.LogicalSegmentId,
							 sgmt.LogicalSegmentName,
							 occ_L_SG.StartRow AS LogicalSegmentStartRow,
							 occ_L_SG.StartCol AS LogicalSegmentStartCol,
							 occ_L_SG.EndRow   AS LogicalSegmentEndRow, 
							 occ_L_SG.EndCol   AS LogicalSegmentEndCol,  
							 occ_L_SG.PathID   AS LogicalSegmentPathID,
			
							 sgmt.LogicalSegmentDBId,
							 sgmt.LogicalSegmentDBName,
							 sgmt.LogicalSegmentDBAccessTypeId,
							 occ_L_DB.StartRow AS LogicalSegmentDBStartRow,
							 occ_L_DB.StartCol AS LogicalSegmentDBStartCol,
							 occ_L_DB.EndRow   AS LogicalSegmentDBEndRow, 
							 occ_L_DB.EndCol   AS LogicalSegmentDBEndCol,  
							 occ_L_DB.PathID   AS LogicalSegmentDBPathID,
			
							 sgmt.PhysicalSegmentId,
							 sgmt.PhysicalSegmentName,
							 occ_P_SG.StartRow AS PhysicalSegmentStartRow,
							 occ_P_SG.StartCol AS PhysicalSegmentStartCol,
							 occ_P_SG.EndRow   AS PhysicalSegmentEndRow, 
							 occ_P_SG.EndCol   AS PhysicalSegmentEndCol,  
							 occ_P_SG.PathID   AS PhysicalSegmentPathID,
			
							 sgmt.PhysicalSegmentDBId,
							 sgmt.PhysicalSegmentDBName,
							 sgmt.PhysicalSegmentDBAccessTypeId,
							 occ_P_DB.StartRow AS PhysicalSegmentDBStartRow,
							 occ_P_DB.StartCol AS PhysicalSegmentDBStartCol,
							 occ_P_DB.EndRow   AS PhysicalSegmentDBEndRow, 
							 occ_P_DB.EndCol   AS PhysicalSegmentDBEndCol,  
							 occ_P_DB.PathID   AS PhysicalSegmentDBPathID,
			
							core.Description,
							core.StatementTypeID,
							core.StartRow AS StatementStartRow,
							core.StartCol AS StatementStartColumn,
							core.EndRow AS StatementEndRow,
							core.EndCol AS StatementEndColumn,
							core.PathID AS StmtPathID,
			
							prog.ProgramName,
							prog.ProgramID,
							prog.ProgramTypeID,  
							prog.PathID AS ProgramPathID,
							prog.StartRow AS ProgStartRow,
							prog.StartCol AS ProgStartCol,
							prog.EndRow AS ProgEndRow,
							prog.EndCol AS ProgEndCol,
							prog.Ancestor,
							prog.AncestorID, 
							prog.AncestorTypeID,
							field.FieldId,
							COALESCE(field.FieldName, 'N/A') AS FieldName,
							field.PathID AS FieldPathId,
							field.StartRow AS FieldStartRow,
							field.StartCol AS FieldStartCol,
							field.EndRow AS FieldEndRow,
							field.EndCol AS FieldEndCol,
							field.Seq AS FieldSeq
					  FROM ( 
							SELECT sr.ResourceID,
								   sr.OccurId,
								   os.ProgID,
								   os.PathID,
								   os.StartRow,
								   os.StartCol,
								   os.EndRow,
								   os.EndCol,
								   st.StatementType AS StatementTypeID,
								   st.Description 
							FROM StatementReference sr
								 INNER JOIN OccurrencesStmt os ON sr.OccurID = os.OccurID
								 INNER JOIN Statements st ON sr.StatementType = st.StatementType
							WHERE sr.ResourceType = 209 -- IMS SEGMENT
								  AND  os.PathID IS NOT NULL
						    )core
						    INNER JOIN ( -- programs
									      SELECT p.ProgramID, p.ProgramName, p.ProgramTypeID,
											     occ.StartRow, occ.StartCol, occ.EndRow, occ.EndCol, occ.PathID, 
											     p.Ancestor, p.AncestorID, pa.ProgramTypeID AS AncestorTypeID 
										  FROM SESSION.programWithAlias p 
											   INNER JOIN Occurrences occ ON p.OccurID = occ.OccurID 
											   LEFT OUTER JOIN Programs pa ON p.AncestorID = pa.ProgramID
										  WHERE occ.PathID IS NOT NULL
									) prog ON core.ProgID = prog.ProgramID  
			                   INNER JOIN ( -- segments
									           SELECT  sg.SegmentId AS LogicalSegmentId,
												    sg.SegmentName AS LogicalSegmentName,
												    sg.OccurId AS LogicalSegmentOccurId,
												    db.DBId AS LogicalSegmentDBId,
												    db.DBName AS LogicalSegmentDBName,
												    db.AccessTypeId AS LogicalSegmentDBAccessTypeId,
												    db.OccurId AS LogicalSegmentDBOccurId,
												    srcsg.SegmentID AS PhysicalSegmentId,
												    srcsg.SegmentName AS PhysicalSegmentName,
												    srcsg.SegmentOccurId AS PhysicalSegmentOccurId,
												    srcsg.DBID AS PhysicalSegmentDBId,
												    srcsg.DBName AS PhysicalSegmentDBName,
												    srcsg.AccessTypeId AS PhysicalSegmentDBAccessTypeId,
												    srcsg.DBOccurId AS PhysicalSegmentDBOccurId
											 FROM IMSDBSegments sg 
												  INNER JOIN IMSDBInfo db ON db.DBId = sg.DBId
												  LEFT OUTER JOIN  -- info related to source segment
															 ( SELECT sg.SegmentID, sg.SegmentName, sg.OccurId AS SegmentOccurID, 
															          sg.DBID, db.DBName, db.AccessTypeId, db.OccurId AS DBOccurId
															   FROM IMSDBSegments sg 
																   INNER JOIN IMSDBInfo db ON db.DBId = sg.DBId
														      ) srcsg ON sg.SourceSegId = srcsg.SegmentID
			                                         WHERE  db.AccessTypeId = 13 -- only Logical Segments
									  ) sgmt ON core.ResourceID = sgmt.LogicalSegmentId
									            LEFT OUTER JOIN Occurrences AS occ_L_SG ON occ_L_SG.OccurID = sgmt.LogicalSegmentOccurId
											    LEFT OUTER JOIN Occurrences AS occ_L_DB ON occ_L_DB.OccurID = sgmt.LogicalSegmentDBOccurId  
											    LEFT OUTER JOIN Occurrences AS occ_P_SG ON occ_P_SG.OccurID = sgmt.PhysicalSegmentOccurId
											    LEFT OUTER JOIN Occurrences AS occ_P_DB ON occ_P_DB.OccurID = sgmt.PhysicalSegmentDBOccurId  
			      LEFT OUTER JOIN ( -- search fields
							  	 SELECT
							  		   sr.OccurId AS StmtOccurId,
							  		   f.FieldId,
							  		   f.FieldName,
							  		   f.SegmentId,
							  		   f.Seq,
									   os.PathID,
									   os.StartRow,
									   os.StartCol,
									   os.EndRow,
									   os.EndCol
								 FROM StatementReference sr
										 INNER JOIN IMSDBFields f on sr.ResourceID = f.FieldId and sr.ResourceType = 222  -- IMS SSA search field
										 LEFT OUTER JOIN Occurrences os ON f.OccurID = os.OccurID
			    		  ) field on core.OccurId = field.StmtOccurId AND field.SegmentId = sgmt.PhysicalSegmentId
			
									  GROUP BY   sgmt.LogicalSegmentId, sgmt.LogicalSegmentName, 
									             occ_L_SG.StartRow, occ_L_SG.StartCol, occ_L_SG.EndRow, occ_L_SG.EndCol,  occ_L_SG.PathID,
									             sgmt.LogicalSegmentDBId, sgmt.LogicalSegmentDBName, sgmt.LogicalSegmentDBAccessTypeId,
											   occ_L_DB.StartRow, occ_L_DB.StartCol, occ_L_DB.EndRow, occ_L_DB.EndCol, occ_L_DB.PathID,
											   sgmt.PhysicalSegmentId, sgmt.PhysicalSegmentName, 
											   occ_P_SG.StartRow, occ_P_SG.StartCol, occ_P_SG.EndRow, occ_P_SG.EndCol,  occ_P_SG.PathID,
											   sgmt.PhysicalSegmentDBId, sgmt.PhysicalSegmentDBName, sgmt.PhysicalSegmentDBAccessTypeId,
											   occ_P_DB.StartRow, occ_P_DB.StartCol, occ_P_DB.EndRow, occ_P_DB.EndCol, occ_P_DB.PathID,
			                                           core.StatementTypeId, core.Description,  core.StartRow,  core.StartCol, core.EndRow, core.EndCol, core.PathID,
                                           prog.ProgramName, prog.ProgramID, prog.ProgramTypeID, prog.PathID, prog.StartRow, prog.StartCol, prog.EndRow, prog.EndCol, prog.Ancestor, prog.AncestorID, prog.AncestorTypeID,
                                           field.fieldID, field.fieldName, field.PathID, field.StartRow, field.StartCol, field.EndRow, field.EndCol, field.Seq
			
					  )c
					   LEFT OUTER JOIN  Paths pth1 ON pth1.PathID = c.LogicalSegmentDBPathID
					   LEFT OUTER JOIN  Paths pth2 ON pth2.PathID = c.PhysicalSegmentDBPathID 	
					   LEFT OUTER JOIN  Paths pth3 ON pth3.PathID = c.StmtPathID
					   LEFT OUTER JOIN  Paths pth4 ON pth4.PathID = c.ProgramPathID
		   			   LEFT OUTER JOIN  Paths pth5 ON pth5.PathID = c.FieldPathID;
			COMMIT;		   
										      
		 END;
			    
	  END;		 
	
END 