def _run_async(self, form_data: Dict[str, Any], command: ChartDataCommand) -> Response: """ Execute command as an async query. """ # First, look for the chart query results in the cache. try: result = command.run(force_cached=True) except ChartDataCacheLoadError: result = None # type: ignore already_cached_result = result is not None # If the chart query has already been cached, return it immediately. if already_cached_result: return self._send_chart_response(result) # Otherwise, kick off a background job to run the chart query. # Clients will either poll or be notified of query completion, # at which point they will call the /data/<cache_key> endpoint # to retrieve the results. async_command = CreateAsyncChartDataJobCommand() try: async_command.validate(request) except AsyncQueryTokenException: return self.response_401() result = async_command.run(form_data, g.user.get_id()) return self.response(202, **result)
def load_chart_data_into_cache( job_metadata: Dict[str, Any], form_data: Dict[str, Any], ) -> None: # pylint: disable=import-outside-toplevel from superset.charts.data.commands.get_data_command import ChartDataCommand try: ensure_user_is_set(job_metadata.get("user_id")) set_form_data(form_data) query_context = _create_query_context_from_form(form_data) command = ChartDataCommand(query_context) result = command.run(cache=True) cache_key = result["cache_key"] result_url = f"/api/v1/chart/data/{cache_key}" async_query_manager.update_job( job_metadata, async_query_manager.STATUS_DONE, result_url=result_url, ) except SoftTimeLimitExceeded as ex: logger.warning( "A timeout occurred while loading chart data, error: %s", ex) raise ex except Exception as ex: # TODO: QueryContext should support SIP-40 style errors error = ex.message if hasattr(ex, "message") else str(ex) # type: ignore # pylint: disable=no-member errors = [{"message": error}] async_query_manager.update_job(job_metadata, async_query_manager.STATUS_ERROR, errors=errors) raise ex
def _get_data_response( self, command: ChartDataCommand, force_cached: bool = False, form_data: Optional[Dict[str, Any]] = None, datasource: Optional[BaseDatasource] = None, ) -> Response: try: result = command.run(force_cached=force_cached) except ChartDataCacheLoadError as exc: return self.response_422(message=exc.message) except ChartDataQueryFailedError as exc: return self.response_400(message=exc.message) return self._send_chart_response(result, form_data, datasource)