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); } }
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); }
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); }