This commit is contained in:
2020-04-07 23:21:19 +00:00
parent 3169b6ec3a
commit ff36baaf57

View File

@@ -121,7 +121,17 @@ namespace AyaNova.Biz
return ReturnObject; return ReturnObject;
} }
//IF PHRASE SPECIFIED // todo: SEARCH UI
// - all searches without wildcards or quotes are "contains" searches by default and multiple phrases space delimited are accomodated
// - if user want's an exact search then they put it in quotes like google for MUST have in that exact form and case (if case insensitive mode)
//IF PHRASE SPECIFIED <---wtf? why wouldn't it be?
//escape literal percentage signs first just in case they are searching for 50% off or something
//https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE
//need to get around breaking possibly losing the symbol so make it text
searchParameters.Phrase = searchParameters.Phrase.Replace("%", "pctsym");
//Modify Phrase to replace wildcard * with % as breakcore expects sql style wildcards //Modify Phrase to replace wildcard * with % as breakcore expects sql style wildcards
searchParameters.Phrase = searchParameters.Phrase.Replace("*", "%"); searchParameters.Phrase = searchParameters.Phrase.Replace("*", "%");
@@ -130,15 +140,15 @@ namespace AyaNova.Biz
var PhraseItems = await BreakSearchPhraseAsync(translationId, searchParameters.Phrase); var PhraseItems = await BreakSearchPhraseAsync(translationId, searchParameters.Phrase);
//SPLIT OUT WILDCARDS FROM NON WILDCARDS //SPLIT OUT WILDCARDS FROM NON WILDCARDS
List<string> WildCardSearchTerms = new List<string>(); List<string> PreWildCardedSearchTerms = new List<string>();
List<string> RegularSearchTerms = new List<string>(); List<string> SearchTerms = new List<string>();
foreach (string PhraseItem in PhraseItems) foreach (string PhraseItem in PhraseItems)
{ {
if (PhraseItem.Contains("%")) if (PhraseItem.Contains("%"))
WildCardSearchTerms.Add(PhraseItem); PreWildCardedSearchTerms.Add(PhraseItem.Replace("pctsym", @"\%"));//put back literal percentage symbol if necessary
else else
RegularSearchTerms.Add(PhraseItem); SearchTerms.Add(PhraseItem.Replace("pctsym", @"\%"));//put back literal percentage symbol if necessary
} }
@@ -148,15 +158,19 @@ namespace AyaNova.Biz
//GET LIST OF DICTIONARY ID'S THAT MATCH REGULAR SEARCH TERMS //GET LIST OF DICTIONARY ID'S THAT MATCH REGULAR SEARCH TERMS
if (RegularSearchTerms.Count > 0) if (SearchTerms.Count > 0)
DictionaryMatches = await ct.SearchDictionary.Where(m => RegularSearchTerms.Contains(m.Word)).Select(m => m.Id).ToListAsync(); //DictionaryMatches = await ct.SearchDictionary.Where(m => SearchTerms.Contains(m.Word)).Select(m => m.Id).ToListAsync();
foreach (string Term in SearchTerms)
{
DictionaryMatches.AddRange(await ct.SearchDictionary.Where(m => m.Word.Contains(Term)).Select(m => m.Id).ToListAsync());
}
//GET LIST OF DICTIONARY ID'S THAT MATCH WILDCARD SEARCH TERMS //GET LIST OF DICTIONARY ID'S THAT MATCH WILDCARD SEARCH TERMS
if (WildCardSearchTerms.Count > 0) if (PreWildCardedSearchTerms.Count > 0)
{ {
foreach (string WildCardSearchTerm in WildCardSearchTerms) foreach (string WildCardSearchTerm in PreWildCardedSearchTerms)
{ {
//Contains? //Contains?
if (WildCardSearchTerm.StartsWith("%") && WildCardSearchTerm.EndsWith("%")) if (WildCardSearchTerm.StartsWith("%") && WildCardSearchTerm.EndsWith("%"))
@@ -175,7 +189,7 @@ namespace AyaNova.Biz
} }
//SEARCH SEARCHKEY FOR MATCHING WORDS AND OPTIONALLY TYPE AND INNAME //SEARCH SEARCHKEY FOR MATCHING WORDS AND OPTIONALLY TYPE AND INNAME
var TotalSearchTermsToMatch = WildCardSearchTerms.Count + RegularSearchTerms.Count; var TotalSearchTermsToMatch = PreWildCardedSearchTerms.Count + SearchTerms.Count;
// var TestRawMatches = await ct.SearchKey.Where(x => DictionaryMatches.Contains(x.WordId)).ToListAsync(); // var TestRawMatches = await ct.SearchKey.Where(x => DictionaryMatches.Contains(x.WordId)).ToListAsync();
@@ -706,24 +720,24 @@ cache or provide directly the translation to save time repeatedly fetching it wh
} }
} }
private static Dictionary<long, TranslationWordBreakingData> translationWordBreakingDataCache = new Dictionary<long, TranslationWordBreakingData>(); private static Dictionary<long, TranslationWordBreakingData> translationWordBreakingDataCache = new Dictionary<long, TranslationWordBreakingData>();
// //called at startup to populate cache // //called at startup to populate cache
//WAS GOING TO ADD THIS IN RESPONSE TO AN ISSUE WITH EXCEPTION ATTEMPTING TO ADD ALREADY EXISTING DICTIONARY ID 1, BUT IT NEVER HAPPENED AGAIN, SO :SHRUGEMOJI: //WAS GOING TO ADD THIS IN RESPONSE TO AN ISSUE WITH EXCEPTION ATTEMPTING TO ADD ALREADY EXISTING DICTIONARY ID 1, BUT IT NEVER HAPPENED AGAIN, SO :SHRUGEMOJI:
//IF IT DOES, MAKE THIS CODE AND POPULATE IT AT SERVER BOOT AND SHOULD BE ADEQUATE //IF IT DOES, MAKE THIS CODE AND POPULATE IT AT SERVER BOOT AND SHOULD BE ADEQUATE
//OR GO NUTS WITH A FULL MEMORY CACHE: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-3.1 //OR GO NUTS WITH A FULL MEMORY CACHE: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-3.1
// internal static async Task CacheAllTranslationWordBreakingData(){ // internal static async Task CacheAllTranslationWordBreakingData(){
// //iterate all Translations, cache the word break data // //iterate all Translations, cache the word break data
// l = await ct.Translation // l = await ct.Translation
// .AsNoTracking() // .AsNoTracking()
// .OrderBy(m => m.Name) // .OrderBy(m => m.Name)
// .Select(m => new NameIdItem() // .Select(m => new NameIdItem()
// { // {
// Id = m.Id, // Id = m.Id,
// Name = m.Name // Name = m.Name
// }).ToListAsync(); // }).ToListAsync();
// TranslationWordBreakingDataCache.Add(TranslationId, await GetTranslationSearchDataAsync(TranslationId)); // TranslationWordBreakingDataCache.Add(TranslationId, await GetTranslationSearchDataAsync(TranslationId));
// } // }
internal static async Task<TranslationWordBreakingData> GetTranslationSearchDataAsync(long translationId, AyContext ct = null) internal static async Task<TranslationWordBreakingData> GetTranslationSearchDataAsync(long translationId, AyContext ct = null)
{ {
TranslationWordBreakingData LSD = new TranslationWordBreakingData(); TranslationWordBreakingData LSD = new TranslationWordBreakingData();
@@ -792,7 +806,8 @@ private static Dictionary<long, TranslationWordBreakingData> translationWordBrea
{ {
List<string> textStrings = new List<string>(); List<string> textStrings = new List<string>();
textStrings.Add(searchPhrase); textStrings.Add(searchPhrase);
return await BreakCoreAsync(translationId, true, textStrings); //note: we want stopwords if this is a search phrase break because they might type "some" wanting awesome but some is a stopword so..
return await BreakCoreAsync(translationId, true, textStrings, true);
} }
/// <summary> /// <summary>
@@ -801,7 +816,7 @@ private static Dictionary<long, TranslationWordBreakingData> translationWordBrea
/// </summary> /// </summary>
internal static async Task<List<string>> BreakCoreAsync(long translationId, bool KeepWildCards, List<string> textStrings) internal static async Task<List<string>> BreakCoreAsync(long translationId, bool KeepWildCards, List<string> textStrings, bool ignoreStopWords = false)
{ {
//For stopwords and CJKIndex flag value //For stopwords and CJKIndex flag value
//if not provided (will be provided by seeder for performance but normally never) then fetch //if not provided (will be provided by seeder for performance but normally never) then fetch
@@ -1075,11 +1090,19 @@ private static Dictionary<long, TranslationWordBreakingData> translationWordBrea
//but keep them if they are part of a wildcard search phrase //but keep them if they are part of a wildcard search phrase
if (s.Length >= MINWORDLENGTH || (KeepWildCards && s.Contains('%'))) if (s.Length >= MINWORDLENGTH || (KeepWildCards && s.Contains('%')))
{ {
//Add only non stopwords if (ignoreStopWords)
if (!translationWordBreakData.StopWords.Contains(s))
{ {
//breaking of search phrase
ReturnList.Add(s); ReturnList.Add(s);
} }
else
{
//Add only non stopwords - regular breaking of object for dictionary entry
if (!translationWordBreakData.StopWords.Contains(s))
{
ReturnList.Add(s);
}
}
} }
} }