From 5f6043e59367a9f103e8c1812645a88a8876db3a Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sat, 29 Jan 2022 14:47:58 -0600 Subject: [PATCH] index added date (#601) --- CHANGELOG.md | 4 ++++ .../Search/CustomMultiFieldQueryParser.cs | 15 +++++++++++++++ .../Search/CustomQueryParser.cs | 15 +++++++++++++++ ErsatzTV.Infrastructure/Search/SearchIndex.cs | 19 ++++++++++++++++++- 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 759ab65a4..e8fa567b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - Hide console window on macOS; tray menu can be used to access UI, logs and to stop the app - Also write logs to text files in the `logs` config subfolder +- Add `added_date` to search index + - This requires rebuilding the search index and search results may be empty or incomplete until the rebuild is complete +- Add `added_inthelast`, `added_notinthelast` search field for relative added date queries + - Syntax is a number and a unit (days, weeks, months, years) like `1 week` or `2 years` ## [0.3.8-alpha] - 2022-01-23 ### Fixed diff --git a/ErsatzTV.Infrastructure/Search/CustomMultiFieldQueryParser.cs b/ErsatzTV.Infrastructure/Search/CustomMultiFieldQueryParser.cs index a243bccf8..4a122871d 100644 --- a/ErsatzTV.Infrastructure/Search/CustomMultiFieldQueryParser.cs +++ b/ErsatzTV.Infrastructure/Search/CustomMultiFieldQueryParser.cs @@ -60,6 +60,21 @@ namespace ErsatzTV.Infrastructure.Search return base.GetRangeQuery("release_date", "00000000", dateString, false, false); } + if (field == "added_inthelast" && CustomQueryParser.ParseStart(queryText, out DateTime addedStart)) + { + var todayString = DateTime.Today.ToString("yyyyMMdd"); + var dateString = addedStart.ToString("yyyyMMdd"); + + return base.GetRangeQuery("added_date", dateString, todayString, true, true); + } + + if (field == "added_notinthelast" && CustomQueryParser.ParseStart(queryText, out DateTime addedFinish)) + { + var dateString = addedFinish.ToString("yyyyMMdd"); + + return base.GetRangeQuery("added_date", "00000000", dateString, false, false); + } + return base.GetFieldQuery(field, queryText, slop); } diff --git a/ErsatzTV.Infrastructure/Search/CustomQueryParser.cs b/ErsatzTV.Infrastructure/Search/CustomQueryParser.cs index 3b7690317..ebc51a426 100644 --- a/ErsatzTV.Infrastructure/Search/CustomQueryParser.cs +++ b/ErsatzTV.Infrastructure/Search/CustomQueryParser.cs @@ -57,6 +57,21 @@ namespace ErsatzTV.Infrastructure.Search return base.GetRangeQuery("release_date", "00000000", dateString, false, false); } + if (field == "added_inthelast" && ParseStart(queryText, out DateTime addedStart)) + { + var todayString = DateTime.Today.ToString("yyyyMMdd"); + var dateString = addedStart.ToString("yyyyMMdd"); + + return base.GetRangeQuery("added_date", dateString, todayString, true, true); + } + + if (field == "added_notinthelast" && ParseStart(queryText, out DateTime addedFinish)) + { + var dateString = addedFinish.ToString("yyyyMMdd"); + + return base.GetRangeQuery("added_date", "00000000", dateString, false, false); + } + return base.GetFieldQuery(field, queryText, slop); } diff --git a/ErsatzTV.Infrastructure/Search/SearchIndex.cs b/ErsatzTV.Infrastructure/Search/SearchIndex.cs index dae750ad8..9ffc9fb60 100644 --- a/ErsatzTV.Infrastructure/Search/SearchIndex.cs +++ b/ErsatzTV.Infrastructure/Search/SearchIndex.cs @@ -43,6 +43,7 @@ namespace ErsatzTV.Infrastructure.Search private const string TitleAndYearField = "title_and_year"; private const string JumpLetterField = "jump_letter"; private const string ReleaseDateField = "release_date"; + private const string AddedDateField = "added_date"; private const string StudioField = "studio"; private const string LanguageField = "language"; private const string StyleField = "style"; @@ -80,7 +81,7 @@ namespace ErsatzTV.Infrastructure.Search _initialized = false; } - public int Version => 19; + public int Version => 20; public Task Initialize(ILocalFileSystem localFileSystem) { @@ -342,6 +343,8 @@ namespace ErsatzTV.Infrastructure.Search Field.Store.NO)); } + doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO)); + if (!string.IsNullOrWhiteSpace(metadata.Plot)) { doc.Add(new TextField(PlotField, metadata.Plot ?? string.Empty, Field.Store.NO)); @@ -468,6 +471,8 @@ namespace ErsatzTV.Infrastructure.Search Field.Store.NO)); } + doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO)); + if (!string.IsNullOrWhiteSpace(metadata.Plot)) { doc.Add(new TextField(PlotField, metadata.Plot ?? string.Empty, Field.Store.NO)); @@ -558,6 +563,8 @@ namespace ErsatzTV.Infrastructure.Search Field.Store.NO)); } + doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO)); + foreach (TraktListItem item in season.TraktListItems) { doc.Add(new StringField(TraktListField, item.TraktList.TraktId.ToString(), Field.Store.NO)); @@ -597,6 +604,8 @@ namespace ErsatzTV.Infrastructure.Search List languages = await searchRepository.GetLanguagesForArtist(artist); await AddLanguages(searchRepository, doc, languages); + doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO)); + foreach (Genre genre in metadata.Genres) { doc.Add(new TextField(GenreField, genre.Name, Field.Store.NO)); @@ -659,6 +668,8 @@ namespace ErsatzTV.Infrastructure.Search metadata.ReleaseDate.Value.ToString("yyyyMMdd"), Field.Store.NO)); } + + doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO)); if (!string.IsNullOrWhiteSpace(metadata.Album)) { @@ -748,6 +759,8 @@ namespace ErsatzTV.Infrastructure.Search metadata.ReleaseDate.Value.ToString("yyyyMMdd"), Field.Store.NO)); } + + doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO)); if (!string.IsNullOrWhiteSpace(metadata.Plot)) { @@ -827,6 +840,8 @@ namespace ErsatzTV.Infrastructure.Search { doc.Add(new Int32Field(MinutesField, (int)Math.Ceiling(version.Duration.TotalMinutes), Field.Store.NO)); } + + doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO)); foreach (Tag tag in metadata.Tags) { @@ -871,6 +886,8 @@ namespace ErsatzTV.Infrastructure.Search { doc.Add(new Int32Field(MinutesField, (int)Math.Ceiling(version.Duration.TotalMinutes), Field.Store.NO)); } + + doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO)); if (!string.IsNullOrWhiteSpace(metadata.Album)) {