Skip to content

Commit

Permalink
[Search] Refactor implementation (loic-sharma#562)
Browse files Browse the repository at this point in the history
Improves the search services:

1. Introduces request models to reduce number of parameters
1. Plumbs additional search parameters to the autocomplete endpoint
1. Adds `packageType` property to the search response model
1. Removes unneeded default values on search services
  • Loading branch information
loic-sharma authored Aug 1, 2020
1 parent fa76475 commit 7c514bf
Show file tree
Hide file tree
Showing 16 changed files with 322 additions and 291 deletions.
2 changes: 1 addition & 1 deletion src/BaGet.Azure/Search/AzureSearchIndexer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public AzureSearchIndexer(
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}

public async Task IndexAsync(Package package, CancellationToken cancellationToken = default)
public async Task IndexAsync(Package package, CancellationToken cancellationToken)
{
var packages = await _packages.FindAsync(package.Id, includeUnlisted: false, cancellationToken);

Expand Down
83 changes: 34 additions & 49 deletions src/BaGet.Azure/Search/AzureSearchService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,46 +31,24 @@ public AzureSearchService(
}

public async Task<SearchResponse> SearchAsync(
string query = null,
int skip = 0,
int take = 20,
bool includePrerelease = true,
bool includeSemVer2 = true,
CancellationToken cancellationToken = default)
SearchRequest request,
CancellationToken cancellationToken)
{
return await SearchAsync(
query,
skip,
take,
includePrerelease,
includeSemVer2,
packageType: null,
framework: null,
cancellationToken);
}

public async Task<SearchResponse> SearchAsync(
string query = null,
int skip = 0,
int take = 20,
bool includePrerelease = true,
bool includeSemVer2 = true,
string packageType = null,
string framework = null,
CancellationToken cancellationToken = default)
{
var searchText = BuildSeachQuery(query, packageType, framework);
var filter = BuildSearchFilter(includePrerelease, includeSemVer2);
var searchText = BuildSeachQuery(request.Query, request.PackageType, request.Framework);
var filter = BuildSearchFilter(request.IncludePrerelease, request.IncludeSemVer2);
var parameters = new SearchParameters
{
IncludeTotalResultCount = true,
QueryType = QueryType.Full,
Skip = skip,
Top = take,
Skip = request.Skip,
Top = request.Take,
Filter = filter
};

var response = await _searchClient.Documents.SearchAsync<PackageDocument>(searchText, parameters, cancellationToken: cancellationToken);
var response = await _searchClient.Documents.SearchAsync<PackageDocument>(
searchText,
parameters,
cancellationToken: cancellationToken);

var results = new List<SearchResult>();

Expand Down Expand Up @@ -127,26 +105,24 @@ public async Task<SearchResponse> SearchAsync(
}

public async Task<AutocompleteResponse> AutocompleteAsync(
string query = null,
AutocompleteType type = AutocompleteType.PackageIds,
int skip = 0,
int take = 20,
bool includePrerelease = true,
bool includeSemVer2 = true,
CancellationToken cancellationToken = default)
AutocompleteRequest request,
CancellationToken cancellationToken)
{
// TODO: Do a prefix search on the package id field.
// TODO: Support versions autocomplete.
// TODO: Support prerelease and semver2 filters.
// TODO: Support prerelease, semver2, and package type filters.
// See: https://github.com/loic-sharma/BaGet/issues/291
var parameters = new SearchParameters
{
IncludeTotalResultCount = true,
Skip = skip,
Top = take,
Skip = request.Skip,
Top = request.Take,
};

var response = await _searchClient.Documents.SearchAsync<PackageDocument>(query, parameters, cancellationToken: cancellationToken);
var response = await _searchClient.Documents.SearchAsync<PackageDocument>(
request.Query,
parameters,
cancellationToken: cancellationToken);

var results = response.Results
.Select(r => r.Document.Id)
.ToList()
Expand All @@ -160,20 +136,29 @@ public async Task<AutocompleteResponse> AutocompleteAsync(
};
}

public Task<AutocompleteResponse> ListPackageVersionsAssync(
string packageId,
bool includePrerelease,
bool includeSemVer2,
CancellationToken cancellationToken)
{
// TODO: Support versions autocomplete.
// See: https://github.com/loic-sharma/BaGet/issues/291
throw new NotImplementedException();
}

public async Task<DependentsResponse> FindDependentsAsync(
string packageId,
int skip = 0,
int take = 20,
CancellationToken cancellationToken = default)
CancellationToken cancellationToken)
{
// TODO: Escape packageId.
var query = $"dependencies:{packageId.ToLowerInvariant()}";
var parameters = new SearchParameters
{
IncludeTotalResultCount = true,
QueryType = QueryType.Full,
Skip = skip,
Top = take,
Skip = 0,
Top = 20,
};

var response = await _searchClient.Documents.SearchAsync<PackageDocument>(query, parameters, cancellationToken: cancellationToken);
Expand Down
66 changes: 30 additions & 36 deletions src/BaGet.Azure/Table/TableSearchService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,64 +35,58 @@ public TableSearchService(
_url = url ?? throw new ArgumentNullException(nameof(url));
}

public async Task<AutocompleteResponse> AutocompleteAsync(
string query = null,
AutocompleteType type = AutocompleteType.PackageIds,
int skip = 0,
int take = 20,
bool includePrerelease = true,
bool includeSemVer2 = true,
CancellationToken cancellationToken = default)
public async Task<SearchResponse> SearchAsync(
SearchRequest request,
CancellationToken cancellationToken)
{
// TODO: Support version autocomplete
var results = await SearchInternalAsync(
query,
skip,
take,
includePrerelease,
includeSemVer2,
request.Query,
request.Skip,
request.Take,
request.IncludePrerelease,
request.IncludeSemVer2,
cancellationToken);

return new AutocompleteResponse
return new SearchResponse
{
TotalHits = results.Count,
Data = results.Select(ToAutocompleteResult).ToList(),
Data = results.Select(ToSearchResult).ToList()
};
}

public async Task<SearchResponse> SearchAsync(
string query = null,
int skip = 0,
int take = 20,
bool includePrerelease = true,
bool includeSemVer2 = true,
string packageType = null,
string framework = null,
CancellationToken cancellationToken = default)
public async Task<AutocompleteResponse> AutocompleteAsync(
AutocompleteRequest request,
CancellationToken cancellationToken)
{
var results = await SearchInternalAsync(
query,
skip,
take,
includePrerelease,
includeSemVer2,
request.Query,
request.Skip,
request.Take,
request.IncludePrerelease,
request.IncludeSemVer2,
cancellationToken);

return new SearchResponse
return new AutocompleteResponse
{
TotalHits = results.Count,
Data = results.Select(ToSearchResult).ToList()
Data = results.Select(ToAutocompleteResult).ToList(),
};
}

public Task<DependentsResponse> FindDependentsAsync(string packageId, int skip = 0, int take = 20, CancellationToken cancellationToken = default)
public Task<AutocompleteResponse> ListPackageVersionsAssync(
string packageId,
bool includePrerelease,
bool includeSemVer2,
CancellationToken cancellationToken)
{
return EmptyDependentsResponseTask;
// TODO: Support versions autocomplete.
// See: https://github.com/loic-sharma/BaGet/issues/291
throw new NotImplementedException();
}

public Task IndexAsync(Package package, CancellationToken cancellationToken = default)
public Task<DependentsResponse> FindDependentsAsync(string packageId, CancellationToken cancellationToken)
{
return Task.CompletedTask;
return EmptyDependentsResponseTask;
}

private async Task<List<List<PackageEntity>>> SearchInternalAsync(
Expand Down
2 changes: 1 addition & 1 deletion src/BaGet.Core/Indexing/PackageIndexingService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ await _storage.SavePackageContentAsync(
package.Id,
package.NormalizedVersionString);

await _search.IndexAsync(package);
await _search.IndexAsync(package, cancellationToken);

_logger.LogInformation(
"Successfully indexed package {Id} {Version} in search",
Expand Down
39 changes: 39 additions & 0 deletions src/BaGet.Core/Search/AutocompleteRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
namespace BaGet.Core
{
/// <summary>
/// The NuGet V3 search request.
/// See: https://docs.microsoft.com/en-us/nuget/api/search-autocomplete-service-resource#request-parameters
/// </summary>
public class AutocompleteRequest
{
/// <summary>
/// The number of results to skip, for pagination.
/// </summary>
public int Skip { get; set; }

/// <summary>
/// The number of results to return, for pagination.
/// </summary>
public int Take { get; set; }

/// <summary>
/// Whether to include pre-release packages.
/// </summary>
public bool IncludePrerelease { get; set; }

/// <summary>
/// Whether to include SemVer 2.0.0 compatible packages.
/// </summary>
public bool IncludeSemVer2 { get; set; }

/// <summary>
/// Filter results to a package type. If null, no filter is applied.
/// </summary>
public string PackageType { get; set; }

/// <summary>
/// The search query.
/// </summary>
public string Query { get; set; }
}
}
Loading

0 comments on commit 7c514bf

Please sign in to comment.