From 6916d78a0cc710fe9e68ad920e147f45c4ab4c0d Mon Sep 17 00:00:00 2001 From: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> Date: Fri, 9 Jan 2026 00:34:56 +0530 Subject: [PATCH 1/5] Add accepted change requests count metric Added an implementation for the "Accepted Change Requests" metric based on the CHAOSS definition.The metric aligns with existing PR metrics and supports filtering by time period, repository, submitter, and merger. Signed-off-by: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> --- collectoss/api/metrics/pull_request.py | 81 ++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/collectoss/api/metrics/pull_request.py b/collectoss/api/metrics/pull_request.py index 7f98ccee6..eb8f23df3 100644 --- a/collectoss/api/metrics/pull_request.py +++ b/collectoss/api/metrics/pull_request.py @@ -1226,7 +1226,88 @@ def pull_request_merged_status_counts(repo_group_id, repo_id=None, begin_date='1 return pr_merged_counts +@register_metric() +def accepted_change_requests_count(repo_group_id,repo_id=None,begin_date=None,end_date=None,submitter_id=None,merger_id=None): + """ + Returns the number of accepted (merged) change requests. + + Definition: + - Accepted change requests are pull requests that have been merged. + - Data source: GitHub (via Augur's ingested database). + + Supported Filters: + - Time period (begin_date, end_date) + - Repository or repository group + - Submitter (PR author) + - Merger (user who merged the PR) + + :param repo_group_id: Repository group ID + :param repo_id: Repository ID + :param begin_date: Start date + :param end_date: End date + :param submitter_id: Contributor ID of PR author + :param merger_id: Contributor ID of PR merger + :return: DataFrame with accepted change request count + """ + + if not begin_date: + begin_date = '1970-01-01 00:00:01' + if not end_date: + end_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + + + # Base query + + sql = """ + SELECT COUNT(DISTINCT pr.pull_request_id) AS accepted_change_requests + FROM pull_requests pr + JOIN repo r ON pr.repo_id = r.repo_id + WHERE pr.pr_merged_at IS NOT NULL + AND pr.pr_merged_at BETWEEN :begin_date AND :end_date + """ + + params = { + 'begin_date': begin_date, + 'end_date': end_date + } + # Repo / repo-group filter + + if repo_id: + sql += " AND pr.repo_id = :repo_id" + params['repo_id'] = repo_id + else: + sql += " AND r.repo_group_id = :repo_group_id" + params['repo_group_id'] = repo_group_id + + + # Submitter filter (PR author) + + if submitter_id: + sql += " AND pr.pr_src_author_id = :submitter_id" + params['submitter_id'] = submitter_id + + + # Merger filter (who merged PR) + + if merger_id: + sql += """ + AND pr.pull_request_id IN ( + SELECT ie.issue_id + FROM issue_events ie + WHERE ie.action = 'merged' + AND ie.cntrb_id = :merger_id + ) + """ + params['merger_id'] = merger_id + + + # Execute query + + with current_app.engine.connect() as conn: + results = pd.read_sql(s.sql.text(sql), conn, params=params) + + return results From 59bc7f2c9d293e83c210c013dd2877d00c0f69c4 Mon Sep 17 00:00:00 2001 From: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:51:32 +0530 Subject: [PATCH 2/5] Fixed bug in merger filter Update SQL query to use pull_request_events Signed-off-by: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> --- collectoss/api/metrics/pull_request.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/collectoss/api/metrics/pull_request.py b/collectoss/api/metrics/pull_request.py index eb8f23df3..405c60d0e 100644 --- a/collectoss/api/metrics/pull_request.py +++ b/collectoss/api/metrics/pull_request.py @@ -1293,10 +1293,10 @@ def accepted_change_requests_count(repo_group_id,repo_id=None,begin_date=None,en if merger_id: sql += """ AND pr.pull_request_id IN ( - SELECT ie.issue_id - FROM issue_events ie - WHERE ie.action = 'merged' - AND ie.cntrb_id = :merger_id + SELECT pre.pull_request_id + FROM pull_request_events pre + WHERE pre.action = 'merged' + AND pre.cntrb_id = :merger_id ) """ params['merger_id'] = merger_id From a7147792a54773277857ba697e603593021c7ed2 Mon Sep 17 00:00:00 2001 From: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> Date: Sat, 10 Jan 2026 10:41:04 +0530 Subject: [PATCH 3/5] correct column pr_augur_contributor_id is used and minor issues are also handled. Signed-off-by: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> --- collectoss/api/metrics/pull_request.py | 42 ++++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/collectoss/api/metrics/pull_request.py b/collectoss/api/metrics/pull_request.py index 405c60d0e..9f7b9677d 100644 --- a/collectoss/api/metrics/pull_request.py +++ b/collectoss/api/metrics/pull_request.py @@ -1227,7 +1227,7 @@ def pull_request_merged_status_counts(repo_group_id, repo_id=None, begin_date='1 return pr_merged_counts @register_metric() -def accepted_change_requests_count(repo_group_id,repo_id=None,begin_date=None,end_date=None,submitter_id=None,merger_id=None): +def accepted_change_requests_count(repo_group_id, repo_id=None, begin_date=None, end_date=None, submitter_id=None, merger_id=None): """ Returns the number of accepted (merged) change requests. @@ -1238,26 +1238,29 @@ def accepted_change_requests_count(repo_group_id,repo_id=None,begin_date=None,en Supported Filters: - Time period (begin_date, end_date) - Repository or repository group - - Submitter (PR author) - - Merger (user who merged the PR) + - Submitter (PR author) using Augur internal contributor ID (cntrb_id) + - Merger (user who merged the PR) using Augur internal contributor ID (cntrb_id) :param repo_group_id: Repository group ID - :param repo_id: Repository ID - :param begin_date: Start date - :param end_date: End date - :param submitter_id: Contributor ID of PR author - :param merger_id: Contributor ID of PR merger + :param repo_id: Repository ID (optional) + :param begin_date: Start date (optional) + :param end_date: End date (optional) + :param submitter_id: Augur contributor ID (cntrb_id) of PR author (optional) + :param merger_id: Augur contributor ID (cntrb_id) of PR merger (optional) :return: DataFrame with accepted change request count """ + # --------------------------- + # Default date handling + # --------------------------- if not begin_date: begin_date = '1970-01-01 00:00:01' if not end_date: end_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - + # --------------------------- # Base query - + # --------------------------- sql = """ SELECT COUNT(DISTINCT pr.pull_request_id) AS accepted_change_requests FROM pull_requests pr @@ -1271,8 +1274,9 @@ def accepted_change_requests_count(repo_group_id,repo_id=None,begin_date=None,en 'end_date': end_date } + # --------------------------- # Repo / repo-group filter - + # --------------------------- if repo_id: sql += " AND pr.repo_id = :repo_id" params['repo_id'] = repo_id @@ -1280,16 +1284,16 @@ def accepted_change_requests_count(repo_group_id,repo_id=None,begin_date=None,en sql += " AND r.repo_group_id = :repo_group_id" params['repo_group_id'] = repo_group_id - + # --------------------------- # Submitter filter (PR author) - + # --------------------------- if submitter_id: - sql += " AND pr.pr_src_author_id = :submitter_id" + sql += " AND pr.pr_augur_contributor_id = :submitter_id" params['submitter_id'] = submitter_id - + # --------------------------- # Merger filter (who merged PR) - + # --------------------------- if merger_id: sql += """ AND pr.pull_request_id IN ( @@ -1301,13 +1305,11 @@ def accepted_change_requests_count(repo_group_id,repo_id=None,begin_date=None,en """ params['merger_id'] = merger_id - + # --------------------------- # Execute query - + # --------------------------- with current_app.engine.connect() as conn: results = pd.read_sql(s.sql.text(sql), conn, params=params) return results - - From 5c1cf742225da9c42c0b6614427950d70c5674de Mon Sep 17 00:00:00 2001 From: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> Date: Sat, 10 Jan 2026 11:19:21 +0530 Subject: [PATCH 4/5] Update pull_request.py Signed-off-by: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> --- collectoss/api/metrics/pull_request.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/collectoss/api/metrics/pull_request.py b/collectoss/api/metrics/pull_request.py index 9f7b9677d..4b05227d8 100644 --- a/collectoss/api/metrics/pull_request.py +++ b/collectoss/api/metrics/pull_request.py @@ -1230,7 +1230,6 @@ def pull_request_merged_status_counts(repo_group_id, repo_id=None, begin_date='1 def accepted_change_requests_count(repo_group_id, repo_id=None, begin_date=None, end_date=None, submitter_id=None, merger_id=None): """ Returns the number of accepted (merged) change requests. - Definition: - Accepted change requests are pull requests that have been merged. - Data source: GitHub (via Augur's ingested database). @@ -1249,18 +1248,13 @@ def accepted_change_requests_count(repo_group_id, repo_id=None, begin_date=None, :param merger_id: Augur contributor ID (cntrb_id) of PR merger (optional) :return: DataFrame with accepted change request count """ - - # --------------------------- - # Default date handling - # --------------------------- + if not begin_date: begin_date = '1970-01-01 00:00:01' if not end_date: end_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - # --------------------------- # Base query - # --------------------------- sql = """ SELECT COUNT(DISTINCT pr.pull_request_id) AS accepted_change_requests FROM pull_requests pr @@ -1268,15 +1262,12 @@ def accepted_change_requests_count(repo_group_id, repo_id=None, begin_date=None, WHERE pr.pr_merged_at IS NOT NULL AND pr.pr_merged_at BETWEEN :begin_date AND :end_date """ - params = { 'begin_date': begin_date, 'end_date': end_date } - # --------------------------- # Repo / repo-group filter - # --------------------------- if repo_id: sql += " AND pr.repo_id = :repo_id" params['repo_id'] = repo_id @@ -1284,16 +1275,12 @@ def accepted_change_requests_count(repo_group_id, repo_id=None, begin_date=None, sql += " AND r.repo_group_id = :repo_group_id" params['repo_group_id'] = repo_group_id - # --------------------------- # Submitter filter (PR author) - # --------------------------- if submitter_id: sql += " AND pr.pr_augur_contributor_id = :submitter_id" params['submitter_id'] = submitter_id - # --------------------------- # Merger filter (who merged PR) - # --------------------------- if merger_id: sql += """ AND pr.pull_request_id IN ( @@ -1305,11 +1292,8 @@ def accepted_change_requests_count(repo_group_id, repo_id=None, begin_date=None, """ params['merger_id'] = merger_id - # --------------------------- # Execute query - # --------------------------- with current_app.engine.connect() as conn: results = pd.read_sql(s.sql.text(sql), conn, params=params) - return results From aca0e88c14c9425b78ca6bbdad7185370bc8f70b Mon Sep 17 00:00:00 2001 From: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> Date: Sat, 10 Jan 2026 13:51:14 +0530 Subject: [PATCH 5/5] Require repo_id or repo_group_id in pull request metrics Added validation to ensure either repo_id or repo_group_id is provided. Signed-off-by: Khusi2005 <139037790+Khusi2005@users.noreply.github.com> --- collectoss/api/metrics/pull_request.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/collectoss/api/metrics/pull_request.py b/collectoss/api/metrics/pull_request.py index 4b05227d8..546d495d3 100644 --- a/collectoss/api/metrics/pull_request.py +++ b/collectoss/api/metrics/pull_request.py @@ -1248,6 +1248,8 @@ def accepted_change_requests_count(repo_group_id, repo_id=None, begin_date=None, :param merger_id: Augur contributor ID (cntrb_id) of PR merger (optional) :return: DataFrame with accepted change request count """ + if not repo_id and not repo_group_id: + raise ValueError("Must provide either repo_id or repo_group_id") if not begin_date: begin_date = '1970-01-01 00:00:01' @@ -1266,7 +1268,6 @@ def accepted_change_requests_count(repo_group_id, repo_id=None, begin_date=None, 'begin_date': begin_date, 'end_date': end_date } - # Repo / repo-group filter if repo_id: sql += " AND pr.repo_id = :repo_id"