Skip to content

Commit 4d5e737

Browse files
authored
feat(issue-taxonomy): Update issue search to support new categories (#90300)
Adds support for both the new and old category mappings when searching issues. For example, `issue.category:performance` will still return the same issues, but `issue.category:performance_regression` will return a subset of the former. This allows us to slowly roll out the new categories and defer migrating the old search values until later on.
1 parent 1d6642b commit 4d5e737

File tree

4 files changed

+29
-17
lines changed

4 files changed

+29
-17
lines changed

src/sentry/api/issue_search.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@
1919
)
2020
from sentry.api.event_search import parse_search_query as base_parse_query
2121
from sentry.exceptions import InvalidSearchQuery
22-
from sentry.issues.grouptype import (
23-
GroupCategory,
24-
get_group_type_by_slug,
25-
get_group_types_by_category,
26-
)
22+
from sentry.issues.grouptype import GroupCategory, get_group_type_by_slug
23+
from sentry.issues.grouptype import registry as GROUP_TYPE_REGISTRY
2724
from sentry.models.environment import Environment
2825
from sentry.models.group import GROUP_SUBSTATUS_TO_STATUS_MAP, STATUS_QUERY_CHOICES
2926
from sentry.models.organization import Organization
@@ -192,7 +189,7 @@ def convert_category_value(
192189
group_category = getattr(GroupCategory, category.upper(), None)
193190
if not group_category:
194191
raise InvalidSearchQuery(f"Invalid category value of '{category}'")
195-
results.extend(get_group_types_by_category(group_category.value))
192+
results.extend(GROUP_TYPE_REGISTRY.get_by_category(group_category.value))
196193
return results
197194

198195

src/sentry/issues/grouptype.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ class GroupTypeRegistry:
8888
_registry: dict[int, type[GroupType]] = field(default_factory=dict)
8989
_slug_lookup: dict[str, type[GroupType]] = field(default_factory=dict)
9090
_category_lookup: dict[int, set[int]] = field(default_factory=lambda: defaultdict(set))
91-
_category_lookup_v2: dict[int, set[int]] = field(default_factory=lambda: defaultdict(set))
9291

9392
def add(self, group_type: type[GroupType]) -> None:
9493
if self._registry.get(group_type.type_id):
@@ -98,7 +97,7 @@ def add(self, group_type: type[GroupType]) -> None:
9897
self._registry[group_type.type_id] = group_type
9998
self._slug_lookup[group_type.slug] = group_type
10099
self._category_lookup[group_type.category].add(group_type.type_id)
101-
self._category_lookup_v2[group_type.category_v2].add(group_type.type_id)
100+
self._category_lookup[group_type.category_v2].add(group_type.type_id)
102101

103102
def all(self) -> list[type[GroupType]]:
104103
return list(self._registry.values())
@@ -135,9 +134,6 @@ def get_all_group_type_ids(self) -> set[int]:
135134
def get_by_category(self, category: int) -> set[int]:
136135
return self._category_lookup[category]
137136

138-
def get_by_category_v2(self, category: int) -> set[int]:
139-
return self._category_lookup_v2[category]
140-
141137
def get_by_slug(self, slug: str) -> type[GroupType] | None:
142138
if slug not in self._slug_lookup:
143139
return None

tests/sentry/api/test_issue_search.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
value_converters,
2323
)
2424
from sentry.exceptions import InvalidSearchQuery
25-
from sentry.issues.grouptype import GroupCategory, get_group_types_by_category
25+
from sentry.issues.grouptype import GroupCategory
26+
from sentry.issues.grouptype import registry as GROUP_TYPE_REGISTRY
2627
from sentry.models.group import GROUP_SUBSTATUS_TO_STATUS_MAP, STATUS_QUERY_CHOICES, GroupStatus
2728
from sentry.models.release import ReleaseStatus
2829
from sentry.search.utils import get_teams_for_users
@@ -401,8 +402,8 @@ def test_latest(self):
401402

402403
class ConvertCategoryValueTest(TestCase):
403404
def test(self):
404-
error_group_types = get_group_types_by_category(GroupCategory.ERROR.value)
405-
perf_group_types = get_group_types_by_category(GroupCategory.PERFORMANCE.value)
405+
error_group_types = GROUP_TYPE_REGISTRY.get_by_category(GroupCategory.ERROR.value)
406+
perf_group_types = GROUP_TYPE_REGISTRY.get_by_category(GroupCategory.PERFORMANCE.value)
406407
assert (
407408
set(convert_category_value(["error"], [self.project], self.user, None))
408409
== error_group_types
@@ -415,6 +416,16 @@ def test(self):
415416
set(convert_category_value(["error", "performance"], [self.project], self.user, None))
416417
== error_group_types | perf_group_types
417418
)
419+
420+
# Also works with new categories
421+
assert set(
422+
convert_category_value(["outage"], [self.project], self.user, None)
423+
) == GROUP_TYPE_REGISTRY.get_by_category(GroupCategory.OUTAGE.value)
424+
assert set(
425+
convert_category_value(["performance_best_practice"], [self.project], self.user, None)
426+
) == GROUP_TYPE_REGISTRY.get_by_category(GroupCategory.PERFORMANCE_BEST_PRACTICE.value)
427+
428+
# Should raise an error for invalid values
418429
with pytest.raises(InvalidSearchQuery):
419430
convert_category_value(["hellboy"], [self.project], self.user, None)
420431

tests/sentry/issues/test_grouptype.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,21 @@ def test_get_visible(self) -> None:
184184
ErrorGroupType,
185185
}
186186

187-
def test_get_by_category_v2(self) -> None:
187+
def test_get_by_category(self) -> None:
188188
registry = GroupTypeRegistry()
189189
registry.add(ErrorGroupType)
190190
registry.add(PerformanceSlowDBQueryGroupType)
191191
registry.add(PerformanceNPlusOneGroupType)
192-
assert registry.get_by_category_v2(GroupCategory.ERROR.value) == {ErrorGroupType.type_id}
193-
assert registry.get_by_category_v2(GroupCategory.PERFORMANCE_BEST_PRACTICE.value) == {
192+
193+
# Works for old category mapping
194+
assert registry.get_by_category(GroupCategory.ERROR.value) == {ErrorGroupType.type_id}
195+
assert registry.get_by_category(GroupCategory.PERFORMANCE.value) == {
196+
PerformanceSlowDBQueryGroupType.type_id,
197+
PerformanceNPlusOneGroupType.type_id,
198+
}
199+
200+
# Works for new category mapping
201+
assert registry.get_by_category(GroupCategory.PERFORMANCE_BEST_PRACTICE.value) == {
194202
PerformanceSlowDBQueryGroupType.type_id,
195203
PerformanceNPlusOneGroupType.type_id,
196204
}

0 commit comments

Comments
 (0)