From c91c6f82298595d83b87ec83c56112c2449630bb Mon Sep 17 00:00:00 2001 From: Roberto T <61755417+RobertGlobant20@users.noreply.github.com> Date: Tue, 11 Jul 2023 07:44:31 -0700 Subject: [PATCH] DYN-6037 lucene overloaded nodes (#14136) * DYN-6037 Overloaded Nodes Some nodes were missing for the search due that were overloaded so the same node was added several times in the search results without considering the parameters. The fix was indexing also the parameters so when executing the search we need to also match the parameters. * DYN-6037 Overloaded Nodes Fixing comment * DYN-6037 Overloaded Nodes Code Review Adding comments for explaining a piece of code. * DYN-6037 Overloaded Nodes Code Review Renaming IndexFieldsEnum to NodeFieldsEnum. --- src/DynamoCore/Configuration/LuceneConfig.cs | 30 +++++++++++-------- src/DynamoCore/Models/DynamoModel.cs | 9 +++--- .../Utilities/LuceneSearchUtility.cs | 30 ++++++++++--------- .../PackageManagerSearchViewModel.cs | 10 +++---- .../ViewModels/Search/SearchViewModel.cs | 20 +++++++++---- 5 files changed, 58 insertions(+), 41 deletions(-) diff --git a/src/DynamoCore/Configuration/LuceneConfig.cs b/src/DynamoCore/Configuration/LuceneConfig.cs index 45aaec84a96..c74491078f7 100644 --- a/src/DynamoCore/Configuration/LuceneConfig.cs +++ b/src/DynamoCore/Configuration/LuceneConfig.cs @@ -92,7 +92,7 @@ internal class LuceneConfig /// /// This represent the fields that will be indexed when initializing Lucene Search /// - public enum IndexFieldsEnum + public enum NodeFieldsEnum { /// /// Name - The name of the node @@ -127,26 +127,32 @@ public enum IndexFieldsEnum /// /// Hosts - Package hosts /// - Hosts + Hosts, + + /// + /// Node Input Parameters as string (there are nodes with same name and category but different parameters) + /// + Parameters } /// /// Nodes Fields to be indexed by Lucene Search /// - public static string[] NodeIndexFields = { nameof(IndexFieldsEnum.Name), - nameof(IndexFieldsEnum.FullCategoryName), - nameof(IndexFieldsEnum.Description), - nameof(IndexFieldsEnum.SearchKeywords), - nameof(IndexFieldsEnum.DocName), - nameof(IndexFieldsEnum.Documentation)}; + public static string[] NodeIndexFields = { nameof(NodeFieldsEnum.Name), + nameof(NodeFieldsEnum.FullCategoryName), + nameof(NodeFieldsEnum.Description), + nameof(NodeFieldsEnum.SearchKeywords), + nameof(NodeFieldsEnum.DocName), + nameof(NodeFieldsEnum.Documentation), + nameof(NodeFieldsEnum.Parameters)}; /// /// Package Fields to be indexed by Lucene Search /// - public static string[] PackageIndexFields = { nameof(IndexFieldsEnum.Name), - nameof(IndexFieldsEnum.Description), - nameof(IndexFieldsEnum.SearchKeywords), - nameof(IndexFieldsEnum.Hosts)}; + public static string[] PackageIndexFields = { nameof(NodeFieldsEnum.Name), + nameof(NodeFieldsEnum.Description), + nameof(NodeFieldsEnum.SearchKeywords), + nameof(NodeFieldsEnum.Hosts)}; } } diff --git a/src/DynamoCore/Models/DynamoModel.cs b/src/DynamoCore/Models/DynamoModel.cs index 8753bb117aa..d6dd202672d 100644 --- a/src/DynamoCore/Models/DynamoModel.cs +++ b/src/DynamoCore/Models/DynamoModel.cs @@ -3253,10 +3253,11 @@ private void AddNodeTypeToSearchIndex(NodeSearchElement node, Document doc) if (IsTestMode) return; if (LuceneSearchUtility.addedFields == null) return; - LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.IndexFieldsEnum.FullCategoryName), node.FullCategoryName); - LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.IndexFieldsEnum.Name), node.Name); - LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.IndexFieldsEnum.Description), node.Description); - if (node.SearchKeywords.Count > 0) LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.IndexFieldsEnum.SearchKeywords), node.SearchKeywords.Aggregate((x, y) => x + " " + y), true, true); + LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.FullCategoryName), node.FullCategoryName); + LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Name), node.Name); + LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Description), node.Description); + if (node.SearchKeywords.Count > 0) LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.SearchKeywords), node.SearchKeywords.Aggregate((x, y) => x + " " + y), true, true); + LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Parameters), node.Parameters?? string.Empty); LuceneSearchUtility.writer?.AddDocument(doc); } diff --git a/src/DynamoCore/Utilities/LuceneSearchUtility.cs b/src/DynamoCore/Utilities/LuceneSearchUtility.cs index aac721035c2..d40097b681b 100644 --- a/src/DynamoCore/Utilities/LuceneSearchUtility.cs +++ b/src/DynamoCore/Utilities/LuceneSearchUtility.cs @@ -79,12 +79,13 @@ internal Document InitializeIndexDocumentForNodes() { if (DynamoModel.IsTestMode) return null; - var name = new TextField(nameof(LuceneConfig.IndexFieldsEnum.Name), string.Empty, Field.Store.YES); - var fullCategory = new TextField(nameof(LuceneConfig.IndexFieldsEnum.FullCategoryName), string.Empty, Field.Store.YES); - var description = new TextField(nameof(LuceneConfig.IndexFieldsEnum.Description), string.Empty, Field.Store.YES); - var keywords = new TextField(nameof(LuceneConfig.IndexFieldsEnum.SearchKeywords), string.Empty, Field.Store.YES); - var docName = new StringField(nameof(LuceneConfig.IndexFieldsEnum.DocName), string.Empty, Field.Store.YES); - var fullDoc = new TextField(nameof(LuceneConfig.IndexFieldsEnum.Documentation), string.Empty, Field.Store.YES); + var name = new TextField(nameof(LuceneConfig.NodeFieldsEnum.Name), string.Empty, Field.Store.YES); + var fullCategory = new TextField(nameof(LuceneConfig.NodeFieldsEnum.FullCategoryName), string.Empty, Field.Store.YES); + var description = new TextField(nameof(LuceneConfig.NodeFieldsEnum.Description), string.Empty, Field.Store.YES); + var keywords = new TextField(nameof(LuceneConfig.NodeFieldsEnum.SearchKeywords), string.Empty, Field.Store.YES); + var docName = new StringField(nameof(LuceneConfig.NodeFieldsEnum.DocName), string.Empty, Field.Store.YES); + var fullDoc = new TextField(nameof(LuceneConfig.NodeFieldsEnum.Documentation), string.Empty, Field.Store.YES); + var parameters = new TextField(nameof(LuceneConfig.NodeFieldsEnum.Parameters), string.Empty, Field.Store.YES); var d = new Document() { @@ -93,7 +94,8 @@ internal Document InitializeIndexDocumentForNodes() description, keywords, fullDoc, - docName + docName, + parameters }; return d; } @@ -106,10 +108,10 @@ internal Document InitializeIndexDocumentForPackages() { if (DynamoModel.IsTestMode) return null; - var name = new TextField(nameof(LuceneConfig.IndexFieldsEnum.Name), string.Empty, Field.Store.YES); - var description = new TextField(nameof(LuceneConfig.IndexFieldsEnum.Description), string.Empty, Field.Store.YES); - var keywords = new TextField(nameof(LuceneConfig.IndexFieldsEnum.SearchKeywords), string.Empty, Field.Store.YES); - var hosts = new TextField(nameof(LuceneConfig.IndexFieldsEnum.Hosts), string.Empty, Field.Store.YES); + var name = new TextField(nameof(LuceneConfig.NodeFieldsEnum.Name), string.Empty, Field.Store.YES); + var description = new TextField(nameof(LuceneConfig.NodeFieldsEnum.Description), string.Empty, Field.Store.YES); + var keywords = new TextField(nameof(LuceneConfig.NodeFieldsEnum.SearchKeywords), string.Empty, Field.Store.YES); + var hosts = new TextField(nameof(LuceneConfig.NodeFieldsEnum.Hosts), string.Empty, Field.Store.YES); var d = new Document() { @@ -196,7 +198,7 @@ internal string CreateSearchQuery(string[] fields, string SearchTerm) } var wildcardQuery = new WildcardQuery(new Term(f, searchTerm)); - if (f.Equals(nameof(LuceneConfig.IndexFieldsEnum.Name))) + if (f.Equals(nameof(LuceneConfig.NodeFieldsEnum.Name))) { wildcardQuery.Boost = LuceneConfig.SearchNameWeight; } @@ -207,7 +209,7 @@ internal string CreateSearchQuery(string[] fields, string SearchTerm) booleanQuery.Add(wildcardQuery, Occur.SHOULD); wildcardQuery = new WildcardQuery(new Term(f, "*" + searchTerm + "*")); - if (f.Equals(nameof(LuceneConfig.IndexFieldsEnum.Name))) + if (f.Equals(nameof(LuceneConfig.NodeFieldsEnum.Name))) { wildcardQuery.Boost = LuceneConfig.WildcardsSearchNameWeight; } @@ -228,7 +230,7 @@ internal string CreateSearchQuery(string[] fields, string SearchTerm) } wildcardQuery = new WildcardQuery(new Term(f, "*" + s + "*")); - if (f.Equals(nameof(LuceneConfig.IndexFieldsEnum.Name))) + if (f.Equals(nameof(LuceneConfig.NodeFieldsEnum.Name))) { wildcardQuery.Boost = 5; } diff --git a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs index 61d0848b4b4..c832a924eda 100644 --- a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs @@ -455,17 +455,17 @@ private void AddPackageToSearchIndex(PackageManagerSearchElement package, Docume if (DynamoModel.IsTestMode) return; if (LuceneSearchUtility.addedFields == null) return; - LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.IndexFieldsEnum.Name), package.Name); - LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.IndexFieldsEnum.Description), package.Description); + LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Name), package.Name); + LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Description), package.Description); if (package.Keywords.Count() > 0) { - LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.IndexFieldsEnum.SearchKeywords), package.Keywords); + LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.SearchKeywords), package.Keywords); } if (package.Hosts != null && string.IsNullOrEmpty(package.Hosts.ToString())) { - LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.IndexFieldsEnum.Hosts), package.Hosts.ToString(), true, true); + LuceneSearchUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Hosts), package.Hosts.ToString(), true, true); } LuceneSearchUtility.writer?.AddDocument(doc); @@ -1132,7 +1132,7 @@ internal IEnumerable Search(string searchT Document resultDoc = LuceneSearchUtility.Searcher.Doc(topDocs.ScoreDocs[i].Doc); // Get the view model of the package element and add it to the results. - string name = resultDoc.Get(nameof(LuceneConfig.IndexFieldsEnum.Name)); + string name = resultDoc.Get(nameof(LuceneConfig.NodeFieldsEnum.Name)); var foundPackage = GetViewModelForPackageSearchElement(name); if (foundPackage != null) diff --git a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs index d933c156c15..9f5aaaea7ce 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs @@ -962,9 +962,10 @@ internal IEnumerable Search(string search, bool useL // read back a Lucene doc from results Document resultDoc = LuceneSearchUtility.Searcher.Doc(topDocs.ScoreDocs[i].Doc); - string name = resultDoc.Get(nameof(LuceneConfig.IndexFieldsEnum.Name)); - string docName = resultDoc.Get(nameof(LuceneConfig.IndexFieldsEnum.DocName)); - string cat = resultDoc.Get(nameof(LuceneConfig.IndexFieldsEnum.FullCategoryName)); + string name = resultDoc.Get(nameof(LuceneConfig.NodeFieldsEnum.Name)); + string docName = resultDoc.Get(nameof(LuceneConfig.NodeFieldsEnum.DocName)); + string cat = resultDoc.Get(nameof(LuceneConfig.NodeFieldsEnum.FullCategoryName)); + string parameters = resultDoc.Get(nameof(LuceneConfig.NodeFieldsEnum.Parameters)); if (!string.IsNullOrEmpty(docName)) { @@ -972,7 +973,7 @@ internal IEnumerable Search(string search, bool useL } else { - var foundNode = FindViewModelForNodeNameAndCategory(name, cat); + var foundNode = FindViewModelForNodeNameAndCategory(name, cat, parameters); if (foundNode != null) { candidates.Add(foundNode); @@ -992,13 +993,20 @@ internal IEnumerable Search(string search, bool useL /// /// Name of the node /// Full Category of the node + /// Node input parameters /// - private NodeSearchElementViewModel FindViewModelForNodeNameAndCategory(string nodeName, string nodeCategory) + private NodeSearchElementViewModel FindViewModelForNodeNameAndCategory(string nodeName, string nodeCategory, string parameters) { var result = Model.SearchEntries.Where(e => { if (e.Name.Equals(nodeName) && e.FullCategoryName.Equals(nodeCategory)) { - return true; + //When the node info was indexed if Parameters was null we added an empty space (null cannot be indexed) + //Then in this case when searching if e.Parameters is null we need to check against empty space + if (e.Parameters == null) + return string.IsNullOrEmpty(parameters); + //Parameters contain a value so we need to compare against the value indexed + else + return e.Parameters.Equals(parameters); } return false; });