From 1fcacb9cfba8fd74ccd8a0e4b3238883c885e718 Mon Sep 17 00:00:00 2001 From: Robert McRackan Date: Thu, 29 Jul 2021 14:55:48 -0400 Subject: [PATCH] Much faster for grid refresh --- ApplicationServices/LibraryCommands.cs | 9 +++++++++ ApplicationServices/SearchEngineCommands.cs | 14 +++++++------- DataLayer/QueryObjects/BookQueries.cs | 2 ++ DataLayer/QueryObjects/LibraryQueries.cs | 2 ++ LibationLauncher/Program.cs | 2 +- LibationSearchEngine/SearchEngine.cs | 8 ++------ ...g.Designer.cs => BookDetailsDialog.Designer.cs} | 2 +- .../{EditTagsDialog.cs => BookDetailsDialog.cs} | 6 +++--- ...{EditTagsDialog.resx => BookDetailsDialog.resx} | 0 LibationWinForms/ProductsGrid.cs | 6 +++--- 10 files changed, 30 insertions(+), 21 deletions(-) rename LibationWinForms/Dialogs/{EditTagsDialog.Designer.cs => BookDetailsDialog.Designer.cs} (98%) rename LibationWinForms/Dialogs/{EditTagsDialog.cs => BookDetailsDialog.cs} (75%) rename LibationWinForms/Dialogs/{EditTagsDialog.resx => BookDetailsDialog.resx} (100%) diff --git a/ApplicationServices/LibraryCommands.cs b/ApplicationServices/LibraryCommands.cs index 8b9e56ce..97bdae3e 100644 --- a/ApplicationServices/LibraryCommands.cs +++ b/ApplicationServices/LibraryCommands.cs @@ -119,6 +119,9 @@ namespace ApplicationServices var udi = book.UserDefinedItem; + if (udi.Tags == newTags) + return 0; + // Attach() NoTracking entities before SaveChanges() udi.Tags = newTags; context.Attach(udi).State = Microsoft.EntityFrameworkCore.EntityState.Modified; @@ -144,6 +147,9 @@ namespace ApplicationServices var udi = libraryBook.Book.UserDefinedItem; + if (udi.BookStatus == liberatedStatus && udi.BookLocation == finalAudioPath) + return 0; + // Attach() NoTracking entities before SaveChanges() udi.BookStatus = liberatedStatus; udi.BookLocation = finalAudioPath; @@ -169,6 +175,9 @@ namespace ApplicationServices var udi = libraryBook.Book.UserDefinedItem; + if (udi.PdfStatus == liberatedStatus) + return 0; + // Attach() NoTracking entities before SaveChanges() udi.PdfStatus = liberatedStatus; context.Attach(udi).State = Microsoft.EntityFrameworkCore.EntityState.Modified; diff --git a/ApplicationServices/SearchEngineCommands.cs b/ApplicationServices/SearchEngineCommands.cs index 183dd266..dbe4287a 100644 --- a/ApplicationServices/SearchEngineCommands.cs +++ b/ApplicationServices/SearchEngineCommands.cs @@ -7,10 +7,10 @@ namespace ApplicationServices { public static class SearchEngineCommands { - public static void FullReIndex() + public static void FullReIndex(SearchEngine engine = null) { - var engine = new SearchEngine(DbContexts.GetContext()); - engine.CreateNewIndex(); + engine ??= new SearchEngine(); + engine.CreateNewIndex(DbContexts.GetContext()); } public static SearchResultSet Search(string searchString) => performSearchEngineFunc_safe(e => @@ -27,28 +27,28 @@ namespace ApplicationServices private static void performSearchEngineAction_safe(Action action) { - var engine = new SearchEngine(DbContexts.GetContext()); + var engine = new SearchEngine(); try { action(engine); } catch (FileNotFoundException) { - FullReIndex(); + FullReIndex(engine); action(engine); } } private static T performSearchEngineFunc_safe(Func action) { - var engine = new SearchEngine(DbContexts.GetContext()); + var engine = new SearchEngine(); try { return action(engine); } catch (FileNotFoundException) { - FullReIndex(); + FullReIndex(engine); return action(engine); } } diff --git a/DataLayer/QueryObjects/BookQueries.cs b/DataLayer/QueryObjects/BookQueries.cs index c6fa3098..581c810e 100644 --- a/DataLayer/QueryObjects/BookQueries.cs +++ b/DataLayer/QueryObjects/BookQueries.cs @@ -6,6 +6,8 @@ using Microsoft.EntityFrameworkCore; namespace DataLayer { + // only library importing should use tracking. All else should be NoTracking. + // only library importing should directly query Book. All else should use LibraryBook public static class BookQueries { public static Book GetBook_Flat_NoTracking(this LibationContext context, string productId) diff --git a/DataLayer/QueryObjects/LibraryQueries.cs b/DataLayer/QueryObjects/LibraryQueries.cs index fb366c32..269ef0a5 100644 --- a/DataLayer/QueryObjects/LibraryQueries.cs +++ b/DataLayer/QueryObjects/LibraryQueries.cs @@ -4,6 +4,8 @@ using Microsoft.EntityFrameworkCore; namespace DataLayer { + // only library importing should use tracking. All else should be NoTracking. + // only library importing should directly query Book. All else should use LibraryBook public static class LibraryQueries { //// tracking is a bad idea for main grid. it prevents anything else from updating entities unless getting them from the grid diff --git a/LibationLauncher/Program.cs b/LibationLauncher/Program.cs index 43ad8a62..2fa3c87a 100644 --- a/LibationLauncher/Program.cs +++ b/LibationLauncher/Program.cs @@ -361,7 +361,7 @@ namespace LibationLauncher config.ConfigureLogging(); // Fwd Console to serilog. - // Serilog also write to Console (should probably change this) so it might be asking for trouble. + // Serilog also writes to Console (should probably change this) so it might be asking for trouble. // SerilogTextWriter needs to be more robust and tested. Esp the Write() methods. // Empirical testing so far has shown no issues. Console.SetOut(new MultiTextWriter(origOut, new SerilogTextWriter())); diff --git a/LibationSearchEngine/SearchEngine.cs b/LibationSearchEngine/SearchEngine.cs index 1f655b00..4df7956f 100644 --- a/LibationSearchEngine/SearchEngine.cs +++ b/LibationSearchEngine/SearchEngine.cs @@ -18,8 +18,6 @@ namespace LibationSearchEngine { public const Lucene.Net.Util.Version Version = Lucene.Net.Util.Version.LUCENE_30; - private LibationContext context { get; } - // not customizable. don't move to config private static string SearchEngineDirectory { get; } = new System.IO.DirectoryInfo(Configuration.Instance.LibationFiles).CreateSubdirectory("SearchEngine").FullName; @@ -32,8 +30,6 @@ namespace LibationSearchEngine // the workaround which allows displaying all books when query is empty public const string ALL_QUERY = "*:*"; - public SearchEngine(LibationContext context) => this.context = context; - #region index rules private static ReadOnlyDictionary> idIndexRules { get; } = new ReadOnlyDictionary>( @@ -202,7 +198,7 @@ namespace LibationSearchEngine /// create new. ie: full re-index /// /// - public void CreateNewIndex(bool overwrite = true) + public void CreateNewIndex(LibationContext context, bool overwrite = true) { // 300 titles: 200- 400 ms // 1021 titles: 1777-2250 ms @@ -235,7 +231,7 @@ namespace LibationSearchEngine } /// Long running. Use await Task.Run(() => UpdateBook(productId)) - public void UpdateBook(string productId) + public void UpdateBook(LibationContext context, string productId) { var libraryBook = context.GetLibraryBook_Flat_NoTracking(productId); var term = new Term(_ID_, productId); diff --git a/LibationWinForms/Dialogs/EditTagsDialog.Designer.cs b/LibationWinForms/Dialogs/BookDetailsDialog.Designer.cs similarity index 98% rename from LibationWinForms/Dialogs/EditTagsDialog.Designer.cs rename to LibationWinForms/Dialogs/BookDetailsDialog.Designer.cs index 37060f22..11680c97 100644 --- a/LibationWinForms/Dialogs/EditTagsDialog.Designer.cs +++ b/LibationWinForms/Dialogs/BookDetailsDialog.Designer.cs @@ -1,6 +1,6 @@ namespace LibationWinForms.Dialogs { - partial class EditTagsDialog + partial class BookDetailsDialog { /// /// Required designer variable. diff --git a/LibationWinForms/Dialogs/EditTagsDialog.cs b/LibationWinForms/Dialogs/BookDetailsDialog.cs similarity index 75% rename from LibationWinForms/Dialogs/EditTagsDialog.cs rename to LibationWinForms/Dialogs/BookDetailsDialog.cs index dc454d42..27c5ab21 100644 --- a/LibationWinForms/Dialogs/EditTagsDialog.cs +++ b/LibationWinForms/Dialogs/BookDetailsDialog.cs @@ -3,15 +3,15 @@ using System.Windows.Forms; namespace LibationWinForms.Dialogs { - public partial class EditTagsDialog : Form + public partial class BookDetailsDialog : Form { public string NewTags { get; private set; } - public EditTagsDialog() + public BookDetailsDialog() { InitializeComponent(); } - public EditTagsDialog(string title, string rawTags) : this() + public BookDetailsDialog(string title, string rawTags) : this() { this.Text = $"Edit Tags - {title}"; diff --git a/LibationWinForms/Dialogs/EditTagsDialog.resx b/LibationWinForms/Dialogs/BookDetailsDialog.resx similarity index 100% rename from LibationWinForms/Dialogs/EditTagsDialog.resx rename to LibationWinForms/Dialogs/BookDetailsDialog.resx diff --git a/LibationWinForms/ProductsGrid.cs b/LibationWinForms/ProductsGrid.cs index 2c85f2d8..5f811bd1 100644 --- a/LibationWinForms/ProductsGrid.cs +++ b/LibationWinForms/ProductsGrid.cs @@ -255,11 +255,11 @@ namespace LibationWinForms // EditTagsDialog should display better-formatted title liveGridEntry.TryDisplayValue(nameof(liveGridEntry.Title), out string value); - var editTagsForm = new EditTagsDialog(value, liveGridEntry.Tags); - if (editTagsForm.ShowDialog() != DialogResult.OK) + var bookDetailsForm = new BookDetailsDialog(value, liveGridEntry.Tags); + if (bookDetailsForm.ShowDialog() != DialogResult.OK) return; - var qtyChanges = LibraryCommands.UpdateTags(liveGridEntry.GetBook(), editTagsForm.NewTags); + var qtyChanges = LibraryCommands.UpdateTags(liveGridEntry.GetBook(), bookDetailsForm.NewTags); if (qtyChanges == 0) return;