@@ -88,12 +88,76 @@ static SearchClient()
8888 /// </summary>
8989 /// <param name="query">Search query</param>
9090 /// <param name="token">Cancellation token passed to <see cref="BaseSearchEngine.GetResultAsync"/></param>
91- public async Task < SearchResult [ ] > RunSearchAsync ( SearchQuery query , CancellationToken ? token = null , [ CBN ] IProgress < int > p = null )
91+ /// <param name="p"><see cref="IProgress{T}"/></param>
92+ public async Task < SearchResult [ ] > RunSearchAsync ( SearchQuery [ ] query , CancellationToken ? token = null ,
93+ [ CBN ] IProgress < int > p = null )
9294 {
9395 if ( ! ConfigApplied ) {
9496 await ApplyConfigAsync ( ) ;
9597 }
9698
99+ token ??= CancellationToken . None ;
100+ var tasks = query . SelectMany ( e => GetSearchTasks ( e , token . Value ) ) . ToList ( ) ;
101+
102+ var results = new SearchResult [ tasks . Count ] ;
103+ int i = 0 ;
104+
105+ while ( tasks . Any ( ) ) {
106+ if ( token . Value . IsCancellationRequested ) {
107+
108+ Logger . LogWarning ( "Cancellation requested" ) ;
109+ IsComplete = true ;
110+
111+ return results ;
112+ }
113+
114+ var task = await Task . WhenAny ( tasks ) ;
115+
116+ var result = await task ;
117+
118+ OnResult ? . Invoke ( this , result ) ;
119+ p ? . Report ( i ) ;
120+
121+ if ( Config . PriorityEngines . HasFlag ( result . Engine . EngineOption ) ) {
122+
123+ OpenResult ( result ) ;
124+ }
125+
126+ results [ i ] = result ;
127+ i ++ ;
128+ // results.Add(result);
129+ tasks . Remove ( task ) ;
130+ }
131+
132+ OnComplete ? . Invoke ( this , results ) ;
133+
134+ IsComplete = true ;
135+
136+ if ( Config . PriorityEngines == SearchEngineOptions . Auto ) {
137+
138+ // var sri = results.SelectMany(r => r.Results).ToArray();
139+ // var result = Optimize(sri).FirstOrDefault() ?? sri.FirstOrDefault();
140+ //todo
141+ OpenResult ( results . FirstOrDefault ( ) ) ;
142+
143+ }
144+
145+ return results ;
146+ }
147+
148+ /// <summary>
149+ /// Runs a search of <paramref name="query"/>.
150+ /// </summary>
151+ /// <param name="query">Search query</param>
152+ /// <param name="token">Cancellation token passed to <see cref="BaseSearchEngine.GetResultAsync"/></param>
153+ /// <param name="p"><see cref="IProgress{T}"/></param>
154+ public Task < SearchResult [ ] > RunSearchAsync ( SearchQuery query , CancellationToken ? token = null ,
155+ [ CBN ] IProgress < int > p = null )
156+ {
157+ /*if (!ConfigApplied) {
158+ await ApplyConfigAsync();
159+ }
160+
97161 token ??= CancellationToken.None;
98162
99163 var tasks = GetSearchTasks(query, token.Value);
@@ -141,7 +205,9 @@ public async Task<SearchResult[]> RunSearchAsync(SearchQuery query, Cancellation
141205
142206 }
143207
144- return results ;
208+ return results;*/
209+
210+ return RunSearchAsync ( new SearchQuery [ ] { query } , token , p ) ;
145211 }
146212
147213 private void OpenResult ( SearchResult result )
@@ -271,5 +337,4 @@ public void Dispose()
271337 ConfigApplied = false ;
272338 IsComplete = false ;
273339 }
274-
275340}
0 commit comments