예제 #1
0
 private void SetValue(int index, T value, bool fromAdd)
 {
     CheckIndex(index, m_count - 1);
     if (m_array != null)
     {
         using (m_array.PinValue())
         {
             m_array.Value().Array[index] = value;
             if (fromAdd)
             {
                 m_array.UpdateSize(ItemSizes.SizeOfInObjectArray(value));
             }
         }
     }
     else
     {
         IReference <StorableArray> reference = m_buckets[GetBucketIndex(index)];
         using (reference.PinValue())
         {
             reference.Value().Array[GetIndexInBucket(index)] = value;
             if (fromAdd)
             {
                 reference.UpdateSize(ItemSizes.SizeOfInObjectArray(value));
             }
         }
     }
     m_version++;
 }
        public RuntimeCell GetAndPinCell(int key, out IDisposable cleanupRef)
        {
            cleanupRef = null;
            IStorable storable = default(IStorable);
            bool      flag;

            if (key < this.m_collection.Count)
            {
                cleanupRef = this.m_collection.GetAndPin(key, out storable);
                flag       = (storable != null);
            }
            else
            {
                storable = null;
                flag     = false;
            }
            if (flag)
            {
                if (this.IsCellReference(storable))
                {
                    if (cleanupRef != null)
                    {
                        cleanupRef.Dispose();
                    }
                    IReference <RuntimeCell> reference = (IReference <RuntimeCell>)storable;
                    reference.PinValue();
                    cleanupRef = (IDisposable)reference;
                    return(reference.Value());
                }
                return((RuntimeCell)storable);
            }
            return(null);
        }
예제 #3
0
 internal static IOnDemandScopeInstance GetCellInstance(IReference <IOnDemandMemberInstance> outerGroupLeafRef, IReference <IOnDemandMemberInstance> innerGroupLeafRef, out IReference <IOnDemandScopeInstance> cellRef)
 {
     using (innerGroupLeafRef.PinValue())
     {
         return(innerGroupLeafRef.Value().GetCellInstance((IOnDemandMemberInstanceReference)outerGroupLeafRef, out cellRef));
     }
 }
예제 #4
0
 public T this[int index]
 {
     get
     {
         CheckIndex(index, m_count - 1);
         if (m_array != null)
         {
             using (m_array.PinValue())
             {
                 return((T)m_array.Value().Array[index]);
             }
         }
         IReference <StorableArray> reference = m_buckets[GetBucketIndex(index)];
         using (reference.PinValue())
         {
             StorableArray bucket = reference.Value();
             return(GetValueAt(index, bucket));
         }
     }
     set
     {
         CheckReadOnly("set value");
         SetValue(index, value, fromAdd: false);
     }
 }
예제 #5
0
        public bool Remove(T item)
        {
            CheckReadOnly("Remove");
            EqualityComparer <T> @default = EqualityComparer <T> .Default;

            if (m_array != null)
            {
                using (m_array.PinValue())
                {
                    object[] array = m_array.Value().Array;
                    return(Remove(item, 0, array, m_count, @default));
                }
            }
            bool flag  = false;
            int  count = m_buckets.Count;

            for (int i = 0; i < count; i++)
            {
                if (flag)
                {
                    break;
                }
                IReference <StorableArray> reference = m_buckets[i];
                using (reference.PinValue())
                {
                    int      limit  = (i != count - 1) ? m_bucketSize : (m_count - i * m_bucketSize);
                    object[] array2 = reference.Value().Array;
                    flag = Remove(item, i * m_bucketSize, array2, limit, @default);
                }
            }
            return(flag);
        }
예제 #6
0
        private IDisposable SetAndPin(int index, T item, bool fromAdd)
        {
            CheckIndex(index, m_count - 1);
            IDisposable result;

            if (m_array != null)
            {
                result = m_array.PinValue();
                m_array.Value().Array[index] = item;
                if (fromAdd)
                {
                    m_array.UpdateSize(ItemSizes.SizeOfInObjectArray(item));
                }
            }
            else
            {
                int bucketIndex = GetBucketIndex(index);
                IReference <StorableArray> reference          = m_buckets[bucketIndex];
                UnPinCascadeHolder         unPinCascadeHolder = new UnPinCascadeHolder();
                unPinCascadeHolder.AddCleanupRef(reference.PinValue());
                m_buckets.PinContainingBucket(bucketIndex, unPinCascadeHolder);
                result = unPinCascadeHolder;
                reference.Value().Array[GetIndexInBucket(index)] = item;
                if (fromAdd)
                {
                    reference.UpdateSize(ItemSizes.SizeOfInObjectArray(item));
                }
            }
            return(result);
        }
 public void RegisterActiveParent(IReference <IOnDemandScopeInstance> parentScopeInstanceRef)
 {
     using (parentScopeInstanceRef.PinValue())
     {
         parentScopeInstanceRef.Value().SetupEnvironment();
         m_lastPrimaryKeyValues = m_activeRelationship.EvaluateJoinConditionKeys(evaluatePrimaryKeys: true, m_odpContext.ReportRuntime);
         UpdateActiveParent(parentScopeInstanceRef);
     }
 }
