Skip to content

Commit 026b29f

Browse files
authored
Dimension Hierarchies (#1564)
* Add support for dimensional hierarchies * Add history tracking for hierarchies and audit info like created by and owner * Move database functions to classmethods * Add tests for hierarchies * Add hierarchies database migration * Remove the hard-coded level order inputs when creating hierarchies since they can be derived from the list order * Remove validate endpoint for hierarchies
1 parent 3f00434 commit 026b29f

File tree

9 files changed

+2650
-0
lines changed

9 files changed

+2650
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
"""Add hierarchies tables
2+
3+
Revision ID: 95732205ad12
4+
Revises: be76e22dd71a
5+
Create Date: 2025-11-22 22:54:00.000000+00:00
6+
"""
7+
8+
import sqlalchemy as sa
9+
from alembic import op
10+
11+
# revision identifiers, used by Alembic.
12+
revision = "95732205ad12"
13+
down_revision = "be76e22dd71a"
14+
branch_labels = None
15+
depends_on = None
16+
17+
18+
def upgrade():
19+
# Create hierarchies table
20+
op.create_table(
21+
"hierarchies",
22+
sa.Column(
23+
"id",
24+
sa.BigInteger().with_variant(sa.Integer(), "sqlite"),
25+
nullable=False,
26+
),
27+
sa.Column("name", sa.String(), nullable=False),
28+
sa.Column("display_name", sa.String(), nullable=True),
29+
sa.Column("description", sa.Text(), nullable=True),
30+
sa.Column("created_by_id", sa.Integer(), nullable=False),
31+
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
32+
sa.ForeignKeyConstraint(
33+
["created_by_id"],
34+
["users.id"],
35+
name="fk_hierarchies_created_by_id_users",
36+
),
37+
sa.PrimaryKeyConstraint("id", name="pk_hierarchies"),
38+
sa.UniqueConstraint("name", name="uq_hierarchies_name"),
39+
)
40+
41+
# Create hierarchy_levels table
42+
op.create_table(
43+
"hierarchy_levels",
44+
sa.Column("id", sa.BigInteger(), nullable=False),
45+
sa.Column("hierarchy_id", sa.BigInteger(), nullable=False),
46+
sa.Column("name", sa.String(), nullable=False),
47+
sa.Column("dimension_node_id", sa.BigInteger(), nullable=False),
48+
sa.Column("level_order", sa.Integer(), nullable=False),
49+
sa.Column("grain_columns", sa.JSON(), nullable=True),
50+
sa.ForeignKeyConstraint(
51+
["hierarchy_id"],
52+
["hierarchies.id"],
53+
name="fk_hierarchy_levels_hierarchy_id_hierarchies",
54+
),
55+
sa.ForeignKeyConstraint(
56+
["dimension_node_id"],
57+
["node.id"],
58+
name="fk_hierarchy_levels_dimension_node_id_node",
59+
),
60+
sa.PrimaryKeyConstraint("id", name="pk_hierarchy_levels"),
61+
sa.UniqueConstraint(
62+
"hierarchy_id",
63+
"name",
64+
name="hierarchy_levels_hierarchy_id_name_key",
65+
),
66+
)
67+
68+
69+
def downgrade():
70+
# Drop hierarchy_levels first (has foreign key to hierarchies)
71+
op.drop_table("hierarchy_levels")
72+
73+
# Drop hierarchies table
74+
op.drop_table("hierarchies")

0 commit comments

Comments
 (0)