Skip to content

Commit

Permalink
squashed: address pr comments, removed redundant constraint and chang…
Browse files Browse the repository at this point in the history
…e field type

add sql migration comment

allow empty array for override ids

use strings for override keys instead

fix-typo
  • Loading branch information
daniel-codecov committed Feb 23, 2024
1 parent 7203d8f commit 604c599
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 62 deletions.
66 changes: 20 additions & 46 deletions shared/django_apps/rollouts/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 4.2.7 on 2024-02-21 20:13
# Generated by Django 4.2.7 on 2024-02-23 16:43

import django.contrib.postgres.fields
import django.db.models.deletion
Expand All @@ -17,30 +17,11 @@ class Migration(migrations.Migration):
# --
# -- Create model FeatureFlag
# --
# CREATE TABLE "feature_flags" ("name" varchar(200) NOT NULL PRIMARY KEY, "proportion" decimal NOT NULL, "salt" varchar(10000) NOT NULL);
# CREATE TABLE "feature_flags" ("name" varchar(200) NOT NULL PRIMARY KEY, "proportion" decimal NOT NULL, "salt" varchar(32) NOT NULL);
# --
# -- Create model FeatureFlagVariant
# --
# CREATE TABLE "feature_flag_variants" ("name" varchar(200) NOT NULL PRIMARY KEY, "proportion" decimal NOT NULL, "enabled" bool NOT NULL, "override_owner_ids" integer[] NOT NULL, "override_repo_ids" integer[] NOT NULL, "feature_flag_id" varchar(200) NOT NULL REFERENCES "feature_flags" ("name") DEFERRABLE INITIALLY DEFERRED);
# --
# -- Create constraint feature_flag_name on model featureflag
# --
# CREATE TABLE "new__feature_flags" ("name" varchar(200) NOT NULL PRIMARY KEY, "proportion" decimal NOT NULL, "salt" varchar(10000) NOT NULL, CONSTRAINT "feature_flag_name" UNIQUE ("name"));
# INSERT INTO "new__feature_flags" ("name", "proportion", "salt") SELECT "name", "proportion", "salt" FROM "feature_flags";
# DROP TABLE "feature_flags";
# ALTER TABLE "new__feature_flags" RENAME TO "feature_flags";
# CREATE INDEX "feature_flag_variants_feature_flag_id_fa3a4c02" ON "feature_flag_variants" ("feature_flag_id");
# --
# -- Create index feature_fla_feature_15a078_idx on field(s) feature_flag of model featureflagvariant
# --
# CREATE INDEX "feature_fla_feature_15a078_idx" ON "feature_flag_variants" ("feature_flag_id");
# --
# -- Create constraint feature_flag_variant_name on model featureflagvariant
# --
# CREATE TABLE "new__feature_flag_variants" ("name" varchar(200) NOT NULL PRIMARY KEY, "proportion" decimal NOT NULL, "enabled" bool NOT NULL, "override_owner_ids" integer[] NOT NULL, "override_repo_ids" integer[] NOT NULL, "feature_flag_id" varchar(200) NOT NULL REFERENCES "feature_flags" ("name") DEFERRABLE INITIALLY DEFERRED, CONSTRAINT "feature_flag_variant_name" UNIQUE ("name"));
# INSERT INTO "new__feature_flag_variants" ("name", "proportion", "enabled", "override_owner_ids", "override_repo_ids", "feature_flag_id") SELECT "name", "proportion", "enabled", "override_owner_ids", "override_repo_ids", "feature_flag_id" FROM "feature_flag_variants";
# DROP TABLE "feature_flag_variants";
# ALTER TABLE "new__feature_flag_variants" RENAME TO "feature_flag_variants";
# CREATE TABLE "feature_flag_variants" ("name" varchar(200) NOT NULL PRIMARY KEY, "proportion" decimal NOT NULL, "value" text NOT NULL CHECK ((JSON_VALID("value") OR "value" IS NULL)), "override_owner_keys" varchar(200)[] NOT NULL, "override_repo_keys" varchar(200)[] NOT NULL, "feature_flag_id" varchar(200) NOT NULL REFERENCES "feature_flags" ("name") DEFERRABLE INITIALLY DEFERRED);
# CREATE INDEX "feature_flag_variants_feature_flag_id_fa3a4c02" ON "feature_flag_variants" ("feature_flag_id");
# CREATE INDEX "feature_fla_feature_15a078_idx" ON "feature_flag_variants" ("feature_flag_id");
# COMMIT;
Expand All @@ -61,7 +42,7 @@ class Migration(migrations.Migration):
"salt",
models.CharField(
default=shared.django_apps.rollouts.models.default_random_salt,
max_length=10000,
max_length=32,
),
),
],
Expand All @@ -80,17 +61,23 @@ class Migration(migrations.Migration):
"proportion",
models.DecimalField(decimal_places=3, default=0, max_digits=4),
),
("enabled", models.BooleanField(default=False)),
("value", models.JSONField(default=False)),
(
"override_owner_ids",
"override_owner_keys",
django.contrib.postgres.fields.ArrayField(
base_field=models.IntegerField(), default=list, size=None
base_field=models.CharField(max_length=200),
blank=True,
default=list,
size=None,
),
),
(
"override_repo_ids",
"override_repo_keys",
django.contrib.postgres.fields.ArrayField(
base_field=models.IntegerField(), default=list, size=None
base_field=models.CharField(max_length=200),
blank=True,
default=list,
size=None,
),
),
(
Expand All @@ -104,24 +91,11 @@ class Migration(migrations.Migration):
],
options={
"db_table": "feature_flag_variants",
"indexes": [
models.Index(
fields=["feature_flag"], name="feature_fla_feature_15a078_idx"
)
],
},
),
migrations.AddConstraint(
model_name="featureflag",
constraint=models.UniqueConstraint(
fields=("name",), name="feature_flag_name"
),
),
migrations.AddIndex(
model_name="featureflagvariant",
index=models.Index(
fields=["feature_flag"], name="feature_fla_feature_15a078_idx"
),
),
migrations.AddConstraint(
model_name="featureflagvariant",
constraint=models.UniqueConstraint(
fields=("name",), name="feature_flag_variant_name"
),
),
]
24 changes: 8 additions & 16 deletions shared/django_apps/rollouts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,10 @@ class FeatureFlag(models.Model):

