// Recursive for dealing with subsearches private ComplexityScoreComponent ScoreSearchDetails(Search search, ComplexityScoreComponent currentScore) { // Break out early if we're already complex enough if (currentScore.IsComplexSearch || search == null) { return(currentScore); } // Determine if FullTextSearch if (search.SearchText?.Contains("SQLServer2005SearchProvider") ?? false) { currentScore.HasFullTextSearch = true; } // Determine if dtSearch var dtSearch = false; if (search.SearchText?.ToLower().Contains("dtsearch") ?? false) { // Set currentScore dtSearch flag, as well as the local scope for increasing the count on the correct character total currentScore.HasDTSearch = dtSearch = true; } // Count the number of 'like' operators in a search (include subsearches?) foreach (var crit in search.Criterias) { // Determine if FullTextSearch if (string.Equals(crit.Operator, "contains", StringComparison.InvariantCultureIgnoreCase)) { currentScore.HasFullTextSearch = true; } // Aggregate number of 'like'/'non-like' operators else if (string.Equals(crit.Operator, "like", StringComparison.InvariantCultureIgnoreCase)) { ++currentScore.TotalLikes; } else if (!string.Equals(crit.Operator, "in", StringComparison.InvariantCultureIgnoreCase) && !string.Equals(crit.Operator, "contains", StringComparison.InvariantCultureIgnoreCase)) { ++currentScore.TotalNonLikeOperators; } // Aggregate number of words in the Value property currentScore.TotalValueWords += crit.Value?.WordCount() ?? 0; // Aggregate number of characters if (dtSearch) { currentScore.TotalDTSearchCharacters += crit.Value?.Length ?? 0; } else { currentScore.TotalCharacters += crit.Value?.Length ?? 0; } // Aggregate the score of all the sub searches if (crit.IsSubSearch) { if (crit.SubSearch == null) { // Log warning when a recursive search is found. Otherwise, do nothing else. this.logger.LogWarning($"Found recursive search referenced. Search:{search.ArtifactId}, Workspace:{search.WorkspaceId}, SubSearch:{crit.Value}"); } else { ++currentScore.TotalSubsearches; currentScore = this.ScoreSearchDetails(crit.SubSearch, currentScore); } } if (currentScore.IsComplexSearch) { return(currentScore); } } // Query the number of search folders currentScore.TotalSearchFolders += this.searchFolderRepository.GetSearchFolderCountForSearch( search.WorkspaceId, search.ArtifactId); return(currentScore); }
public void ScoreSearchDetails_OneLevel(Search searchToScore, int searchFolderCount, ComplexityScoreComponent expectedComplexity) { this.searchFolderRepositoryMock.Setup( m => m.GetSearchFolderCountForSearch(searchToScore.WorkspaceId, searchToScore.ArtifactId)) .Returns(searchFolderCount); var result = this.searchAnalysisService.ScoreSearchDetails(searchToScore); Assert.That(result, Is.Not.Null); Assert.That(result.TotalLikes, Is.EqualTo(expectedComplexity.TotalLikes)); Assert.That(result.TotalValueWords, Is.EqualTo(expectedComplexity.TotalValueWords)); Assert.That(result.TotalCharacters, Is.EqualTo(expectedComplexity.TotalCharacters)); Assert.That(result.TotalDTSearchCharacters, Is.EqualTo(expectedComplexity.TotalDTSearchCharacters)); Assert.That(result.TotalSubsearches, Is.EqualTo(expectedComplexity.TotalSubsearches)); Assert.That(result.TotalNonLikeOperators, Is.EqualTo(expectedComplexity.TotalNonLikeOperators)); Assert.That(result.TotalSearchFolders, Is.EqualTo(expectedComplexity.TotalSearchFolders)); Assert.That(result.HasDTSearch, Is.EqualTo(expectedComplexity.HasDTSearch)); Assert.That(result.HasFullTextSearch, Is.EqualTo(expectedComplexity.HasFullTextSearch)); Assert.That(result.HasInOrContainsOperator, Is.EqualTo(expectedComplexity.HasInOrContainsOperator)); Assert.That(result.TotalScore, Is.EqualTo(expectedComplexity.TotalScore)); Assert.That(result.IsComplexSearch, Is.EqualTo(expectedComplexity.IsComplexSearch)); }