diff --git a/server/AyaNova/biz/AyaTypeId.cs b/server/AyaNova/biz/AyaTypeId.cs index dc02aa83..35acb6e1 100644 --- a/server/AyaNova/biz/AyaTypeId.cs +++ b/server/AyaNova/biz/AyaTypeId.cs @@ -44,7 +44,7 @@ namespace AyaNova.Biz _id = long.Parse(sId); int nType = int.Parse(sObjectTypeNumeral); if (!AyaTypeExists(nType)) - _ayaType = AyaType.NotValid; + _ayaType = AyaType.NoType; else _ayaType = (AyaType)Enum.Parse(typeof(AyaType), sObjectTypeNumeral); } @@ -53,7 +53,7 @@ namespace AyaNova.Biz { get { - return (_ayaType == AyaType.NotValid) || (_id == 0); + return (_ayaType == AyaType.NoType) || (_id == 0); } } diff --git a/server/AyaNova/biz/Search.cs b/server/AyaNova/biz/Search.cs index 332191ae..a87cc299 100644 --- a/server/AyaNova/biz/Search.cs +++ b/server/AyaNova/biz/Search.cs @@ -109,10 +109,83 @@ namespace AyaNova.Biz - public static async Task> DoSearch(AyContext ct, SearchRequestParameters searchParameters) + public static async Task> DoSearch(AyContext ct, long localeId, SearchRequestParameters searchParameters) { List ResultList = new List(); + if (!searchParameters.IsValid) + { + throw new System.ArgumentException("Search::DoSearch - Search request parameters must contain a phrase or tags"); + } + + //IF PHRASE SPECIFIED + + //Modify Phrase to replace wildcard * with % as breakcore expects sql style wildcards + searchParameters.Phrase = searchParameters.Phrase.Replace("*", "%"); + + //BREAK SEARCH PHRASE INTO SEPARATE TERMS + var PhraseItems = BreakSearchPhrase(localeId, searchParameters.Phrase); + + //SPLIT OUT WILDCARDS FROM NON WILDCARDS + List WildCardSearchTerms = new List(); + List RegularSearchTerms = new List(); + + foreach (string PhraseItem in PhraseItems) + { + if (PhraseItem.Contains("%")) + WildCardSearchTerms.Add(PhraseItem); + else + RegularSearchTerms.Add(PhraseItem); + } + + + + //GET LIST OF DICTIONARY ID'S THAT MATCH REGULAR SEARCH TERMS + List RegularMatches = new List(); + if (RegularSearchTerms.Count > 0) + RegularMatches = await ct.SearchDictionary.Where(m => RegularSearchTerms.Contains(m.Word)).ToListAsync(); + + + //GET LIST OF DICTIONARY ID'S THAT MATCH WILDCARD SEARCH TERMS + List WildCardMatches = new List(); + if (WildCardSearchTerms.Count > 0) + { + //Ok some fuckery required to implement this the EF CORE way + /* + .Where(entity => entity.Name.Contains("xyz")) + .Where(entity => entity.Name.EndsWith("xyz")) + .Where(entity => entity.Name.StartsWith("xyz")) + */ + foreach (string WildCardSearchTerm in WildCardSearchTerms) + { + //Contains? + if (WildCardSearchTerm.StartsWith("%") && WildCardSearchTerm.EndsWith("%")) + { + WildCardMatches.AddRange(await ct.SearchDictionary.Where(m => m.Word.EndsWith(WildCardSearchTerm.Replace("%", ""))).ToListAsync()); + } + else if (WildCardSearchTerm.EndsWith("%")) //STARTS WITH? + { + WildCardMatches.AddRange(await ct.SearchDictionary.Where(m => m.Word.EndsWith(WildCardSearchTerm.Replace("%", ""))).ToListAsync()); + } + else if (WildCardSearchTerm.StartsWith("%"))//ENDS WITH? + { + WildCardMatches.AddRange(await ct.SearchDictionary.Where(m => m.Word.EndsWith(WildCardSearchTerm.Replace("%", ""))).ToListAsync()); + } + } + + + WildCardMatches = await ct.SearchDictionary.Where(m => WildCardMatches.Contains(m.Word)).ToListAsync(); + } + + //SEARCH SEARCHKEY FOR MATCHING WORDS AND OPTIONALLY TYPE AND INNAME + + //IF TAGS SPECIFIED + //LOOP THROUGH SEARCHKEY MATCHES + //FOREACH OBJECT SEARCH TAGMAP FOR MATCHING OBJECTTYPE AND ID + //REMOVE RESULTS FROM SEARCH PHRASE PHASE THAT ARE NOT MATCHING + + + //fake await to clear error //await ct.SaveChangesAsync(); @@ -293,8 +366,7 @@ namespace AyaNova.Biz /// List of strings internal static List Break(long localeId, params string[] text) { - List KeyWordList = new List(BreakCore(localeId, false, text).Split(',')); - return KeyWordList; + return BreakCore(localeId, false, text); } /// @@ -304,7 +376,7 @@ namespace AyaNova.Biz /// /// /// - internal static string BreakSearchPhrase(long localeId, params string[] text) + internal static List BreakSearchPhrase(long localeId, params string[] text) { return BreakCore(localeId, true, text); } @@ -315,7 +387,7 @@ namespace AyaNova.Biz /// // public static System.Collections.Generic.List StopList = null; - internal static string BreakCore(long localeId, bool KeepWildCards, params string[] text) + internal static List BreakCore(long localeId, bool KeepWildCards, params string[] text) { //Get stopwords and CJKIndex flag value LocaleWordBreakingData LocaleSearchData = GetLocaleSearchData(localeId); @@ -327,11 +399,7 @@ namespace AyaNova.Biz StringBuilder sb = new StringBuilder(); StringBuilder sbWord = new StringBuilder(); - // System.IO.StringWriter sr = new System.IO.StringWriter(sb); - // System.Xml.XmlTextWriter w = new System.Xml.XmlTextWriter(sr); - - // w.Formatting = System.Xml.Formatting.Indented; - // w.WriteStartElement("Items"); + List ReturnList = new List(); //Loop through each of the passed in strings @@ -573,7 +641,7 @@ namespace AyaNova.Biz //bail early if there is nothing indexed - if (tempParsedWords.Count == 0) return ""; + if (tempParsedWords.Count == 0) return ReturnList; //Make a return string array @@ -583,14 +651,12 @@ namespace AyaNova.Biz //Add only non stopwords if (!LocaleSearchData.StopWords.Contains(s)) { - sbResults.Append(s); - sbResults.Append(","); + ReturnList.Add(s); } } - //sometimes all the results are stop words so you end up - //here with nothing in sbResults. - return sbResults.ToString().TrimEnd(','); + //sometimes all the results are stop words so you end up here with nothing + return ReturnList; } diff --git a/server/AyaNova/models/OpsJob.cs b/server/AyaNova/models/OpsJob.cs index 537b4dd0..5963e203 100644 --- a/server/AyaNova/models/OpsJob.cs +++ b/server/AyaNova/models/OpsJob.cs @@ -49,7 +49,7 @@ namespace AyaNova.Models StartAfter=Created; JobType=JobType.NotSet; ObjectId=0; - ObjectType=AyaType.NotValid; + ObjectType=AyaType.NoType; JobStatus=JobStatus.Sleeping; JobInfo=null;