Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,365 @@
"""Add generic campaign models

Revision ID: a873e3bb7ed3
Revises: 523e523531a7
Create Date: 2026-02-27 15:35:48.007178

"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from alembic_postgresql_enum import TableReference
from sqlalchemy.dialects import postgresql

from sqlalchemy import Text
import app.db.types

# revision identifiers, used by Alembic.
revision: str = "a873e3bb7ed3"
down_revision: Union[str, None] = "523e523531a7"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
sa.Enum(
"circuit_simulation",
"circuit_extraction",
"ion_channel_modeling",
"skeletonization",
"ion_channel_simulation",
"em_synapse_mapping",
name="tasktype",
).create(op.get_bind())
op.create_table(
"campaign",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column(
"task_type",
postgresql.ENUM(
"circuit_simulation",
"circuit_extraction",
"ion_channel_modeling",
"skeletonization",
"ion_channel_simulation",
"em_synapse_mapping",
name="tasktype",
create_type=False,
),
nullable=False,
),
sa.Column(
"scan_parameters",
postgresql.JSONB(astext_type=sa.Text()),
server_default="{}",
nullable=False,
),
sa.Column("name", sa.String(), nullable=False),
sa.Column("description", sa.String(), nullable=False),
sa.Column("description_vector", postgresql.TSVECTOR(), nullable=True),
sa.ForeignKeyConstraint(["id"], ["entity.id"], name=op.f("fk_campaign_id_entity")),
sa.PrimaryKeyConstraint("id", name=op.f("pk_campaign")),
)
op.create_index(
"ix_campaign_description_vector",
"campaign",
["description_vector"],
unique=False,
postgresql_using="gin",
)
op.create_index(op.f("ix_campaign_name"), "campaign", ["name"], unique=False)
op.create_index(op.f("ix_campaign_task_type"), "campaign", ["task_type"], unique=False)
op.create_table(
"task_config_generation",
sa.Column("id", sa.Uuid(), nullable=False),
sa.ForeignKeyConstraint(
["id"], ["activity.id"], name=op.f("fk_config_generation_id_activity")
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_config_generation")),
)
op.create_table(
"task_execution",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column(
"executor",
postgresql.ENUM(
"single_node_job",
"distributed_job",
"jupyter_notebook",
name="executortype",
create_type=False,
),
nullable=True,
),
sa.Column("execution_id", sa.Uuid(), nullable=True),
sa.ForeignKeyConstraint(
["id"], ["activity.id"], name=op.f("fk_task_execution_id_activity")
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_task_execution")),
)
op.create_table(
"campaign__entity",
sa.Column("campaign_id", sa.Uuid(), nullable=False),
sa.Column("entity_id", sa.Uuid(), nullable=False),
sa.ForeignKeyConstraint(
["campaign_id"],
["campaign.id"],
name=op.f("fk_campaign__entity_campaign_id_campaign"),
ondelete="CASCADE",
),
sa.ForeignKeyConstraint(
["entity_id"],
["entity.id"],
name=op.f("fk_campaign__entity_entity_id_entity"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("campaign_id", "entity_id", name=op.f("pk_campaign__entity")),
)
op.create_table(
"task_config",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column(
"task_type",
postgresql.ENUM(
"circuit_simulation",
"circuit_extraction",
"ion_channel_modeling",
"skeletonization",
"ion_channel_simulation",
"em_synapse_mapping",
name="tasktype",
create_type=False,
),
nullable=False,
),
sa.Column(
"scan_parameters",
postgresql.JSONB(astext_type=sa.Text()),
server_default="{}",
nullable=False,
),
sa.Column("campaign_id", sa.Uuid(), nullable=False),
sa.Column("name", sa.String(), nullable=False),
sa.Column("description", sa.String(), nullable=False),
sa.Column("description_vector", postgresql.TSVECTOR(), nullable=True),
sa.ForeignKeyConstraint(
["campaign_id"], ["campaign.id"], name=op.f("fk_task_config_campaign_id_campaign")
),
sa.ForeignKeyConstraint(["id"], ["entity.id"], name=op.f("fk_task_config_id_entity")),
sa.PrimaryKeyConstraint("id", name=op.f("pk_task_config")),
)
op.create_index(
op.f("ix_task_config_campaign_id"), "task_config", ["campaign_id"], unique=False
)
op.create_index(
"ix_task_config_description_vector",
"task_config",
["description_vector"],
unique=False,
postgresql_using="gin",
)
op.create_index(op.f("ix_task_config_name"), "task_config", ["name"], unique=False)
op.create_index(op.f("ix_task_config_task_type"), "task_config", ["task_type"], unique=False)
op.create_table(
"task_config__entity",
sa.Column("task_config_id", sa.Uuid(), nullable=False),
sa.Column("entity_id", sa.Uuid(), nullable=False),
sa.ForeignKeyConstraint(
["entity_id"],
["entity.id"],
name=op.f("fk_task_config__entity_entity_id_entity"),
ondelete="CASCADE",
),
sa.ForeignKeyConstraint(
["task_config_id"],
["task_config.id"],
name=op.f("fk_task_config__entity_task_config_id_task_config"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("task_config_id", "entity_id", name=op.f("pk_task_config__entity")),
)
op.sync_enum_values(
enum_schema="public",
enum_name="activitytype",
new_values=[
"simulation_execution",
"simulation_generation",
"validation",
"calibration",
"analysis_notebook_execution",
"ion_channel_modeling_execution",
"ion_channel_modeling_config_generation",
"circuit_extraction_config_generation",
"circuit_extraction_execution",
"skeletonization_execution",
"skeletonization_config_generation",
"task_config_generation",
"task_execution",
],
affected_columns=[
TableReference(table_schema="public", table_name="activity", column_name="type")
],
enum_values_to_rename=[],
)
op.sync_enum_values(
enum_schema="public",
enum_name="entitytype",
new_values=[
"analysis_software_source_code",
"brain_atlas",
"brain_atlas_region",
"cell_composition",
"cell_morphology",
"cell_morphology_protocol",
"electrical_cell_recording",
"electrical_recording",
"electrical_recording_stimulus",
"emodel",
"experimental_bouton_density",
"experimental_neuron_density",
"experimental_synapses_per_connection",
"external_url",
"ion_channel_model",
"ion_channel_modeling_campaign",
"ion_channel_modeling_config",
"ion_channel_recording",
"memodel",
"memodel_calibration_result",
"me_type_density",
"simulation",
"simulation_campaign",
"simulation_result",
"scientific_artifact",
"single_neuron_simulation",
"single_neuron_synaptome",
"single_neuron_synaptome_simulation",
"subject",
"validation_result",
"circuit",
"circuit_extraction_campaign",
"circuit_extraction_config",
"em_dense_reconstruction_dataset",
"em_cell_mesh",
"analysis_notebook_template",
"analysis_notebook_environment",
"analysis_notebook_result",
"skeletonization_config",
"skeletonization_campaign",
"campaign",
"task_config",
],
affected_columns=[
TableReference(table_schema="public", table_name="entity", column_name="type"),
TableReference(
table_schema="public", table_name="measurement_label", column_name="entity_type"
),
],
enum_values_to_rename=[],
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values(
enum_schema="public",
enum_name="entitytype",
new_values=[
"analysis_software_source_code",
"brain_atlas",
"brain_atlas_region",
"cell_composition",
"cell_morphology",
"cell_morphology_protocol",
"electrical_cell_recording",
"electrical_recording",
"electrical_recording_stimulus",
"emodel",
"experimental_bouton_density",
"experimental_neuron_density",
"experimental_synapses_per_connection",
"external_url",
"ion_channel_model",
"ion_channel_modeling_campaign",
"ion_channel_modeling_config",
"ion_channel_recording",
"memodel",
"memodel_calibration_result",
"me_type_density",
"simulation",
"simulation_campaign",
"simulation_result",
"scientific_artifact",
"single_neuron_simulation",
"single_neuron_synaptome",
"single_neuron_synaptome_simulation",
"subject",
"validation_result",
"circuit",
"circuit_extraction_campaign",
"circuit_extraction_config",
"em_dense_reconstruction_dataset",
"em_cell_mesh",
"analysis_notebook_template",
"analysis_notebook_environment",
"analysis_notebook_result",
"skeletonization_config",
"skeletonization_campaign",
],
affected_columns=[
TableReference(table_schema="public", table_name="entity", column_name="type"),
TableReference(
table_schema="public", table_name="measurement_label", column_name="entity_type"
),
],
enum_values_to_rename=[],
)
op.sync_enum_values(
enum_schema="public",
enum_name="activitytype",
new_values=[
"simulation_execution",
"simulation_generation",
"validation",
"calibration",
"analysis_notebook_execution",
"ion_channel_modeling_execution",
"ion_channel_modeling_config_generation",
"circuit_extraction_config_generation",
"circuit_extraction_execution",
"skeletonization_execution",
"skeletonization_config_generation",
],
affected_columns=[
TableReference(table_schema="public", table_name="activity", column_name="type")
],
enum_values_to_rename=[],
)
op.drop_table("task_config__entity")
op.drop_index(op.f("ix_task_config_task_type"), table_name="task_config")
op.drop_index(op.f("ix_task_config_name"), table_name="task_config")
op.drop_index(
"ix_task_config_description_vector", table_name="task_config", postgresql_using="gin"
)
op.drop_index(op.f("ix_task_config_campaign_id"), table_name="task_config")
op.drop_table("task_config")
op.drop_table("campaign__entity")
op.drop_table("task_execution")
op.drop_table("task_config_generation")
op.drop_index(op.f("ix_campaign_task_type"), table_name="campaign")
op.drop_index(op.f("ix_campaign_name"), table_name="campaign")
op.drop_index("ix_campaign_description_vector", table_name="campaign", postgresql_using="gin")
op.drop_table("campaign")
sa.Enum(
"circuit_simulation",
"circuit_extraction",
"ion_channel_modeling",
"skeletonization",
"ion_channel_simulation",
"em_synapse_mapping",
name="tasktype",
).drop(op.get_bind())
# ### end Alembic commands ###
Loading