|
@@ -34,6 +34,7 @@ from sentry.db.models import (
|
|
sane_repr,
|
|
sane_repr,
|
|
)
|
|
)
|
|
from sentry.db.models.fields.hybrid_cloud_foreign_key import HybridCloudForeignKey
|
|
from sentry.db.models.fields.hybrid_cloud_foreign_key import HybridCloudForeignKey
|
|
|
|
+from sentry.db.models.indexes import IndexWithPostgresNameLimits
|
|
from sentry.db.models.manager import BaseManager
|
|
from sentry.db.models.manager import BaseManager
|
|
from sentry.db.postgres.transactions import in_test_hide_transaction_boundary
|
|
from sentry.db.postgres.transactions import in_test_hide_transaction_boundary
|
|
from sentry.exceptions import InvalidSearchQuery
|
|
from sentry.exceptions import InvalidSearchQuery
|
|
@@ -115,10 +116,10 @@ class ReleaseProject(Model):
|
|
class Meta:
|
|
class Meta:
|
|
app_label = "sentry"
|
|
app_label = "sentry"
|
|
db_table = "sentry_release_project"
|
|
db_table = "sentry_release_project"
|
|
- index_together = (
|
|
|
|
- ("project", "adopted"),
|
|
|
|
- ("project", "unadopted"),
|
|
|
|
- ("project", "first_seen_transaction"),
|
|
|
|
|
|
+ indexes = (
|
|
|
|
+ models.Index(fields=("project", "adopted")),
|
|
|
|
+ models.Index(fields=("project", "unadopted")),
|
|
|
|
+ models.Index(fields=("project", "first_seen_transaction")),
|
|
)
|
|
)
|
|
unique_together = (("project", "release"),)
|
|
unique_together = (("project", "release"),)
|
|
|
|
|
|
@@ -530,25 +531,38 @@ class Release(Model):
|
|
app_label = "sentry"
|
|
app_label = "sentry"
|
|
db_table = "sentry_release"
|
|
db_table = "sentry_release"
|
|
unique_together = (("organization", "version"),)
|
|
unique_together = (("organization", "version"),)
|
|
- # TODO(django2.2): Note that we create this index with each column ordered
|
|
|
|
- # descending. Django 2.2 allows us to specify functional indexes, which should
|
|
|
|
- # allow us to specify this on the model.
|
|
|
|
- # We also use a functional index to order `prerelease` according to semver rules,
|
|
|
|
- # which we can't express here for now.
|
|
|
|
- index_together = (
|
|
|
|
- ("organization", "package", "major", "minor", "patch", "revision", "prerelease"),
|
|
|
|
- ("organization", "major", "minor", "patch", "revision", "prerelease"),
|
|
|
|
- ("organization", "build_code"),
|
|
|
|
- ("organization", "build_number"),
|
|
|
|
- ("organization", "date_added"),
|
|
|
|
- ("organization", "status"),
|
|
|
|
- )
|
|
|
|
indexes = [
|
|
indexes = [
|
|
models.Index(
|
|
models.Index(
|
|
fields=["organization", "version"],
|
|
fields=["organization", "version"],
|
|
opclasses=["", "text_pattern_ops"],
|
|
opclasses=["", "text_pattern_ops"],
|
|
name="sentry_release_version_btree",
|
|
name="sentry_release_version_btree",
|
|
- )
|
|
|
|
|
|
+ ),
|
|
|
|
+ # We also use a functional index to order `prerelease` according to semver rules,
|
|
|
|
+ IndexWithPostgresNameLimits(
|
|
|
|
+ "organization",
|
|
|
|
+ "package",
|
|
|
|
+ F("major").desc(),
|
|
|
|
+ F("minor").desc(),
|
|
|
|
+ F("patch").desc(),
|
|
|
|
+ F("revision").desc(),
|
|
|
|
+ Case(When(prerelease="", then=1), default=0).desc(),
|
|
|
|
+ F("prerelease").desc(),
|
|
|
|
+ name="sentry_release_semver_by_package_idx",
|
|
|
|
+ ),
|
|
|
|
+ models.Index(
|
|
|
|
+ "organization",
|
|
|
|
+ F("major").desc(),
|
|
|
|
+ F("minor").desc(),
|
|
|
|
+ F("patch").desc(),
|
|
|
|
+ F("revision").desc(),
|
|
|
|
+ Case(When(prerelease="", then=1), default=0).desc(),
|
|
|
|
+ F("prerelease").desc(),
|
|
|
|
+ name="sentry_release_semver_idx",
|
|
|
|
+ ),
|
|
|
|
+ models.Index(fields=("organization", "build_code")),
|
|
|
|
+ models.Index(fields=("organization", "build_number")),
|
|
|
|
+ models.Index(fields=("organization", "date_added")),
|
|
|
|
+ models.Index(fields=("organization", "status")),
|
|
]
|
|
]
|
|
|
|
|
|
__repr__ = sane_repr("organization_id", "version")
|
|
__repr__ = sane_repr("organization_id", "version")
|