From 8e45c41f209af77a9c94c8f242bbcc74a6d3d402 Mon Sep 17 00:00:00 2001 From: Alekhya Reddy Kommuru Date: Mon, 16 Mar 2020 14:37:28 -0700 Subject: [PATCH] Created a helper class to use indexer and return search results --- PowerToys.sln | 11 +++ .../SearchHelper/WindowsSearchAPI.cs | 81 +++++++++++++++++++ .../Wox.Plugin.Indexer.csproj | 37 +++++---- .../Wox.Plugin.Indexer/packages.config | 4 + 4 files changed, 116 insertions(+), 17 deletions(-) create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/packages.config diff --git a/PowerToys.sln b/PowerToys.sln index 6b4e70c89..396ff8efa 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -154,6 +154,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wox.Plugin.Folder", "src\mo EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Wox.Launcher", "src\modules\launcher\Wox.Launcher\Wox.Launcher.vcxproj", "{E364F67B-BB12-4E91-B639-355866EBCD8B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wox.Plugin.Indexer", "src\modules\launcher\Plugins\Wox.Plugin.Indexer\Wox.Plugin.Indexer.csproj", "{63C3CEA8-51FE-472E-B97C-B58F8B17DD51}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -378,6 +380,14 @@ Global {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|Any CPU.ActiveCfg = Release|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.ActiveCfg = Release|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.Build.0 = Release|x64 + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Debug|x64.ActiveCfg = Debug|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Debug|x64.Build.0 = Debug|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Release|Any CPU.Build.0 = Release|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Release|x64.ActiveCfg = Release|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -419,6 +429,7 @@ Global {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {787B8AA6-CA93-4C84-96FE-DF31110AD1C4} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {E364F67B-BB12-4E91-B639-355866EBCD8B} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51} = {4AFC9975-2456-4C70-94A4-84073C1CED93} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs new file mode 100644 index 000000000..a340b99d6 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Data.OleDb; +using Microsoft.Search.Interop; + +namespace Wox.Plugin.Indexer.SearchHelper +{ + public class WindowsSearchAPI + { + public IEnumerable Search(string keyword, string pattern = "*", int offset = 0, int maxCount = 100) + { + // This uses the Microsoft.Search.Interop assembly + CSearchManager manager = new CSearchManager(); + + // SystemIndex catalog is the default catalog in Windows + ISearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex"); + + // Get the ISearchQueryHelper which will help us to translate AQS --> SQL necessary to query the indexer + ISearchQueryHelper queryHelper = catalogManager.GetQueryHelper(); + + // Set the number of results we want. Don't set this property if all results are needed. + queryHelper.QueryMaxResults = maxCount; + + // Set list of columns we want to display, getting the path presently + queryHelper.QuerySelectColumns = "System.ItemPathDisplay"; + + // Set additional query restriction + queryHelper.QueryWhereRestrictions = "AND scope='file:'"; + + // convert file pattern if it is not '*'. Don't create restriction for '*' as it includes all files. + if (pattern != "*") + { + pattern = pattern.Replace("*", "%"); + pattern = pattern.Replace("?", "_"); + + if (pattern.Contains("%") || pattern.Contains("_")) + { + queryHelper.QueryWhereRestrictions += " AND System.FileName LIKE '" + pattern + "' "; + } + else + { + // if there are no wildcards we can use a contains which is much faster as it uses the index + queryHelper.QueryWhereRestrictions += " AND Contains(System.FileName, '" + pattern + "') "; + } + } + + // Set sorting order + queryHelper.QuerySorting = "System.DateModified DESC"; + + // Generate SQL from our parameters, converting the userQuery from AQS->WHERE clause + string sqlQuery = queryHelper.GenerateSQLFromUserQuery(keyword); + + // --- Perform the query --- + // create an OleDbConnection object which connects to the indexer provider with the windows application + using (System.Data.OleDb.OleDbConnection conn = new OleDbConnection(queryHelper.ConnectionString)) + { + // open the connection + conn.Open(); + + // now create an OleDB command object with the query we built above and the connection we just opened. + using (OleDbCommand command = new OleDbCommand(sqlQuery, conn)) + { + // execute the command, which returns the results as an OleDbDataReader. + using (OleDbDataReader WDSResults = command.ExecuteReader()) + { + while (WDSResults.Read()) + { + // col 0 is our path in display format + Console.WriteLine("{0}", WDSResults.GetString(0)); + var result = new SearchResult { Path = WDSResults.GetString(0) }; + + yield return result; + } + } + + } + } + + } + } +} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj index d6cd5b2a3..b164c50f5 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj @@ -1,10 +1,10 @@ - + Debug AnyCPU - 63c3cea8-51fe-472e-b97c-b58f8b17dd51 + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51} Library Properties Wox.Plugin.Indexer @@ -31,24 +31,27 @@ 4 - - - - - - - - - - - - - - + + ..\..\..\..\..\packages\tlbimp-Microsoft.Search.Interop.1.0.0\lib\net45\Microsoft.Search.Interop.dll + True + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/packages.config b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/packages.config new file mode 100644 index 000000000..6b77ac3b2 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file