name = models.CharField(max_length=200, primary_key=True)
proportion = models.DecimalField(default=0, decimal_places=3, max_digits=4)
salt = models.CharField(max_length=10000, default=default_random_salt)
salt = models.CharField(max_length=32, default=default_random_salt)

class Meta:
db_table = "feature_flags"
constraints = [
models.UniqueConstraint(fields=["name"], name="feature_flag_name")
]
# TODO: assert that variant proportions sum to 1


class FeatureFlagVariant(models.Model):
Expand All @@ -40,25 +36,21 @@ class FeatureFlagVariant(models.Model):
the proportions of the corresponding `FeatureFlagVariant`s sum to 1.
"""

name = models.CharField(max_length=200, primary_key=True)
name = models.CharField(max_length=200, primary_key=True)
feature_flag = models.ForeignKey(
"FeatureFlag", on_delete=models.CASCADE, related_name="variants"
)
proportion = models.DecimalField(default=0, decimal_places=3, max_digits=4)
enabled = models.BooleanField(default=False)
value = models.JSONField(default=False)

# Weak foreign keys to Owner and Respository models respectively
override_owner_ids = fields.ArrayField(
base_field=models.IntegerField(), default=list
# Weak foreign keys to Owner and Respository models respectively. Could be either a slug or ID
override_owner_keys = fields.ArrayField(
base_field=models.CharField(max_length=200), default=list, blank=True
)
override_repo_ids = fields.ArrayField(
base_field=models.IntegerField(), default=list
override_repo_keys = fields.ArrayField(
base_field=models.CharField(max_length=200), default=list, blank=True
)

# TODO: maybe add more fields for more granularity on feature variants. EG: featureA uses value 10 vs featureB uses value 100
class Meta:
db_table = "feature_flag_variants"
constraints = [
models.UniqueConstraint(fields=["name"], name="feature_flag_variant_name")
]
indexes = [models.Index(fields=["feature_flag"])]

0 comments on commit 604c599

Please sign in to comment.