예제 #8
0
 public void RegisterActiveParent(IReference <IOnDemandScopeInstance> parentScopeInstanceRef)
 {
     using (parentScopeInstanceRef.PinValue())
     {
         IOnDemandScopeInstance onDemandScopeInstance = parentScopeInstanceRef.Value();
         onDemandScopeInstance.SetupEnvironment();
         this.m_lastPrimaryKeyValues = this.m_activeRelationship.EvaluateJoinConditionKeys(true, base.m_odpContext.ReportRuntime);
         this.UpdateActiveParent(parentScopeInstanceRef);
     }
 }
예제 #9
0
 internal override void CreateInstances(IReference <RuntimeDataRegionObj> containingScopeRef, OnDemandProcessingContext odpContext, DataRegionInstance dataRegionInstance, bool isOuterGrouping, IReference <RuntimeDataTablixGroupRootObj> currOuterGroupRoot, ScopeInstance parentInstance, IReference <RuntimeMemberObj>[] innerMembers, IReference <RuntimeDataTablixGroupLeafObj> innerGroupLeaf)
 {
     Microsoft.ReportingServices.ReportIntermediateFormat.DataRegion dataRegionDef = dataRegionInstance.DataRegionDef;
     if (isOuterGrouping && m_hasStaticMembers)
     {
         dataRegionDef.NewOuterCells();
     }
     if (null != m_groupRoot)
     {
         dataRegionDef.CurrentOuterGroupRoot = currOuterGroupRoot;
         using (m_groupRoot.PinValue())
         {
             m_groupRoot.Value().CreateInstances(parentInstance, innerMembers, innerGroupLeaf);
         }
         if (m_staticLeafCellIndexes == null)
         {
             return;
         }
         if (isOuterGrouping && m_hasStaticMembers)
         {
             dataRegionDef.NewOuterCells();
         }
         IReference <RuntimeDataTablixGroupRootObj> reference = null;
         if (m_owner is IReference <RuntimeDataTablixObj> )
         {
             using (m_owner.PinValue())
             {
                 ((RuntimeDataTablixObj)m_owner.Value()).SetupEnvironment();
             }
             if (isOuterGrouping && m_hasStaticMembers)
             {
                 reference = dataRegionDef.CurrentOuterGroupRoot;
                 dataRegionDef.CurrentOuterGroupRoot = null;
                 currOuterGroupRoot = null;
             }
         }
         else
         {
             using (containingScopeRef.PinValue())
             {
                 containingScopeRef.Value().SetupEnvironment();
             }
         }
         CreateCells(containingScopeRef, odpContext, dataRegionInstance, isOuterGrouping, currOuterGroupRoot, parentInstance, innerMembers, innerGroupLeaf);
         if (reference != null)
         {
             dataRegionDef.CurrentOuterGroupRoot = reference;
         }
     }
     else
     {
         CreateCells(containingScopeRef, odpContext, dataRegionInstance, isOuterGrouping, currOuterGroupRoot, parentInstance, innerMembers, innerGroupLeaf);
     }
 }
예제 #10
0
        internal override void InstanceComplete()
        {
            if (m_reportInstance != null)
            {
                m_reportInstance.Value()?.InstanceComplete();
            }
            IReference <SubReportInstance> obj = (IReference <SubReportInstance>)m_cleanupRef;

            base.InstanceComplete();
            obj.PinValue();
        }
