LANGUAGE SQL
BEGIN

			-- declare temp tables

	          DECLARE GLOBAL TEMPORARY TABLE session.idmsx_v
		               (
			             ElementName VARGRAPHIC(512)
		                )
		                CCSID UNICODE
		                WITH REPLACE 
                        ON COMMIT PRESERVE ROWS
						NOT LOGGED;
	
	
	          DECLARE GLOBAL TEMPORARY TABLE session.deelem
		               (
			             Id INTEGER ,
						 Name VARGRAPHIC(400) ,
						 DdsTypeId INTEGER ,
						 SourceInfo INTEGER
		                )
		                CCSID UNICODE
		                WITH REPLACE 
                        ON COMMIT PRESERVE ROWS
						NOT LOGGED;

	           DECLARE GLOBAL TEMPORARY TABLE session.s1
						(
						usedTypeID INTEGER ,
						usedTypeDescription VARGRAPHIC(1024) ,
						usedName VARGRAPHIC(512) ,
						usedID INTEGER ,
						usedStartRow INTEGER ,
						usedEndRow INTEGER ,
						usedStartCol INTEGER ,
						usedEndCol INTEGER ,
						usedSourceFile VARCHAR(250) ,
						usedIsIDMSX INTEGER ,
						usedInElementTypeID INTEGER ,
						usedInDescription VARGRAPHIC(1024) ,
						usedInElementName VARGRAPHIC(400) ,
						ElemId INTEGER ,
						ElemStartRow INTEGER ,
						ElemStartCol INTEGER ,
						ElemEndRow INTEGER ,
						ElemEndCol INTEGER ,
						inProperty VARGRAPHIC(256) ,
						withAlias VARGRAPHIC(512) ,
						ddclfilePath VARCHAR(250) ,
						IsIDMSX INTEGER ,
						PropertyStartRow INTEGER ,
						PropertyEndRow INTEGER ,
						PropertyStartCol INTEGER ,
						PropertyEndCol INTEGER
				       )
				       CCSID UNICODE
				       WITH REPLACE 
                       ON COMMIT PRESERVE ROWS
					   NOT LOGGED;

               DECLARE GLOBAL TEMPORARY TABLE session.s2
						(
						usedTypeID INTEGER ,
						usedTypeDescription VARGRAPHIC(1024) ,
						usedName VARGRAPHIC(400) ,
						usedID INTEGER ,
						usedStartRow INTEGER ,
						usedEndRow INTEGER ,
						usedStartCol INTEGER ,
						usedEndCol INTEGER ,
						usedSourceFile VARCHAR(250) ,
						usedIsIDMSX INTEGER ,
						ProgramTypeID INTEGER ,
						ProgramName VARCHAR(50) ,
						ProgramId INTEGER ,
						ProgStartRow INTEGER ,
						ProgStartCol INTEGER ,
						ProgEndRow INTEGER ,
						ProgEndCol INTEGER ,
						StatementTypeName VARCHAR(50) ,
						ProgramPath VARCHAR(250) ,
						StatementStartRow INTEGER ,
						StatementEndRow INTEGER ,
						StatementStartColumn INTEGER ,
						StatementEndColumn INTEGER
						)
						CCSID UNICODE
						WITH REPLACE 
                        ON COMMIT PRESERVE ROWS
						NOT LOGGED;


			  DECLARE GLOBAL TEMPORARY TABLE session.s3
						(
						usedTypeID INTEGER ,
						usedTypeDescription VARGRAPHIC(1024) ,
						usedName VARGRAPHIC(400) ,
						usedID INTEGER ,
						usedStartRow INTEGER ,
						usedEndRow INTEGER ,
						usedStartCol INTEGER ,
						usedEndCol INTEGER ,
						usedSourceFile VARCHAR(250) ,
						usedIsIDMSX INTEGER ,
						ProgramTypeID INTEGER ,
						ProgramName VARCHAR(50) ,
						ProgramId INTEGER ,
						ProgStartRow INTEGER ,
						ProgStartCol INTEGER ,
						ProgEndRow INTEGER ,
						ProgEndCol INTEGER ,
						StatementTypeName VARCHAR(50) ,
						ProgramPath VARCHAR(250) ,
						StatementStartRow INTEGER ,
						StatementEndRow INTEGER ,
						StatementStartColumn INTEGER ,
						StatementEndColumn INTEGER
						)
						CCSID UNICODE
						WITH REPLACE 
                        ON COMMIT PRESERVE ROWS
						NOT LOGGED;



                         -- fill in temp tables

                      INSERT INTO session.idmsx_v(ElementName)
                      SELECT DISTINCT ElementName
                      FROM EZViewer_IDMSX_View ;
                      COMMIT;



					 INSERT INTO SESSION.deelem (ID, Name, ddstypeid, SourceInfo)
					 SELECT ID, Name, ddstypeid, SourceInfo
					 FROM DDCLElement;
					 COMMIT;

                     CREATE INDEX deelem_ncidx1 ON SESSION.deelem (ddstypeid, Name);


						INSERT INTO session.s1
						SELECT     rt.id AS usedTypeID,
						           rt.Description AS usedTypeDescription,
						           v.referencename AS usedName,
						           u.Id AS usedID,
						           us.StartRow AS usedStartRow,
						           us.EndRow AS usedEndRow,
						           us.StartCol AS usedStartCol,
						           us.EndCol AS usedEndCol,
						           pth2.PathStr AS usedSourceFile,
						           CASE
						               WHEN (IDMSX_View_For_Used.ElementName IS NOT NULL)
						               THEN 1
						               ELSE 0
						           END AS usedIsIDMSX,
						           et.Id AS usedInElementTypeID,
						           et.Description AS usedInDescription,
						           e.name AS usedInElementName,
						           e.Id AS ElemId,
						           es.StartRow AS ElemStartRow,
						           es.StartCol AS ElemStartCol,
						           es.EndRow AS ElemEndRow,
						           es.EndCol AS ElemEndCol,
						           p.name AS inProperty,
						           v.referencealias AS withAlias,
						           pth.PathStr AS ddclfilePath,
						           CASE
						               WHEN (IDMSX_View.ElementName IS NOT NULL)
						               THEN 1
						               ELSE 0
						           END AS IsIDMSX,
						           si.startrow AS PropertyStartRow,
						           si.EndRow AS PropertyEndRow,
						           si.StartCol AS PropertyStartCol,
						           si.EndCol AS PropertyEndCol
						    FROM DDCLValue AS v
						         INNER JOIN SESSION.deelem AS e ON e.id = v.elementid
						         INNER JOIN DDCLSourceInfo AS es ON es.Id = e.SourceInfo
						         INNER JOIN DDCLDdsType AS et ON et.id = e.ddstypeid
						         LEFT OUTER JOIN session.idmsx_v AS IDMSX_View ON e.DdsTypeId IN (3, 10)
											                            AND e.Name = IDMSX_View.ElementName
						         INNER JOIN DDCLProperty AS p ON p.id = v.propertyid
						         INNER JOIN DDCLDdsType AS rt ON rt.id = v.ReferenceDdsTypeId
						         LEFT OUTER JOIN SESSION.deelem AS u ON u.DdsTypeId = rt.Id
						                                       AND u.Name = v.ReferenceName
						         LEFT OUTER JOIN DDCLSourceInfo AS us ON us.Id = u.SourceInfo
								 LEFT OUTER JOIN Programs prg2 ON prg2.ProgramID = us.ProgramId
						         LEFT OUTER JOIN Occurrences occ2 ON occ2.ProgID = prg2.programid
						         LEFT OUTER JOIN Paths pth2 ON pth2.PathID = occ2.PathID
						         LEFT OUTER JOIN session.idmsx_v AS IDMSX_View_For_Used ON u.DdsTypeId IN (3, 10)
						                                                             AND u.Name = IDMSX_View_For_Used.ElementName
						         INNER JOIN DDCLSourceInfo AS si ON si.id = v.sourceinfo
						         INNER JOIN Programs AS prg ON prg.programid = si.programid
						         LEFT OUTER JOIN Occurrences AS occ ON occ.progid = prg.programid
						         LEFT OUTER JOIN Paths AS pth ON pth.pathid = occ.pathid
						    WHERE v.valuetypeid IN (2, 4);
                            COMMIT;



							INSERT INTO session.s2
							SELECT dt.Id AS usedTypeID,
							           dt.Description AS usedTypeDescription,
							           de.Name AS usedName,
							           de.Id AS usedID,
							           di.StartRow AS usedStartRow,
							           di.EndRow AS usedEndRow,
							           di.StartCol AS usedStartCol,
							           di.EndCol AS usedEndCol,
							           ddclpth.PathStr AS usedSourceFile,
							           CASE
							               WHEN(IDMSX_View_For_Used.ElementName IS NOT NULL)
							               THEN 1
							               ELSE 0
							           END AS usedIsIDMSX,
							           prg2.ProgramTypeID AS ProgramTypeID,
							           prg2.ProgramName AS ProgramName,
							           prg2.ProgramID AS ProgramId,
							           prgOcc.StartRow AS ProgStartRow,
							           prgOcc.StartCol AS ProgStartCol,
							           prgOcc.EndRow AS ProgEndRow,
							           prgOcc.EndCol AS ProgEndCol,
							           s.Description AS StatementTypeName,
							           PrgFilePath.PathStr AS ProgramPath,
							           os.StartRow AS StatementStartRow,
							           os.EndRow AS StatementEndRow,
							           os.StartCol AS StatementStartColumn,
							           os.EndCol AS StatementEndColumn
							    FROM OccurrencesStmt os
							         INNER JOIN StatementReference sr ON os.OccurID = sr.OccurID
							         INNER JOIN (
												SELECT r.ResourceID, r.OccurID,
													  (SUBSTR(r.Name, LOCATE_IN_STRING(r.Name, '-') + 1, LENGTH(r.Name))) AS DDCLElement_Name,
													  (SUBSTR(r.Name, 1, CASE WHEN LOCATE_IN_STRING(r.Name, '-')> 0 THEN LOCATE_IN_STRING(r.Name, '-') - 1 ELSE 0 END  )) AS DDCLDdsType_Name
												FROM Resources r
												WHERE r.ResourceType = 13
								                ) r ON sr.ResourceID =r.ResourceID
							         INNER JOIN Statements s ON sr.StatementType = s.StatementType
							         INNER JOIN Occurrences occ2 ON r.OccurID = occ2.OccurID
							         INNER JOIN Paths pth ON occ2.PathID = pth.PathID
							         INNER JOIN
												(
													 SELECT pg.ProgramID,
															--pg.Ancestor,
															pg.ProgramTypeID,
															pg.OccurID,
															pa.AliasName AS ProgramName
													 FROM Programs pg
														   INNER JOIN ProgramAliases pa ON pg.ProgramID = pa.ProgramId AND pa.AliasType = 0
												  )  prg2 ON os.ProgID = prg2.ProgramID
							         INNER JOIN Paths AS PrgFilePath ON os.PathID = PrgFilePath.PathID
							         INNER JOIN Occurrences AS prgOcc ON prgOcc.OccurID = prg2.OccurID
							         INNER JOIN SESSION.deelem de ON de.Name = r.DDCLElement_Name
							         INNER JOIN DDCLDdsType dt ON dt.Name = r.DDCLDdsType_Name
							         INNER JOIN DDCLSourceInfo di ON di.Id = de.SourceInfo
							         INNER JOIN Programs AS prg ON prg.programid = di.programid
							         LEFT OUTER JOIN Occurrences AS occ ON occ.progid = prg.programid
							         LEFT OUTER JOIN Paths AS ddclpth ON ddclpth.pathid = occ.pathid
							         LEFT OUTER JOIN session.idmsx_v AS IDMSX_View_For_Used ON  de.DdsTypeId IN (3, 10) AND de.Name = IDMSX_View_For_Used.ElementName
								WHERE sr.StatementType = 44
							           AND pth.PathStr LIKE '%DDCL INCLUDES%' ;
                                COMMIT;






									INSERT INTO session.s3
									SELECT dt.Id AS usedTypeID,
									           dt.Description AS usedTypeDescription,
									           de.Name AS usedName,
									           de.Id AS usedID,
									           di.StartRow AS usedStartRow,
									           di.EndRow AS usedEndRow,
									           di.StartCol AS usedStartCol,
									           di.EndCol AS usedEndCol,
									           ddclpth.PathStr AS usedSourceFile,
									           CASE
									               WHEN(IDMSX_View_For_Used.ElementName IS NOT NULL)
									               THEN 1
									               ELSE 0
									           END AS usedIsIDMSX,
									           prg2.ProgramTypeID AS ProgramTypeID,
									           prg2.ProgramName AS ProgramName,
									           prg2.ProgramID AS ProgramId,
									           prgOcc.StartRow AS ProgStartRow,
									           prgOcc.StartCol AS ProgStartCol,
									           prgOcc.EndRow AS ProgEndRow,
									           prgOcc.EndCol AS ProgEndCol,
									           s.Description AS StatementTypeName,
									           PrgFilePath.PathStr AS ProgramPath,
									           os.StartRow AS StatementStartRow,
									           os.EndRow AS StatementEndRow,
									           os.StartCol AS StatementStartColumn,
									           os.EndCol AS StatementEndColumn
									    FROM SESSION.deelem de
									         INNER JOIN
												   (
													    SELECT 78 AS ResourceType1, 10 AS ResourceType2, ID AS SetOrRecordID, SetName AS SetOrRecordName
													    FROM IdmsSubschemaSets
													    UNION
													    SELECT 77 AS ResourceType1, 3 AS ResourceType2, ID AS SetOrRecordID, RecordName AS SetOrRecordName
													    FROM IdmsSubschemaRecords
												    ) SetOrRecord  ON de.ddstypeid = SetOrRecord.ResourceType2
												                      AND de.Name = SetOrRecord.SetOrRecordName
									         INNER JOIN StatementReference sr ON SetOrRecord.SetOrRecordID = sr.ResourceID
										                                         AND  SetOrRecord.ResourceType1 =  sr.ResourceType
									         INNER JOIN Statements s ON sr.StatementType = s.StatementType
									         INNER JOIN OccurrencesStmt os ON os.OccurID = sr.OccurID
									         INNER JOIN
														(
															 SELECT pg.ProgramID,
																	--pg.Ancestor,
																	pg.ProgramTypeID,
																	pg.OccurID,
																	pa.AliasName AS ProgramName
															 FROM Programs pg
																   INNER JOIN ProgramAliases pa ON pg.ProgramID = pa.ProgramId AND pa.AliasType = 0
														  )prg2 ON prg2.ProgramID = os.ProgID
									         INNER JOIN Paths AS PrgFilePath ON os.PathID = PrgFilePath.PathID
									         INNER JOIN Occurrences AS prgOcc ON prgOcc.OccurID = prg2.OccurID
									         INNER JOIN DDCLDdsType dt  ON dt.Id = de.DdsTypeId
									         INNER JOIN DDCLSourceInfo di ON di.Id = de.SourceInfo
									         INNER JOIN Programs AS prg ON prg.programid = di.programid
									         LEFT OUTER JOIN Occurrences AS occ ON occ.progid = prg.programid
									         LEFT OUTER JOIN Paths AS ddclpth ON ddclpth.pathid = occ.pathid
									         LEFT OUTER JOIN session.idmsx_v AS IDMSX_View_For_Used ON de.Name = IDMSX_View_For_Used.ElementName
									    WHERE (
									           (de.ddstypeid = 3 AND sr.ResourceType = 77)
											    OR
											    (de.ddstypeid = 10 AND sr.ResourceType = 78)
											   );
                                        COMMIT;




            BEGIN
			      COMMIT;
				  TRUNCATE TABLE cacheEZViewer_Usage_DDCL_Dictionary IMMEDIATE ;
	              --DELETE FROM cacheEZViewer_Usage_DDCL_Dictionary ;
	        END;


            -- fill in cache table
            LOCK TABLE  cacheEZViewer_Usage_DDCL_Dictionary IN EXCLUSIVE MODE ;-- lock table
			INSERT INTO cacheEZViewer_Usage_DDCL_Dictionary
			SELECT usedTypeID, usedTypeDescription, usedName, usedID, usedStartRow, usedEndRow, usedStartCol, usedEndCol,
			       usedSourceFile, usedIsIDMSX, usedInElementTypeID, usedInDescription, usedInElementName,
				  ElemId, ElemStartRow, ElemStartCol, ElemEndRow, ElemEndCol, inProperty, withAlias, ddclfilePath, IsIDMSX,
				  PropertyStartRow, PropertyEndRow, PropertyStartCol, PropertyEndCol, ProgramTypeID, ProgramName, ProgramId,
				  ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, StatementTypeName, ProgramPath,
				  StatementStartRow, StatementEndRow, StatementStartColumn, StatementEndColumn
			FROM(	
			       SELECT 	
			            usedTypeID, usedTypeDescription, usedName, usedID, usedStartRow, usedEndRow, usedStartCol, usedEndCol,
						usedSourceFile, usedIsIDMSX,
						usedInElementTypeID, usedInDescription, usedInElementName,
						ElemId, ElemStartRow, ElemStartCol, ElemEndRow,
						ElemEndCol, inProperty, withAlias, ddclfilePath,
						IsIDMSX, PropertyStartRow, PropertyEndRow,
						PropertyStartCol, PropertyEndCol,
						CAST(NULL AS INTEGER) AS ProgramTypeID,
						CAST(NULL AS VARCHAR(250)) ProgramName,
						CAST(NULL AS INTEGER) AS ProgramId,
						CAST(NULL AS INTEGER) AS ProgStartRow,
						CAST(NULL AS INTEGER) AS ProgStartCol,
						CAST(NULL AS INTEGER) AS ProgEndRow,
						CAST(NULL AS INTEGER) AS ProgEndCol,
						CAST(NULL AS VARCHAR(50)) AS StatementTypeName,
						CAST(NULL AS VARCHAR(250)) AS ProgramPath,
						CAST(NULL AS INTEGER) AS StatementStartRow,
						CAST(NULL AS INTEGER) AS StatementEndRow,
						CAST(NULL AS INTEGER) AS StatementStartColumn,
						CAST(NULL AS INTEGER) AS StatementEndColumn
				  FROM session.s1
			
				  UNION
				  SELECT  usedTypeID, usedTypeDescription, usedName, usedID, usedStartRow, usedEndRow, usedStartCol, usedEndCol,
					      usedSourceFile, usedIsIDMSX,
					      CAST(NULL AS INTEGER) AS usedInElementTypeID,
					      CAST(NULL AS VARGRAPHIC(1024)) AS  usedInDescription,
					      CAST(NULL AS VARGRAPHIC(400)) AS usedInElementName,
			              CAST(NULL AS INTEGER) AS ElemId,
			              CAST(NULL AS INTEGER) AS ElemStartRow,
			              CAST(NULL AS INTEGER) AS ElemStartCol,
			              CAST(NULL AS INTEGER) AS ElemEndRow,
			              CAST(NULL AS INTEGER) AS ElemEndCol,
			              CAST(NULL AS VARGRAPHIC(256)) AS inProperty,
			              CAST(NULL AS VARGRAPHIC(512)) AS withAlias,
			              CAST(NULL AS VARGRAPHIC(250)) AS ddclfilePath,
			              CAST(NULL AS INTEGER) AS IsIDMSX,
			              CAST(NULL AS INTEGER) AS PropertyStartRow,
			              CAST(NULL AS INTEGER) AS PropertyEndRow,
			              CAST(NULL AS INTEGER) AS PropertyStartCol,
			              CAST(NULL AS INTEGER) AS PropertyEndCol,
					    ProgramTypeID, ProgramName, ProgramId,
					    ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, StatementTypeName, ProgramPath,
					    StatementStartRow, StatementEndRow, StatementStartColumn, StatementEndColumn
				  FROM session.s2
				
				  UNION
				  SELECT  usedTypeID, usedTypeDescription, usedName, usedID, usedStartRow, usedEndRow, usedStartCol, usedEndCol,
					      usedSourceFile, usedIsIDMSX,
					      CAST(NULL AS INTEGER) AS usedInElementTypeID,
					      CAST(NULL AS VARGRAPHIC(1024)) AS  usedInDescription,
					      CAST(NULL AS VARGRAPHIC(400)) AS usedInElementName,
			              CAST(NULL AS INTEGER) AS ElemId,
			              CAST(NULL AS INTEGER) AS ElemStartRow,
			              CAST(NULL AS INTEGER) AS ElemStartCol,
			              CAST(NULL AS INTEGER) AS ElemEndRow,
			              CAST(NULL AS INTEGER) AS ElemEndCol,
			              CAST(NULL AS VARGRAPHIC(256)) AS inProperty,
			              CAST(NULL AS VARGRAPHIC(512)) AS withAlias,
			              CAST(NULL AS VARGRAPHIC(250)) AS ddclfilePath,
			              CAST(NULL AS INTEGER) AS IsIDMSX,
			              CAST(NULL AS INTEGER) AS PropertyStartRow,
			              CAST(NULL AS INTEGER) AS PropertyEndRow,
			              CAST(NULL AS INTEGER) AS PropertyStartCol,
			              CAST(NULL AS INTEGER) AS PropertyEndCol,
					    ProgramTypeID, ProgramName, ProgramId,
					    ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, StatementTypeName, ProgramPath,
					    StatementStartRow, StatementEndRow, StatementStartColumn, StatementEndColumn
				  FROM session.s3
				  ) s;
				  COMMIT;


END 
