AS
BEGIN
SET NOCOUNT ON



IF OBJECT_ID('dbo.cacheEZViewer_Usage_OpenTP') IS NOT NULL  DROP TABLE dbo.cacheEZViewer_Usage_OpenTP
SELECT
	   Description,
	   StatementStartRow, StatementStartColumn, StatementEndRow, StatementEndColumn,
	   pth1.PathStr AS StmtPathStr,
	   ProgramID, ProgramName, ProgramTypeID,
	   pth2.PathStr AS ProgramPath, ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, Ancestor, AncestorID, AncestorTypeID
INTO dbo.cacheEZViewer_Usage_OpenTP
FROM (
		  SELECT
			    core.Description,
			    core.PathID AS StmtPathID,
			    core.StartRow AS StatementStartRow,
			    core.StartCol AS StatementStartColumn,
			    core.EndRow AS StatementEndRow,
			    core.EndCol AS StatementEndColumn,
			    prog.ProgramID,
			    prog.ProgramName,
			    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
		  FROM (  -- distinct core data
				SELECT
					   os.ProgID,
					   os.PathID,
					   os.StartRow,
					   os.StartCol,
					   os.EndRow,
					   os.EndCol,
					   st.Description
				FROM  dbo.OccurrencesStmt os
					 INNER JOIN dbo.Statements st ON os.StatementType = st.StatementType
				WHERE st.StatementType BETWEEN 1845 AND 1855
					  AND  os.PathID IS NOT NULL
			   )core
			    INNER JOIN ( -- programs
						    SELECT p.ProgramID, p.ProgramName, p.ProgramTypeID, p.Ancestor,
						           ap.ProgramID AS AncestorID , ap.ProgramTypeID AS AncestorTypeID,
								 occ.StartRow, occ.StartCol, occ.EndRow, occ.EndCol
								,occ.PathID
							  FROM dbo.Occurrences occ
								   INNER JOIN (SELECT p1.ProgramID, AliasName as ProgramName, ProgramTypeID, Ancestor, OccurID FROM dbo.Programs p1
                                                                                INNER JOIN dbo.ProgramAliases p2 ON p1.ProgramID = p2.ProgramID AND p2.AliasType = 0) p ON p.OccurID = occ.OccurID
								   LEFT OUTER JOIN (SELECT DISTINCT p1.ProgramID, AliasName as ProgramName, ProgramTypeID FROM dbo.Programs p1
                                                                                INNER JOIN dbo.ProgramAliases p2 ON p1.ProgramID = p2.ProgramID) ap ON p.Ancestor = ap.ProgramName AND ap.ProgramTypeID IN ( 8, 13)
							  WHERE occ.PathID IS NOT NULL
						) prog ON core.ProgID = prog.ProgramID
			
			  GROUP BY  core.Description, core.PathID, core.StartRow , core.StartCol, core.EndRow, core.EndCol,
			            prog.ProgramID, prog.ProgramName, prog.ProgramTypeID, prog.PathID,  prog.StartRow, prog.StartCol, prog.EndRow, prog.EndCol, prog.Ancestor,
					  prog.AncestorID, prog.AncestorTypeID
		  )c
		   LEFT OUTER JOIN  dbo.Paths pth1 ON pth1.PathID = c.StmtPathID
		   LEFT OUTER JOIN  dbo.Paths pth2 ON pth2.PathID = c.ProgramPathID		


END