diff --git a/devdocs/todo.txt b/devdocs/todo.txt index d244ac21..2a4f485d 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -27,23 +27,9 @@ Once that is done then can steam ahead on the biz objects but until I have the c IMMEDIATE ITEMS: ================ -Current huge seeding takes around 15 minutes -Current unbounded search for "et*" in huge dataset takes avg 21 seconds to process -{ - "phrase": "et*", - "nameOnly": false, - "typeOnly": 0, - "maxResults": 0 -} + - Search and search text indexing - - https://gist.github.com/ruckus/5718112 - - //new issue came up during testing under heavy load: - - 23505: duplicate key value violates unique constraint "asearchdictionary_word_idx" - - Between the read of finding matching words and the adding a not found word another run added it independently - - - Change return object from a search to include a count of results plus the restricted list of results - this way the Client can know there are tons more than just weren't shown so they can narrow their terms - see if any other callers to name fetcher are in tight loops and could benefit from using the new Direct version diff --git a/server/AyaNova/biz/Search.cs b/server/AyaNova/biz/Search.cs index 3d0ab2ac..6b722d01 100644 --- a/server/AyaNova/biz/Search.cs +++ b/server/AyaNova/biz/Search.cs @@ -20,14 +20,6 @@ namespace AyaNova.Biz public static class Search { - /* - ISSUES: - Search of big data a little slow, attempt to tweak indices - - - */ - - #region Search and return results /* @@ -102,7 +94,7 @@ namespace AyaNova.Biz } - //Class to hold search result returned to client + //Classes to hold search results returned to client public class SearchResult { public string Name { get; set; } @@ -110,11 +102,20 @@ namespace AyaNova.Biz public long Id { get; set; } } - - - public static async Task> DoSearch(AyContext ct, long localeId, AuthorizationRoles currentUserRoles, SearchRequestParameters searchParameters) + public class SearchReturnObject { - List ResultList = new List(); + public long TotalResultsFound { get; set; } + public List SearchResults { get; set; } + public SearchReturnObject(){ + TotalResultsFound=0; + SearchResults = new List(); + } + } + + + public static async Task DoSearch(AyContext ct, long localeId, AuthorizationRoles currentUserRoles, SearchRequestParameters searchParameters) + { + var ReturnObject = new SearchReturnObject(); //list to hold temporary search/tag hits List MatchingObjects = new List(); @@ -234,7 +235,7 @@ namespace AyaNova.Biz if (MatchTagCount == 0) { //return empty resultlist - return ResultList; + return ReturnObject; } //Save the matching count @@ -323,10 +324,14 @@ namespace AyaNova.Biz MatchingObjects = CanReadMatchingObjects; } + + //TOTAL RESULTS + //we have the total results here so set accordingly + ReturnObject.TotalResultsFound=MatchingObjects.Count; + //MAXIMUM RESULTS FILTER //The theory is that it should be filtered BEFORE sorting so that you get the most random collection of results //As the results are not ranked so... - if (searchParameters.MaxResults > 0)//0 = all results MatchingObjects = MatchingObjects.Take(searchParameters.MaxResults).ToList(); @@ -353,14 +358,14 @@ namespace AyaNova.Biz SR.Id = i.ObjectId; SR.Type = i.ObjectType; - ResultList.Add(SR); + ReturnObject.SearchResults.Add(SR); } } // watch.Stop();//###################### PROFILING // var TimeToBuildSearchResultReturnList = watch.ElapsedMilliseconds;//###################### PROFILING - return ResultList; + return ReturnObject; } @@ -415,7 +420,7 @@ namespace AyaNova.Biz List MatchingKeywordIdList = new List(); - + //ITERATE ALL THE KEYWORDS, SEARCH IN THE SEARCHDICTIONARY TABLE AND COLLECT ID'S OF ANY PRE-EXISTING IN DB KEYWORDS var ExistingKeywordMatches = ct.SearchDictionary.Where(m => KeyWordList.Contains(m.Word)).ToDictionary(m => m.Id, m => m.Word); //Put the matching keyword ID's into the list @@ -460,7 +465,7 @@ namespace AyaNova.Biz } } - + //----- //Now add the id's of the newly created words to the matching keyword id list for this object @@ -882,7 +887,6 @@ namespace AyaNova.Biz #endregion - }//eoc }//eons \ No newline at end of file