refactor(versioning): split VersionDAO into queries + restore modules
VersionDAO carried five distinct concerns under one class — UUID derivation, version metadata queries, change-record loading, single-version snapshot retrieval, and restore orchestration. Bob's "and" test (the clean-code review flagged this as the next structural fix after the dead-code purge) gives ~600 lines of "queries about versioned state of one entity AND the workflow that mutates it." Splits the read and write sides into purpose-built modules: - ``superset/versioning/queries.py`` — UUID derivation (``VERSION_UUID_NAMESPACE``, ``derive_version_uuid``) + read-side helpers (``find_active_by_uuid``, ``current_version_number``, ``current_live_transaction_id``, ``current_live_version_uuid``, ``list_versions``, ``resolve_version_uuid``, ``get_version``, ``list_change_records_batch``). ~475 lines. - ``superset/versioning/restore.py`` — write-side (``restore_version``, ``_stamp_audit_fields_for_restore``, ``_RESTORE_RELATIONS``). ~140 lines. Depends only on ``queries.find_active_by_uuid`` and ``utils.single_flush_scope``. - ``superset/daos/version.py`` — collapsed to an ~85-line backward-compat façade that re-exports both modules under a single ``VersionDAO`` class via ``staticmethod`` aliases. The module also re-exports ``VERSION_UUID_NAMESPACE`` and ``derive_version_uuid`` at module level so the ~10 existing callers (api.py handlers, command classes, the ETag emitter, integration tests) don't have to change their imports. New code is encouraged to import from the sub-modules directly. The functions themselves are unchanged byte-for-byte aside from internal call sites being rewritten from ``VersionDAO.foo`` to the bare function name (since they now live as module-level functions, not class methods). One unit-test mock target moved: ``test_restore_version_returns_none_for_unknown_entity`` now patches ``superset.versioning.restore.find_active_by_uuid`` (the actual call site) instead of ``VersionDAO.find_active_by_uuid`` (which is now just an alias). Each of the three modules now has one reason to change. When the sc-103157 soft-delete pass adds the ``deleted_at IS NULL`` filter to ``find_active_by_uuid``, it touches only ``queries.py``. When a per-entity-type restore Strategy replaces the string-keyed ``_RESTORE_RELATIONS`` dispatch, it touches only ``restore.py``.
M
Mike Bridge committed
59045f8cfe95e2f51af4354cb6489320bbc02bec
Parent: 76bbb18