Skip to content

Commit e73b4a9

Browse files
authored
Drop ForeignKeys from TagKey, TagValue and GroupTagKey. (#6002)
1 parent df8f3ee commit e73b4a9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1925
-125
lines changed

bin/merge_legacy_releases

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def update_version(release):
5858
id=release.id
5959
).update(version=new_version)
6060
TagValue.objects.filter(
61-
project__in=release.projects.all(),
61+
project_id__in=release.projects.values_list('id', flat=True),
6262
key='sentry:release',
6363
value=old_version
6464
).update(value=new_version)

src/sentry/api/endpoints/group_details.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ def get(self, request, group):
212212
last_release = self._get_release_info(request, group, last_release)
213213

214214
tags = list(GroupTagKey.objects.filter(
215-
group=group,
215+
group_id=group.id,
216216
)[:100])
217217

218218
participants = list(

src/sentry/api/endpoints/group_events.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ class GroupEventsEndpoint(GroupEndpoint):
2727
doc_section = DocSection.EVENTS
2828

2929
def _tags_to_filter(self, group, tags):
30-
project = group.project
30+
project_id = group.project_id
3131
tagkeys = dict(
3232
TagKey.objects.filter(
33-
project=project,
33+
project_id=project_id,
3434
key__in=tags.keys(),
3535
).values_list('key', 'id')
3636
)
@@ -39,7 +39,7 @@ def _tags_to_filter(self, group, tags):
3939
(t[1], t[2]): t[0]
4040
for t in TagValue.objects.filter(
4141
reduce(or_, (Q(key=k, value=v) for k, v in six.iteritems(tags))),
42-
project=project,
42+
project_id=project_id,
4343
).values_list('id', 'key', 'value')
4444
}
4545

src/sentry/api/endpoints/group_tagkey_details.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def get(self, request, group, key):
4545

4646
try:
4747
tag_key = TagKey.objects.get(
48-
project=group.project_id,
48+
project_id=group.project_id,
4949
key=lookup_key,
5050
status=TagKeyStatus.VISIBLE,
5151
)
@@ -54,7 +54,7 @@ def get(self, request, group, key):
5454

5555
try:
5656
group_tag_key = GroupTagKey.objects.get(
57-
group=group,
57+
group_id=group.id,
5858
key=lookup_key,
5959
)
6060
except GroupTagKey.DoesNotExist:

src/sentry/api/endpoints/group_tagkey_values.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def get(self, request, group, key):
4242
lookup_key = key
4343

4444
tagkey = TagKey.objects.filter(
45-
project=group.project_id,
45+
project_id=group.project_id,
4646
key=lookup_key,
4747
status=TagKeyStatus.VISIBLE,
4848
)

src/sentry/api/endpoints/group_tags.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
class GroupTagsEndpoint(GroupEndpoint):
1414
def get(self, request, group):
1515
tag_keys = TagKey.objects.filter(
16-
project=group.project,
16+
project_id=group.project_id,
1717
status=TagKeyStatus.VISIBLE,
1818
key__in=GroupTagKey.objects.filter(
19-
group=group,
19+
group_id=group.id,
2020
).values('key'),
2121
)
2222

src/sentry/api/endpoints/project_tagkey_details.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def get(self, request, project, key):
1818

1919
try:
2020
tagkey = TagKey.objects.get(
21-
project=project,
21+
project_id=project.id,
2222
key=lookup_key,
2323
status=TagKeyStatus.VISIBLE,
2424
)
@@ -41,7 +41,7 @@ def delete(self, request, project, key):
4141

4242
try:
4343
tagkey = TagKey.objects.get(
44-
project=project,
44+
project_id=project.id,
4545
key=lookup_key,
4646
)
4747
except TagKey.DoesNotExist:

src/sentry/api/endpoints/project_tagkey_values.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ def get(self, request, project, key):
3232

3333
try:
3434
tagkey = TagKey.objects.get(
35-
project=project,
35+
project_id=project.id,
3636
key=lookup_key,
3737
status=TagKeyStatus.VISIBLE,
3838
)
3939
except TagKey.DoesNotExist:
4040
raise ResourceDoesNotExist
4141

