def main( config, metrics=None, dimensions=None, criteria=None, row_filters=None, rollup=None, log_level=None, ): if log_level: logger = logging.getLogger() logger.setLevel(log_level) if criteria: criteria = ast.literal_eval(criteria) if row_filters: row_filters = ast.literal_eval(row_filters) pp(locals()) wh = Warehouse(config=config) result = wh.execute( metrics=metrics, dimensions=dimensions, criteria=criteria, row_filters=row_filters, rollup=rollup, ) print(result.df_display)
def save( warehouse_id: int, request: ReportSaveRequest, whs: Dict[str, Any] = Depends(deps.get_warehouses), current_user: models.User = Depends(deps.get_current_active_user), ) -> Any: """Save a report""" if not whs: raise Exception("No warehouses have been loaded") if crud.user.is_active(current_user): wh = whs[warehouse_id] request = dict(request) replace_report_formula_display_names(wh, request) handle_shortcut_criteria(wh, request) pp(request) report_id = None if "report_id" in request: report_id = request["report_id"] del request["report_id"] if report_id: report = update_report(wh, report_id, **request) else: report = wh.save_report(**request) return {"spec_id": report.spec_id} return {}
def test_get_structure(client: TestClient, superuser_token_headers: dict) -> None: resp = client.get(f"{settings.API_V1_STR}/warehouse/1/structure", headers=superuser_token_headers) assert resp.status_code == 200 data = resp.json() pp(data)
def test_execute(client: TestClient, superuser_token_headers: dict) -> None: resp = client.post( f"{settings.API_V1_STR}/warehouse/1/execute", headers=superuser_token_headers, json={ "metrics": ["cases"], "dimensions": ["month"] }, ) assert resp.status_code == 200, resp.content data = resp.json() pp(data)
def test_check_formula(client: TestClient, superuser_token_headers: dict) -> None: resp = client.post( f"{settings.API_V1_STR}/warehouse/1/check_formula", headers=superuser_token_headers, json={ "name": "adhoc1", "formula": "1.0*{Cases}/{Deaths}" }, ) assert resp.status_code == 200 data = resp.json() pp(data)
def get_warehouses() -> Dict[str, Any]: """NOTE: this assumes Zillion Web DB is same as Zillion DB""" global warehouses if warehouses: # TODO: cache control? return warehouses print("Building warehouses...") db = SessionLocal() try: result = db.query(Warehouses).all() for row in result: warehouses[row.id] = Warehouse.load(row.id) pp(warehouses) return warehouses finally: db.close()
def execute( warehouse_id: int, request: ReportRequest, whs: Dict[str, Any] = Depends(deps.get_warehouses), current_user: models.User = Depends(deps.get_current_active_user), ) -> Any: """Execute a report""" if not whs: raise Exception("No warehouses have been loaded") if crud.user.is_active(current_user): request = dict(request) pp(request) wh = whs[warehouse_id] replace_report_formula_display_names(wh, request) handle_shortcut_criteria(wh, request) display_names = request.get("display_names", False) del request["display_names"] result = wh.execute(allow_partial=True, **request) data = process_report_result(result, display_names=display_names) # Need to use a custom json response to handle numpy dtypes json_str = json.dumps(data, ignore_nan=True, cls=JSONEncoder) return Response(media_type="application/json", content=json_str) return {}
def check_formula( warehouse_id: int, request: CheckFormulaRequest, whs: Dict[str, Any] = Depends(deps.get_warehouses), current_user: models.User = Depends(deps.get_current_active_user), ) -> Any: """Check an AdHocMetric formula""" if not whs: raise Exception("No warehouses have been loaded") if crud.user.is_active(current_user): request = dict(request) wh = whs[warehouse_id] request["formula"] = replace_display_names(wh, request["formula"]) pp(request) if request.get("display_name", None): all_fields = wh.get_fields() for field in all_fields.values(): if field.display_name == request["display_name"]: return { "success": False, "reason": f"Display name '{request['display_name']}' is used by another field", } try: wh.get_metric(request) except InvalidFieldException as e: return {"success": False, "reason": str(e)} except ValidationError as e: return {"success": False, "reason": str(e)} except ZillionException as e: return {"success": False, "reason": str(e)} return {"success": True, "reason": None} return {}
def print(self, data): pp(data)