@@ -32,7 +32,7 @@ public partial class MainViewModel : BaseModel, ISavable, IDisposable
3232        private  static   readonly  string  ClassName  =  nameof ( MainViewModel ) ; 
3333
3434        private  Query  _lastQuery ; 
35-         private  bool  _lastIsHomeQuery ; 
35+         private  bool  _previousIsHomeQuery ; 
3636        private  Query  _progressQuery ;  // Used for QueryResultAsync 
3737        private  Query  _updateQuery ;  // Used for ResultsUpdated 
3838        private  string  _queryTextBeforeLeaveResults ; 
@@ -1267,7 +1267,7 @@ private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, b
12671267                return ; 
12681268            } 
12691269
1270-             var  isHomeQuery  =  query . RawQuery  ==  string . Empty ; 
1270+             var  currentIsHomeQuery  =  query . RawQuery  ==  string . Empty ; 
12711271
12721272            try 
12731273            { 
@@ -1297,12 +1297,6 @@ private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, b
12971297                // Update the query's IsReQuery property to true if this is a re-query 
12981298                query . IsReQuery  =  isReQuery ; 
12991299
1300-                 // handle the exclusiveness of plugin using action keyword 
1301-                 RemoveOldQueryResults ( query ,  isHomeQuery ) ; 
1302- 
1303-                 _lastQuery  =  query ; 
1304-                 _lastIsHomeQuery  =  isHomeQuery ; 
1305- 
13061300                ICollection < PluginPair >  plugins  =  Array . Empty < PluginPair > ( ) ; 
13071301                if  ( isHomeQuery ) 
13081302                { 
@@ -1360,7 +1354,7 @@ private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, b
13601354                // plugins are ICollection, meaning LINQ will get the Count and preallocate Array 
13611355
13621356                Task [ ]  tasks ; 
1363-                 if  ( isHomeQuery ) 
1357+                 if  ( currentIsHomeQuery ) 
13641358                { 
13651359                    tasks  =  plugins . Select ( plugin =>  plugin . Metadata . HomeDisabled  switch 
13661360                    { 
@@ -1416,7 +1410,7 @@ async Task QueryTaskAsync(PluginPair plugin, CancellationToken token)
14161410            { 
14171411                App . API . LogDebug ( ClassName ,  $ "Wait for querying plugin <{ plugin . Metadata . Name } >") ; 
14181412
1419-                 if  ( searchDelay  &&  ! isHomeQuery )  // Do not delay for home query 
1413+                 if  ( searchDelay  &&  ! currentIsHomeQuery )  // Do not delay for home query 
14201414                { 
14211415                    var  searchDelayTime  =  plugin . Metadata . SearchDelayTime  ??  Settings . SearchDelayTime ; 
14221416
@@ -1429,7 +1423,7 @@ async Task QueryTaskAsync(PluginPair plugin, CancellationToken token)
14291423                // Task.Yield will force it to run in ThreadPool 
14301424                await  Task . Yield ( ) ; 
14311425
1432-                 var  results  =  isHomeQuery  ? 
1426+                 var  results  =  currentIsHomeQuery  ? 
14331427                    await  PluginManager . QueryHomeForPluginAsync ( plugin ,  query ,  token )  : 
14341428                    await  PluginManager . QueryForPluginAsync ( plugin ,  query ,  token ) ; 
14351429
@@ -1458,8 +1452,13 @@ await PluginManager.QueryHomeForPluginAsync(plugin, query, token) :
14581452
14591453                App . API . LogDebug ( ClassName ,  $ "Update results for plugin <{ plugin . Metadata . Name } >") ; 
14601454
1455+                 // Indicate if to clear existing results so to show only ones from plugins with action keywords 
1456+                 var  shouldClearExistingResults  =  ShouldClearExistingResults ( query ,  currentIsHomeQuery ) ; 
1457+                 _lastQuery  =  query ; 
1458+                 _previousIsHomeQuery  =  currentIsHomeQuery ; 
1459+ 
14611460                if  ( ! _resultsUpdateChannelWriter . TryWrite ( new  ResultsForUpdate ( resultsCopy ,  plugin . Metadata ,  query , 
1462-                     token ,  reSelect ) ) ) 
1461+                     token ,  reSelect ,   shouldClearExistingResults ) ) ) 
14631462                { 
14641463                    App . API . LogError ( ClassName ,  "Unable to add item to Result Update Queue" ) ; 
14651464                } 
@@ -1561,25 +1560,36 @@ private async Task BuildQueryAsync(IEnumerable<BaseBuiltinShortcutModel> builtIn
15611560            } 
15621561        } 
15631562
1564-         private  void  RemoveOldQueryResults ( Query  query ,  bool  isHomeQuery ) 
1563+         /// <summary> 
1564+         /// Determines whether the existing search results should be cleared based on the current query and the previous query type. 
1565+         /// This is needed because of the design that treats plugins with action keywords and global action keywords separately. Results are gathered 
1566+         /// either from plugins with matching action keywords or global action keyword, but not both. So when the current results are from plugins 
1567+         /// with a matching action keyword and a new result set comes from a new query with the global action keyword, the existing results need to be cleared, 
1568+         /// and vice versa. The same applies to home page query results. 
1569+         ///  
1570+         /// There is no need to clear results from global action keyword if a new set of results comes along that is also from global action keywords. 
1571+         /// This is because the removal of obsolete results is handled in ResultsViewModel.NewResults(ICollection<ResultsForUpdate>). 
1572+         /// </summary> 
1573+         /// <param name="query">The current query.</param> 
1574+         /// <param name="currentIsHomeQuery">A flag indicating if the current query is a home query.</param> 
1575+         /// <returns>True if the existing results should be cleared, false otherwise.</returns> 
1576+         private  bool  ShouldClearExistingResults ( Query  query ,  bool  currentIsHomeQuery ) 
15651577        { 
1566-             // If last and  current query  are home query, we don't  need to clear the results  
1567-             if  ( _lastIsHomeQuery   &&   isHomeQuery ) 
1578+             // If previous or  current results  are from  home query, we need to clear them  
1579+             if  ( _previousIsHomeQuery   ||   currentIsHomeQuery ) 
15681580            { 
1569-                 return ; 
1570-             } 
1571-             // If last or current query is home query, we need to clear the results 
1572-             else  if  ( _lastIsHomeQuery  ||  isHomeQuery ) 
1573-             { 
1574-                 App . API . LogDebug ( ClassName ,  $ "Remove old results") ; 
1575-                 Results . Clear ( ) ; 
1581+                 App . API . LogDebug ( ClassName ,  $ "Cleared old results") ; 
1582+                 return  true ; 
15761583            } 
1577-             // If last and current query are not home query, we need to check action keyword 
1578-             else  if  ( _lastQuery ? . ActionKeyword  !=  query ? . ActionKeyword ) 
1584+ 
1585+             // If the last and current query are not home query type, we need to check the action keyword 
1586+             if  ( _lastQuery ? . ActionKeyword  !=  query ? . ActionKeyword ) 
15791587            { 
1580-                 App . API . LogDebug ( ClassName ,  $ "Remove  old results") ; 
1581-                 Results . Clear ( ) ; 
1588+                 App . API . LogDebug ( ClassName ,  $ "Cleared  old results") ; 
1589+                 return   true ; 
15821590            } 
1591+ 
1592+             return  false ; 
15831593        } 
15841594
15851595        private  Result  ContextMenuTopMost ( Result  result ) 
0 commit comments