Skip to content

Commit 0447e89

Browse files
update google issue query to handle field searches (#4373)
1 parent 432d549 commit 0447e89

File tree

5 files changed

+93
-4
lines changed

5 files changed

+93
-4
lines changed

src/clusterfuzz/_internal/issue_management/google_issue_tracker/issue_tracker.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,10 +1113,21 @@ def get_attachment(self, resource_name):
11131113

11141114
def find_issues(self, keywords=None, only_open=None):
11151115
"""Finds issues."""
1116+
return self.find_issues_with_filters(keywords, only_open)
1117+
1118+
def find_issues_with_filters(self,
1119+
keywords=None,
1120+
query_filters=None,
1121+
only_open=None):
1122+
"""Finds issues with additional query filters."""
11161123
page_token = None
11171124
while True:
11181125
issues = self._execute(self.client.issues().list(
1119-
query=_get_query(keywords, only_open), pageToken=page_token))
1126+
query=_get_query(
1127+
string_keywords=keywords,
1128+
query_filters=query_filters,
1129+
only_open=only_open),
1130+
pageToken=page_token))
11201131
if "issues" not in issues:
11211132
return
11221133
for issue in issues['issues']:
@@ -1128,8 +1139,20 @@ def find_issues(self, keywords=None, only_open=None):
11281139

11291140
def find_issues_url(self, keywords=None, only_open=None):
11301141
"""Finds issues (web URL)."""
1142+
return self.find_issues_url_with_filters(
1143+
keywords=keywords, only_open=only_open)
1144+
1145+
def find_issues_url_with_filters(self,
1146+
keywords=None,
1147+
query_filters=None,
1148+
only_open=None):
1149+
"""Finds issues (web URL) with additional query filters."""
11311150
return (self._url + '?' + urllib.parse.urlencode({
1132-
'q': _get_query(keywords, only_open),
1151+
'q':
1152+
_get_query(
1153+
string_keywords=keywords,
1154+
query_filters=query_filters,
1155+
only_open=only_open),
11331156
}))
11341157

11351158
def issue_url(self, issue_id):
@@ -1168,9 +1191,12 @@ def _parse_datetime(date_string):
11681191
return datetime_obj
11691192

11701193

1171-
def _get_query(keywords, only_open):
1194+
def _get_query(string_keywords, only_open, query_filters):
11721195
"""Gets a search query."""
1173-
query = ' '.join('"{}"'.format(keyword) for keyword in keywords)
1196+
query = ' '.join('"{}"'.format(keyword) for keyword in string_keywords)
1197+
if query_filters:
1198+
query += ' '
1199+
query += ' '.join('{}'.format(keyword) for keyword in query_filters)
11741200
if only_open:
11751201
query += ' status:open'
11761202
return query

src/clusterfuzz/_internal/issue_management/issue_tracker.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,24 @@ def find_issues(self, keywords=None, only_open=None):
313313
"""Find issues."""
314314
raise NotImplementedError
315315

316+
def find_issues_with_filters(self,
317+
keywords=None,
318+
query_filters=None,
319+
only_open=None):
320+
"""Find issues."""
321+
raise NotImplementedError
322+
316323
def find_issues_url(self, keywords=None, only_open=None):
317324
"""Find issues (web URL)."""
318325
raise NotImplementedError
319326

327+
def find_issues_url_with_filters(self,
328+
keywords=None,
329+
query_filters=None,
330+
only_open=None):
331+
"""Find issues."""
332+
raise NotImplementedError
333+
320334
def issue_url(self, issue_id):
321335
"""Return the issue URL with the given ID."""
322336
raise NotImplementedError

src/clusterfuzz/_internal/issue_management/jira/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,14 @@ def find_issues(self, keywords=None, only_open=False):
187187
issues = self._itm.get_issues(search_text)
188188
return [Issue(self._itm, issue) for issue in issues]
189189

