private object EvaluateFilterValue(Microsoft.ReportingServices.ReportIntermediateFormat.Filter filterDef)
 {
     Global.Tracer.Assert(filterDef.Values != null, "(filterDef.Values != null)");
     Global.Tracer.Assert(filterDef.Values.Count > 0, "(filterDef.Values.Count > 0)");
     Microsoft.ReportingServices.RdlExpressions.VariantResult variantResult = m_processingContext.ReportRuntime.EvaluateFilterVariantValue(filterDef, 0, m_objectType, m_objectName);
     ThrowIfErrorOccurred("FilterValue", variantResult.ErrorOccurred, variantResult.FieldStatus);
     return(variantResult.Value);
 }
 private object[] EvaluateFilterValues(Microsoft.ReportingServices.ReportIntermediateFormat.Filter filterDef)
 {
     if (filterDef.Values != null)
     {
         object[] array = new object[filterDef.Values.Count];
         for (int num = filterDef.Values.Count - 1; num >= 0; num--)
         {
             Microsoft.ReportingServices.RdlExpressions.VariantResult variantResult = m_processingContext.ReportRuntime.EvaluateFilterVariantValue(filterDef, num, m_objectType, m_objectName);
             ThrowIfErrorOccurred("FilterValues", variantResult.ErrorOccurred, variantResult.FieldStatus);
             array[num] = variantResult.Value;
         }
         return(array);
     }
     return(null);
 }
        internal bool PassFilters(object dataInstance, out bool specialFilter)
        {
            bool flag = true;

            specialFilter = false;
            if (m_failFilters)
            {
                return(false);
            }
            if (m_filters != null)
            {
                for (int num = m_startFilterIndex; num < m_filters.Count; num++)
                {
                    Microsoft.ReportingServices.ReportIntermediateFormat.Filter filter = m_filters[num];
                    if (Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.Like == filter.Operator)
                    {
                        Microsoft.ReportingServices.RdlExpressions.StringResult stringResult = m_processingContext.ReportRuntime.EvaluateFilterStringExpression(filter, m_objectType, m_objectName);
                        ThrowIfErrorOccurred("FilterExpression", stringResult.ErrorOccurred, stringResult.FieldStatus);
                        Global.Tracer.Assert(filter.Values != null, "(null != filter.Values)");
                        Global.Tracer.Assert(1 <= filter.Values.Count, "(1 <= filter.Values.Count)");
                        Microsoft.ReportingServices.RdlExpressions.StringResult stringResult2 = m_processingContext.ReportRuntime.EvaluateFilterStringValue(filter, 0, m_objectType, m_objectName);
                        ThrowIfErrorOccurred("FilterValue", stringResult2.ErrorOccurred, stringResult2.FieldStatus);
                        if (stringResult.Value != null && stringResult2.Value != null)
                        {
                            if (!StringType.StrLikeText(stringResult.Value, stringResult2.Value))
                            {
                                flag = false;
                            }
                        }
                        else if (stringResult.Value != null || stringResult2.Value != null)
                        {
                            flag = false;
                        }
                    }
                    else
                    {
                        Microsoft.ReportingServices.RdlExpressions.VariantResult variantResult = m_processingContext.ReportRuntime.EvaluateFilterVariantExpression(filter, m_objectType, m_objectName);
                        ThrowIfErrorOccurred("FilterExpression", variantResult.ErrorOccurred, variantResult.FieldStatus);
                        object value = variantResult.Value;
                        if (filter.Operator == Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.Equal || Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.NotEqual == filter.Operator || Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.GreaterThan == filter.Operator || Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.GreaterThanOrEqual == filter.Operator || Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.LessThan == filter.Operator || Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.LessThanOrEqual == filter.Operator)
                        {
                            object value2 = EvaluateFilterValue(filter);
                            int    num2   = 0;
                            try
                            {
                                num2 = Compare(value, value2);
                            }
                            catch (ReportProcessingException_SpatialTypeComparisonError reportProcessingException_SpatialTypeComparisonError)
                            {
                                throw new ReportProcessingException(RegisterSpatialTypeComparisonError(reportProcessingException_SpatialTypeComparisonError.Type));
                            }
                            catch (ReportProcessingException_ComparisonError e)
                            {
                                throw new ReportProcessingException(RegisterComparisonError(e));
                            }
                            catch (Exception e2)
                            {
                                if (AsynchronousExceptionDetection.IsStoppingException(e2))
                                {
                                    throw;
                                }
                                throw new ReportProcessingException(RegisterComparisonError());
                            }
                            if (flag)
                            {
                                switch (filter.Operator)
                                {
                                case Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.Equal:
                                    if (num2 != 0)
                                    {
                                        flag = false;
                                    }
                                    break;

                                case Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.NotEqual:
                                    if (num2 == 0)
                                    {
                                        flag = false;
                                    }
                                    break;

                                case Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.GreaterThan:
                                    if (0 >= num2)
                                    {
                                        flag = false;
                                    }
                                    break;

                                case Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.GreaterThanOrEqual:
                                    if (0 > num2)
                                    {
                                        flag = false;
                                    }
                                    break;

                                case Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.LessThan:
                                    if (0 <= num2)
                                    {
                                        flag = false;
                                    }
                                    break;

                                case Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.LessThanOrEqual:
                                    if (0 < num2)
                                    {
                                        flag = false;
                                    }
                                    break;
                                }
                            }
                        }
                        else if (Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.In == filter.Operator)
                        {
                            object[] array = EvaluateFilterValues(filter);
                            flag = false;
                            if (array != null)
                            {
                                for (int i = 0; i < array.Length; i++)
                                {
                                    try
                                    {
                                        if (array[i] is ICollection)
                                        {
                                            foreach (object item in (ICollection)array[i])
                                            {
                                                if (Compare(value, item) == 0)
                                                {
                                                    flag = true;
                                                    break;
                                                }
                                            }
                                        }
                                        else if (Compare(value, array[i]) == 0)
                                        {
                                            flag = true;
                                        }
                                        if (flag)
                                        {
                                            goto IL_05e1;
                                        }
                                    }
                                    catch (ReportProcessingException_SpatialTypeComparisonError reportProcessingException_SpatialTypeComparisonError2)
                                    {
                                        throw new ReportProcessingException(RegisterSpatialTypeComparisonError(reportProcessingException_SpatialTypeComparisonError2.Type));
                                    }
                                    catch (ReportProcessingException_ComparisonError e3)
                                    {
                                        throw new ReportProcessingException(RegisterComparisonError(e3));
                                    }
                                    catch (Exception e4)
                                    {
                                        if (AsynchronousExceptionDetection.IsStoppingException(e4))
                                        {
                                            throw;
                                        }
                                        throw new ReportProcessingException(RegisterComparisonError());
                                    }
                                }
                            }
                        }
                        else if (Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.Between == filter.Operator)
                        {
                            object[] array2 = EvaluateFilterValues(filter);
                            flag = false;
                            Global.Tracer.Assert(array2 != null && 2 == array2.Length, "(null != values && 2 == values.Length)");
                            try
                            {
                                if (0 <= Compare(value, array2[0]) && 0 >= Compare(value, array2[1]))
                                {
                                    flag = true;
                                }
                            }
                            catch (ReportProcessingException_SpatialTypeComparisonError reportProcessingException_SpatialTypeComparisonError3)
                            {
                                throw new ReportProcessingException(RegisterSpatialTypeComparisonError(reportProcessingException_SpatialTypeComparisonError3.Type));
                            }
                            catch (ReportProcessingException_ComparisonError e5)
                            {
                                throw new ReportProcessingException(RegisterComparisonError(e5));
                            }
                            catch (RSException)
                            {
                                throw;
                            }
                            catch (Exception e6)
                            {
                                if (AsynchronousExceptionDetection.IsStoppingException(e6))
                                {
                                    throw;
                                }
                                throw new ReportProcessingException(RegisterComparisonError());
                            }
                        }
                        else if (Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.TopN == filter.Operator || Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.BottomN == filter.Operator)
                        {
                            if (m_filterInfo == null)
                            {
                                Global.Tracer.Assert(filter.Values != null && 1 == filter.Values.Count, "(null != filter.Values && 1 == filter.Values.Count)");
                                Microsoft.ReportingServices.RdlExpressions.IntegerResult integerResult = m_processingContext.ReportRuntime.EvaluateFilterIntegerValue(filter, 0, m_objectType, m_objectName);
                                ThrowIfErrorOccurred("FilterValue", integerResult.ErrorOccurred, integerResult.FieldStatus);
                                int       value3   = integerResult.Value;
                                IComparer comparer = (Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.TopN != filter.Operator) ? ((IComparer) new MyBottomComparer(m_processingContext.ProcessingComparer)) : ((IComparer) new MyTopComparer(m_processingContext.ProcessingComparer));
                                InitFilterInfos(new MySortedListWithMaxSize(comparer, value3, this), num);
                            }
                            SortAndSave(value, dataInstance);
                            flag          = false;
                            specialFilter = true;
                        }
                        else if (Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.TopPercent == filter.Operator || Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.BottomPercent == filter.Operator)
                        {
                            if (m_filterInfo == null)
                            {
                                Global.Tracer.Assert(filter.Values != null && 1 == filter.Values.Count, "(null != filter.Values && 1 == filter.Values.Count)");
                                Microsoft.ReportingServices.RdlExpressions.FloatResult floatResult = m_processingContext.ReportRuntime.EvaluateFilterIntegerOrFloatValue(filter, 0, m_objectType, m_objectName);
                                ThrowIfErrorOccurred("FilterValue", floatResult.ErrorOccurred, floatResult.FieldStatus);
                                double    value4    = floatResult.Value;
                                IComparer comparer2 = (Microsoft.ReportingServices.ReportIntermediateFormat.Filter.Operators.TopPercent != filter.Operator) ? ((IComparer) new MyBottomComparer(m_processingContext.ProcessingComparer)) : ((IComparer) new MyTopComparer(m_processingContext.ProcessingComparer));
                                InitFilterInfos(new MySortedListWithoutMaxSize(comparer2, this), num);
                                m_filterInfo.Percentage = value4;
                                m_filterInfo.Operator   = filter.Operator;
                            }
                            SortAndSave(value, dataInstance);
                            flag          = false;
                            specialFilter = true;
                        }
                    }
                    goto IL_05e1;
IL_05e1:
                    if (!flag)
                    {
                        return(false);
                    }
                }
            }
            return(flag);
        }