Skip to content

Commit

Permalink
initial push
Browse files Browse the repository at this point in the history
  • Loading branch information
AAfghahi committed Mar 8, 2021
1 parent 86c0727 commit bfa3b05
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,21 @@
from enum import Enum
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
from superset.models.sql_lab import LimitMethod
from sqlalchemy.dialects import postgresql
from sqlalchemy.dialects.postgresql.base import PGDialect
from superset.models.sql_lab import LimitingFactor

def upgrade():
bind = op.get_bind()
if isinstance(bind.dialect, PGDialect):
limiting_factor = postgresql.ENUM("DROPDOWN", "QUERY", "NOT_LIMITED", "QUERY_AND_DROPDOWN", "UNKNOWN", name="limitingfactor")
limiting_factor.create(bind)
with op.batch_alter_table("query") as batch_op:
batch_op.add_column(sa.Column("was_limited", sa.Boolean(), nullable=True))
batch_op.add_column(
sa.Column("limiting_factor", sa.Enum("DROPDOWN", "QUERY", "UNKNOWN", name="limitingfactor"))
)
sa.Column("limiting_factor", sa.Enum("DROPDOWN", "QUERY", "NOT_LIMITED", "QUERY_AND_DROPDOWN", "UNKNOWN", name="limitingfactor"))
)


def downgrade():
with op.batch_alter_table("query") as batch_op:
batch_op.drop_column("was_limited")
batch_op.drop_column("limiting_factor")
7 changes: 4 additions & 3 deletions superset/models/sql_lab.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,11 @@
from superset.sql_parse import CtasMethod, ParsedQuery, Table
from superset.utils.core import QueryStatus, user_label

class LimitMethod(str, enum.Enum):
class LimitingFactor(str, enum.Enum):
QUERY = "QUERY"
DROPDOWN = "DROPDOWN"
QUERY_AND_DROPDOWN = "QUERY_AND_DROPDOWN"
NOT_LIMITED = "NOT_LIMITED"
UNKNOWN = "UNKNOWN"

class Query(Model, ExtraJSONMixin):
Expand Down Expand Up @@ -82,8 +84,7 @@ class Query(Model, ExtraJSONMixin):
executed_sql = Column(Text)
# Could be configured in the superset config.
limit = Column(Integer)
limiting_factor = Column(Enum(LimitMethod), server_default=LimitMethod.UNKNOWN)
was_limited = Column(Boolean, default=False)
limiting_factor = Column(Enum(LimitingFactor), server_default=LimitingFactor.UNKNOWN)
select_as_cta = Column(Boolean)
select_as_cta_used = Column(Boolean, default=False)
ctas_method = Column(String(16), default=CtasMethod.TABLE)
Expand Down
5 changes: 3 additions & 2 deletions superset/sql_lab.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ def execute_sql_statement(
if SQL_MAX_ROW and (not query.limit or query.limit > SQL_MAX_ROW):
query.limit = SQL_MAX_ROW
if query.limit:
#We are fetching one more than the requested limit in order to test whether there are more rows than the limit.
sql = database.apply_limit_to_sql(sql, query.limit + 1)

# Hook to allow environment-specific mutation (usually comments) to the SQL
Expand Down Expand Up @@ -236,11 +237,11 @@ def execute_sql_statement(
query.id,
str(query.to_dict()),
)
# This is a test to see if the query is being limited by either the dropdown or the sql. We are testing to see if more rows exist than the limit.
data = db_engine_spec.fetch_data(cursor, query.limit + 1)
if len(data) <= query.limit:
query.was_limited = False
query.limiting_factor = LimitingFactor.NOT_LIMITED
else:
query.was_limited = True
data = data[:-1]

except SoftTimeLimitExceeded as ex:
Expand Down
9 changes: 6 additions & 3 deletions superset/views/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -2579,9 +2579,12 @@ def sql_json_exec( # pylint: disable=too-many-statements,too-many-locals
if not (config.get("SQLLAB_CTAS_NO_LIMIT") and select_as_cta):
# set LIMIT after template processing
limits = [mydb.db_engine_spec.get_limit_from_sql(rendered_query), limit]
query.limiting_factor = (
QueryLimiter.QUERY if limits[0] > limits[1] else QueryLimiter.DROPDOWN
)
if limits[0] == limits[1]:
query.limiting_factor = LimitingFactor.QUERY_AND_DROPDOWN
elif limits[0] > limits[1]:
query.limiting_factor = LimitingFactor.DROPDOWN
else:
query.limiting_factor = LimitingFactor.QUERY
query.limit = min(lim for lim in limits if lim is not None)

# Flag for whether or not to expand data
Expand Down

0 comments on commit bfa3b05

Please sign in to comment.