AS
BEGIN
SET NOCOUNT ON

-- EXEC [dbo].[EZViewer_Usage_IMSDB_Physical]
--SELECT * FROM dbo.cacheEZViewer_Usage_IMSDB_Physical

IF OBJECT_ID('dbo.cacheEZViewer_Usage_IMSDB_Physical') IS NOT NULL  DROP TABLE dbo.cacheEZViewer_Usage_IMSDB_Physical
SELECT  SegmentID, SegmentName, SegmentStartRow, SegmentStartCol, SegmentEndRow, SegmentEndCol,  pth1.PathStr AS SegPath,
	   SegmentDBId AS DBId, SegmentDBName AS DBName, SegmentDBAccessTypeId AS AccessTypeId, IMSDBStartRow, IMSDBStartCol, IMSDBEndRow, IMSDBEndCol, pth2.PathStr AS IMSDBPath,
	   LogicalSegmentId, LogicalSegmentName, LogicalSegmentDBId, LogicalSegmentDBName,
        StatementTypeID, Description, StatementStartRow, StatementStartColumn, StatementEndRow, StatementEndColumn, pth3.PathStr AS StmtPathStr,
        ProgramID, ProgramName, ProgramTypeID, ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, pth4.PathStr AS ProgramPath, Ancestor, AncestorID, AncestorTypeID, 
        FieldID, FieldName, pth5.PathStr AS FieldPath, FieldStartRow, FieldStartCol, FieldEndRow, FieldEndCol, FieldSeq
