public override void Process(IList <SearchSource> item)
        {
            Recorder.Trace(4L, TraceType.InfoTrace, "SearchDatabase.Process Item:", item);
            SearchMailboxesInputs searchMailboxesInputs = ((SearchMailboxesInputs)base.Executor.Context.Input).Clone();

            searchMailboxesInputs.Sources = item.ToList <SearchSource>();
            ISearchResultProvider  searchResultProvider = SearchFactory.Current.GetSearchResultProvider(base.Policy, searchMailboxesInputs.SearchType);
            SearchMailboxesResults item2 = searchResultProvider.Search(base.Policy, searchMailboxesInputs);

            base.Executor.EnqueueNext(item2);
        }
        private void Enqueue(FanoutParameters.FanoutState state, SearchMailboxesResponse response, Exception exception)
        {
            Recorder.Trace(4L, TraceType.InfoTrace, new object[]
            {
                "FanoutSearchMailboxes.Enqueue State:",
                state,
                "Response:",
                response,
                "Exception:",
                exception
            });
            SearchMailboxesResults searchMailboxesResults = new SearchMailboxesResults(null);

            searchMailboxesResults.UpdateResults(state.Parameters, (SearchMailboxesInputs)base.Executor.Context.Input, response, exception);
            base.Executor.EnqueueNext(searchMailboxesResults);
        }
        private void ProcessLocal(IList <FanoutParameters> item)
        {
            Recorder.Trace(4L, TraceType.InfoTrace, "FanoutSearchMailboxes.ProcessLocal Item:", item);
            SearchMailboxesInputs searchMailboxesInputs = (SearchMailboxesInputs)base.Executor.Context.Input;

            searchMailboxesInputs         = searchMailboxesInputs.Clone();
            searchMailboxesInputs.Sources = (from t in item
                                             select t.Source).ToList <SearchSource>();
            searchMailboxesInputs.IsLocalCall = true;
            Recorder.Record record = base.Policy.Recorder.Start("FanoutSyncTime", TraceType.InfoTrace, true);
            try
            {
                SearchMailboxesResults item2 = Controller.SeachMailboxes(base.Policy, searchMailboxesInputs);
                base.Executor.EnqueueNext(item2);
            }
            catch (SearchException ex)
            {
                Recorder.Trace(4L, TraceType.ErrorTrace, new object[]
                {
                    "FanoutSearchMailboxes.ProcessLocal Falied:",
                    ex,
                    "Count:",
                    searchMailboxesInputs.Sources
                });
                foreach (SearchSource errorSource in searchMailboxesInputs.Sources)
                {
                    base.Executor.Fail(new SearchException(ex)
                    {
                        ErrorSource = errorSource
                    });
                }
            }
            finally
            {
                base.Policy.Recorder.End(record);
            }
        }
