예제 #1
0
        // 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));
        }