from typing import List from .engines import MsSqlEngine, MongoEngine, PgSqlEngine, AbstractEngine from .utils.Models import TableEngineInput from .utils.Models import WorkingMode, JoinModel from ..table_engine import TableEngineExport class NewTableEngine: def __init__(self, query_class, model, inputs, mode, engine: AbstractEngine, extra_filter, default_sort_by, joins, search_cols, options=None, soft_deleted=False): self.model = model self.query_class = query_class self.mode = mode self.joins = False self.raw_input = inputs if isinstance(inputs, dict): self.input = TableEngineInput(**inputs if inputs else {}) else: self.input = TableEngineInput(**inputs.dict() if inputs else {}) self.input.extra_filter = extra_filter self.default_sort_by = default_sort_by self.joins = joins self.soft_deleted = soft_deleted self.options = options self.search_cols = search_cols self.engine = engine(self) @staticmethod def mongo(query_class, model, inputs, mode: WorkingMode = WorkingMode.Development, extra_filter=None, soft_deleted=False, default_sort_by=None, joins=None, search_cols=[]): return NewTableEngine(query_class, model, inputs, mode, engine=MongoEngine, extra_filter=extra_filter, default_sort_by=default_sort_by, joins=joins, search_cols=search_cols, soft_deleted=soft_deleted) @staticmethod def mssql(query_class, model, inputs, mode: WorkingMode = WorkingMode.Development, extra_filter=None, default_sort_by=None, joins=None, search_cols=[], options=None): return NewTableEngine(query_class, model, inputs, mode, engine=MsSqlEngine, extra_filter=extra_filter, default_sort_by=default_sort_by, joins=joins, search_cols=search_cols, options=options) @staticmethod def pgsql(query_class, model, inputs, mode: WorkingMode = WorkingMode.Development, extra_filter=None, default_sort_by=None, joins=None, search_cols=None, options=None): return NewTableEngine(query_class, model, inputs, mode, engine=PgSqlEngine, extra_filter=extra_filter, default_sort_by=default_sort_by, joins=joins, search_cols=search_cols, options=options) async def exe(self): return await self.engine.exe() async def to_dict(self) -> TableEngineExport: rows, count = await self.exe() self.input.extra_filter = None del self.engine return TableEngineExport( rows=rows, page=self.input.virtual_page(), total=count, te=self.input ) def add_extra_filter(self, filters): self.input = filters return self def joins(self, joins: List[JoinModel]): self.joins = joins return self def set_custom_entities(self, entities=None): self.engine.custom_entities = entities return self