LANGUAGE SQL
BEGIN 
         
-- clean up temp table if exists 
	BEGIN
		DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
		BEGIN END;
		
		COMMIT;
		DROP TABLE SESSION.core;
		DROP TABLE SESSION.appendix_1_56;
		DROP TABLE SESSION.appendix_3_193;
		DROP TABLE SESSION.appendix_1_62;
		
		DROP INDEX SESSION.IX_1;
		DROP INDEX SESSION.IX_2;
		DROP INDEX SESSION.IX_3;
		DROP INDEX SESSION.IX_4;
		
	END;
  
  
-- DECLARATION AREA
  
  -- cobol -> 56, 1
    DECLARE GLOBAL TEMPORARY TABLE SESSION.appendix_1_56 
       ( 
         DBName VARCHAR(20),
		 FileName VARCHAR(20), 
		 FileID INTEGER
		 ) ON COMMIT PRESERVE ROWS
		   NOT LOGGED;
		   
	 CREATE INDEX IX_2 ON SESSION.appendix_1_56 (FileID ASC) CLUSTER;  
		   

  -- natural 	-> 193, 3
      DECLARE GLOBAL TEMPORARY TABLE SESSION.appendix_3_193  
       (
			viewid INTEGER ,
			DBName VARCHAR(16) ,
			FileName VARCHAR(16) ,
			FileID INTEGER ,
			AdabasView VARCHAR(50) ,
			NaturalView VARCHAR(50) ,
			ViewPath VARCHAR(250) ,
			ViewSource VARCHAR(50) ,
			ViewStartRow INTEGER ,
			ViewStartColumn INTEGER
        )  ON COMMIT PRESERVE ROWS
           NOT LOGGED;
        
    CREATE INDEX IX_3 ON SESSION.appendix_3_193 (viewid ASC) CLUSTER;


    -- cobol -> 62, 1
    DECLARE GLOBAL TEMPORARY TABLE SESSION.appendix_1_62  
       (ViewID INTEGER ,
		DBName VARCHAR(16) ,
		FileName VARCHAR(16) ,
		FileID INTEGER ,
		AdabasView VARCHAR(50) 
		)ON COMMIT PRESERVE ROWS
		 NOT LOGGED;

      CREATE INDEX IX_4 ON SESSION.appendix_1_62 (viewid ASC) CLUSTER;
      
      
      -- cobol -> 62, 1
    DECLARE GLOBAL TEMPORARY TABLE SESSION.core  
       (
            Description VARCHAR(50) ,
			StatementStartRow INTEGER ,
			StatementStartColumn INTEGER ,
			StatementEndRow INTEGER ,
			StatementEndColumn INTEGER ,
			StmtPathStr VARCHAR(250) ,
			ProgramName VARCHAR(255) ,
			ProgramID INTEGER ,
			ProgramTypeID INTEGER ,
			ProgramPath VARCHAR(250) ,
			Ancestor VARCHAR(255) ,
			ProgStartRow INTEGER ,
			ProgStartCol INTEGER ,
			ProgEndRow INTEGER ,
			ProgEndCol INTEGER ,
			ResourceID INTEGER ,
			ResourceType INTEGER 
		)ON COMMIT PRESERVE ROWS
		 NOT LOGGED;

   CREATE INDEX IX_1 ON SESSION.core (ResourceID ASC, ResourceType ASC, ProgramTypeid ASC) CLUSTER;
        
