public async Task <SearchResults> SearchCodeAsync(SearchRequest searchRequest)
        {
            if (_searchClient == null)
            {
                _logger.LogInformation($"Code Search client isn't ready. Couldn't process request with filter '{searchRequest.Filter}'.");
                return(new SearchResults());
            }

            SearchResults result = null;
            string        searchTypeString;

            if (searchRequest.FindReferences)
            {
                searchTypeString = $"{searchRequest.Filter}"; // Do not use ref: prefix because it misses too many things
            }
            else
            {
                searchTypeString = $"def:{searchRequest.Filter}";
            }

            var request = new CodeSearchRequest
            {
                SearchText    = $"ext:cs {searchTypeString}{(searchRequest.ExactMatch ? string.Empty : "*")}",
                Skip          = 0,
                Top           = searchRequest.MaxResults,
                Filters       = _searchFilters,
                IncludeFacets = false
            };

            try
            {
                _logger.LogInformation($"Querying Azure DevOps Code Search with filter '{request.SearchText}'");
                using (var ct = new CancellationTokenSource(searchRequest.Timeout))
                {
                    Stopwatch          sw       = Stopwatch.StartNew();
                    CodeSearchResponse response = await _searchClient.FetchCodeSearchResultsAsync(request, ct);

                    _logger.LogInformation($"Response from Azure DevOps Code Search for filter '{request.SearchText}' completed in {sw.Elapsed.TotalSeconds:F2} seconds and contains results from {response.Results.Count()} files");

                    if (response != null)
                    {
                        result = await GetQuickFixesFromCodeResultsAsync(response.Results, searchRequest.FindReferences, searchRequest.Filter, searchRequest.ExactMatch);
                    }
                }
            }
            catch (Exception e)
            {
                _logger.LogError(e, $"Failed to query Azure DevOps Code Search for filter '{request.SearchText}'");
            }

            return(result ?? new SearchResults());
        }
Example #2
0
        public static void Main(string[] args)
        {
            const string url = @"https://account.visualstudio.com";

            Uri              uri          = new Uri(url);
            VssConnection    connection   = new VssConnection(uri, new VssClientCredentials());
            SearchHttpClient searchClient = connection.GetClient <SearchHttpClient>();

            IDictionary <string, IEnumerable <string> > filters = new Dictionary <string, IEnumerable <string> >
            {
                ["Project"] = new[]
                {
                    "<repo project>"
                },
                ["Repository"] = new[]
                {
                    "<repo name>"
                },
                ["Path"] = new[]
                {
                    ""
                },
                ["Branch"] = new[]
                {
                    "master"
                },
                // ["CodeElement"] = new[] { "def" }
            };

            CodeSearchRequest searchRequest = new CodeSearchRequest
            {
                SearchText    = "def:getconfig* OR basetype:getconfig*",
                Skip          = 0,
                Top           = 10,
                Filters       = filters,
                IncludeFacets = true
            };

            CodeSearchResponse searchResults = searchClient.FetchAdvancedCodeSearchResultsAsync(searchRequest).GetAwaiter().GetResult();

            Console.WriteLine($"Total matches = {searchResults.Count}.");
            Console.WriteLine("Results fetched:");
            int rank = 1;

            foreach (CodeResult result in searchResults.Results)
            {
                var f = Path.GetFileNameWithoutExtension(result.Filename);
                Console.WriteLine($"Rank = {rank++}, Project = {result.Project.Name}, Repository = {result.Repository.Name}, Branch = {result.Versions.FirstOrDefault()?.BranchName}, " +
                                  $"FilePath = {result.Path}, HitsInFile = {result.Matches.Count}");
            }
        }