Skip to content

Commit e106395

Browse files
authored
feat(issues): GA case insensitive project slug lookup (#102495)
Fixes discover searches for `issue:PROJECT-123` when the project slug isn't entirely lowercase.
1 parent 2ccd961 commit e106395

File tree

3 files changed

+18
-26
lines changed

3 files changed

+18
-26
lines changed

src/sentry/features/temporary.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,6 @@ def register_temporary_features(manager: FeatureManager) -> None:
435435
manager.add("organizations:statistical-detectors-rca-spans-only", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
436436
# Allow organizations to configure all symbol sources.
437437
manager.add("organizations:symbol-sources", OrganizationFeature, FeatureHandlerStrategy.INTERNAL, default=True, api_expose=True)
438-
# Enable case-insensitive project slug lookup for qualified short ID bulk queries
439-
manager.add("organizations:group-case-insensitive-short-id-lookup", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
440438
# Enable tracking of tombstone hits. When enabled, the feature increments the times_seen column and updates the last_seen timestamp
441439
manager.add("organizations:grouptombstones-hit-counter", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
442440
# Enable static ClickHouse sampling for `OrganizationTagsEndpoint`

src/sentry/models/group.py

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from django.utils.translation import gettext_lazy as _
2222
from snuba_sdk import Column, Condition, Op
2323

24-
from sentry import eventstore, eventtypes, features, options, tagstore
24+
from sentry import eventstore, eventtypes, options, tagstore
2525
from sentry.backup.scopes import RelocationScope
2626
from sentry.constants import DEFAULT_LOGGER_NAME, LOG_LEVELS, MAX_CULPRIT_LENGTH
2727
from sentry.db.models import (
@@ -370,32 +370,27 @@ def by_qualified_short_id_bulk(
370370
groups = list(base_group_queryset.filter(short_id_lookup))
371371
group_lookup: set[int] = {group.short_id for group in groups}
372372

373-
organization = Organization.objects.get_from_cache(id=organization_id)
374-
has_insensitive_lookup = features.has(
375-
"organizations:group-case-insensitive-short-id-lookup", organization
376-
)
377-
378373
# If any requested short_ids are missing after the exact slug match,
379374
# fallback to a case-insensitive slug lookup to handle legacy/mixed-case slugs.
380-
if has_insensitive_lookup:
381-
missing_by_slug = defaultdict(list)
382-
for sid in short_ids:
383-
if sid.short_id not in group_lookup:
384-
missing_by_slug[sid.project_slug].append(sid.short_id)
385-
386-
if len(missing_by_slug) > 0:
387-
ci_short_id_lookup = reduce(
388-
or_,
389-
[
390-
Q(project__slug__iexact=slug, short_id__in=sids)
391-
for slug, sids in missing_by_slug.items()
392-
],
393-
)
375+
# Handles legacy project slugs that may not be entirely lowercase.
376+
missing_by_slug = defaultdict(list)
377+
for sid in short_ids:
378+
if sid.short_id not in group_lookup:
379+
missing_by_slug[sid.project_slug].append(sid.short_id)
380+
381+
if len(missing_by_slug) > 0:
382+
ci_short_id_lookup = reduce(
383+
or_,
384+
[
385+
Q(project__slug__iexact=slug, short_id__in=sids)
386+
for slug, sids in missing_by_slug.items()
387+
],
388+
)
394389

395-
fallback_groups = list(base_group_queryset.filter(ci_short_id_lookup))
390+
fallback_groups = list(base_group_queryset.filter(ci_short_id_lookup))
396391

397-
groups.extend(fallback_groups)
398-
group_lookup.update(group.short_id for group in fallback_groups)
392+
groups.extend(fallback_groups)
393+
group_lookup.update(group.short_id for group in fallback_groups)
399394

400395
for short_id in short_ids:
401396
if short_id.short_id not in group_lookup:

tests/sentry/models/test_group.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ def test_qualified_share_id_bulk(self) -> None:
170170
group.organization.id, [group_short_id, group_2_short_id]
171171
)
172172

173-
@with_feature("organizations:group-case-insensitive-short-id-lookup")
174173
def test_by_qualified_short_id_bulk_case_insensitive_project_slug(self) -> None:
175174
project = self.create_project(slug="mixedcaseslug")
176175
group = self.create_group(project=project, short_id=project.next_short_id())

0 commit comments

Comments
 (0)