4242
base_queryset = TagValue.objects.filter(
43-
project=project,
43+
project_id=project.id,
4444
key=tagkey.key,
4545
)
4646

@@ -58,7 +58,7 @@ def get(self, request, project, key):
5858

5959
else:
6060
queryset = TagValue.objects.filter(
61-
project=project,
61+
project_id=project.id,
6262
key=tagkey.key,
6363
)
6464

src/sentry/api/endpoints/project_tags.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class ProjectTagsEndpoint(ProjectEndpoint):
1212
def get(self, request, project):
1313
tag_keys = TagKey.objects.filter(
14-
project=project,
14+
project_id=project.id,
1515
status=TagKeyStatus.VISIBLE,
1616
)
1717

src/sentry/api/serializers/models/group.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ def get_attrs(self, item_list, user):
126126

127127
user_counts = dict(
128128
GroupTagKey.objects.filter(
129-
group__in=item_list,
129+
group_id__in=[g.id for g in item_list],
130130
key='sentry:user',
131-
).values_list('group', 'values_seen')
131+
).values_list('group_id', 'values_seen')
132132
)
133133

134134
ignore_items = {g.group_id: g for g in GroupSnooze.objects.filter(

src/sentry/api/serializers/models/grouptagkey.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ def get_attrs(self, item_list, user):
1212
tag_labels = {
1313
t.key: t.get_label()
1414
for t in
15-
TagKey.objects.filter(project=item_list[0].project, key__in=[i.key for i in item_list])
15+
TagKey.objects.filter(
16+
project_id=item_list[0].project.id, key__in=[
17+
i.key for i in item_list])
1618
}
1719

1820
result = {}

src/sentry/models/group.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,16 +353,16 @@ def get_tags(self, with_internal=True):
353353
from sentry.models import GroupTagKey, TagKey
354354
if not hasattr(self, '_tag_cache'):
355355
group_tags = GroupTagKey.objects.filter(
356-
group=self,
357-
project=self.project,
356+
group_id=self.id,
357+
project_id=self.project_id,
358358
)
359359
if not with_internal:
360360
group_tags = group_tags.exclude(key__startswith='sentry:')
361361

362362
group_tags = list(group_tags.values_list('key', flat=True))
363363

364364
tag_keys = dict(
365-
(t.key, t) for t in TagKey.objects.filter(project=self.project, key__in=group_tags)
365+
(t.key, t) for t in TagKey.objects.filter(project_id=self.project_id, key__in=group_tags)
366366
)
367367

368368
results = []
@@ -477,6 +477,6 @@ def count_users_seen(self):
477477
from sentry.models import GroupTagKey
478478

479479
return GroupTagKey.objects.filter(
480-
group=self,
480+
group_id=self.id,
481481
key='sentry:user',
482482
).aggregate(t=models.Sum('values_seen'))['t'] or 0

src/sentry/models/grouptagkey.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from sentry.constants import MAX_TAG_KEY_LENGTH
1313
from sentry.db.models import (
14-
Model, BoundedPositiveIntegerField, BaseManager, FlexibleForeignKey, sane_repr
14+
Model, BoundedPositiveIntegerField, BaseManager, sane_repr
1515
)
1616

1717

@@ -23,8 +23,8 @@ class GroupTagKey(Model):
2323
"""
2424
__core__ = False
2525

26-
project = FlexibleForeignKey('sentry.Project', null=True)
27-
group = FlexibleForeignKey('sentry.Group')
26+
project_id = BoundedPositiveIntegerField(db_index=True, null=True)
27+
group_id = BoundedPositiveIntegerField(db_index=True)
2828
key = models.CharField(max_length=MAX_TAG_KEY_LENGTH)
2929
values_seen = BoundedPositiveIntegerField(default=0)
3030

@@ -33,6 +33,6 @@ class GroupTagKey(Model):
3333
class Meta:
3434
app_label = 'sentry'
3535
db_table = 'sentry_grouptagkey'
36-
unique_together = (('project', 'group', 'key'), )
36+
unique_together = (('project_id', 'group_id', 'key'), )
3737

3838
__repr__ = sane_repr('project_id', 'group_id', 'key')

src/sentry/models/grouptagvalue.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
from django.utils import timezone
1414

1515
from sentry.constants import MAX_TAG_KEY_LENGTH, MAX_TAG_VALUE_LENGTH
16-
from sentry.db.models import (Model, BoundedPositiveIntegerField, BaseManager, sane_repr)
16+
from sentry.db.models import (
17+
Model, BoundedPositiveIntegerField, BaseManager, sane_repr)
1718
from sentry.utils import db
1819

1920

@@ -24,13 +25,15 @@ class GroupTagValue(Model):
2425
"""
2526
__core__ = False
2627

27-
project_id = BoundedPositiveIntegerField(null=True)
28-
group_id = BoundedPositiveIntegerField()
28+
project_id = BoundedPositiveIntegerField(db_index=True, null=True)
29+
group_id = BoundedPositiveIntegerField(db_index=True)
2930
times_seen = BoundedPositiveIntegerField(default=0)
3031
key = models.CharField(max_length=MAX_TAG_KEY_LENGTH)
3132
value = models.CharField(max_length=MAX_TAG_VALUE_LENGTH)
32-
last_seen = models.DateTimeField(default=timezone.now, db_index=True, null=True)
33-
first_seen = models.DateTimeField(default=timezone.now, db_index=True, null=True)
33+
last_seen = models.DateTimeField(
34+
default=timezone.now, db_index=True, null=True)
35+
first_seen = models.DateTimeField(
36+
default=timezone.now, db_index=True, null=True)
3437

3538
objects = BaseManager()
3639

src/sentry/models/project.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ def merge_to(self, project):
161161
if not created:
162162
obj2.update(times_seen=F('times_seen') + obj.times_seen)
163163

164-
for fv in TagValue.objects.filter(project=self):
165-
TagValue.objects.get_or_create(project=project, key=fv.key, value=fv.value)
164+
for fv in TagValue.objects.filter(project_id=self.id):
165+
TagValue.objects.get_or_create(project_id=project.id, key=fv.key, value=fv.value)
166166
fv.delete()
167167
self.delete()
168168

src/sentry/models/tagkey.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from django.utils.translation import ugettext_lazy as _
1414

1515
from sentry.constants import MAX_TAG_KEY_LENGTH, TAG_LABELS
16-
from sentry.db.models import (Model, BoundedPositiveIntegerField, FlexibleForeignKey, sane_repr)
16+
from sentry.db.models import (Model, BoundedPositiveIntegerField, sane_repr)
1717
from sentry.db.models.manager import BaseManager
1818
from sentry.utils.cache import cache
1919

@@ -22,7 +22,8 @@
2222

2323
# These tags are special and are used in pairing with `sentry:{}`
2424
# they should not be allowed to be set via data ingest due to abiguity
25-
INTERNAL_TAG_KEYS = frozenset(('release', 'dist', 'user', 'filename', 'function'))
25+
INTERNAL_TAG_KEYS = frozenset(
26+
('release', 'dist', 'user', 'filename', 'function'))
2627

2728

2829
# TODO(dcramer): pull in enum library
@@ -43,7 +44,7 @@ def all_keys(self, project):
4344
if result is None:
4445
result = list(
4546
self.filter(
46-
project=project,
47+
project_id=project.id,
4748
status=TagKeyStatus.VISIBLE,
4849
).order_by('-values_seen').values_list('key', flat=True)[:20]
4950
)
@@ -57,7 +58,7 @@ class TagKey(Model):
5758
"""
5859
__core__ = False
5960

60-
project = FlexibleForeignKey('sentry.Project')
61+
project_id = BoundedPositiveIntegerField(db_index=True)
6162
key = models.CharField(max_length=MAX_TAG_KEY_LENGTH)
6263
values_seen = BoundedPositiveIntegerField(default=0)
6364
label = models.CharField(max_length=64, null=True)
@@ -75,7 +76,7 @@ class TagKey(Model):
7576
class Meta:
7677
app_label = 'sentry'
7778
db_table = 'sentry_filterkey'
78-
unique_together = (('project', 'key'), )
79+
unique_together = (('project_id', 'key'), )
7980

8081
__repr__ = sane_repr('project_id', 'key')
8182

src/sentry/models/tagvalue.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from sentry.constants import MAX_TAG_KEY_LENGTH, MAX_TAG_VALUE_LENGTH
1515
from sentry.db.models import (
16-
Model, BoundedPositiveIntegerField, FlexibleForeignKey, GzippedDictField, BaseManager, sane_repr
16+
Model, BoundedPositiveIntegerField, GzippedDictField, BaseManager, sane_repr
1717
)
1818
from sentry.utils.http import absolute_uri
1919

@@ -24,20 +24,22 @@ class TagValue(Model):
2424
"""
2525
__core__ = False
2626

27-
project = FlexibleForeignKey('sentry.Project', null=True)
27+
project_id = BoundedPositiveIntegerField(db_index=True, null=True)
2828
key = models.CharField(max_length=MAX_TAG_KEY_LENGTH)
2929
value = models.CharField(max_length=MAX_TAG_VALUE_LENGTH)
3030
data = GzippedDictField(blank=True, null=True)
3131
times_seen = BoundedPositiveIntegerField(default=0)
32-
last_seen = models.DateTimeField(default=timezone.now, db_index=True, null=True)
33-
first_seen = models.DateTimeField(default=timezone.now, db_index=True, null=True)
32+
last_seen = models.DateTimeField(
33+
default=timezone.now, db_index=True, null=True)
34+
first_seen = models.DateTimeField(
35+
default=timezone.now, db_index=True, null=True)
3436

3537
objects = BaseManager()
3638

3739
class Meta:
3840
app_label = 'sentry'
3941
db_table = 'sentry_filtervalue'
40-
unique_together = (('project', 'key', 'value'), )
42+
unique_together = (('project_id', 'key', 'value'), )
4143

4244
__repr__ = sane_repr('project_id', 'key', 'value')
4345

@@ -70,10 +72,12 @@ def get_absolute_url(self):
7072
return absolute_uri(
7173
reverse(
7274
url_name,
73-
args=[self.project.organization.slug, self.project.slug, self.key, self.id]
75+
args=[self.project.organization.slug,
76+
self.project.slug, self.key, self.id]
7477
)
7578
)
7679

7780
return absolute_uri(
78-
reverse(url_name, args=[self.project.organization.slug, self.project.slug, self.id])
81+
reverse(url_name, args=[
82+
self.project.organization.slug, self.project.slug, self.id])
7983
)

src/sentry/receivers/releases.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.db.models.signals import post_save
55

66
from sentry.models import (
7-
Activity, Commit, GroupAssignee, GroupCommitResolution, Release, TagValue
7+
Activity, Commit, GroupAssignee, GroupCommitResolution, Project, Release, TagValue
88
)
99
from sentry.tasks.clear_expired_resolutions import clear_expired_resolutions
1010

@@ -16,23 +16,25 @@ def ensure_release_exists(instance, created, **kwargs):
1616
if instance.data and instance.data.get('release_id'):
1717
return
1818

19+
project = Project.objects.get(pk=instance.project_id)
20+
1921
try:
2022
with transaction.atomic():
2123
release = Release.objects.create(
22-
organization_id=instance.project.organization_id,
24+
organization_id=project.organization_id,
2325
version=instance.value,
2426
date_added=instance.first_seen,
2527
)
2628
except IntegrityError:
2729
release = Release.objects.get(
28-
organization_id=instance.project.organization_id,
30+
organization_id=project.organization_id,
2931
version=instance.value,
3032
)
3133
release.update(date_added=instance.first_seen)
3234
else:
3335
instance.update(data={'release_id': release.id})
3436

35-
release.add_project(instance.project)
37+
release.add_project(project)
3638

3739

3840
def resolve_group_resolutions(instance, created, **kwargs):

0 commit comments

Comments
 (0)