Exemple #4
0
        public SearchMailboxesResults Search(ISearchPolicy policy, SearchMailboxesInputs input)
        {
            long                     num        = 0L;
            long                     num2       = 0L;
            long                     num3       = 0L;
            long                     num4       = 0L;
            long                     num5       = 0L;
            long                     num6       = 0L;
            ulong                    num7       = 0UL;
            SortedResultPage         resultPage = null;
            MultiMailboxSearchClient multiMailboxSearchClient = null;
            ResultAggregator         resultAggregator         = new ResultAggregator();
            ByteQuantifiedSize       byteQuantifiedSize       = new ByteQuantifiedSize(0UL);
            List <MailboxStatistics> list = new List <MailboxStatistics>();
            Dictionary <Guid, List <KeyValuePair <int, long> > > dictionary = new Dictionary <Guid, List <KeyValuePair <int, long> > >();
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            Recorder.Record record = policy.Recorder.Start("SearchResultProvider", TraceType.InfoTrace, true);
            Recorder.Trace(5L, TraceType.InfoTrace, new object[]
            {
                "FastLocalSearchResultsProvider.Search Input:",
                input,
                "Type:",
                input.SearchType
            });
            SearchMailboxesResults result;

            try
            {
                Recorder.Trace(5L, TraceType.InfoTrace, "FastLocalSearchResultsProvider.Search Initializing");
                num3 = stopwatch.ElapsedMilliseconds;
                string str  = (input.PagingInfo != null && input.PagingInfo.SortBy != null && input.PagingInfo.SortBy.SortOrder == SortOrder.Ascending) ? "+" : "-";
                string str2 = (input.PagingInfo != null && input.PagingInfo.SortValue != null && input.PagingInfo.SortValue.SortColumn == ItemSchema.DocumentId) ? "[docid]" : FastIndexSystemSchema.Received.Name;
                AdditionalParameters additionalParameters = new AdditionalParameters
                {
                    Sort     = str + str2,
                    Refiners = new string[]
                    {
                        FastIndexSystemSchema.Size.Name
                    }
                };
                long referenceDocId = 0L;
                PaginationQueryFilter pagingFilter = null;
                QueryFilter           queryFilter  = input.Criteria.Query;
                if (input.PagingInfo != null && input.PagingInfo.SortValue != null)
                {
                    referenceDocId = input.PagingInfo.SortValue.SecondarySortValue;
                    if (input.PagingInfo.SortValue.SortColumnValue != null && input.PagingInfo.SortValue.SortColumn != ItemSchema.DocumentId)
                    {
                        pagingFilter = new PaginationQueryFilter(input.PagingInfo);
                    }
                }
                SearchSource searchSource = input.Sources.FirstOrDefault <SearchSource>();
                if (searchSource != null)
                {
                    Guid   guid        = searchSource.MailboxInfo.IsArchive ? searchSource.MailboxInfo.ArchiveDatabase : searchSource.MailboxInfo.MdbGuid;
                    string displayName = FlowDescriptor.GetImsFlowDescriptor(FastLocalSearchResultsProvider.SearchConfig, FastIndexVersion.GetIndexSystemName(guid)).DisplayName;
                    num4 += stopwatch.ElapsedMilliseconds - num3;
                    num3  = stopwatch.ElapsedMilliseconds;
                    Recorder.Trace(5L, TraceType.InfoTrace, new object[]
                    {
                        "FastLocalSearchResultsProvider.Search Initialized DB:",
                        guid,
                        "Flow:",
                        displayName
                    });
                    List <SearchSource> list2 = new List <SearchSource>(input.Sources);
                    while (list2.Count > 0)
                    {
                        HashSet <Guid>      hashSet = new HashSet <Guid>();
                        List <SearchSource> list3   = new List <SearchSource>();
                        int i = 0;
                        while (i < list2.Count)
                        {
                            SearchSource searchSource2 = list2[i];
                            Guid         item          = searchSource2.MailboxInfo.IsArchive ? searchSource2.MailboxInfo.ArchiveGuid : searchSource2.MailboxInfo.MailboxGuid;
                            if (!hashSet.Contains(item))
                            {
                                list3.Add(searchSource2);
                                list2.RemoveAt(i);
                                hashSet.Add(item);
                            }
                            else
                            {
                                i++;
                            }
                        }
                        multiMailboxSearchClient = new MultiMailboxSearchClient(guid, (from s in list3
                                                                                       select s.MailboxInfo).ToArray <MailboxInfo>(), input.Criteria, input.CallerInfo, input.PagingInfo);
                        foreach (SearchSource searchSource3 in list3)
                        {
                            Recorder.Trace(5L, TraceType.InfoTrace, "FastLocalSearchResultsProvider.Search Searching Source", searchSource3);
                            ulong              num8 = 0UL;
                            bool               flag = false;
                            MailboxStatistics  mailboxStatistics   = null;
                            ByteQuantifiedSize byteQuantifiedSize2 = new ByteQuantifiedSize(0UL);
                            List <KeyValuePair <int, long> > list4 = new List <KeyValuePair <int, long> >();
                            Guid guid2 = searchSource3.MailboxInfo.IsArchive ? searchSource3.MailboxInfo.ArchiveGuid : searchSource3.MailboxInfo.MailboxGuid;
                            queryFilter = this.ApplyFolderFilter(queryFilter, searchSource3.MailboxInfo, multiMailboxSearchClient);
                            string text = FqlQueryBuilder.ToFqlString(queryFilter, input.Criteria.QueryCulture);
                            text = this.ApplyPagingFilter(text, referenceDocId, pagingFilter, input.PagingInfo, input.Criteria.QueryCulture);
                            Recorder.Trace(5L, TraceType.InfoTrace, new object[]
                            {
                                "FastLocalSearchResultsProvider.Search Searching Source Guid:",
                                guid2,
                                "Filter:",
                                queryFilter,
                                "Query:",
                                text
                            });
                            num6 += stopwatch.ElapsedMilliseconds - num3;
                            num3  = stopwatch.ElapsedMilliseconds;
                            IEnumerable <KeyValuePair <PagingImsFlowExecutor.QueryExecutionContext, SearchResultItem[]> > enumerable = FastLocalSearchResultsProvider.FlowExecutor.Execute(displayName, guid2, policy.CallerInfo.QueryCorrelationId, text, 0L, input.Criteria.QueryCulture, additionalParameters, Math.Min(FastLocalSearchResultsProvider.SearchConfig.FastQueryResultTrimHits, input.PagingInfo.PageSize), null);
                            foreach (KeyValuePair <PagingImsFlowExecutor.QueryExecutionContext, SearchResultItem[]> keyValuePair in enumerable)
                            {
                                Recorder.Trace(5L, TraceType.InfoTrace, "FastLocalSearchResultsProvider.Search found pages");
                                PagingImsFlowExecutor.QueryExecutionContext key = keyValuePair.Key;
                                ISearchResultItem[] value = keyValuePair.Value;
                                if (!flag)
                                {
                                    Recorder.Trace(5L, TraceType.InfoTrace, "FastLocalSearchResultsProvider.Search found statistics");
                                    num8 += (ulong)FastLocalSearchResultsProvider.FlowExecutor.ReadHitCount(key);
                                    IEnumerable <RefinerResult> source = FastLocalSearchResultsProvider.FlowExecutor.ReadRefiners(key);
                                    RefinerResult refinerResult        = source.FirstOrDefault((RefinerResult t) => t.Name == FastIndexSystemSchema.Size.Name);
                                    if (refinerResult != null)
                                    {
                                        byteQuantifiedSize2 += new ByteQuantifiedSize((ulong)refinerResult.Sum);
                                    }
                                    mailboxStatistics = new MailboxStatistics(searchSource3.MailboxInfo, num8, byteQuantifiedSize2);
                                    flag = true;
                                }
                                foreach (ISearchResultItem searchResultItem in value)
                                {
                                    Recorder.Trace(5L, TraceType.InfoTrace, "FastLocalSearchResultsProvider.Search found items");
                                    IFieldHolder fieldHolder = searchResultItem.Fields.FirstOrDefault((IFieldHolder f) => string.Equals(f.Name, "DocId", StringComparison.InvariantCultureIgnoreCase));
                                    if (fieldHolder != null)
                                    {
                                        long num9       = (long)fieldHolder.Value;
                                        int  documentId = IndexId.GetDocumentId(num9);
                                        IndexId.GetMailboxNumber(num9);
                                        list4.Add(new KeyValuePair <int, long>(documentId, num9));
                                    }
                                }
                                if (list4.Count >= input.PagingInfo.PageSize)
                                {
                                    Recorder.Trace(5L, TraceType.InfoTrace, "FastLocalSearchResultsProvider.Search completed FAST");
                                    break;
                                }
                            }
                            num7 += num8;
                            byteQuantifiedSize += byteQuantifiedSize2;
                            if (list4.Count > 0)
                            {
                                dictionary[guid2] = list4;
                            }
                            if (mailboxStatistics != null)
                            {
                                list.Add(mailboxStatistics);
                            }
                            num += stopwatch.ElapsedMilliseconds - num3;
                            num3 = stopwatch.ElapsedMilliseconds;
                        }
                        if (dictionary.Count > 0)
                        {
                            Recorder.Trace(5L, TraceType.InfoTrace, "FastLocalSearchResultsProvider.Search loading preview items");
                            resultPage = multiMailboxSearchClient.FetchPreviewProperties(dictionary);
                            num2      += stopwatch.ElapsedMilliseconds - num3;
                            num3       = stopwatch.ElapsedMilliseconds;
                        }
                        Recorder.Trace(5L, TraceType.InfoTrace, "FastLocalSearchResultsProvider.Search aggregating");
                        ISearchResult aggregator = new AggregatedSearchTaskResult(new MailboxInfoList(multiMailboxSearchClient.Mailboxes), resultPage, null, num7, byteQuantifiedSize, null, list, null);
                        resultAggregator.MergeSearchResult(aggregator);
                        num5 += stopwatch.ElapsedMilliseconds - num3;
                        num3  = stopwatch.ElapsedMilliseconds;
                    }
                }
                result = new SearchMailboxesResults(input.Sources)
                {
                    SearchResult = resultAggregator
                };
            }
            finally
            {
                record.Attributes["FAST"]      = num;
                record.Attributes["STORE"]     = num2;
                record.Attributes["REST"]      = num6;
                record.Attributes["INIT"]      = num4;
                record.Attributes["AGGR"]      = num5;
                record.Attributes["TOTALSIZE"] = byteQuantifiedSize;
                record.Attributes["TOTALCNT"]  = num7;
                policy.Recorder.End(record);
            }
            return(result);
        }
