Skip to content

Commit 7b785ee

Browse files
authored
feat: dataset labels migration (#9409)
1 parent 3d6eb81 commit 7b785ee

File tree

3 files changed

+135
-0
lines changed

3 files changed

+135
-0
lines changed

scripts/ddl/postgresql_schema.sql

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,48 @@ CREATE INDEX ix_api_keys_user_id ON public.api_keys
509509
USING btree (user_id);
510510

511511

512+
-- Table: dataset_labels
513+
-- ---------------------
514+
CREATE TABLE public.dataset_labels (
515+
id serial NOT NULL,
516+
name VARCHAR NOT NULL,
517+
description VARCHAR,
518+
color VARCHAR NOT NULL DEFAULT '#ffffff'::character varying,
519+
user_id INTEGER,
520+
CONSTRAINT pk_dataset_labels PRIMARY KEY (id),
521+
CONSTRAINT uq_dataset_labels_name
522+
UNIQUE (name),
523+
CONSTRAINT fk_dataset_labels_user_id_users FOREIGN KEY
524+
(user_id)
525+
REFERENCES public.users (id)
526+
ON DELETE SET NULL
527+
);
528+
529+
530+
-- Table: datasets_dataset_labels
531+
-- ------------------------------
532+
CREATE TABLE public.datasets_dataset_labels (
533+
id serial NOT NULL,
534+
dataset_id INTEGER NOT NULL,
535+
dataset_label_id INTEGER NOT NULL,
536+
CONSTRAINT pk_datasets_dataset_labels PRIMARY KEY (id),
537+
CONSTRAINT uq_datasets_dataset_labels_dataset_id_dataset_label_id
538+
UNIQUE (dataset_id, dataset_label_id),
539+
CONSTRAINT fk_datasets_dataset_labels_dataset_id_datasets FOREIGN KEY
540+
(dataset_id)
541+
REFERENCES public.datasets (id)
542+
ON DELETE CASCADE,
543+
CONSTRAINT fk_datasets_dataset_labels_dataset_label_id_dataset_labels
544+
FOREIGN KEY
545+
(dataset_label_id)
546+
REFERENCES public.dataset_labels (id)
547+
ON DELETE CASCADE
548+
);
549+
550+
CREATE INDEX ix_datasets_dataset_labels_dataset_label_id ON public.datasets_dataset_labels
551+
USING btree (dataset_label_id);
552+
553+
512554
-- Table: document_annotations
513555
-- ---------------------------
514556
CREATE TABLE public.document_annotations (
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"""dataset_labels
2+
3+
Revision ID: 58228d933c91
4+
Revises: 699f655af132
5+
Create Date: 2025-09-05 17:47:34.637329
6+
7+
"""
8+
9+
from typing import Sequence, Union
10+
11+
import sqlalchemy as sa
12+
from alembic import op
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = "58228d933c91"
16+
down_revision: Union[str, None] = "699f655af132"
17+
branch_labels: Union[str, Sequence[str], None] = None
18+
depends_on: Union[str, Sequence[str], None] = None
19+
20+
21+
def upgrade() -> None:
22+
op.create_table(
23+
"dataset_labels",
24+
sa.Column("id", sa.Integer, primary_key=True),
25+
sa.Column("name", sa.String, nullable=False, unique=True),
26+
sa.Column("description", sa.String, nullable=True),
27+
sa.Column("color", sa.String, server_default=sa.text("'#ffffff'"), nullable=False),
28+
sa.Column(
29+
"user_id",
30+
sa.Integer,
31+
sa.ForeignKey("users.id", ondelete="SET NULL"),
32+
nullable=True,
33+
),
34+
)
35+
36+
op.create_table(
37+
"datasets_dataset_labels",
38+
sa.Column("id", sa.Integer, primary_key=True),
39+
sa.Column(
40+
"dataset_id",
41+
sa.Integer,
42+
sa.ForeignKey("datasets.id", ondelete="CASCADE"),
43+
nullable=False,
44+
),
45+
sa.Column(
46+
"dataset_label_id",
47+
sa.Integer,
48+
sa.ForeignKey("dataset_labels.id", ondelete="CASCADE"),
49+
nullable=False,
50+
index=True,
51+
),
52+
sa.UniqueConstraint("dataset_id", "dataset_label_id"),
53+
)
54+
55+
56+
def downgrade() -> None:
57+
op.drop_table("datasets_dataset_labels")
58+
op.drop_table("dataset_labels")

src/phoenix/db/models.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,6 +1061,9 @@ class Dataset(Base):
10611061
experiment_tags: Mapped[list["ExperimentTag"]] = relationship(
10621062
"ExperimentTag", back_populates="dataset"
10631063
)
1064+
datasets_dataset_labels: Mapped[list["DatasetsDatasetLabel"]] = relationship(
1065+
"DatasetsDatasetLabel", back_populates="dataset"
1066+
)
10641067

10651068
@hybrid_property
10661069
def example_count(self) -> Optional[int]:
@@ -1111,6 +1114,38 @@ async def load_example_count(self, session: AsyncSession) -> None:
11111114
)
11121115

11131116

1117+
class DatasetLabel(Base):
1118+
__tablename__ = "dataset_labels"
1119+
name: Mapped[str] = mapped_column(unique=True)
1120+
description: Mapped[Optional[str]]
1121+
color: Mapped[str] = mapped_column(String, server_default=text("'#ffffff'"), nullable=False)
1122+
datasets_dataset_labels: Mapped[list["DatasetsDatasetLabel"]] = relationship(
1123+
"DatasetsDatasetLabel", back_populates="dataset_label"
1124+
)
1125+
user_id: Mapped[Optional[int]] = mapped_column(
1126+
ForeignKey("users.id", ondelete="SET NULL"),
1127+
nullable=True,
1128+
)
1129+
user: Mapped[Optional["User"]] = relationship("User")
1130+
1131+
1132+
class DatasetsDatasetLabel(Base):
1133+
__tablename__ = "datasets_dataset_labels"
1134+
dataset_id: Mapped[int] = mapped_column(
1135+
ForeignKey("datasets.id", ondelete="CASCADE"),
1136+
)
1137+
dataset_label_id: Mapped[int] = mapped_column(
1138+
ForeignKey("dataset_labels.id", ondelete="CASCADE"),
1139+
index=True,
1140+
)
1141+
dataset: Mapped["Dataset"] = relationship("Dataset", back_populates="datasets_dataset_labels")
1142+
dataset_label: Mapped["DatasetLabel"] = relationship(
1143+
"DatasetLabel", back_populates="datasets_dataset_labels"
1144+
)
1145+
1146+
__table_args__ = (UniqueConstraint("dataset_id", "dataset_label_id"),)
1147+
1148+
11141149
class DatasetVersion(Base):
11151150
__tablename__ = "dataset_versions"
11161151
dataset_id: Mapped[int] = mapped_column(

0 commit comments

Comments
 (0)