Re-index if search engine files get deleted

This commit is contained in:
Robert McRackan 2019-11-11 16:16:17 -05:00
parent c598576683
commit 0b42b8ee49
9 changed files with 95 additions and 82 deletions

View File

@ -0,0 +1,40 @@
using System;
using System.Threading.Tasks;
using AudibleApi;
using DataLayer;
using DtoImporterService;
using InternalUtilities;
namespace ApplicationServices
{
public static class LibraryCommands
{
public static async Task<(int totalCount, int newCount)> IndexLibraryAsync(ILoginCallback callback)
{
var audibleApiActions = new AudibleApiActions();
var items = await audibleApiActions.GetAllLibraryItemsAsync(callback);
var totalCount = items.Count;
var libImporter = new LibraryImporter();
var newCount = await Task.Run(() => libImporter.Import(items));
await Task.Run(() => SearchEngineCommands.FullReIndex());
return (totalCount, newCount);
}
public static int IndexChangedTags(Book book)
{
// update disconnected entity
using var context = LibationContext.Create();
context.Update(book);
var qtyChanges = context.SaveChanges();
// this part is tags-specific
if (qtyChanges > 0)
SearchEngineCommands.UpdateBookTags(book);
return qtyChanges;
}
}
}

View File

@ -1,25 +0,0 @@
using System;
using System.Threading.Tasks;
using AudibleApi;
using DtoImporterService;
using InternalUtilities;
namespace ApplicationServices
{
public class LibraryIndexer
{
public async Task<(int totalCount, int newCount)> IndexAsync(ILoginCallback callback)
{
var audibleApiActions = new AudibleApiActions();
var items = await audibleApiActions.GetAllLibraryItemsAsync(callback);
var totalCount = items.Count;
var libImporter = new LibraryImporter();
var newCount = await Task.Run(() => libImporter.Import(items));
await SearchEngineActions.FullReIndexAsync();
return (totalCount, newCount);
}
}
}

View File

@ -1,20 +0,0 @@
using System.Threading.Tasks;
using DataLayer;
namespace ApplicationServices
{
public static class SearchEngineActions
{
public static async Task FullReIndexAsync()
{
var engine = new LibationSearchEngine.SearchEngine();
await engine.CreateNewIndexAsync().ConfigureAwait(false);
}
public static void UpdateBookTags(Book book)
{
var engine = new LibationSearchEngine.SearchEngine();
engine.UpdateTags(book.AudibleProductId, book.UserDefinedItem.Tags);
}
}
}

View File

@ -0,0 +1,43 @@
using System.Threading.Tasks;
using DataLayer;
using LibationSearchEngine;
namespace ApplicationServices
{
public static class SearchEngineCommands
{
public static void FullReIndex()
{
var engine = new SearchEngine();
engine.CreateNewIndex();
}
public static SearchResultSet Search(string searchString)
{
var engine = new SearchEngine();
try
{
return engine.Search(searchString);
}
catch (System.IO.FileNotFoundException)
{
FullReIndex();
return engine.Search(searchString);
}
}
public static void UpdateBookTags(Book book)
{
var engine = new SearchEngine();
try
{
engine.UpdateTags(book.AudibleProductId, book.UserDefinedItem.Tags);
}
catch (System.IO.FileNotFoundException)
{
FullReIndex();
engine.UpdateTags(book.AudibleProductId, book.UserDefinedItem.Tags);
}
}
}
}

View File

@ -1,21 +0,0 @@
using DataLayer;
namespace ApplicationServices
{
public static class TagUpdater
{
public static int IndexChangedTags(Book book)
{
// update disconnected entity
using var context = LibationContext.Create();
context.Update(book);
var qtyChanges = context.SaveChanges();
// this part is tags-specific
if (qtyChanges > 0)
SearchEngineActions.UpdateBookTags(book);
return qtyChanges;
}
}
}

View File

@ -160,8 +160,7 @@ namespace LibationSearchEngine
private Directory getIndex() => FSDirectory.Open(SearchEngineDirectory);
public async Task CreateNewIndexAsync() => await Task.Run(() => createNewIndex(true));
private void createNewIndex(bool overwrite)
public void CreateNewIndex(bool overwrite = true)
{
// 300 products
// 1st run after app is started: 400ms

View File

@ -31,8 +31,7 @@ namespace LibationWinForm
public async Task DoMainWorkAsync()
{
var callback = new Login.WinformResponder();
var indexer = new LibraryIndexer();
(TotalBooksProcessed, NewBooksAdded) = await indexer.IndexAsync(callback);
(TotalBooksProcessed, NewBooksAdded) = await LibraryCommands.IndexLibraryAsync(callback);
successMessages.Add($"Total processed: {TotalBooksProcessed}");
successMessages.Add($"New: {NewBooksAdded}");

View File

@ -2,9 +2,10 @@
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using Dinah.Core.DataBinding;
using ApplicationServices;
using DataLayer;
using Dinah.Core.Collections.Generic;
using Dinah.Core.DataBinding;
namespace LibationWinForm
{
@ -189,7 +190,7 @@ namespace LibationWinForm
{
book.UserDefinedItem.Tags = newTags;
var qtyChanges = ApplicationServices.TagUpdater.IndexChangedTags(book);
var qtyChanges = LibraryCommands.IndexChangedTags(book);
return qtyChanges;
}
@ -238,7 +239,7 @@ namespace LibationWinForm
if (dataGridView.Rows.Count == 0)
return;
var searchResults = new LibationSearchEngine.SearchEngine().Search(searchString);
var searchResults = SearchEngineCommands.Search(searchString);
var productIds = searchResults.Docs.Select(d => d.ProductId).ToList();
// https://stackoverflow.com/a/18942430

View File

@ -1,21 +1,18 @@
-- begin BETA ---------------------------------------------------------------------------------------------------------------------
if db present but no search files -- re-create
when library scan complete: close "Scan Library" dialog and THEN show results dialog
make sure the new "if (dataGridView.Rows.Count == 0)" doesn't break filtering if all are invisible
- load products. do a search with 0 results. do a search with results
libation errors on another computer:
copy pw, LibationSettings.json
file not found. probably about file locations. the bottom right and bottom left counts don't update
ONLY file in libation files: IdentityTokens.json. no other files OR folders
exception after library scan
file not found. same file?
no mdf,ldf files created in C:\Users\[username]
throttle needed for downloading images, pdf.s
no mdf,ldf files created in C:\Users\[username]
Warn of known performance issues
- Library import
incl image d/l. need to throttle
- Tag add/edit
- Grid is slow to respond loading when books aren't liberated
- get decrypt key -- unavoidable
@ -27,7 +24,7 @@ https://dotnetcoretutorials.com/2019/06/20/publishing-a-single-exe-file-in-net-c
-- begin ENHANCEMENT, IMPORT UI ---------------------------------------------------------------------------------------------------------------------
scan library in background?
can include a notice somewhere that it's in-process
why block the UI?
why block the UI at all?
-- end ENHANCEMENT, IMPORT UI ---------------------------------------------------------------------------------------------------------------------
-- begin BUG, FILE DOWNLOAD ---------------------------------------------------------------------------------------------------------------------