190+
def find_issues_with_filters(self,
191+
keywords=None,
192+
query_filters=None,
193+
only_open=None):
194+
"""Find issues given query filters."""
195+
# Jira treats keywords and query filters the same for queries.
196+
return self.find_issues(keywords + query_filters, only_open)
197+
190198
def issue_url(self, issue_id):
191199
"""Return the issue URL with the given ID."""
192200
issue = self.get_issue(issue_id)
@@ -205,6 +213,14 @@ def find_issues_url(self, keywords=None, only_open=None):
205213
config = db_config.get()
206214
return urljoin(config.jira_url, f'/issues/?jql={search_text}')
207215

216+
def find_issues_url_with_filters(self,
217+
keywords=None,
218+
query_filters=None,
219+
only_open=None):
220+
"""Return the issue URL with the given ID and additional query filters."""
221+
# Jira treats keywords and query filters the same for queries.
222+
return self.find_issues_url(keywords + query_filters, only_open)
223+
208224

209225
def _get_issue_tracker_manager_for_project(project_name):
210226
"""Return jira issue tracker manager for the given project."""

src/clusterfuzz/_internal/issue_management/monorail/__init__.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,14 @@ def find_issues(self, keywords=None, only_open=False):
247247
issues = self._itm.get_issues(search_text, can=can)
248248
return [Issue(issue) for issue in issues]
249249

250+
def find_issues_with_filters(self,
251+
keywords=None,
252+
query_filters=None,
253+
only_open=None):
254+
"""Find issues given additional filters."""
255+
# Monorail treats keywords and query filters the same for queries.
256+
return self.find_issues(keywords + query_filters, only_open)
257+
250258
def find_issues_url(self, keywords=None, only_open=False):
251259
"""Find issues (web URL)."""
252260
if not keywords:
@@ -266,6 +274,13 @@ def find_issues_url(self, keywords=None, only_open=False):
266274
'q': search_text,
267275
}))
268276

277+
def find_issues_url_with_filters(self,
278+
keywords=None,
279+
query_filters=None,
280+
only_open=None):
281+
# Monorail treats keywords and query filters the same for queries.
282+
return self.find_issues_url(keywords + query_filters, only_open)
283+
269284
def issue_url(self, issue_id):
270285
"""Return the issue URL with the given ID."""
271286
return ISSUE_TRACKER_URL.format(project=self.project, id=issue_id)

src/clusterfuzz/_internal/tests/appengine/libs/issue_management/google_issue_tracker/google_issue_tracker_test.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,6 +1154,24 @@ def test_find_issues_url(self):
11541154
self.assertEqual('https://issues.chromium.org/issues?q=%22abc%22+%22def%22',
11551155
url)
11561156

1157+
def test_find_issues_url_with_filters(self):
1158+
"""Test find_issues_url."""
1159+
url = self.issue_tracker.find_issues_url_with_filters(
1160+
keywords=['abc', 'def'],
1161+
query_filters=['id:123', 'hotlistid:(4801165|4072748)'],
1162+
only_open=True)
1163+
self.assertEqual(
1164+
'https://issues.chromium.org/issues?q=%22abc%22+%22def%22+id%3A123+hotlistid%3A%284801165%7C4072748%29+status%3Aopen',
1165+
url,
1166+
)
1167+
url = self.issue_tracker.find_issues_url_with_filters(
1168+
keywords=['abc', 'def'],
1169+
query_filters=['id:123', 'hotlistid:(4801165|4072748)'],
1170+
only_open=False)
1171+
self.assertEqual(
1172+
'https://issues.chromium.org/issues?q=%22abc%22+%22def%22+id%3A123+hotlistid%3A%284801165%7C4072748%29',
1173+
url)
1174+
11571175
def test_issue_url(self):
11581176
"""Test issue_url."""
11591177
url = self.issue_tracker.issue_url(123)

0 commit comments

Comments
 (0)