예제 #11
0
 internal override void CalculatePreviousAggregates()
 {
     if (m_previousValuesInGroup != null)
     {
         AggregatesImpl aggregatesImpl = m_odpContext.ReportObjectModel.AggregatesImpl;
         for (int i = 0; i < m_previousValuesInGroup.Count; i++)
         {
             string text = m_previousValuesInGroup[i];
             Microsoft.ReportingServices.ReportIntermediateFormat.DataAggregateObj aggregateObj = aggregatesImpl.GetAggregateObj(text);
             Global.Tracer.Assert(aggregateObj != null, "Missing expected previous aggregate: {0}", text);
             aggregateObj.Update();
         }
     }
     if (m_outerScope != null && (m_outerDataAction & DataActions.PostSortAggregates) != 0)
     {
         using (m_outerScope.PinValue())
         {
             m_outerScope.Value().CalculatePreviousAggregates();
         }
     }
 }
 private void ProcessInnerHierarchy(AggregateRowInfo aggregateRowInfo)
 {
     for (int i = 0; i < m_innerGroupings.Length; i++)
     {
         IReference <RuntimeMemberObj> reference = m_innerGroupings[i];
         using (reference.PinValue())
         {
             reference.Value().NextRow(isOuterGrouping: false, m_odpContext);
         }
         aggregateRowInfo.RestoreAggregateInfo(m_odpContext);
     }
 }
예제 #13
0
 protected void ProcessDetailSort()
 {
     if (m_detailUserSortTargetInfo != null && !m_detailUserSortTargetInfo.TargetForNonDetailSort)
     {
         IReference <RuntimeSortFilterEventInfo> reference = m_odpContext.RuntimeSortFilterInfo[m_detailUserSortTargetInfo.SortFilterInfoIndices[0]];
         object sortOrder;
         using (reference.PinValue())
         {
             sortOrder = reference.Value().GetSortOrder(m_odpContext.ReportRuntime);
         }
         m_detailUserSortTargetInfo.SortTree.NextRow(sortOrder, this);
     }
 }
예제 #14
0
 public void AddSortInfoIndex(int sortInfoIndex, IReference <RuntimeSortFilterEventInfo> sortInfoRef)
 {
     using (sortInfoRef.PinValue())
     {
         RuntimeSortFilterEventInfo runtimeSortFilterEventInfo = sortInfoRef.Value();
         Global.Tracer.Assert(runtimeSortFilterEventInfo.EventSource.UserSort.SortExpressionScope == null || !runtimeSortFilterEventInfo.TargetSortFilterInfoAdded);
         if (this.m_sortFilterInfoIndices == null)
         {
             this.m_sortFilterInfoIndices = new List <int>();
         }
         this.m_sortFilterInfoIndices.Add(sortInfoIndex);
         runtimeSortFilterEventInfo.TargetSortFilterInfoAdded = true;
     }
 }
        private void ProcessOuterHierarchy(AggregateRowInfo aggregateRowInfo, int outerGroupingIndex)
        {
            m_odpContext.PeerOuterGroupProcessing = (outerGroupingIndex != 0);
            m_dataRegionDef.ResetOuterGroupingIndexesForOuterPeerGroup(0);
            m_dataRegionDef.ResetOuterGroupingAggregateRowInfo();
            m_dataRegionDef.SetDataTablixAggregateRowInfo(aggregateRowInfo);
            IReference <RuntimeMemberObj> reference = m_outerGroupings[outerGroupingIndex];

            using (reference.PinValue())
            {
                reference.Value().NextRow(isOuterGrouping: true, m_odpContext);
            }
            aggregateRowInfo.RestoreAggregateInfo(m_odpContext);
        }
예제 #16
0
 public void ProcessUserSortForTarget(ObjectModelImpl reportObjectModel, AspNetCore.ReportingServices.RdlExpressions.ReportRuntime reportRuntime, IReference <IHierarchyObj> target, ref ScalableList <DataFieldRow> dataRows, bool targetForNonDetailSort)
 {
     using (target.PinValue())
     {
         IHierarchyObj hierarchyObj = target.Value();
         if (targetForNonDetailSort && dataRows != null && 0 < dataRows.Count)
         {
             IReference <RuntimeSortFilterEventInfo> reference = null;
             try
             {
                 List <int> sortFilterInfoIndices = hierarchyObj.SortFilterInfoIndices;
                 Global.Tracer.Assert(null != hierarchyObj.SortTree, "(null != targetObj.SortTree)");
                 if (sortFilterInfoIndices != null)
                 {
                     reference = this.m_runtimeSortFilterInfo[sortFilterInfoIndices[0]];
                 }
                 RuntimeSortFilterEventInfo runtimeSortFilterEventInfo = null;
                 if (reference != null)
                 {
                     reference.PinValue();
                     runtimeSortFilterEventInfo = reference.Value();
                 }
                 for (int i = 0; i < dataRows.Count; i++)
                 {
                     dataRows[i].SetFields(reportObjectModel.FieldsImpl);
                     object keyValue = DBNull.Value;
                     if (runtimeSortFilterEventInfo != null)
                     {
                         keyValue = runtimeSortFilterEventInfo.GetSortOrder(reportRuntime);
                     }
                     hierarchyObj.SortTree.NextRow(keyValue, hierarchyObj);
                 }
             }
             finally
             {
                 if (reference != null)
                 {
                     reference.UnPinValue();
                 }
             }
             if (dataRows != null)
             {
                 dataRows.Dispose();
             }
             dataRows = null;
         }
         hierarchyObj.MarkSortInfoProcessed(this.m_runtimeSortFilterInfo);
     }
 }
