Skip to content

Commit aafa81f

Browse files
committed
Refactor search manager (cont.)
1 parent eddd738 commit aafa81f

11 files changed

Lines changed: 79 additions & 372 deletions

Flow.Launcher.Plugin.OneNote/Main.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Threading.Tasks;
55
using System.Windows.Controls;
66
using Flow.Launcher.Plugin.OneNote.Icons;
7+
using Flow.Launcher.Plugin.OneNote.Search;
78
using Flow.Launcher.Plugin.OneNote.UI.Views;
89
using Odotocodot.OneNote.Linq;
910
namespace Flow.Launcher.Plugin.OneNote
@@ -22,7 +23,8 @@ public class Main : IAsyncPlugin, IContextMenu, ISettingProvider, IDisposable
2223
private static Main instance;
2324

2425
private Query currentQuery;
25-
26+
private Search.SearchManager sm2;
27+
2628
public Task InitAsync(PluginInitContext context)
2729
{
2830
this.context = context;
@@ -65,7 +67,7 @@ public async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
6567

6668
await init;
6769

68-
return searchManager.Query(query);
70+
return searchManager.Query(query.Search);
6971
}
7072

7173
[Obsolete("Use PluginInitContext.API.ReQuery")]

Flow.Launcher.Plugin.OneNote/ResultCreator.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -411,28 +411,28 @@ public List<Result> ContextMenu(Result selectedResult)
411411
return results;
412412
}
413413

