async def get_data_join_feature_by_id( conn: Database, data_model, feature_model, mp_id: int, require_mp_type: int, data_id: int, data_fileds: tuple, feature_fileds: tuple, session: Session = session_make(engine=None), ): data_model = get_shard_model( data_model, mp_id=mp_id, require_mp_type=require_mp_type ) feature_model = get_shard_model( feature_model, mp_id=mp_id, require_mp_type=require_mp_type ) feature_attr = [] for feature in feature_fileds: feature_attr.append(getattr(feature_model, feature)) data_attr = [] for data in data_fileds: data_attr.append(getattr(data_model, data)) query = ( session.query(*tuple(data_attr), *tuple(feature_attr)) .select_from(data_model) .join(feature_model, feature_model.data_id == data_model.id) .filter(data_model.id == data_id) ) return await conn.fetch_one(query2sql(query))
async def get_by_id( conn: Database, orm_model, mp_id: int, require_mp_type: int, data_id: int, session: Session = session_make(engine=None), ): model = get_shard_model(orm_model, mp_id=mp_id, require_mp_type=require_mp_type) query = session.query(model).filter(model.id == data_id) return await conn.fetch_one(query2sql(query))
async def get_latest( conn: Database, orm_model, mp_id: int, require_mp_type: int, session: Session = session_make(engine=None), ): model = get_shard_model(orm_model, mp_id=mp_id, require_mp_type=require_mp_type) query = ( session.query(model).order_by(model.id.desc()).limit(1) ) # query all the defined fields return await conn.fetch_one(query2sql(query))
async def get_multi( conn: Database, mp_id: int, require_mp_type: int, orm_model, fileds: List[str], time_before: str, time_after: str, limit: int, with_estimated: bool = False, session: Session = session_make(engine=None), ): model = get_shard_model(orm_model, mp_id=mp_id, require_mp_type=require_mp_type) query = session.query(model) for filed in fileds + ["id", "time", "data_id"]: query = query.options(load_only(filed)) if with_estimated: for filed in fileds: query = ( query.options(load_only("est_" + filed)) if filed != "similarity" else query ) if time_before != "None": query = query.filter(model.time.between(str(time_after), str(time_before))) query = query.order_by(model.time.desc()) if limit: query = query.order_by(model.time.desc()).limit(limit) res = await conn.fetch_all(query2sql(query)) res.reverse() if len(res) == 0: raise HTTPException( status_code=400, detail="No signal collected between the time range" ) dic = {} keys = res[0].keys() for row in res: for key in keys: if key == "time": dic.setdefault(key, []).append(str(row[key])) else: dic.setdefault(key, []).append(row[key]) return dic
async def get_multi( conn: Database, orm_model, mp_id: int, require_mp_type: int, time_before: datetime, time_after: datetime, session: Session = session_make(engine=None), ): model = get_shard_model(orm_model, mp_id=mp_id, require_mp_type=require_mp_type) query = ( session.query(model.id, model.time) .filter(model.time.between(str(time_before), str(time_after))) .order_by(model.id) ) return await conn.fetch_all(query2sql(query))
async def get_latest( conn: Database, mp_id: int, require_mp_type: int, orm_model, fileds: List[str], session: Session = session_make(engine=None), ): model = get_shard_model(orm_model, mp_id=mp_id, require_mp_type=require_mp_type) query = session.query(model) for filed in fileds: query = query.options(load_only(filed)) query = query.order_by(model.id.desc()).limit(1) res = await conn.fetch_one(query2sql(query)) return res
async def get( conn: Database, mp_id: int, require_mp_type: int, orm_model, fileds: List[str], data_id: int, session: Session = session_make(engine=None), ): model = get_shard_model(orm_model, mp_id=mp_id, require_mp_type=require_mp_type) query = session.query(model) for filed in fileds + ["id", "time"]: query = query.options(load_only(filed)) query = query.filter(model.data_id == data_id) res = await conn.fetch_one(query2sql(query)) return res