예제 #17
0
 internal void RemoveDomainScopes(IReference <RuntimeMemberObj>[] membersDef, int startIndex)
 {
     for (int i = startIndex; i < membersDef.Length; i++)
     {
         IReference <RuntimeMemberObj> reference = membersDef[i];
         using (reference.PinValue())
         {
             IReference <RuntimeGroupRootObj> groupRoot = ((RuntimeDataTablixMemberObj)reference.Value()).GroupRoot;
             using (groupRoot.PinValue())
             {
                 m_domainScopes.Remove(groupRoot.Value().HierarchyDef.OriginalScopeID);
             }
         }
     }
 }
예제 #18
0
 void IHierarchyObj.NextRow(IHierarchyObj owner)
 {
     if (m_dataHolder != null)
     {
         using (m_dataHolder.PinValue())
         {
             m_dataHolder.Value().NextRow();
         }
     }
     else if (m_sortHierarchyStruct != null)
     {
         IReference <RuntimeSortFilterEventInfo> sortInfo = m_sortHierarchyStruct.SortInfo;
         object sortOrder;
         using (sortInfo.PinValue())
         {
             sortOrder = sortInfo.Value().GetSortOrder(m_odpContext.ReportRuntime);
         }
         m_sortHierarchyStruct.SortTree.NextRow(sortOrder, this);
     }
     else if (m_dataRowHolder != null)
     {
         m_dataRowHolder.NextRow(m_odpContext, Depth + 1);
     }
 }
예제 #19
0
 private void CreateCells(IReference <RuntimeDataRegionObj> containingScopeRef, OnDemandProcessingContext odpContext, DataRegionInstance dataRegionInstance, bool isOuterGroup, IReference <RuntimeDataTablixGroupRootObj> currOuterGroupRoot, ScopeInstance parentInstance, IReference <RuntimeMemberObj>[] innerMembers, IReference <RuntimeDataTablixGroupLeafObj> innerGroupLeafRef)
 {
     using (containingScopeRef.PinValue())
     {
         RuntimeDataRegionObj runtimeDataRegionObj = containingScopeRef.Value();
         if (runtimeDataRegionObj is RuntimeDataTablixGroupLeafObj)
         {
             ((RuntimeDataTablixGroupLeafObj)runtimeDataRegionObj).CreateStaticCells(dataRegionInstance, parentInstance, currOuterGroupRoot, isOuterGroup, m_staticLeafCellIndexes, innerMembers, innerGroupLeafRef);
         }
         else
         {
             ((RuntimeDataTablixObj)runtimeDataRegionObj).CreateOutermostStaticCells(dataRegionInstance, isOuterGroup, innerMembers, innerGroupLeafRef);
         }
     }
 }
