"""add experiments Revision ID: bd9f6a8b7c1d Revises: 3419d4e56131 Create Date: 2026-03-30 23:40:00.000000 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision: str = 'bd9f6a8b7c1d' down_revision: Union[str, None] = '3419d4e56131' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( 'experiments', sa.Column('experiment_key', sa.String(length=64), nullable=False), sa.Column('name', sa.String(length=120), nullable=False), sa.Column('description', sa.String(length=512), nullable=True), sa.Column('enabled', sa.Boolean(), nullable=False), sa.Column('eligible_routes', sa.JSON(), nullable=False), sa.Column('id', sa.Uuid(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('experiment_key'), ) op.create_index(op.f('ix_experiments_enabled'), 'experiments', ['enabled'], unique=False) op.create_index(op.f('ix_experiments_experiment_key'), 'experiments', ['experiment_key'], unique=False) op.create_table( 'experiment_variants', sa.Column('experiment_id', sa.Uuid(), nullable=False), sa.Column('variant_key', sa.String(length=64), nullable=False), sa.Column('label', sa.String(length=120), nullable=False), sa.Column('allocation', sa.Integer(), nullable=False), sa.Column('is_control', sa.Boolean(), nullable=False), sa.Column('id', sa.Uuid(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False), sa.ForeignKeyConstraint(['experiment_id'], ['experiments.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('experiment_id', 'variant_key', name='uq_experiment_variants_experiment_variant'), ) op.create_index(op.f('ix_experiment_variants_experiment_id'), 'experiment_variants', ['experiment_id'], unique=False) op.create_table( 'experiment_events', sa.Column('experiment_key', sa.String(length=64), nullable=False), sa.Column('variant_key', sa.String(length=64), nullable=False), sa.Column('session_id', sa.String(length=128), nullable=False), sa.Column('user_id', sa.String(length=64), nullable=True), sa.Column('path', sa.String(length=255), nullable=False), sa.Column('event_type', sa.String(length=64), nullable=False), sa.Column('conversion_value', sa.Numeric(precision=12, scale=2), nullable=True), sa.Column('metadata', sa.JSON(), nullable=True), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False), sa.Column('id', sa.Uuid(), nullable=False), sa.PrimaryKeyConstraint('id'), ) op.create_index(op.f('ix_experiment_events_created_at'), 'experiment_events', ['created_at'], unique=False) op.create_index(op.f('ix_experiment_events_event_type'), 'experiment_events', ['event_type'], unique=False) op.create_index(op.f('ix_experiment_events_experiment_key'), 'experiment_events', ['experiment_key'], unique=False) op.create_index(op.f('ix_experiment_events_path'), 'experiment_events', ['path'], unique=False) op.create_index(op.f('ix_experiment_events_session_id'), 'experiment_events', ['session_id'], unique=False) op.create_index(op.f('ix_experiment_events_user_id'), 'experiment_events', ['user_id'], unique=False) op.create_index(op.f('ix_experiment_events_variant_key'), 'experiment_events', ['variant_key'], unique=False) op.create_index('ix_experiment_events_experiment_variant_created_at', 'experiment_events', ['experiment_key', 'variant_key', 'created_at'], unique=False) op.create_index('ix_experiment_events_session_created_at', 'experiment_events', ['session_id', 'created_at'], unique=False) def downgrade() -> None: op.drop_index('ix_experiment_events_session_created_at', table_name='experiment_events') op.drop_index('ix_experiment_events_experiment_variant_created_at', table_name='experiment_events') op.drop_index(op.f('ix_experiment_events_variant_key'), table_name='experiment_events') op.drop_index(op.f('ix_experiment_events_user_id'), table_name='experiment_events') op.drop_index(op.f('ix_experiment_events_session_id'), table_name='experiment_events') op.drop_index(op.f('ix_experiment_events_path'), table_name='experiment_events') op.drop_index(op.f('ix_experiment_events_experiment_key'), table_name='experiment_events') op.drop_index(op.f('ix_experiment_events_event_type'), table_name='experiment_events') op.drop_index(op.f('ix_experiment_events_created_at'), table_name='experiment_events') op.drop_table('experiment_events') op.drop_index(op.f('ix_experiment_variants_experiment_id'), table_name='experiment_variants') op.drop_table('experiment_variants') op.drop_index(op.f('ix_experiments_experiment_key'), table_name='experiments') op.drop_index(op.f('ix_experiments_enabled'), table_name='experiments') op.drop_table('experiments')