Skip to content

Commit f5f7126

Browse files
Copilottjprescott
andauthored
[APIView] Parameterize CosmosPullRequestsRepository queries (#15748)
* Initial plan * Use parameterized Cosmos queries for pull requests repository Co-authored-by: tjprescott <5723682+tjprescott@users.noreply.github.com> * Bind optional Cosmos query params only when used Co-authored-by: tjprescott <5723682+tjprescott@users.noreply.github.com> * Fix fluent QueryDefinition parameter assignment Co-authored-by: tjprescott <5723682+tjprescott@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: tjprescott <5723682+tjprescott@users.noreply.github.com>
1 parent ee2090a commit f5f7126

1 file changed

Lines changed: 65 additions & 44 deletions

File tree

src/dotnet/APIView/APIViewWeb/Repositories/CosmosPullRequestsRepository.cs

Lines changed: 65 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using System.Text;
77
using System.Threading.Tasks;
88
using APIViewWeb.Models;
9-
using APIViewWeb.Repositories;
9+
using APIViewWeb.Repositories;
1010
using Microsoft.Azure.Cosmos;
1111
using Microsoft.Extensions.Configuration;
1212

@@ -25,12 +25,22 @@ public CosmosPullRequestsRepository(IConfiguration configuration, ICosmosReviewR
2525

2626
public async Task<PullRequestModel> GetPullRequestAsync(int pullRequestNumber, string repoName, string packageName, string language = null)
2727
{
28-
var queryBuilder = new StringBuilder($"SELECT * FROM PullRequests c WHERE c.PullRequestNumber = {pullRequestNumber} AND c.RepoName = '{repoName}' AND c.PackageName = '{packageName}' AND c.IsDeleted = false");
28+
var queryBuilder = new StringBuilder("SELECT * FROM PullRequests c WHERE c.PullRequestNumber = @pullRequestNumber AND c.RepoName = @repoName AND c.PackageName = @packageName AND c.IsDeleted = false");
2929
if (language != null)
3030
{
31-
queryBuilder.Append($" AND IS_DEFINED(c.Language) AND c.Language = '{language}'");
31+
queryBuilder.Append(" AND IS_DEFINED(c.Language) AND c.Language = @language");
3232
}
33-
var requests = await GetPullRequestFromQueryAsync(queryBuilder.ToString());
33+
34+
var queryDefinition = new QueryDefinition(queryBuilder.ToString())
35+
.WithParameter("@pullRequestNumber", pullRequestNumber)
36+
.WithParameter("@repoName", repoName)
37+
.WithParameter("@packageName", packageName);
38+
if (language != null)
39+
{
40+
queryDefinition = queryDefinition.WithParameter("@language", language);
41+
}
42+
43+
var requests = await GetPullRequestFromQueryAsync(queryDefinition);
3444
return requests.Count > 0 ? requests[0] : null;
3545
}
3646

@@ -41,30 +51,41 @@ public async Task UpsertPullRequestAsync(PullRequestModel pullRequestModel)
4151

4252
public async Task<IEnumerable<PullRequestModel>> GetPullRequestsAsync(bool isOpen)
4353
{
44-
var query = $"SELECT * FROM PullRequests c WHERE c.IsOpen = {(isOpen? "true": "false")} AND c.IsDeleted = false";
45-
return await GetPullRequestFromQueryAsync(query);
46-
}
47-
54+
var queryDefinition = new QueryDefinition("SELECT * FROM PullRequests c WHERE c.IsOpen = @isOpen AND c.IsDeleted = false")
55+
.WithParameter("@isOpen", isOpen);
56+
return await GetPullRequestFromQueryAsync(queryDefinition);
57+
}
58+
4859
public async Task<List<PullRequestModel>> GetPullRequestsAsync(int pullRequestNumber, string repoName)
4960
{
50-
var query = $"SELECT * FROM PullRequests c WHERE c.PullRequestNumber = {pullRequestNumber} and c.RepoName = '{repoName}' AND c.IsDeleted = false";
51-
return await GetPullRequestFromQueryAsync(query);
52-
}
53-
54-
public async Task<IEnumerable<PullRequestModel>> GetPullRequestsAsync(string reviewId, string apiRevisionId = null) {
55-
var query = $"SELECT * FROM PullRequests c WHERE c.ReviewId = '{reviewId}' AND c.IsDeleted = false";
56-
if (!string.IsNullOrEmpty(apiRevisionId))
57-
{
58-
query += $" AND c.APIRevisionId = '{apiRevisionId}'";
59-
}
60-
61-
return await GetPullRequestFromQueryAsync(query);
61+
var queryDefinition = new QueryDefinition("SELECT * FROM PullRequests c WHERE c.PullRequestNumber = @pullRequestNumber AND c.RepoName = @repoName AND c.IsDeleted = false")
62+
.WithParameter("@pullRequestNumber", pullRequestNumber)
63+
.WithParameter("@repoName", repoName);
64+
return await GetPullRequestFromQueryAsync(queryDefinition);
65+
}
66+
67+
public async Task<IEnumerable<PullRequestModel>> GetPullRequestsAsync(string reviewId, string apiRevisionId = null)
68+
{
69+
var queryBuilder = new StringBuilder("SELECT * FROM PullRequests c WHERE c.ReviewId = @reviewId AND c.IsDeleted = false");
70+
if (!string.IsNullOrEmpty(apiRevisionId))
71+
{
72+
queryBuilder.Append(" AND c.APIRevisionId = @apiRevisionId");
73+
}
74+
75+
var queryDefinition = new QueryDefinition(queryBuilder.ToString())
76+
.WithParameter("@reviewId", reviewId);
77+
if (!string.IsNullOrEmpty(apiRevisionId))
78+
{
79+
queryDefinition = queryDefinition.WithParameter("@apiRevisionId", apiRevisionId);
80+
}
81+
82+
return await GetPullRequestFromQueryAsync(queryDefinition);
6283
}
6384

64-
private async Task<List<PullRequestModel>> GetPullRequestFromQueryAsync(string query)
85+
private async Task<List<PullRequestModel>> GetPullRequestFromQueryAsync(QueryDefinition queryDefinition)
6586
{
6687
var allRequests = new List<PullRequestModel>();
67-
var itemQueryIterator = _pullRequestsContainer.GetItemQueryIterator<PullRequestModel>(query);
88+
var itemQueryIterator = _pullRequestsContainer.GetItemQueryIterator<PullRequestModel>(queryDefinition);
6889
while (itemQueryIterator.HasMoreResults)
6990
{
7091
var result = await itemQueryIterator.ReadNextAsync();
@@ -76,32 +97,32 @@ private async Task<List<PullRequestModel>> GetPullRequestFromQueryAsync(string q
7697
Dictionary<string, List<PullRequestModel>> kvp = new Dictionary<string, List<PullRequestModel>>();
7798
foreach (var pr in allRequests)
7899
{
79-
if (!string.IsNullOrEmpty(pr.ReviewId))
100+
if (!string.IsNullOrEmpty(pr.ReviewId))
101+
{
102+
if (kvp.ContainsKey(pr.ReviewId))
103+
{
104+
kvp[pr.ReviewId].Add(pr);
105+
}
106+
else
107+
{
108+
kvp.Add(pr.ReviewId, new List<PullRequestModel> { pr });
109+
}
110+
}
111+
}
112+
113+
if (kvp.Any())
114+
{
115+
var reviews = await _reviewsRepository.GetReviewsAsync(reviewIds: new List<string>(kvp.Keys), isClosed: false);
116+
var reviewIds = reviews.Select(r => r.Id).ToList();
117+
118+
foreach (var kv in kvp)
80119
{
81-
if (kvp.ContainsKey(pr.ReviewId))
82-
{
83-
kvp[pr.ReviewId].Add(pr);
84-
}
85-
else
86-
{
87-
kvp.Add(pr.ReviewId, new List<PullRequestModel> { pr });
120+
if (reviewIds.Contains(kv.Key))
121+
{
122+
filtered.AddRange(kv.Value);
88123
}
89124
}
90125
}
91-
92-
if (kvp.Any())
93-
{
94-
var reviews = await _reviewsRepository.GetReviewsAsync(reviewIds: new List<string>(kvp.Keys), isClosed: false);
95-
var reviewIds = reviews.Select(r => r.Id).ToList();
96-
97-
foreach (var kv in kvp)
98-
{
99-
if (reviewIds.Contains(kv.Key))
100-
{
101-
filtered.AddRange(kv.Value);
102-
}
103-
}
104-
}
105126
return filtered;
106127
}
107128
}

0 commit comments

Comments
 (0)