예제 #20
0
        public override void InstanceComplete()
        {
            if (this.m_reportInstance != null)
            {
                ReportInstance reportInstance = this.m_reportInstance.Value();
                if (reportInstance != null)
                {
                    reportInstance.InstanceComplete();
                }
            }
            IReference <SubReportInstance> reference = (IReference <SubReportInstance>)base.m_cleanupRef;

            base.InstanceComplete();
            reference.PinValue();
        }
 internal override void NextRow(object keyValue, bool hasParent, object parentKey)
 {
     if (m_lastChild != null && m_owner.OdpContext.EqualityComparer.Equals(m_lastValue, keyValue))
     {
         using (m_lastChild.PinValue())
         {
             m_lastChild.Value().NextRow();
         }
     }
     else
     {
         m_lastValue = keyValue;
         m_lastChild = CreateHierarchyObjAndAddToParent();
     }
 }
 public static void AddRunningValues(OnDemandProcessingContext odpContext, List <AspNetCore.ReportingServices.ReportIntermediateFormat.RunningValueInfo> runningValues, ref List <string> runningValuesInGroup, ref List <string> previousValuesInGroup, Dictionary <string, IReference <RuntimeGroupRootObj> > groupCollection, IReference <RuntimeGroupRootObj> lastGroup)
 {
     if (runningValues != null && 0 < runningValues.Count)
     {
         if (runningValuesInGroup == null)
         {
             runningValuesInGroup = new List <string>();
         }
         if (previousValuesInGroup == null)
         {
             previousValuesInGroup = new List <string>();
         }
         AggregatesImpl aggregatesImpl = odpContext.ReportObjectModel.AggregatesImpl;
         for (int i = 0; i < runningValues.Count; i++)
         {
             AspNetCore.ReportingServices.ReportIntermediateFormat.RunningValueInfo runningValueInfo = runningValues[i];
             AspNetCore.ReportingServices.ReportIntermediateFormat.DataAggregateObj dataAggregateObj = aggregatesImpl.GetAggregateObj(runningValueInfo.Name);
             if (dataAggregateObj == null)
             {
                 dataAggregateObj = new AspNetCore.ReportingServices.ReportIntermediateFormat.DataAggregateObj(runningValueInfo, odpContext);
                 aggregatesImpl.Add(dataAggregateObj);
             }
             if (runningValueInfo.Scope != null)
             {
                 IReference <RuntimeGroupRootObj> reference = default(IReference <RuntimeGroupRootObj>);
                 if (groupCollection.TryGetValue(runningValueInfo.Scope, out reference))
                 {
                     using (reference.PinValue())
                     {
                         reference.Value().AddScopedRunningValue(dataAggregateObj);
                     }
                 }
                 else
                 {
                     Global.Tracer.Assert(false);
                 }
             }
             if (runningValueInfo.AggregateType == AspNetCore.ReportingServices.ReportIntermediateFormat.DataAggregateInfo.AggregateTypes.Previous)
             {
                 previousValuesInGroup.Add(dataAggregateObj.Name);
             }
             else
             {
                 runningValuesInGroup.Add(dataAggregateObj.Name);
             }
         }
     }
 }
예제 #23
0
 private void MarkSortInfoProcessed(List <IReference <RuntimeSortFilterEventInfo> > runtimeSortFilterInfo, IReference <IHierarchyObj> sortTarget, ICollection indices)
 {
     foreach (int index in indices)
     {
         IReference <RuntimeSortFilterEventInfo> reference = runtimeSortFilterInfo[index];
         using (reference.PinValue())
         {
             RuntimeSortFilterEventInfo runtimeSortFilterEventInfo = reference.Value();
             if (runtimeSortFilterEventInfo.EventTarget.Equals(sortTarget))
             {
                 Global.Tracer.Assert(!runtimeSortFilterEventInfo.Processed, "(!runtimeSortInfo.Processed)");
                 runtimeSortFilterEventInfo.Processed = true;
             }
         }
     }
 }
예제 #24
0
        public IDisposable GetAndPin(int index, out T item)
        {
            this.CheckIndex(index, this.m_count - 1);
            if (this.m_array != null)
            {
                this.m_array.PinValue();
                item = (T)this.m_array.Value().Array[index];
                return((IDisposable)this.m_array);
            }
            IReference <StorableArray> reference = this.m_buckets[this.GetBucketIndex(index)];

            reference.PinValue();
            StorableArray bucket = reference.Value();

            item = this.GetValueAt(index, bucket);
            return((IDisposable)reference);
        }