414-
public List<Result> NoItemsInCollection(List<Result> results, IOneNoteItem? parent)
414+
public List<Result> EmptyCollection(List<Result> results, IOneNoteItem? parent)
415415
{
416416
// parent can be null if the collection only contains notebooks.
417417
switch (parent)
418418
{
419419
case INotebookOrSectionGroup:
420420
// Can create section/section group
421-
results.Add(NoItemsInCollectionResult("section", iconProvider.NewSection, "(unencrypted) section"));
422-
results.Add(NoItemsInCollectionResult("section group", iconProvider.NewSectionGroup));
421+
results.Add(EmptyCollectionResult("section", iconProvider.NewSection, "(unencrypted) section"));
422+
results.Add(EmptyCollectionResult("section group", iconProvider.NewSectionGroup));
423423
break;
424424
case OneNoteSection section:
425425
// Can create page
426426
if (!section.Locked)
427427
{
428-
results.Add(NoItemsInCollectionResult("page", iconProvider.NewPage, section: section));
428+
results.Add(EmptyCollectionResult("page", iconProvider.NewPage, section: section));
429429
}
430430
break;
431431
}
432432

433433
return results;
434434

435-
Result NoItemsInCollectionResult(string title, string iconPath, string? subTitle = null, OneNoteSection? section = null)
435+
Result EmptyCollectionResult(string title, string iconPath, string? subTitle = null, OneNoteSection? section = null)
436436
{
437437
return new Result
438438
{
@@ -463,7 +463,7 @@ public List<Result> InvalidQuery(bool includeSubtitle = true)
463463
}
464464
public List<Result> SearchingByTitle()
465465
{
466-
return SingleResult($"Now searching by title.", null, iconProvider.Search);
466+
return SingleResult("Now searching by title.", string.Empty, iconProvider.Search);
467467
}
468468

469469
private static List<Result> SingleResult(string title, string subTitle, string iconPath)

Flow.Launcher.Plugin.OneNote/Search/DefaultSearch.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ namespace Flow.Launcher.Plugin.OneNote.Search
66
{
77
public class DefaultSearch : SearchBase
88
{
9+
public DefaultSearch(PluginInitContext context, Settings settings, ResultCreator resultCreator) : base(context, settings, resultCreator, null) { }
10+
911
public override List<Result> GetResults(string query)
1012
{
1113
if (!char.IsLetterOrDigit(query[0]))

Flow.Launcher.Plugin.OneNote/Search/NotebookExplorer.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,24 @@ namespace Flow.Launcher.Plugin.OneNote.Search
88
{
99
public class NotebookExplorer : SearchBase
1010
{
11+
private readonly TitleSearch titleSearch;
12+
public NotebookExplorer(PluginInitContext context, Settings settings, ResultCreator resultCreator, TitleSearch titleSearch) : base(context,
13+
settings, resultCreator, () => settings.Keywords.NotebookExplorer)
14+
{
15+
this.titleSearch = titleSearch;
16+
}
17+
1118
public override List<Result> GetResults(string query)
1219
{
13-
if (ValidateSearch(query, out string? search, out IOneNoteItem? parent, out IEnumerable<IOneNoteItem> collection))
20+
if (!ValidateSearch(query, out string? search, out IOneNoteItem? parent, out IEnumerable<IOneNoteItem> collection))
1421
return resultCreator.InvalidQuery(false);
1522

1623
List<Result> results = search switch
1724
{
18-
// Empty search so show all in collection
19-
string when string.IsNullOrWhiteSpace(search) => ShowAll(parent, collection),
20-
21-
// Search by title
22-
not null when search.StartsWith(Keywords.TitleSearch) && parent is not OneNotePage
23-
=> TitleSearch.Filter(search, parent, collection, context, settings, resultCreator),
24-
25-
// Scoped search
26-
not null when search.StartsWith(Keywords.ScopedSearch) && parent is INotebookOrSectionGroup => ScopedSearch(search, parent),
27-
28-
// Default search
29-
_ => Explorer(search, parent, collection),
25+
{ } when search.StartsWith(Keywords.TitleSearch) && parent is not OneNotePage => titleSearch.Filter(search, parent, collection),
26+
{ } when search.StartsWith(Keywords.ScopedSearch) && parent is INotebookOrSectionGroup => ScopedSearch(search, parent),
27+
{ } when !string.IsNullOrWhiteSpace(search) => Explorer(search, parent, collection),
28+
_ => ShowAll(parent, collection),
3029
};
3130

3231
if (parent == null)
@@ -36,8 +35,8 @@ not null when search.StartsWith(Keywords.ScopedSearch) && parent is INotebookOrS
3635
result.Title = $"Open \"{parent.Name}\" in OneNote";
3736
result.SubTitle = search switch
3837
{
39-
not null when search.StartsWith(Keywords.TitleSearch) => $"Now searching by title in \"{parent.Name}\"",
40-
not null when search.StartsWith(Keywords.ScopedSearch) => $"Now searching all pages in \"{parent.Name}\"",
38+
{ } when search.StartsWith(Keywords.TitleSearch) => $"Now searching by title in \"{parent.Name}\"",
39+
{ } when search.StartsWith(Keywords.ScopedSearch) => $"Now searching all pages in \"{parent.Name}\"",
4140
_ => $"Use \'{Keywords.ScopedSearch}\' to search this item. Use \'{Keywords.TitleSearch}\' to search by title in this item",
4241
};
4342

@@ -52,7 +51,6 @@ private bool ValidateSearch(string query, out string? lastSearch, out IOneNoteIt
5251
collection = OneNoteApplication.GetNotebooks();
5352

5453
string search = query[(query.IndexOf(Keywords.NotebookExplorer, StringComparison.Ordinal) + Keywords.NotebookExplorer.Length)..];
55-
5654
const string separator = Keywords.NotebookExplorerSeparator;
5755
var currIndex = search.IndexOf(separator, StringComparison.Ordinal);
5856
var prevIndex = 0;
@@ -80,7 +78,7 @@ private List<Result> ShowAll(IOneNoteItem? parent, IEnumerable<IOneNoteItem> col
8078
.Select(item => resultCreator.CreateOneNoteItemResult(item, true))
8179
.ToList();
8280

83-
return results.Any() ? results : resultCreator.NoItemsInCollection(results, parent);
81+
return results.Any() ? results : resultCreator.EmptyCollection(results, parent);
8482
}
8583

8684
private List<Result> ScopedSearch(string query, IOneNoteItem parent)
@@ -93,9 +91,11 @@ private List<Result> ScopedSearch(string query, IOneNoteItem parent)
9391

9492
string currentSearch = query[Keywords.TitleSearch.Length..];
9593

96-
return OneNoteApplication.FindPages(currentSearch, parent)
97-
.Select(pg => resultCreator.CreatePageResult(pg, currentSearch))
98-
.ToList();
94+
var results = OneNoteApplication.FindPages(currentSearch, parent)
95+
.Select(pg => resultCreator.CreatePageResult(pg, currentSearch))
96+
.ToList();
97+
98+
return results.Any() ? results : ResultCreator.NoMatchesFound();
9999
}
100100

101101
private List<Result> Explorer(string search, IOneNoteItem? parent, IEnumerable<IOneNoteItem> collection)

Flow.Launcher.Plugin.OneNote/Search/RecentPages.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ namespace Flow.Launcher.Plugin.OneNote.Search
66
{
77
public class RecentPages : SearchBase
88
{
9+
public RecentPages(PluginInitContext context, Settings settings, ResultCreator resultCreator) : base(context, settings, resultCreator, () => settings.Keywords.RecentPages) { }
10+
911
public override List<Result> GetResults(string query)
1012
{
1113
int count = settings.DefaultRecentsCount;

Flow.Launcher.Plugin.OneNote/Search/SearchBase.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,15 @@ public abstract class SearchBase
88
protected readonly PluginInitContext context;
99
protected readonly Settings settings;
1010
protected readonly ResultCreator resultCreator;
11-
public Func<string> KeywordGetter { get; init; }
12-
public string Keyword => KeywordGetter();
11+
private readonly Func<string> keywordGetter;
12+
protected SearchBase(PluginInitContext context, Settings settings, ResultCreator resultCreator, Func<string> keywordGetter)
13+
{
14+
this.context = context;
15+
this.settings = settings;
16+
this.resultCreator = resultCreator;
17+
this.keywordGetter = keywordGetter;
18+
}
19+
public string Keyword => keywordGetter();
1320
protected Keywords Keywords => settings.Keywords;
1421
public abstract List<Result> GetResults(string query);
1522
}

Flow.Launcher.Plugin.OneNote/Search/SearchExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public static IEnumerable<T> FilterBySettings<T>(this IEnumerable<T> source, Set
4141
}
4242
}
4343

44+
//TODO: implement
4445
public static bool StartsWithOrd(this string str, string value)
4546
{
4647
return str.StartsWith(value, StringComparison.Ordinal);
Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,40 @@
11
using System.Collections.Generic;
2-
using System.Linq;
32

43
namespace Flow.Launcher.Plugin.OneNote.Search
54
{
65
public class SearchManager
76
{
7+
private readonly Settings settings;
8+
89
private readonly TitleSearch titleSearch;
9-
1010
private readonly NotebookExplorer notebookExplorer;
11-
private readonly Settings settings;
11+
private readonly DefaultSearch defaultSearch;
12+
private readonly RecentPages recentPages;
1213

13-
public SearchManager(Settings settings)
14+
public SearchManager(PluginInitContext context, Settings settings, ResultCreator resultCreator)
1415
{
1516
this.settings = settings;
16-
titleSearch = new TitleSearch
17-
{
18-
KeywordGetter = () => settings.Keywords.TitleSearch,
19-
};
20-
notebookExplorer = new NotebookExplorer
21-
{
22-
KeywordGetter = () => settings.Keywords.NotebookExplorer,
23-
};
24-
17+
titleSearch = new TitleSearch(context, settings, resultCreator);
18+
notebookExplorer = new NotebookExplorer(context, settings, resultCreator, titleSearch);
19+
recentPages = new RecentPages(context, settings, resultCreator);
20+
defaultSearch = new DefaultSearch(context, settings, resultCreator);
21+
2522
}
26-
public List<Result> Query(Query query)
23+
24+
public List<Result> Query(string search)
2725
{
28-
//PluginState ps;
29-
var r = query.Search switch
26+
return search switch
3027
{
31-
{ } search when search.StartsWith(titleSearch.Keyword) => titleSearch.GetResults(search),
32-
//string search when search.StartsWith(settings.Keywords.TitleSearch) => TitleSearch(ps, settings.Keywords.TitleSearch, search)
33-
28+
{ } when search.StartsWith(titleSearch.Keyword) => titleSearch.GetResults(search),
29+
{ } when search.StartsWith(notebookExplorer.Keyword) => notebookExplorer.GetResults(search),
30+
{ } when search.StartsWith(recentPages.Keyword) => recentPages.GetResults(search),
31+
_ => defaultSearch.GetResults(search!),
3432
};
35-
return null;
3633
}
3734
}
3835

39-
public record PluginState(PluginInitContext Context, Settings Settings, ResultCreator ResultCreator)
40-
{
41-
public Keywords Keywords => Settings.Keywords;
42-
}
36+
// public record PluginState(PluginInitContext Context, Settings Settings, ResultCreator ResultCreator)
37+
// {
38+
// public Keywords Keywords => Settings.Keywords;
39+
// }
4340
}
Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.Linq;
34
using Odotocodot.OneNote.Linq;
@@ -6,37 +7,25 @@ namespace Flow.Launcher.Plugin.OneNote.Search
67
{
78
public class TitleSearch : SearchBase
89
{
9-
public override List<Result> GetResults(string query)
10-
{
11-
return Filter(query, null, OneNoteApplication.GetNotebooks());
12-
}
13-
10+
public TitleSearch(PluginInitContext context, Settings settings, ResultCreator resultCreator) : base(context, settings, resultCreator,
11+
() => settings.Keywords.TitleSearch) { }
12+
13+
public override List<Result> GetResults(string query) => Filter(query, null, OneNoteApplication.GetNotebooks());
14+
1415
public List<Result> Filter(string query, IOneNoteItem? parent, IEnumerable<IOneNoteItem> collection)
1516
{
16-
if (query.Length == Keyword.Length && parent == null)
17+
if (query.Length == Keyword.Length || parent == null)
1718
return resultCreator.SearchingByTitle();
18-
19+
1920
var currentSearch = query[Keyword.Length..];
2021

21-
return collection.Traverse()
22-
.FilterBySettings(settings)
23-
.FuzzySearch(currentSearch, context)
24-
.Select(x => resultCreator.CreateOneNoteItemResult(x.item, false, x.highlightData, x.score))
25-
.ToList();
26-
}
27-
28-
public static List<Result> Filter(string query, IOneNoteItem? parent, IEnumerable<IOneNoteItem> collection, PluginInitContext context, Settings settings, ResultCreator resultCreator)
29-
{
30-
if (query.Length == settings.Keywords.TitleSearch.Length && parent == null)
31-
return resultCreator.SearchingByTitle();
32-
33-
var currentSearch = query[settings.Keywords.TitleSearch.Length..];
22+
var results = collection.Traverse()
23+
.FilterBySettings(settings)
24+
.FuzzySearch(currentSearch, context)
25+
.Select(x => resultCreator.CreateOneNoteItemResult(x.item, false, x.highlightData, x.score))
26+
.ToList();
3427

35-
return collection.Traverse()
36-
.FilterBySettings(settings)
37-
.FuzzySearch(currentSearch, context)
38-
.Select(x => resultCreator.CreateOneNoteItemResult(x.item, false, x.highlightData, x.score))
39-
.ToList();
28+
return results.Any() ? results : ResultCreator.NoMatchesFound();
4029
}
4130
}
4231
}

0 commit comments

Comments
 (0)