"""Persistence models for active metadata discovery and field lineage.""" from sqlalchemy.dialects.postgresql import JSONB, UUID from app import db from app.core.common.identifiers import new_governance_uid class ActiveMetadataPlan(db.Model): __tablename__ = "active_metadata_plans" __table_args__ = {"schema": "public"} uid = db.Column(UUID(as_uuid=False), primary_key=True, default=new_governance_uid) source_uid = db.Column(UUID(as_uuid=False), nullable=False) name = db.Column(db.String(300), nullable=False) source_kind = db.Column(db.String(20), nullable=False) schedule_type = db.Column(db.String(20), nullable=False) schedule_expression = db.Column(db.String(120)) discovery_mode = db.Column(db.String(20), nullable=False) scope = db.Column(JSONB, nullable=False) cursor_state = db.Column(JSONB, nullable=False) owner_uid = db.Column(UUID(as_uuid=False), nullable=False) enabled = db.Column(db.Boolean, nullable=False) current_version = db.Column(db.Integer, nullable=False) created_by = db.Column(UUID(as_uuid=False), nullable=False) class ActiveMetadataRun(db.Model): __tablename__ = "active_metadata_runs" __table_args__ = ( db.UniqueConstraint("plan_uid", "batch_key"), {"schema": "public"}, ) uid = db.Column(UUID(as_uuid=False), primary_key=True, default=new_governance_uid) plan_uid = db.Column(UUID(as_uuid=False), nullable=False) batch_key = db.Column(db.String(160), nullable=False) status = db.Column(db.String(20), nullable=False) attempt_count = db.Column(db.Integer, nullable=False) cursor_before = db.Column(JSONB, nullable=False) cursor_after = db.Column(JSONB, nullable=False) snapshot_hash = db.Column(db.String(64)) statistics = db.Column(JSONB, nullable=False) failure_code = db.Column(db.String(80)) failure_reason = db.Column(db.String(500)) actor_uid = db.Column(UUID(as_uuid=False), nullable=False) class ActiveMetadataAsset(db.Model): __tablename__ = "active_metadata_assets" __table_args__ = ( db.UniqueConstraint("source_uid", "asset_key"), {"schema": "public"}, ) uid = db.Column(UUID(as_uuid=False), primary_key=True) source_uid = db.Column(UUID(as_uuid=False), nullable=False) asset_key = db.Column(db.String(500), nullable=False) namespace = db.Column(db.String(200), nullable=False) name = db.Column(db.String(200), nullable=False) asset_type = db.Column(db.String(40), nullable=False) lifecycle_status = db.Column(db.String(30), nullable=False) current_version = db.Column(db.Integer, nullable=False) content_hash = db.Column(db.String(64), nullable=False) snapshot = db.Column(JSONB, nullable=False) health = db.Column(JSONB, nullable=False) last_run_uid = db.Column(UUID(as_uuid=False), nullable=False) class ActiveMetadataAssetVersion(db.Model): __tablename__ = "active_metadata_asset_versions" __table_args__ = ( db.UniqueConstraint("asset_uid", "version"), {"schema": "public"}, ) uid = db.Column(UUID(as_uuid=False), primary_key=True, default=new_governance_uid) asset_uid = db.Column(UUID(as_uuid=False), nullable=False) version = db.Column(db.Integer, nullable=False) run_uid = db.Column(UUID(as_uuid=False), nullable=False) content_hash = db.Column(db.String(64), nullable=False) snapshot = db.Column(JSONB, nullable=False) actor_uid = db.Column(UUID(as_uuid=False), nullable=False) class ActiveMetadataChange(db.Model): __tablename__ = "active_metadata_changes" __table_args__ = {"schema": "public"} uid = db.Column(UUID(as_uuid=False), primary_key=True, default=new_governance_uid) run_uid = db.Column(UUID(as_uuid=False), nullable=False) asset_uid = db.Column(UUID(as_uuid=False), nullable=False) asset_key = db.Column(db.String(500), nullable=False) field_name = db.Column(db.String(200)) change_type = db.Column(db.String(40), nullable=False) before_state = db.Column(JSONB) after_state = db.Column(JSONB) status = db.Column(db.String(20), nullable=False) class ActiveMetadataLineage(db.Model): __tablename__ = "active_metadata_lineage" __table_args__ = {"schema": "public"} uid = db.Column(UUID(as_uuid=False), primary_key=True, default=new_governance_uid) run_uid = db.Column(UUID(as_uuid=False), nullable=False) parse_status = db.Column(db.String(20), nullable=False) source_asset = db.Column(db.String(500)) source_field = db.Column(db.String(200)) target_asset = db.Column(db.String(500)) target_field = db.Column(db.String(200)) relation_type = db.Column(db.String(40), nullable=False) evidence = db.Column(JSONB, nullable=False) failure_reason = db.Column(db.String(500)) class ActiveMetadataHealthSignal(db.Model): __tablename__ = "active_metadata_health_signals" __table_args__ = {"schema": "public"} uid = db.Column(UUID(as_uuid=False), primary_key=True, default=new_governance_uid) asset_uid = db.Column(UUID(as_uuid=False), nullable=False) run_uid = db.Column(UUID(as_uuid=False), nullable=False) signal_type = db.Column(db.String(30), nullable=False) value = db.Column(JSONB) status = db.Column(db.String(20), nullable=False) evidence = db.Column(JSONB, nullable=False) class ActiveMetadataCorrection(db.Model): __tablename__ = "active_metadata_corrections" __table_args__ = {"schema": "public"} uid = db.Column(UUID(as_uuid=False), primary_key=True, default=new_governance_uid) asset_uid = db.Column(UUID(as_uuid=False), nullable=False) field_name = db.Column(db.String(200)) proposed_value = db.Column(JSONB, nullable=False) reason = db.Column(db.String(500), nullable=False) assignee_uid = db.Column(UUID(as_uuid=False), nullable=False) status = db.Column(db.String(20), nullable=False) resolution = db.Column(JSONB, nullable=False) current_version = db.Column(db.Integer, nullable=False) submitted_by = db.Column(UUID(as_uuid=False), nullable=False) resolved_by = db.Column(UUID(as_uuid=False)) class ActiveMetadataCorrectionAudit(db.Model): __tablename__ = "active_metadata_correction_audits" __table_args__ = ( db.UniqueConstraint("correction_uid", "version"), {"schema": "public"}, ) uid = db.Column(UUID(as_uuid=False), primary_key=True, default=new_governance_uid) correction_uid = db.Column(UUID(as_uuid=False), nullable=False) version = db.Column(db.Integer, nullable=False) action = db.Column(db.String(40), nullable=False) before_state = db.Column(JSONB) after_state = db.Column(JSONB, nullable=False) actor_uid = db.Column(UUID(as_uuid=False), nullable=False)