mirror of https://github.com/apache/superset.git
[select-star] Adding optional schema to view (#6051)
This commit is contained in:
parent
9dcf8e101a
commit
1ee08fc216
|
@ -32,7 +32,7 @@ from flask_babel import lazy_gettext as _
|
||||||
import pandas
|
import pandas
|
||||||
from past.builtins import basestring
|
from past.builtins import basestring
|
||||||
import sqlalchemy as sqla
|
import sqlalchemy as sqla
|
||||||
from sqlalchemy import select
|
from sqlalchemy import Column, select
|
||||||
from sqlalchemy.engine import create_engine
|
from sqlalchemy.engine import create_engine
|
||||||
from sqlalchemy.engine.url import make_url
|
from sqlalchemy.engine.url import make_url
|
||||||
from sqlalchemy.sql import quoted_name, text
|
from sqlalchemy.sql import quoted_name, text
|
||||||
|
@ -852,6 +852,20 @@ class PrestoEngineSpec(BaseEngineSpec):
|
||||||
""").format(**locals())
|
""").format(**locals())
|
||||||
return sql
|
return sql
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def where_latest_partition(
|
||||||
|
cls, table_name, schema, database, qry, columns=None):
|
||||||
|
try:
|
||||||
|
col_name, value = cls.latest_partition(
|
||||||
|
table_name, schema, database, show_first=True)
|
||||||
|
except Exception:
|
||||||
|
# table is not partitioned
|
||||||
|
return False
|
||||||
|
for c in columns:
|
||||||
|
if c.get('name') == col_name:
|
||||||
|
return qry.where(Column(col_name) == value)
|
||||||
|
return False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _latest_partition_from_df(cls, df):
|
def _latest_partition_from_df(cls, df):
|
||||||
recs = df.to_records(index=False)
|
recs = df.to_records(index=False)
|
||||||
|
@ -1180,7 +1194,7 @@ class HiveEngineSpec(PrestoEngineSpec):
|
||||||
cls, table_name, schema, database, qry, columns=None):
|
cls, table_name, schema, database, qry, columns=None):
|
||||||
try:
|
try:
|
||||||
col_name, value = cls.latest_partition(
|
col_name, value = cls.latest_partition(
|
||||||
table_name, schema, database)
|
table_name, schema, database, show_first=True)
|
||||||
except Exception:
|
except Exception:
|
||||||
# table is not partitioned
|
# table is not partitioned
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
{{ content |safe }}
|
|
|
@ -2332,7 +2332,7 @@ class Superset(BaseSupersetView):
|
||||||
'columns': payload_columns,
|
'columns': payload_columns,
|
||||||
'selectStar': mydb.select_star(
|
'selectStar': mydb.select_star(
|
||||||
table_name, schema=schema, show_cols=True, indent=True,
|
table_name, schema=schema, show_cols=True, indent=True,
|
||||||
cols=columns, latest_partition=False),
|
cols=columns, latest_partition=True),
|
||||||
'primaryKey': primary_key,
|
'primaryKey': primary_key,
|
||||||
'foreignKeys': foreign_keys,
|
'foreignKeys': foreign_keys,
|
||||||
'indexes': keys,
|
'indexes': keys,
|
||||||
|
@ -2350,14 +2350,19 @@ class Superset(BaseSupersetView):
|
||||||
return json_success(json.dumps(payload))
|
return json_success(json.dumps(payload))
|
||||||
|
|
||||||
@has_access
|
@has_access
|
||||||
@expose('/select_star/<database_id>/<table_name>/')
|
@expose('/select_star/<database_id>/<table_name>')
|
||||||
|
@expose('/select_star/<database_id>/<table_name>/<schema>')
|
||||||
@log_this
|
@log_this
|
||||||
def select_star(self, database_id, table_name):
|
def select_star(self, database_id, table_name, schema=None):
|
||||||
mydb = db.session.query(
|
mydb = db.session.query(
|
||||||
models.Database).filter_by(id=database_id).first()
|
models.Database).filter_by(id=database_id).first()
|
||||||
return self.render_template(
|
return json_success(
|
||||||
'superset/ajah.html',
|
mydb.select_star(
|
||||||
content=mydb.select_star(table_name, show_cols=True),
|
table_name,
|
||||||
|
schema,
|
||||||
|
latest_partition=True,
|
||||||
|
show_cols=True,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@expose('/theme/')
|
@expose('/theme/')
|
||||||
|
|
|
@ -727,6 +727,11 @@ class CoreTests(SupersetTestCase):
|
||||||
.format(db_id=dbobj.id))
|
.format(db_id=dbobj.id))
|
||||||
assert data == ['this_schema_is_allowed_too']
|
assert data == ['this_schema_is_allowed_too']
|
||||||
|
|
||||||
|
def test_select_star(self):
|
||||||
|
self.login(username='admin')
|
||||||
|
resp = self.get_resp('/superset/select_star/1/birth_names')
|
||||||
|
self.assertIn('gender', resp)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue