from abc import abstractmethod from typing import Any, Dict from ... import BaseStep from ...mixins import ESMixin, PGMixin __all__ = ["SearchSwitchDataSourceBase"] class SearchSwitchDataSourceBase(PGMixin, ESMixin, BaseStep): depends_on = {"utils.switch_ready"} @property @abstractmethod def base_index_name(self) -> str: pass @property def index_name(self) -> str: return f"{self.base_index_name}_{self.timestamp}" @property @abstractmethod def table_name(self) -> str: pass @property def alt_table_name(self) -> str: # TODO: use self.timestamp instead of "alt" # but first find a way to delete tables by wildcard like "DROP TABLE TABLE_NAME_*" return f"{self.table_name}_alt" def process(self) -> Dict[str, Any]: try: self.swap_tables(self.table_name, self.alt_table_name) self.es_client.refresh(index=self.index_name) self.es_client.put_alias(index=self.index_name, name=self.base_index_name) except Exception: raise else: self.es_client.index_delete(f"{self.base_index_name}*,-{self.index_name}") return {"status": "ok"}