Exemple #5
0
        public static SearchMailboxesResults SeachMailboxes(ISearchPolicy policy, SearchMailboxesInputs input)
        {
            Recorder.Trace(2L, TraceType.InfoTrace, new object[]
            {
                "Controller.SeachMailboxes Input:",
                input,
                "IsLocal:",
                input.IsLocalCall,
                "SearchType:",
                input.SearchType
            });
            Recorder.Record record = policy.Recorder.Start("SearchMailboxes", TraceType.InfoTrace, true);
            ValidateSource.ValidateSourceContext taskContext = new ValidateSource.ValidateSourceContext
            {
                AllowedRecipientTypeDetails = SearchRecipient.RecipientTypeDetail,
                AllowedRecipientTypes       = SearchRecipient.RecipientTypes,
                MinimumVersion           = null,
                RequiredCmdlet           = "New-MailboxSearch",
                RequiredCmdletParameters = "EstimateOnly"
            };
            MailboxInfoCreation.MailboxInfoCreationContext taskContext2 = new MailboxInfoCreation.MailboxInfoCreationContext
            {
                SuppressDuplicates = true,
                MaximumItems       = (int)((input != null && input.SearchType == SearchType.Statistics) ? policy.ThrottlingSettings.DiscoveryMaxStatsSearchMailboxes : ((uint)policy.ExecutionSettings.DiscoveryMaxMailboxes))
            };
            ServerLookup.ServerLookupContext taskContext3 = new ServerLookup.ServerLookupContext();
            CompleteSearchMailbox.CompleteSearchMailboxContext taskContext4 = new CompleteSearchMailbox.CompleteSearchMailboxContext();
            Func <object, string> batchByDatabase = delegate(object item)
            {
                if (!((SearchSource)item).MailboxInfo.IsArchive)
                {
                    return(((SearchSource)item).MailboxInfo.MdbGuid.ToString());
                }
                return(((SearchSource)item).MailboxInfo.ArchiveDatabase.ToString());
            };
            Func <object, string> batchKeyFactory = delegate(object item)
            {
                if (!((SearchSource)item).MailboxInfo.IsRemoteMailbox)
                {
                    return(batchByDatabase(item));
                }
                return("Remote");
            };
            Func <object, string> batchKeyFactory2 = (object item) => ((FanoutParameters)item).GroupId.Uri.ToString();
            Executor executor = new Executor(policy, typeof(InitializeSearchMailbox))
            {
                Concurrency = policy.ExecutionSettings.DiscoverySynchronousConcurrency
            };
            Executor executor2 = executor;

            if (input.IsLocalCall)
            {
                Recorder.Trace(2L, TraceType.InfoTrace, "Controller.SeachMailboxes LocalSearch");
                executor2 = executor2.Chain(new BatchedExecutor(policy, typeof(SearchDatabase))
                {
                    Concurrency     = policy.ExecutionSettings.DiscoveryLocalSearchConcurrency,
                    BatchSize       = (policy.ExecutionSettings.DiscoveryLocalSearchIsParallel ? 1U : policy.ExecutionSettings.DiscoveryLocalSearchBatch),
                    BatchKeyFactory = batchByDatabase
                });
            }
            else
            {
                Recorder.Trace(2L, TraceType.InfoTrace, "Controller.SeachMailboxes Search");
                executor2 = executor2.Chain(new Executor(policy, typeof(DirectoryQueryFormatting))
                {
                    Concurrency = policy.ExecutionSettings.DiscoverySynchronousConcurrency
                }).Chain(new Executor(policy, typeof(DirectoryLookup))
                {
                    Concurrency = policy.ExecutionSettings.DiscoveryADLookupConcurrency
                }).Chain(new Executor(policy, typeof(ValidateSource))
                {
                    Concurrency = policy.ExecutionSettings.DiscoverySynchronousConcurrency,
                    TaskContext = taskContext
                }).Chain(new Executor(policy, typeof(MailboxInfoCreation))
                {
                    Concurrency = policy.ExecutionSettings.DiscoverySynchronousConcurrency,
                    TaskContext = taskContext2
                });
                if (input.SearchType == SearchType.ExpandSources)
                {
                    Recorder.Trace(2L, TraceType.InfoTrace, "Controller.SeachMailboxes ExpandSources");
                    executor2 = executor2.Chain(new BatchedExecutor(policy, typeof(CompleteSourceLookup))
                    {
                        Concurrency     = policy.ExecutionSettings.DiscoverySynchronousConcurrency,
                        BatchKeyFactory = BatchedExecutor.BatchByCount,
                        BatchSize       = policy.ThrottlingSettings.DiscoveryMaxPreviewSearchMailboxes,
                        TaskContext     = input
                    });
                }
                else
                {
                    executor2 = executor2.Chain(new BatchedExecutor(policy, typeof(ServerLookup))
                    {
                        Concurrency     = policy.ExecutionSettings.DiscoveryServerLookupConcurrency,
                        TaskContext     = taskContext3,
                        BatchSize       = policy.ExecutionSettings.DiscoveryServerLookupBatch,
                        BatchKeyFactory = batchKeyFactory
                    }).Chain(new BatchedExecutor(policy, typeof(FanoutSearchMailboxes))
                    {
                        Concurrency     = policy.ExecutionSettings.DiscoveryFanoutConcurrency,
                        BatchSize       = policy.ExecutionSettings.DiscoveryFanoutBatch,
                        BatchKeyFactory = batchKeyFactory2
                    });
                }
            }
            executor2 = executor2.Chain(new Executor(policy, typeof(CompleteSearchMailbox))
            {
                Concurrency = 1U,
                TaskContext = taskContext4
            });
            Recorder.Trace(2L, TraceType.InfoTrace, "Controller.SeachMailboxes Start");
            SearchMailboxesResults result;

            try
            {
                ServicePointManager.ServerCertificateValidationCallback = (RemoteCertificateValidationCallback)Delegate.Combine(ServicePointManager.ServerCertificateValidationCallback, new RemoteCertificateValidationCallback(ServerToServerEwsCallingContext.CertificateErrorHandler));
                SearchMailboxesResults searchMailboxesResults = executor.Process(input) as SearchMailboxesResults;
                Recorder.Trace(2L, TraceType.InfoTrace, "Controller.SeachMailboxes End");
                if (executor.Context.Failures.Count > 0)
                {
                    Recorder.Trace(2L, TraceType.InfoTrace, "Controller.SeachMailboxes Failures:", executor.Context.Failures.Count);
                    if (searchMailboxesResults == null)
                    {
                        searchMailboxesResults = new SearchMailboxesResults(null);
                    }
                    searchMailboxesResults.AddFailures(executor.Context.Failures);
                }
                policy.Recorder.End(record);
                result = searchMailboxesResults;
            }
            finally
            {
                ServicePointManager.ServerCertificateValidationCallback = (RemoteCertificateValidationCallback)Delegate.Remove(ServicePointManager.ServerCertificateValidationCallback, new RemoteCertificateValidationCallback(ServerToServerEwsCallingContext.CertificateErrorHandler));
            }
            return(result);
        }