예제 #25
0
		private RuntimeCell GetOrCreateCellByIndex(int groupLeafIndex, Microsoft.ReportingServices.ReportIntermediateFormat.DataRegion dataRegionDef, IReference<RuntimeDataTablixGroupLeafObj> ownerRef, RuntimeDataTablixGroupRootObj currOuterGroupRoot, out IDisposable cleanupRef)
		{
			RuntimeCell andPinCell = GetAndPinCell(groupLeafIndex, out cleanupRef);
			if (andPinCell == null)
			{
				using (ownerRef.PinValue())
				{
					RuntimeDataTablixGroupLeafObj runtimeDataTablixGroupLeafObj = ownerRef.Value();
					if (!RuntimeCell.HasOnlySimpleGroupTreeCells(currOuterGroupRoot.HierarchyDef, runtimeDataTablixGroupLeafObj.MemberDef, dataRegionDef))
					{
						runtimeDataTablixGroupLeafObj.CreateCell(this, groupLeafIndex, currOuterGroupRoot.HierarchyDef, runtimeDataTablixGroupLeafObj.MemberDef, dataRegionDef);
					}
				}
				andPinCell = GetAndPinCell(groupLeafIndex, out cleanupRef);
			}
			return andPinCell;
		}
예제 #26
0
        public int IndexOf(T item)
        {
            EqualityComparer <T> @default = EqualityComparer <T> .Default;

            if (this.m_array != null)
            {
                object[] array = this.m_array.Value().Array;
                for (int i = 0; i < this.m_count; i++)
                {
                    if (@default.Equals(item, (T)array[i]))
                    {
                        return(i);
                    }
                }
            }
            else
            {
                int count = this.m_buckets.Count;
                for (int j = 0; j < count; j++)
                {
                    IReference <StorableArray> reference = this.m_buckets[j];
                    using (reference.PinValue())
                    {
                        object[] array2 = reference.Value().Array;
                        int      num    = 0;
                        if (j == count - 1)
                        {
                            num = this.m_count % this.m_bucketSize;
                        }
                        if (num == 0)
                        {
                            num = this.m_bucketSize;
                        }
                        for (int k = 0; k < num; k++)
                        {
                            if (@default.Equals(item, (T)array2[k]))
                            {
                                return(j * this.m_bucketSize + k);
                            }
                        }
                    }
                }
            }
            return(-1);
        }
예제 #27
0
 private void ProcessParent(object parentKey, IReference <RuntimeGroupLeafObj> parentObj, RuntimeGroupLeafObjReference childObj, bool addToWaitList)
 {
     if (parentObj != null)
     {
         using (parentObj.PinValue())
         {
             parentObj.Value().AddChild(childObj);
         }
     }
     else
     {
         RuntimeGroupRootObj runtimeGroupRootObj = base.m_owner as RuntimeGroupRootObj;
         runtimeGroupRootObj.AddChild(childObj);
         if (addToWaitList)
         {
             ChildLeafInfo childLeafInfo = null;
             IDisposable   disposable2   = null;
             try
             {
                 if (this.m_parentInfo == null)
                 {
                     this.m_parentInfo = this.CreateParentInfo();
                 }
                 else
                 {
                     this.m_parentInfo.TryGetAndPin(parentKey, out childLeafInfo, out disposable2);
                 }
                 if (childLeafInfo == null)
                 {
                     childLeafInfo = new ChildLeafInfo();
                     disposable2   = this.m_parentInfo.AddAndPin(parentKey, childLeafInfo);
                 }
                 childLeafInfo.Add(childObj);
             }
             finally
             {
                 if (disposable2 != null)
                 {
                     disposable2.Dispose();
                 }
             }
         }
     }
 }
 protected void DetailHandleSortFilterEvent(Microsoft.ReportingServices.ReportIntermediateFormat.DataRegion dataRegionDef, IReference <IScope> outerScope, bool isColumnAxis, int rowIndex)
 {
     using (outerScope.PinValue())
     {
         IScope scope = outerScope.Value();
         List <IReference <RuntimeSortFilterEventInfo> > runtimeSortFilterInfo = m_odpContext.RuntimeSortFilterInfo;
         if (runtimeSortFilterInfo == null || dataRegionDef.SortFilterSourceDetailScopeInfo == null || scope.TargetForNonDetailSort)
         {
             return;
         }
         int count = runtimeSortFilterInfo.Count;
         for (int i = 0; i < count; i++)
         {
             IReference <RuntimeSortFilterEventInfo> reference = runtimeSortFilterInfo[i];
             using (reference.PinValue())
             {
                 RuntimeSortFilterEventInfo runtimeSortFilterEventInfo = reference.Value();
                 if (runtimeSortFilterEventInfo.EventSource.ContainingScopes == null || 0 >= runtimeSortFilterEventInfo.EventSource.ContainingScopes.Count || -1 == dataRegionDef.SortFilterSourceDetailScopeInfo[i] || !scope.TargetScopeMatched(i, detailSort: false) || m_odpContext.ReportObjectModel.FieldsImpl.GetRowIndex() != dataRegionDef.SortFilterSourceDetailScopeInfo[i])
                 {
                     continue;
                 }
                 if (runtimeSortFilterEventInfo.EventSource.ContainingScopes.LastEntry == null)
                 {
                     Microsoft.ReportingServices.ReportIntermediateFormat.ReportItem parent = runtimeSortFilterEventInfo.EventSource.Parent;
                     if (runtimeSortFilterEventInfo.EventSource.IsSubReportTopLevelScope)
                     {
                         while (parent != null && !(parent is Microsoft.ReportingServices.ReportIntermediateFormat.SubReport))
                         {
                             parent = parent.Parent;
                         }
                         Global.Tracer.Assert(parent is Microsoft.ReportingServices.ReportIntermediateFormat.SubReport, "(parent is SubReport)");
                         parent = parent.Parent;
                     }
                     if (parent == dataRegionDef)
                     {
                         runtimeSortFilterEventInfo.SetEventSourceScope(isColumnAxis, SelfReference, rowIndex);
                     }
                 }
                 runtimeSortFilterEventInfo.AddDetailScopeInfo(isColumnAxis, SelfReference, rowIndex);
             }
         }
     }
 }
        private void TraverseMember(IReference <RuntimeMemberObj> memberRef, ProcessingStages operation, ITraversalContext context)
        {
            using (memberRef.PinValue())
            {
                switch (operation)
                {
                case ProcessingStages.SortAndFilter:
                    memberRef.Value().SortAndFilter((AggregateUpdateContext)context);
                    break;

                case ProcessingStages.UpdateAggregates:
                    memberRef.Value().UpdateAggregates((AggregateUpdateContext)context);
                    break;

                default:
                    Global.Tracer.Assert(condition: false, "Unknown ProcessingStage in TraverseMember");
                    break;
                }
            }
        }
 protected void DetailHandleSortFilterEvent(AspNetCore.ReportingServices.ReportIntermediateFormat.DataRegion dataRegionDef, IReference <IScope> outerScope, bool isColumnAxis, int rowIndex)
 {
     using (outerScope.PinValue())
     {
         IScope scope = outerScope.Value();
         List <IReference <RuntimeSortFilterEventInfo> > runtimeSortFilterInfo = this.m_odpContext.RuntimeSortFilterInfo;
         if (runtimeSortFilterInfo != null && dataRegionDef.SortFilterSourceDetailScopeInfo != null && !scope.TargetForNonDetailSort)
         {
             int count = runtimeSortFilterInfo.Count;
             for (int i = 0; i < count; i++)
             {
                 IReference <RuntimeSortFilterEventInfo> reference = runtimeSortFilterInfo[i];
                 using (reference.PinValue())
                 {
                     RuntimeSortFilterEventInfo runtimeSortFilterEventInfo = reference.Value();
                     if (runtimeSortFilterEventInfo.EventSource.ContainingScopes != null && 0 < runtimeSortFilterEventInfo.EventSource.ContainingScopes.Count && -1 != dataRegionDef.SortFilterSourceDetailScopeInfo[i] && scope.TargetScopeMatched(i, false) && this.m_odpContext.ReportObjectModel.FieldsImpl.GetRowIndex() == dataRegionDef.SortFilterSourceDetailScopeInfo[i])
                     {
                         if (runtimeSortFilterEventInfo.EventSource.ContainingScopes.LastEntry == null)
                         {
                             AspNetCore.ReportingServices.ReportIntermediateFormat.ReportItem parent = runtimeSortFilterEventInfo.EventSource.Parent;
                             if (runtimeSortFilterEventInfo.EventSource.IsSubReportTopLevelScope)
                             {
                                 while (parent != null && !(parent is AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport))
                                 {
                                     parent = parent.Parent;
                                 }
                                 Global.Tracer.Assert(parent is AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport, "(parent is SubReport)");
                                 parent = parent.Parent;
                             }
                             if (parent == dataRegionDef)
                             {
                                 runtimeSortFilterEventInfo.SetEventSourceScope(isColumnAxis, this.SelfReference, rowIndex);
                             }
                         }
                         runtimeSortFilterEventInfo.AddDetailScopeInfo(isColumnAxis, this.SelfReference, rowIndex);
                     }
                 }
             }
         }
     }
 }