Skip to content

Commit

Permalink
[WiP] making doubling '%' not required (#2459)
Browse files Browse the repository at this point in the history
* Making doubling '%' not required

Now passing the sqlalchemy query object to pandas's read_sql_query

* Fix test/lint
  • Loading branch information
mistercrunch authored Mar 24, 2017
1 parent 1590b8c commit 7bf19b1
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 25 deletions.
5 changes: 3 additions & 2 deletions superset/connectors/druid/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,7 @@ def values_for_column(self,
return [row[0] for row in df.to_records(index=False)]

def get_query_str( # noqa / druid
self, client, qry_start_dttm,
self,
groupby, metrics,
granularity,
from_dttm, to_dttm,
Expand All @@ -741,6 +741,7 @@ def get_query_str( # noqa / druid
This query interface is common to SqlAlchemy and Druid
"""
# TODO refactor into using a TBD Query object
client = self.cluster.get_pydruid_client()
if not is_timeseries:
granularity = 'all'
inner_from_dttm = inner_from_dttm or from_dttm
Expand Down Expand Up @@ -941,7 +942,7 @@ def recursive_get_fields(_conf):
def query(self, query_obj):
qry_start_dttm = datetime.now()
client = self.cluster.get_pydruid_client()
query_str = self.get_query_str(client, qry_start_dttm, **query_obj)
query_str = self.get_query_str(**query_obj)
df = client.export_pandas()

if df is None or df.size == 0:
Expand Down
30 changes: 15 additions & 15 deletions superset/connectors/sqla/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,8 +322,16 @@ def get_template_processor(self, **kwargs):
return get_template_processor(
table=self, database=self.database, **kwargs)

def get_query_str( # sqla
self, engine, qry_start_dttm,
def get_query_str(self, **kwargs):
qry = self.get_sqla_query(**kwargs)
sql = str(qry.compile(kwargs['engine']))
logging.info(sql)
sql = sqlparse.format(sql, reindent=True)
sql = self.database.db_engine_spec.sql_preprocessor(sql)
return sql

def get_sqla_query( # sqla
self,
groupby, metrics,
granularity,
from_dttm, to_dttm,
Expand Down Expand Up @@ -472,8 +480,7 @@ def visit_column(element, compiler, **kw):
elif op == '<=':
where_clause_and.append(col_obj.sqla_col <= eq)
elif op == 'LIKE':
where_clause_and.append(
col_obj.sqla_col.like(eq.replace('%', '%%')))
where_clause_and.append(col_obj.sqla_col.like(eq))
if extras:
where = extras.get('where')
if where:
Expand Down Expand Up @@ -523,25 +530,18 @@ def visit_column(element, compiler, **kw):

tbl = tbl.join(subq.alias(), and_(*on_clause))

qry = qry.select_from(tbl)

sql = "{}".format(
qry.compile(
engine, compile_kwargs={"literal_binds": True},),
)
logging.info(sql)
sql = sqlparse.format(sql, reindent=True)
return sql
return qry.select_from(tbl)

def query(self, query_obj):
qry_start_dttm = datetime.now()
engine = self.database.get_sqla_engine()
sql = self.get_query_str(engine, qry_start_dttm, **query_obj)
qry = self.get_sqla_query(**query_obj)
sql = str(qry)
status = QueryStatus.SUCCESS
error_message = None
df = None
try:
df = pd.read_sql_query(sql, con=engine)
df = pd.read_sql_query(qry, con=engine)
except Exception as e:
status = QueryStatus.FAILED
error_message = str(e)
Expand Down
4 changes: 0 additions & 4 deletions superset/db_engine_specs.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,10 +279,6 @@ def patch(cls):
from superset.db_engines import presto as patched_presto
presto.Cursor.cancel = patched_presto.cancel

@classmethod
def sql_preprocessor(cls, sql):
return sql.replace('%', '%%')

@classmethod
def convert_dttm(cls, target_type, dttm):
tt = target_type.upper()
Expand Down
5 changes: 1 addition & 4 deletions superset/views/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -983,14 +983,11 @@ def explore_json(self, datasource_type, datasource_id):
if request.args.get("query") == "true":
try:
query_obj = viz_obj.query_obj()
engine = viz_obj.datasource.database.get_sqla_engine() \
if datasource_type == 'table' \
else viz_obj.datasource.cluster.get_pydruid_client()
if datasource_type == 'druid':
# only retrive first phase query for druid
query_obj['phase'] = 1
query = viz_obj.datasource.get_query_str(
engine, datetime.now(), **query_obj)
datetime.now(), **query_obj)
except Exception as e:
return json_error_response(e)
return Response(
Expand Down

0 comments on commit 7bf19b1

Please sign in to comment.