INTO dbo.cacheEZViewer_Usage_IMSDB_Physical
FROM (
		  SELECT
			     sgmt.SegmentID,
				sgmt.SegmentName,
				occ_SG.StartRow AS SegmentStartRow,
				occ_SG.StartCol AS SegmentStartCol,
				occ_SG.EndRow   AS SegmentEndRow,
				occ_SG.EndCol   AS SegmentEndCol,
				occ_SG.PathID   AS SegmentPathID,
				
				sgmt.SegmentDBId,
				sgmt.SegmentDBName,
				sgmt.SegmentDBAccessTypeId,
				occ_DB.StartRow AS IMSDBStartRow,
				occ_DB.StartCol AS IMSDBStartCol,
				occ_DB.EndRow   AS IMSDBEndRow,
				occ_DB.EndCol   AS IMSDBEndCol,
				occ_DB.PathID   AS IMSDBPathID,

				case when sgmt.SourceSegmentID is not null then sgmt.LogicalSegmentId else null end as LogicalSegmentId,
				case when sgmt.SourceSegmentID is not null then sgmt.LogicalSegmentName else null end as LogicalSegmentName,
				case when sgmt.SourceSegmentID is not null then sgmt.LogicalSegmentDBId else null end as LogicalSegmentDBId,
				case when sgmt.SourceSegmentID is not null then sgmt.LogicalSegmentDBName else null end as LogicalSegmentDBName,

				core.StatementTypeID,
			     core.Description,
			     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.StartRow AS ProgStartRow,
				prog.StartCol AS ProgStartCol,
				prog.EndRow AS ProgEndRow,
				prog.EndCol AS ProgEndCol,
				prog.PathID AS ProgramPathID,
				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 dbo.StatementReference sr
					 INNER JOIN dbo.OccurrencesStmt os ON sr.OccurID = os.OccurID
					 INNER JOIN dbo.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, pa.ProgramID AS AncestorID, pa.ProgramTypeID AS AncestorTypeID
							  FROM (SELECT AliasName as ProgramName, p1.ProgramID, ProgramTypeID, Ancestor, OccurID
                                                                FROM dbo.Programs p1 INNER JOIN dbo.ProgramAliases p2 ON p1.ProgramId = p2.ProgramId and p2.AliasType = 0) p
								   INNER JOIN dbo.Occurrences occ ON p.OccurID = occ.OccurID
								   LEFT OUTER JOIN (SELECT DISTINCT AliasName as ProgramName, p1.ProgramID, ProgramTypeID FROM dbo.Programs p1
                                                                                                INNER JOIN dbo.ProgramAliases p2 on p1.ProgramId = p2.ProgramId) pa ON pa.ProgramName = p.Ancestor
							  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 SourceSegmentID,
									    srcsg.SegmentName AS SourceSegmentName,
									    srcsg.SegmentOccurID AS SourceSegmentOccurID,
									    srcsg.DBID AS SourceSegmentDBId,
									    srcsg.DBName AS SourceSegmentDBName,
									    srcsg.AccessTypeId AS SourceSegmentDBAccessTypeId,
									    srcsg.DBOccurID AS SourceSegmentDBOccurId,

									    --prepare final output
									      CASE WHEN srcsg.SegmentID IS NOT NULL THEN srcsg.SegmentID
											 ELSE sg.SegmentId
										 END AS SegmentID,
										 CASE WHEN srcsg.SegmentID IS NOT NULL THEN srcsg.SegmentName
											 ELSE sg.SegmentName
										 END AS SegmentName,
										 CASE WHEN srcsg.SegmentID IS NOT NULL THEN srcsg.SegmentOccurID
											 ELSE sg.OccurId
										 END AS SegmentOccurID,
										 CASE WHEN srcsg.SegmentID IS NOT NULL THEN srcsg.DBID
											 ELSE db.DBId
										 END AS SegmentDBId,
										 CASE WHEN srcsg.SegmentID IS NOT NULL THEN srcsg.DBName
											 ELSE db.DBName
										 END AS SegmentDBName,
										 CASE WHEN srcsg.SegmentID IS NOT NULL THEN srcsg.AccessTypeId
											 ELSE db.AccessTypeId
										 END AS SegmentDBAccessTypeId,
										 CASE WHEN srcsg.SegmentID IS NOT NULL THEN srcsg.DBOccurID
											 ELSE db.OccurID
										 END AS SegmentDBOccurID
								 FROM dbo.IMSDBSegments sg
									  INNER JOIN dbo.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 dbo.IMSDBSegments sg
													   INNER JOIN dbo.IMSDBInfo db ON db.DBId = sg.DBId
												  ) srcsg ON sg.SourceSegId = srcsg.SegmentID
						  ) sgmt ON core.ResourceID = sgmt.LogicalSegmentId AND ISNULL(sgmt.SegmentDBAccessTypeId, 0) != 13 -- physical segments
								  LEFT OUTER JOIN dbo.Occurrences AS occ_SG ON occ_SG.OccurID = sgmt.SegmentOccurID
								  LEFT OUTER JOIN dbo.Occurrences AS occ_DB ON occ_DB.OccurID = sgmt.SegmentDBOccurID
				  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 dbo.StatementReference sr
									  INNER JOIN dbo.IMSDBFields f on sr.ResourceID = f.FieldId and sr.ResourceType = 222  -- IMS SSA search field
									  LEFT OUTER JOIN dbo.Occurrences os ON f.OccurID = os.OccurID
			    		  ) field on core.OccurId = field.StmtOccurId AND field.SegmentId = core.ResourceId
						  GROUP BY  sgmt.SegmentID, sgmt.SegmentName, occ_SG.StartRow, occ_SG.StartCol, occ_SG.EndRow, occ_SG.EndCol, occ_SG.PathID,
						            sgmt.SegmentDBId, sgmt.SegmentDBName, sgmt.SegmentDBAccessTypeId, occ_DB.StartRow, occ_DB.StartCol, occ_DB.EndRow, occ_DB.EndCol, occ_DB.PathID,
								  sgmt.SourceSegmentID, sgmt.LogicalSegmentId, sgmt.LogicalSegmentName, sgmt.LogicalSegmentDBId, sgmt.LogicalSegmentDBName,
                                          core.StatementTypeID, core.Description,  core.StartRow,  core.StartCol, core.EndRow, core.EndCol, core.PathID,
                                          prog.ProgramName, prog.ProgramID, prog.ProgramTypeID, prog.StartRow, prog.StartCol, prog.EndRow, prog.EndCol, prog.PathID, 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  dbo.Paths pth1 ON pth1.PathID = c.SegmentPathID
		   LEFT OUTER JOIN  dbo.Paths pth2 ON pth2.PathID = c.IMSDBPathID
		   LEFT OUTER JOIN  dbo.Paths pth3 ON pth3.PathID = c.StmtPathID
		   LEFT OUTER JOIN  dbo.Paths pth4 ON pth4.PathID = c.ProgramPathID				
		   LEFT OUTER JOIN  dbo.Paths pth5 ON pth5.PathID = c.FieldPathID	

END