refactor sql_json view endpoint: separate set the query's limiting concern into ad hod method (#16653)
diff --git a/superset/views/core.py b/superset/views/core.py
index 12106c2..f335099 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -2600,20 +2600,7 @@
self._validate_access(query, session)
rendered_query = self._render_query(execution_context, query, session)
- if not (config.get("SQLLAB_CTAS_NO_LIMIT") and execution_context.select_as_cta):
- # set LIMIT after template processing
- db_engine_spec = execution_context.database.db_engine_spec # type: ignore
- limits = [
- db_engine_spec.get_limit_from_sql(rendered_query),
- execution_context.limit,
- ]
- if limits[0] is None or limits[0] > limits[1]: # type: ignore
- query.limiting_factor = LimitingFactor.DROPDOWN
- elif limits[1] > limits[0]: # type: ignore
- query.limiting_factor = LimitingFactor.QUERY
- else: # limits[0] == limits[1]
- query.limiting_factor = LimitingFactor.QUERY_AND_DROPDOWN
- query.limit = min(lim for lim in limits if lim is not None)
+ self._set_query_limit_if_required(execution_context, query, rendered_query)
# Flag for whether or not to expand data
# (feature that will expand Presto row objects and arrays)
@@ -2629,6 +2616,41 @@
session, rendered_query, query, expand_data, log_params
)
+ def _set_query_limit_if_required(
+ self,
+ execution_context: SqlJsonExecutionContext,
+ query: Query,
+ rendered_query: str,
+ ) -> None:
+ if self._is_required_to_set_limit(execution_context):
+ self._set_query_limit(execution_context, query, rendered_query)
+
+ def _set_query_limit( # pylint: disable=no-self-use
+ self,
+ execution_context: SqlJsonExecutionContext,
+ query: Query,
+ rendered_query: str,
+ ) -> None:
+ db_engine_spec = execution_context.database.db_engine_spec # type: ignore
+ limits = [
+ db_engine_spec.get_limit_from_sql(rendered_query),
+ execution_context.limit,
+ ]
+ if limits[0] is None or limits[0] > limits[1]: # type: ignore
+ query.limiting_factor = LimitingFactor.DROPDOWN
+ elif limits[1] > limits[0]: # type: ignore
+ query.limiting_factor = LimitingFactor.QUERY
+ else: # limits[0] == limits[1]
+ query.limiting_factor = LimitingFactor.QUERY_AND_DROPDOWN
+ query.limit = min(lim for lim in limits if lim is not None)
+
+ def _is_required_to_set_limit( # pylint: disable=no-self-use
+ self, execution_context: SqlJsonExecutionContext
+ ) -> bool:
+ return not (
+ config.get("SQLLAB_CTAS_NO_LIMIT") and execution_context.select_as_cta
+ )
+
def _render_query( # pylint: disable=no-self-use
self, execution_context: SqlJsonExecutionContext, query: Query, session: Session
) -> str: