Beispiel #1
0
        public SearchResult(
            ISearchManagerInternal owner,
            SearchAllOptions options,
            IFilter optionsFilter,
            IList <ILogSourceSearchWorkerInternal> workers,
            Progress.IProgressAggregatorFactory progressAggregatorFactory,
            ISynchronizationContext modelSynchronization,
            Settings.IGlobalSettingsAccessor settings,
            int id,
            ISearchObjectsFactory factory,
            ITraceSourceFactory traceSourceFactory
            )
        {
            this.owner                = owner;
            this.options              = options;
            this.optionsFilter        = optionsFilter;
            this.factory              = factory;
            this.modelSynchronization = modelSynchronization;
            this.id                     = id;
            this.cancellation           = new CancellationTokenSource();
            this.results                = new List <ISourceSearchResultInternal>();
            this.progressAggregator     = progressAggregatorFactory.CreateProgressAggregator();
            this.updateInvokationHelper = new AsyncInvokeHelper(modelSynchronization, UpdateStatus);
            this.hitsLimit              = settings.MaxNumberOfHitsInSearchResultsView;
            this.visible                = true;
            this.trace                  = traceSourceFactory.CreateTraceSource("SearchManager", "sr." + id.ToString());
            this.timeGapsDetector       = new TimeGapsDetector(trace, modelSynchronization, this, traceSourceFactory);

            this.timeGapsDetector.OnTimeGapsChanged += (s, e) =>
            {
                owner.OnResultChanged(this, SearchResultChangeFlag.TimeGapsChanged);
            };

            this.progressAggregator.ProgressChanged += HandleProgressChanged;

            this.searchTime = Stopwatch.StartNew();
            this.results.AddRange(workers.Select(w => factory.CreateSourceSearchResults(w, this, cancellation.Token, progressAggregator)));
            if (results.Count == 0)
            {
                status = SearchResultStatus.Finished;
                HandleFinalStateTransition();
            }
        }
Beispiel #2
0
        void UpdateStatus()
        {
            if (status != SearchResultStatus.Active)
            {
                return;                 // alredy in final state
            }
            bool anyCancelled       = false;
            bool anyReachedHitLimit = false;
            bool anyFailed          = false;
            bool anyActive          = false;
            bool allFinished        = true;

            foreach (var r in results)
            {
                var rst = r.Status;
                if (rst == SearchResultStatus.Active)
                {
                    anyActive = true;
                }
                if (rst == SearchResultStatus.Cancelled)
                {
                    anyCancelled = true;
                }
                if (rst == SearchResultStatus.Failed)
                {
                    anyFailed = true;
                }
                if (rst == SearchResultStatus.HitLimitReached)
                {
                    anyReachedHitLimit = true;
                }
                if (rst != SearchResultStatus.Finished)
                {
                    allFinished = false;
                }
            }
            if (anyActive)
            {
                return;
            }
            else if (anyFailed)
            {
                status = SearchResultStatus.Failed;
            }
            else if (anyCancelled)
            {
                status = SearchResultStatus.Cancelled;
            }
            else if (anyReachedHitLimit)
            {
                status = SearchResultStatus.HitLimitReached;
            }
            else if (allFinished)
            {
                status = SearchResultStatus.Finished;
            }
            else
            {
                return;
            }
            if (status != SearchResultStatus.Active)
            {
                results.ForEach(r => r.ReleaseProgress());
                HandleFinalStateTransition();
            }
            owner.OnResultChanged(this, SearchResultChangeFlag.StatusChanged);
        }
 private GetResourceResult(SearchResultStatus status, T value)
 {
     _status = status;
     Value   = value;
 }