-- end declaration area
        
        
-- fill in temp tables
   -- cobol -> 56, 1
   INSERT INTO SESSION.appendix_1_56   
   SELECT 
		COALESCE(mad.DBName,   CAST(ad.DBNumber AS VARCHAR(16))) AS DBName,
		COALESCE(maf.FileName, CAST(af.FileNumber AS VARCHAR(16))) AS FileName, 
		af.FileID 
	 FROM  AdabasFiles af 
		LEFT OUTER JOIN AdabasDatabases ad  ON ad.AdabasDBID=af.AdabasDBID
		LEFT OUTER JOIN MFAdabasFiles maf ON maf.FileNumber=af.FileNumber
		LEFT OUTER JOIN MFAdabasDB mad ON mad.DBNumber= ad.DBNumber;
	COMMIT;	
        
        
   -- natural 	-> 193, 3
   INSERT INTO SESSION.appendix_3_193  
   SELECT nv.viewid,
			 COALESCE(mad.DBName,   CAST( ad.DBNumber AS VARCHAR(16))) AS DBName,
			 COALESCE(maf.FileName, CAST( af.FileNumber AS VARCHAR(16))) AS FileName,
			 af.FileID,
			 n.DDMName as AdabasView, 
			 nv.ViewName as NaturalView, 
			 vpth.PathStr as ViewPath,
			 nv.ResourceName as ViewSource,
			 vo.StartRow as ViewStartRow,
			 vo.StartCol as ViewStartColumn
		 FROM NaturalDBView nv
			 INNER JOIN NaturalDDM n on n.DDM_ID = nv.DDM_ID AND n.ResourceType=62
			 INNER JOIN AdabasView av ON av.ViewID = n.ReferenceResourceID 
			 INNER JOIN AdabasFiles af ON af.FileId = av.AdabasFileID
			 INNER JOIN AdabasDatabases ad ON ad.AdabasDBID = af.AdabasDBID	
			 LEFT OUTER JOIN MFAdabasFiles maf ON maf.FileNumber=af.FileNumber
			 LEFT OUTER JOIN MFAdabasDB mad ON mad.DBNumber= ad.DBNumber
			 LEFT OUTER JOIN Occurrences vo ON nv.OccurID = vo.OccurID
			 LEFT OUTER JOIN Paths vpth ON vo.PathID = vpth.PathID ;
   COMMIT;
               
        
	-- cobol -> 62, 1
	 INSERT INTO SESSION.appendix_1_62 
	 SELECT av.ViewID,
		    COALESCE(mad.DBName,   CAST(ad.DBNumber AS VARCHAR(16) )) AS DBName,
		    COALESCE(maf.FileName, CAST(af.FileNumber AS VARCHAR(16) )) AS FileName,  
		    af.FileID,
		    av.ViewName AS AdabasView
		FROM AdabasView av
		    LEFT OUTER JOIN AdabasFiles af ON af.FileId = av.AdabasFileID
		    LEFT OUTER JOIN AdabasDatabases ad  ON ad.AdabasDBID=af.AdabasDBID
		    LEFT OUTER JOIN MFAdabasFiles maf ON maf.FileNumber=af.FileNumber
		    LEFT OUTER JOIN MFAdabasDB mad ON mad.DBNumber= ad.DBNumber;
		COMMIT;    
					
					
     INSERT INTO SESSION.core
     SELECT 
			 s.Description, 
			 os.StartRow AS StatementStartRow, 
			 os.StartCol AS StatementStartColumn, 
			 os.EndRow AS StatementEndRow, 
			 os.EndCol AS StatementEndColumn, 
			 pth1.PathStr as StmtPathStr, 
			 p1.ProgramName, 
			 p1.ProgramID, 
			 p1.ProgramTypeID, 
			 pth2.PathStr AS ProgramPath,
			 p1.Ancestor,
			 o.StartRow AS ProgStartRow, 
			 o.StartCol AS ProgStartCol, 
			 o.EndRow AS ProgEndRow, 
			 o.EndCol AS ProgEndCol,
			 sr.ResourceID,
			 sr.ResourceType
		 FROM (SELECT ResourceID, ResourceType, OccurID,
		              CASE ResourceType 
		                   WHEN 56 THEN 1
		                   WHEN 62 THEN 1
		                   ELSE 3
                      END AS FlagProgramTypeID 
		       FROM StatementReference 
		       WHERE ResourceType IN (56, 62, 193)
		      )sr
			 INNER JOIN OccurrencesStmt os ON sr.OccurID = os.OccurID 
			 INNER JOIN Statements  s ON os.StatementType = s.StatementType 
			 INNER JOIN 
                    (   
                         SELECT p.ProgramID,
			                    p.Ancestor,
					            p.ProgramTypeID,
					            p.OccurID,
			                    pa.AliasName AS ProgramName
			              FROM Programs p
			                   INNER JOIN ProgramAliases pa ON p.ProgramID = pa.ProgramId AND pa.AliasType = 0
			              WHERE p.ProgramTypeid IN (1, 3)     
			          ) p1 ON os.ProgID = p1.ProgramID 
			 INNER JOIN Paths pth1 ON pth1.PathID = os.PathID 
			 INNER JOIN Occurrences o ON o.OccurID = p1.OccurID 
			 INNER JOIN Paths pth2 on pth2.PathID = o.PathID 
		 WHERE sr.FlagProgramTypeID  = p1.ProgramTypeID
		      /* 
		       (sr.ResourceType IN (56, 62) AND p1.ProgramTypeid = 1) --cobol
			   OR
			  (sr.ResourceType IN (193) AND p1.ProgramTypeid = 3) --natural
			  */
         ;
         COMMIT;
	   
 -- end fill in temp tables
                 

	BEGIN
		 COMMIT;
		 TRUNCATE TABLE cacheEZViewer_Usage_Adabas ;
	END;
  

    -- fill in cache table
    LOCK TABLE   cacheEZViewer_Usage_Adabas IN EXCLUSIVE MODE ;-- lock table 
    INSERT INTO  cacheEZViewer_Usage_Adabas             
    SELECT DISTINCT
	   COALESCE(a1.DBName, a2.DBName, a3.DBName) AS DBName,
	   COALESCE(a1.FileName, a2.FileName, a3.FileName) AS FileName,
	   COALESCE(a1.FileID, a2.FileID, a3.FileID) AS FileID,
	   COALESCE(a2.AdabasView, a3.AdabasView) AS AdabasView,
	   a2.NaturalView,
	   a2.ViewPath,
	   a2.ViewSource,
	   a2.ViewStartRow,
	   a2.ViewStartColumn,
	    c.Description, 
	    c.StatementStartRow, 
	    c.StatementStartColumn, 
	    c.StatementEndRow, 
	    c.StatementEndColumn, 
	    c.StmtPathStr, 
	    c.ProgramName, 
	    c.ProgramID, 
	    c.ProgramTypeID, 
	    c.ProgramPath,
	    c.Ancestor,
	    c.ProgStartRow, 
	    c.ProgStartCol, 
	    c.ProgEndRow, 
	    c.ProgEndCol 
	 FROM SESSION.core c 
		 LEFT OUTER JOIN SESSION.appendix_1_56 a1  ON a1.FileID = c.ResourceID AND c.ResourceType = 56 AND c.ProgramTypeid = 1
		 LEFT OUTER JOIN SESSION.appendix_3_193 a2 ON a2.viewid = c.ResourceID AND c.ResourceType = 193 AND c.ProgramTypeid = 3 
		 LEFT OUTER JOIN SESSION.appendix_1_62 a3  ON a3.viewid = c.ResourceID AND c.ResourceType = 62 AND c.ProgramTypeid = 1 
	 WHERE (a1.FileID IS NOT NULL OR a2.viewid IS NOT NULL OR a3.viewid IS NOT NULL);
     COMMIT;  


END 