Skip to content

Commit 53e5262

Browse files
authored
fix: derive activity counts from paged nodes instead of search [CM-1220] (#4192)
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
1 parent 291a993 commit 53e5262

2 files changed

Lines changed: 20 additions & 58 deletions

File tree

services/apps/packages_worker/src/enricher/computeMedians.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export interface ResponseNode {
2626
export interface PrNode {
2727
createdAt: string
2828
mergedAt: string | null
29+
closedAt: string | null
2930
author: { login: string } | null
3031
comments: { nodes: ResponseNode[] }
3132
reviews: { nodes: ResponseNode[] }

services/apps/packages_worker/src/enricher/fetchActivitySnapshot.ts

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,11 @@ async function graphqlRequest<T>(
7070
return json.data as T
7171
}
7272

73-
function toDateString(date: Date): string {
74-
return date.toISOString().slice(0, 10)
75-
}
76-
7773
function buildDateWindows(): {
7874
since12m: Date
75+
since6m: Date
7976
since12mIso: string
8077
since6mIso: string
81-
since12mDate: string
82-
since6mDate: string
8378
} {
8479
const now = new Date()
8580

@@ -91,10 +86,9 @@ function buildDateWindows(): {
9186

9287
return {
9388
since12m,
89+
since6m,
9490
since12mIso: since12m.toISOString(),
9591
since6mIso: since6m.toISOString(),
96-
since12mDate: toDateString(since12m),
97-
since6mDate: toDateString(since6m),
9892
}
9993
}
10094

@@ -104,10 +98,6 @@ interface RateLimit {
10498
resetAt: string
10599
}
106100

107-
interface IssueCount {
108-
issueCount: number
109-
}
110-
111101
interface CommitHistory {
112102
totalCount: number
113103
}
@@ -127,14 +117,8 @@ interface SummaryQueryResult {
127117
commitsPrior6m?: CommitHistory
128118
}
129119
}
120+
openIssues: { totalCount: number }
130121
}
131-
prsOpened: IssueCount
132-
prsMerged: IssueCount
133-
prsClosedUnmerged: IssueCount
134-
issuesOpened: IssueCount
135-
issuesClosed: IssueCount
136-
issuesOpened6m: IssueCount
137-
issuesOpenNow: IssueCount
138122
}
139123

140124
interface PrPageQueryResult {
@@ -158,14 +142,7 @@ interface IssuePageQueryResult {
158142
}
159143

160144
const SUMMARY_QUERY = `
161-
query(
162-
$owner: String!, $name: String!,
163-
$since12m: GitTimestamp!, $since6m: GitTimestamp!,
164-
$searchPrsOpened: String!, $searchPrsMerged: String!,
165-
$searchPrsClosedUnmerged: String!,
166-
$searchIssuesOpened: String!, $searchIssuesClosed: String!,
167-
$searchIssuesOpened6m: String!, $searchIssuesOpenNow: String!
168-
) {
145+
query($owner: String!, $name: String!, $since12m: GitTimestamp!, $since6m: GitTimestamp!) {
169146
rateLimit { cost remaining resetAt }
170147
repository(owner: $owner, name: $name) {
171148
defaultBranchRef {
@@ -177,14 +154,8 @@ const SUMMARY_QUERY = `
177154
}
178155
}
179156
}
157+
openIssues: issues(states: OPEN) { totalCount }
180158
}
181-
prsOpened: search(query: $searchPrsOpened, type: ISSUE) { issueCount }
182-
prsMerged: search(query: $searchPrsMerged, type: ISSUE) { issueCount }
183-
prsClosedUnmerged: search(query: $searchPrsClosedUnmerged, type: ISSUE) { issueCount }
184-
issuesOpened: search(query: $searchIssuesOpened, type: ISSUE) { issueCount }
185-
issuesClosed: search(query: $searchIssuesClosed, type: ISSUE) { issueCount }
186-
issuesOpened6m: search(query: $searchIssuesOpened6m, type: ISSUE) { issueCount }
187-
issuesOpenNow: search(query: $searchIssuesOpenNow, type: ISSUE) { issueCount }
188159
}
189160
`
190161

@@ -197,6 +168,7 @@ const PR_PAGE_QUERY = `
197168
nodes {
198169
createdAt
199170
mergedAt
171+
closedAt
200172
author { login }
201173
comments(first: ${RESPONSES_PER_NODE}) { nodes { createdAt author { login } } }
202174
reviews(first: ${RESPONSES_PER_NODE}) { nodes { createdAt author { login } } }
@@ -325,24 +297,11 @@ export async function fetchActivitySnapshot(
325297
token: string,
326298
timeoutMs: number,
327299
): Promise<RepoActivitySnapshot> {
328-
const { since12m, since12mIso, since6mIso, since12mDate, since6mDate } = buildDateWindows()
329-
const repoFilter = `repo:${owner}/${name}`
300+
const { since12m, since6m, since12mIso, since6mIso } = buildDateWindows()
330301

331302
const summaryData = await graphqlRequest<SummaryQueryResult>(
332303
SUMMARY_QUERY,
333-
{
334-
owner,
335-
name,
336-
since12m: since12mIso,
337-
since6m: since6mIso,
338-
searchPrsOpened: `${repoFilter} is:pr created:>=${since12mDate}`,
339-
searchPrsMerged: `${repoFilter} is:pr is:merged created:>=${since12mDate}`,
340-
searchPrsClosedUnmerged: `${repoFilter} is:pr is:unmerged is:closed created:>=${since12mDate}`,
341-
searchIssuesOpened: `${repoFilter} is:issue created:>=${since12mDate}`,
342-
searchIssuesClosed: `${repoFilter} is:issue is:closed created:>=${since12mDate}`,
343-
searchIssuesOpened6m: `${repoFilter} is:issue created:>=${since6mDate}`,
344-
searchIssuesOpenNow: `${repoFilter} is:issue is:open`,
345-
},
304+
{ owner, name, since12m: since12mIso, since6m: since6mIso },
346305
token,
347306
timeoutMs,
348307
)
@@ -378,6 +337,9 @@ export async function fetchActivitySnapshot(
378337

379338
const prMedians = computePrMedians(prResult.nodes)
380339
const issueMedians = computeIssueMedians(issueResult.nodes)
340+
const issuesOpenedLast6m = issueResult.nodes.filter(
341+
(n) => new Date(n.createdAt) >= since6m,
342+
).length
381343

382344
// Lowest remaining across all requests — remaining only decreases within a reset window
383345
const lastRateLimit = [summaryData.rateLimit, prResult.rateLimit, issueResult.rateLimit]
@@ -391,17 +353,16 @@ export async function fetchActivitySnapshot(
391353
commitsLast12m,
392354
commitsLast6m,
393355
commitsPrior6m,
394-
prsOpenedLast12m: summaryData.prsOpened.issueCount,
395-
prsMergedLast12m: summaryData.prsMerged.issueCount,
396-
prsClosedUnmerged12m: summaryData.prsClosedUnmerged.issueCount,
356+
prsOpenedLast12m: prResult.nodes.length,
357+
prsMergedLast12m: prResult.nodes.filter((n) => n.mergedAt).length,
358+
prsClosedUnmerged12m: prResult.nodes.filter((n) => n.closedAt && !n.mergedAt).length,
397359
prMedianTimeToMergeHours: prMedians.medianTimeToMergeHours,
398360
prMedianTimeToFirstResponseHours: prMedians.medianTimeToFirstResponseHours,
399-
issuesOpenedLast12m: summaryData.issuesOpened.issueCount,
400-
issuesClosedLast12m: summaryData.issuesClosed.issueCount,
401-
issuesOpenedLast6m: summaryData.issuesOpened6m.issueCount,
402-
issuesOpenedPrior6m:
403-
summaryData.issuesOpened.issueCount - summaryData.issuesOpened6m.issueCount,
404-
issuesOpenNow: summaryData.issuesOpenNow.issueCount,
361+
issuesOpenedLast12m: issueResult.nodes.length,
362+
issuesClosedLast12m: issueResult.nodes.filter((n) => n.closedAt).length,
363+
issuesOpenedLast6m,
364+
issuesOpenedPrior6m: issueResult.nodes.length - issuesOpenedLast6m,
365+
issuesOpenNow: summaryData.repository.openIssues.totalCount,
405366
issueMedianTimeToCloseHours: issueMedians.medianTimeToCloseHours,
406367
issueMedianTimeToFirstResponseHours: issueMedians.medianTimeToFirstResponseHours,
407368
httpRequestCount: totalHttpRequests,

0 commit comments

Comments
 (0)