Files
superset2/superset/commands/chart/data/streaming_export_command.py
2025-12-04 13:18:34 -05:00

81 lines
2.7 KiB
Python

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
"""Command for streaming CSV exports of chart data."""
from __future__ import annotations
from typing import Any, TYPE_CHECKING
from superset.commands.streaming_export.base import BaseStreamingCSVExportCommand
if TYPE_CHECKING:
from superset.common.query_context import QueryContext
class StreamingCSVExportCommand(BaseStreamingCSVExportCommand):
"""
Command to execute a streaming CSV export for chart data.
This command handles chart-specific logic:
- QueryContext validation
- Datasource preparation and SQL generation
- No row limit (exports all chart data)
"""
def __init__(
self,
query_context: QueryContext,
chunk_size: int = 1000,
):
"""
Initialize the chart streaming export command.
Args:
query_context: The query context containing datasource and query details
chunk_size: Number of rows to fetch per database query (default: 1000)
"""
super().__init__(chunk_size)
self._query_context = query_context
def validate(self) -> None:
"""Validate permissions and query context."""
self._query_context.raise_for_access()
def _get_sql_and_database(self) -> tuple[str, Any]:
"""
Get the SQL query and database for chart export.
Returns:
Tuple of (sql_query, database_object)
"""
# Get datasource and generate SQL query
# Note: datasource should already be attached to a session from query_context
datasource = self._query_context.datasource
query_obj = self._query_context.queries[0]
sql_query = datasource.get_query_str(query_obj.to_dict())
return sql_query, getattr(datasource, "database", None)
def _get_row_limit(self) -> int | None:
"""
Get the row limit for chart export.
Returns:
None (no limit for chart exports)
"""
return None