From 2c78c091bfc48c04b55448e2a32e31b0baf83622 Mon Sep 17 00:00:00 2001 From: Rich Date: Mon, 5 Nov 2012 22:01:59 +0000 Subject: [PATCH] SetParentSectionAndDocVersion to eliminate lookups when the parent is known. Use existing ActiveSection rather than "getting" an item from the database. Add property "LoadAllAtOnce" for printing. Allow MyProcedure to be set for "LoadAllAtOnce" Allow MyDocVersion to be set for "LoadAllAtOnce" Created GetCachedByPrimaryKey for ProcedureInfo, SectionInfo and StepInfo. Added Static Method GetItemAndChildren to get an entire procedure at once. --- .../VEPROMS.CSLA.Library/Extension/ItemExt.cs | 197 ++++++++++++++++-- 1 file changed, 180 insertions(+), 17 deletions(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs index 3acf07b3..fe5121c2 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs @@ -310,6 +310,19 @@ namespace VEPROMS.CSLA.Library // return ii._ItemID == _ItemID; // return false; //} + internal static void SetParentSectionAndDocVersion(ItemInfo itemInfo, IVEDrillDownReadOnly itemParent, SectionInfo sectionInfo, ProcedureInfo procInfo, DocVersionInfo docVersionInfo) + { + if (itemInfo == null) return; + itemInfo.LoadAllAtOnce = true; + itemInfo.ActiveParent = itemParent; + itemInfo.ActiveSection = sectionInfo; + itemInfo.MyProcedure = procInfo; + itemInfo.MyDocVersion = docVersionInfo; + if (itemInfo.MyContent.ContentPartCount > 0) + foreach (PartInfo pi in itemInfo.MyContent.ContentParts) + foreach (ItemInfo ii in pi.MyItems) + SetParentSectionAndDocVersion(ii, itemInfo, (itemInfo as SectionInfo) ?? sectionInfo, procInfo, docVersionInfo); + } private int _PrintBias = 0; public int PrintBias { @@ -730,7 +743,7 @@ namespace VEPROMS.CSLA.Library throw new DbCslaException("ItemInfoList.DataPortal_Fetch", ex); } } - private void AddPart(SafeDataReader dr, ItemInfo itemInfo) + internal void AddPart(SafeDataReader dr, ItemInfo itemInfo) { // Either a new PartInfo or an existing PartInfo if (dr.IsDBNull(dr.GetOrdinal("PreviousID"))) @@ -971,7 +984,9 @@ namespace VEPROMS.CSLA.Library // check config value on my section, if null/default use Pmode of active format if (ActiveSection != null) { - SectionInfo si = SectionInfo.Get(ActiveSection.ItemID); //ActiveSection as SectionInfo; + SectionInfo si = ActiveSection as SectionInfo; + if(si == null) + si = SectionInfo.Get(ActiveSection.ItemID); //ActiveSection as SectionInfo; if (si != null) { // there is no longer a "default" ENUM item - SectionConfig will return format default if needed @@ -1185,8 +1200,8 @@ namespace VEPROMS.CSLA.Library } #endregion #region Ordinal CslaType and Tostring - [NonSerialized] - private int? _Ordinal; + //[NonSerialized] + internal int? _Ordinal; public int Ordinal { get @@ -1569,14 +1584,19 @@ namespace VEPROMS.CSLA.Library } } } + internal ItemInfo _MyParent; public ItemInfo MyParent { get { + if (_MyParent == null) + { //if (ItemDocVersionCount > 0) return ItemDocVersions[0]; Need to create one interface to support Folders, DocVersions and Items ContentInfo parentContent = ParentContent; if (parentContent == null || parentContent.ContentItemCount == 0) return null; - return parentContent.ContentItems[0]; + _MyParent = parentContent.ContentItems[0]; + } + return _MyParent; } } #endregion @@ -1587,6 +1607,12 @@ namespace VEPROMS.CSLA.Library itemInfoList = Lookup(fromType); return itemInfoList; } + private bool _LoadAllAtOnce; + public bool LoadAllAtOnce + { + get { return _LoadAllAtOnce; } + set { _LoadAllAtOnce = value; } + } internal ItemInfoList Lookup(int fromType) { ItemInfoList itemInfoList = null; @@ -1594,6 +1620,9 @@ namespace VEPROMS.CSLA.Library foreach (PartInfo partInfo in MyContent.ContentParts) if (partInfo.FromType == fromType) { + if(LoadAllAtOnce) + itemInfoList = partInfo._MyItems;// = ItemInfoList.GetList(partInfo.ItemID, partInfo.FromType); + else itemInfoList = partInfo._MyItems = ItemInfoList.GetList(partInfo.ItemID, partInfo.FromType); return itemInfoList; } @@ -1798,17 +1827,27 @@ namespace VEPROMS.CSLA.Library return true; } } + private ProcedureInfo _MyProcedure; public ProcedureInfo MyProcedure { get { - // Walk up active parents until the parent is not an item - ItemInfo tmp = this; - while (tmp.ActiveParent != null && !tmp.ActiveParent.IsDocVersion) - tmp = (ItemInfo)tmp.ActiveParent; - if (tmp is ProcedureInfo) - return tmp as ProcedureInfo; - return ProcedureInfo.Get(tmp.ItemID); + if (_MyProcedure == null) + { + // Walk up active parents until the parent is not an item + ItemInfo tmp = this; + while (tmp.ActiveParent != null && !tmp.ActiveParent.IsDocVersion) + tmp = (ItemInfo)tmp.ActiveParent; + if (tmp is ProcedureInfo) + _MyProcedure = tmp as ProcedureInfo; + else + _MyProcedure = ProcedureInfo.Get(tmp.ItemID); + } + return _MyProcedure; + } + set + { + _MyProcedure = value; } } private ItemInfo _MyHLS = null; @@ -1847,8 +1886,9 @@ namespace VEPROMS.CSLA.Library } return _MyDocVersion; } + set { _MyDocVersion = value; } } - private IVEDrillDownReadOnly _ActiveParent = null; + internal IVEDrillDownReadOnly _ActiveParent = null; public IVEDrillDownReadOnly MyActiveParent { get { return _ActiveParent; } } public IVEDrillDownReadOnly ActiveParent { @@ -1895,7 +1935,7 @@ namespace VEPROMS.CSLA.Library _ActiveParent = value; } } - private ItemInfo _ActiveSection = null; + internal ItemInfo _ActiveSection = null; /// /// MyActiveSection is used to determine if _ActiveSection is null or not. /// @@ -3666,7 +3706,7 @@ namespace VEPROMS.CSLA.Library // throw new System.Security.SecurityException("User not authorized to view a Item"); try { - ProcedureInfo tmp = GetCachedByPrimaryKey(itemID) as ProcedureInfo; + ProcedureInfo tmp = GetCachedByPrimaryKey(itemID); if (tmp == null) { tmp = DataPortal.Fetch(new PKCriteria(itemID)); @@ -3680,6 +3720,16 @@ namespace VEPROMS.CSLA.Library throw new DbCslaException("Error on Item.Get", ex); } } + protected new static ProcedureInfo GetCachedByPrimaryKey(int itemID) + { + ConvertListToDictionary(); + string key = itemID.ToString(); + if (_CacheByPrimaryKey.ContainsKey(key)) + foreach (ItemInfo ii in _CacheByPrimaryKey[key]) + if (ii is ProcedureInfo) + return ii as ProcedureInfo; + return null; + } public void MoveProcedure(IVEDrillDownReadOnly pInfo, int index) { using (Item ii = Item.Get(this.ItemID)) @@ -3706,6 +3756,99 @@ namespace VEPROMS.CSLA.Library { get { return ActiveParent as DocVersionInfo; } } + public static ProcedureInfo GetItemAndChildren(int? itemID) + { + try + { + ProcedureInfo tmp = DataPortal.Fetch(new ItemAndChildrenCriteria(itemID)); + //AddToCache(tmp); + if (tmp.ErrorMessage == "No Record Found") tmp = null; + if (tmp != null) + SetParentSectionAndDocVersion(tmp, tmp.MyDocVersion, null, tmp, tmp.MyDocVersion); + return tmp; + } + catch (Exception ex) + { + throw new DbCslaException("Error on ItemInfoList.GetChildren", ex); + } + } + [Serializable()] + private class ItemAndChildrenCriteria + { + public ItemAndChildrenCriteria(int? itemID) + { + _ItemID = itemID; + } + private int? _ItemID; + public int? ItemID + { + get { return _ItemID; } + set { _ItemID = value; } + } + } + // Data Portal to Get Item and Children + private void DataPortal_Fetch(ItemAndChildrenCriteria criteria) + { + //ItemInfo tmp = null; + Dictionary lookup = new Dictionary(); ; + try + { + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "vesp_ListItemAndChildren"; + cm.Parameters.AddWithValue("@ItemID", criteria.ItemID); + cm.Parameters.AddWithValue("@ParentID", 0); + cm.CommandTimeout = Database.DefaultTimeout; + using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader())) + { + while (dr.Read()) + { + if (dr.GetInt32("Level") == 0) + { + //tmp = itemInfo; + ReadData(dr); + AddContent(dr); + lookup[this.ItemID] = this; + } + else + { + ItemInfo itemInfo = null; + int itemType = dr.GetInt32("Type") / 10000; + switch (itemType) + { + case 0: + itemInfo = new ProcedureInfo(dr); + break; + case 1: + itemInfo = new SectionInfo(dr); + break; + case 2: + itemInfo = new StepInfo(dr); + break; + } + // Load Children + itemInfo.AddContent(dr); + ItemInfo parent = lookup[dr.GetInt32("ParentID")]; + itemInfo._ActiveParent = parent; + itemInfo._ActiveSection = (itemInfo.IsSection ? itemInfo : parent._ActiveSection); + parent.AddPart(dr, itemInfo); + lookup.Add(itemInfo.ItemID, itemInfo); + } + } + //Console.WriteLine("I'm here {0}",this.MyContent.ContentPartCount); + } + } + } + } + catch (Exception ex) + { + Database.LogException("ItemInfoList.DataPortal_Fetch", ex); + throw new DbCslaException("ItemInfoList.DataPortal_Fetch", ex); + } + } } #endregion #region Procedure @@ -3854,7 +3997,7 @@ namespace VEPROMS.CSLA.Library // throw new System.Security.SecurityException("User not authorized to view a Item"); try { - SectionInfo tmp = GetCachedByPrimaryKey(itemID) as SectionInfo; + SectionInfo tmp = GetCachedByPrimaryKey(itemID); if (tmp == null) { tmp = DataPortal.Fetch(new PKCriteria(itemID)); @@ -3868,6 +4011,16 @@ namespace VEPROMS.CSLA.Library throw new DbCslaException("Error on Item.Get", ex); } } + protected new static SectionInfo GetCachedByPrimaryKey(int itemID) + { + ConvertListToDictionary(); + string key = itemID.ToString(); + if (_CacheByPrimaryKey.ContainsKey(key)) + foreach (ItemInfo ii in _CacheByPrimaryKey[key]) + if (ii is SectionInfo) + return ii as SectionInfo; + return null; + } public void MoveSection(IVEDrillDownReadOnly pInfo, int index) { using (Item ii = Item.Get(this.ItemID)) @@ -3986,7 +4139,7 @@ namespace VEPROMS.CSLA.Library // throw new System.Security.SecurityException("User not authorized to view a Item"); try { - StepInfo tmp = GetCachedByPrimaryKey(itemID) as StepInfo; + StepInfo tmp = GetCachedByPrimaryKey(itemID); if (tmp == null) { tmp = DataPortal.Fetch(new PKCriteria(itemID)); @@ -4000,6 +4153,16 @@ namespace VEPROMS.CSLA.Library throw new DbCslaException("Error on Item.Get", ex); } } + protected new static StepInfo GetCachedByPrimaryKey(int itemID) + { + ConvertListToDictionary(); + string key = itemID.ToString(); + if (_CacheByPrimaryKey.ContainsKey(key)) + foreach (ItemInfo ii in _CacheByPrimaryKey[key]) + if (ii is StepInfo) + return ii as StepInfo; + return null; + } public void MoveStep(IVEDrillDownReadOnly pInfo, int index) { using (Item ii = Item.Get(this.ItemID))