public List<Result> Query(Query query) { return new List<Result> { new Result { Action = (ActionContext a) => { new DriveClient(); return false; }, Title = "Drive" }}; }
public void GenericPluginQueryTest() { Query q = new Query("file.txt file2 file3"); q.Search = q.RawQuery; Assert.AreEqual(q.FirstSearch, "file.txt"); Assert.AreEqual(q.SecondSearch, "file2"); Assert.AreEqual(q.ThirdSearch, "file3"); Assert.AreEqual(q.SecondToEndSearch, "file2 file3"); }
public void ExclusivePluginQueryTest() { Query q = new Query("f file.txt file2 file3"); q.Search = "file.txt file2 file3"; Assert.AreEqual(q.FirstSearch, "file.txt"); Assert.AreEqual(q.SecondSearch, "file2"); Assert.AreEqual(q.ThirdSearch, "file3"); Assert.AreEqual(q.SecondToEndSearch, "file2 file3"); }
public static void Dispatch(Query query) { if (PluginManager.IsExclusivePluginQuery(query)) { exclusivePluginDispatcher.Dispatch(query); } else { genericQueryDispatcher.Dispatch(query); } }
protected override List<PluginPair> GetPlugins(Query query) { List<PluginPair> pluginPairs = new List<PluginPair>(); var exclusivePluginPair = PluginManager.GetExclusivePlugin(query) ?? PluginManager.GetActionKeywordPlugin(query); if (exclusivePluginPair != null) { pluginPairs.Add(exclusivePluginPair); } return pluginPairs; }
public void Dispatch(Query query) { foreach (PluginPair pair in GetPlugins(query)) { PluginPair localPair = pair; if (query.IsIntantQuery && PluginManager.IsInstantSearchPlugin(pair.Metadata)) { DebugHelper.WriteLine(string.Format("Plugin {0} is executing instant search.", pair.Metadata.Name)); using (new Timeit(" => instant search took: ")) { PluginManager.ExecutePluginQuery(localPair, query); } } else { ThreadPool.QueueUserWorkItem(state => { PluginManager.ExecutePluginQuery(localPair, query); }); } } }
public void PushResults(Query query, PluginMetadata plugin, List<Result> results) { results.ForEach(o => { o.PluginDirectory = plugin.PluginDirectory; o.PluginID = plugin.ID; o.OriginQuery = query; }); UpdateResultView(results); }
protected override List<PluginPair> GetPlugins(Query query) { return PluginManager.AllPlugins.Where(o => PluginManager.IsGenericPlugin(o.Metadata)).ToList(); }
internal static bool IsExclusivePluginQuery(Query query) { return GetExclusivePlugin(query) != null || GetActionKeywordPlugin(query) != null; }
internal static PluginPair GetExclusivePlugin(Query query) { KeyValuePair<PluginPair, IExclusiveQuery> plugin = LoadExclusiveSearchPlugins().FirstOrDefault(o => o.Value.IsExclusiveQuery((query))); return plugin.Key; }
internal static PluginPair GetActionKeywordPlugin(Query query) { //if a query doesn't contain at least one space, it should not be a action keword plugin query if (!query.RawQuery.Contains(" ")) return null; PluginPair actionKeywordPluginPair = AllPlugins.FirstOrDefault(o => o.Metadata.ActionKeyword == query.GetActionKeyword()); if (actionKeywordPluginPair != null) { var customizedPluginConfig = UserSettingStorage.Instance. CustomizedPluginConfigs.FirstOrDefault(o => o.ID == actionKeywordPluginPair.Metadata.ID); if (customizedPluginConfig != null && customizedPluginConfig.Disabled) { return null; } return actionKeywordPluginPair; } return null; }
internal static void ExecutePluginQuery(PluginPair pair, Query query) { try { Stopwatch sw = new Stopwatch(); sw.Start(); List<Result> results = pair.Plugin.Query(query) ?? new List<Result>(); results.ForEach(o => { o.PluginID = pair.Metadata.ID; }); sw.Stop(); DebugHelper.WriteLine(string.Format("Plugin query: {0} - {1}", pair.Metadata.Name, sw.ElapsedMilliseconds)); pair.QueryCount += 1; if (pair.QueryCount == 1) { pair.AvgQueryTime = sw.ElapsedMilliseconds; } else { pair.AvgQueryTime = (pair.AvgQueryTime + sw.ElapsedMilliseconds) / 2; } API.PushResults(query, pair.Metadata, results); } catch (System.Exception e) { throw new BloopPluginException(pair.Metadata.Name, e); } }
public static void Query(Query query) { if (!string.IsNullOrEmpty(query.RawQuery.Trim())) { query.Search = IsActionKeywordQuery(query) ? query.RawQuery.Substring(query.RawQuery.IndexOf(' ') + 1) : query.RawQuery; QueryDispatcher.QueryDispatcher.Dispatch(query); } }
/// <summary> /// Check if a query contains valid action keyword /// </summary> /// <param name="query"></param> /// <returns></returns> public static bool IsActionKeywordQuery(Query query) { if (string.IsNullOrEmpty(query.RawQuery)) return false; var strings = query.RawQuery.Split(' '); if (strings.Length == 1) return false; var actionKeyword = strings[0].Trim(); if (string.IsNullOrEmpty(actionKeyword)) return false; PluginPair pair = plugins.FirstOrDefault(o => o.Metadata.ActionKeyword == actionKeyword); if (pair != null) { var customizedPluginConfig = UserSettingStorage.Instance.CustomizedPluginConfigs.FirstOrDefault(o => o.ID == pair.Metadata.ID); if (customizedPluginConfig != null && customizedPluginConfig.Disabled) { return false; } return true; } return false; }
private void Query(Query q) { PluginManager.Query(q); StopProgress(); }
protected abstract List<PluginPair> GetPlugins(Query query);
private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e) { if (ignoreTextChange) { ignoreTextChange = false; return; } toolTip.IsOpen = false; pnlResult.Dirty = true; if (IsInContextMenuMode) { QueryContextMenu(); return; } lastQuery = tbQuery.Text; int searchDelay = GetSearchDelay(lastQuery); Dispatcher.DelayInvoke("UpdateSearch", o => { Dispatcher.DelayInvoke("ClearResults", i => { // first try to use clear method inside pnlResult, which is more closer to the add new results // and this will not bring splash issues.After waiting 100ms, if there still no results added, we // must clear the result. otherwise, it will be confused why the query changed, but the results // didn't. if (pnlResult.Dirty) pnlResult.Clear(); }, TimeSpan.FromMilliseconds(100), null); queryHasReturn = false; Query query = new Query(lastQuery); query.IsIntantQuery = searchDelay == 0; Query(query); Dispatcher.DelayInvoke("ShowProgressbar", originQuery => { if (!queryHasReturn && originQuery == tbQuery.Text && !string.IsNullOrEmpty(lastQuery)) { StartProgress(); } }, TimeSpan.FromMilliseconds(150), tbQuery.Text); //reset query history index after user start new query ResetQueryHistoryIndex(); }, TimeSpan.FromMilliseconds(searchDelay)); }