diff --git a/app/models.py b/app/models.py
index 6dea1f17a9667..feddeda2c57e7 100644
--- a/app/models.py
+++ b/app/models.py
@@ -2,7 +2,7 @@
from datetime import timedelta
from flask.ext.appbuilder.models.mixins import AuditMixin
from sqlalchemy import Column, Integer, String, ForeignKey, Text, Boolean, DateTime
-from sqlalchemy import create_engine, MetaData
+from sqlalchemy import create_engine, MetaData, desc
from sqlalchemy import Table as sqlaTable
from sqlalchemy.orm import relationship
from dateutil.parser import parse
@@ -210,11 +210,11 @@ def query(
select_exprs = [literal_column(s) for s in groupby]
groupby_exprs = [literal_column(s) for s in groupby]
inner_groupby_exprs = [literal_column(s).label('__' + s) for s in groupby]
- select_exprs += metrics_exprs
if granularity != "all":
select_exprs += [timestamp]
groupby_exprs += [timestamp]
+ select_exprs += metrics_exprs
qry = select(select_exprs)
from_clause = table(self.table_name)
qry = qry.group_by(*groupby_exprs)
@@ -231,6 +231,7 @@ def query(
cond = ~cond
where_clause_and.append(cond)
qry = qry.where(and_(*where_clause_and))
+ qry = qry.order_by(desc(main_metric_expr))
qry = qry.limit(row_limit)
if timeseries_limit and groupby:
@@ -238,6 +239,7 @@ def query(
subq = subq.select_from(table(self.table_name))
subq = subq.where(and_(*where_clause_and))
subq = subq.group_by(*inner_groupby_exprs)
+ subq = subq.order_by(desc(main_metric_expr))
subq = subq.limit(timeseries_limit)
on_clause = []
for gb in groupby:
diff --git a/app/templates/panoramix/datasource.html b/app/templates/panoramix/datasource.html
index 5bed7d9c512df..1a33ffbba2f91 100644
--- a/app/templates/panoramix/datasource.html
+++ b/app/templates/panoramix/datasource.html
@@ -57,7 +57,6 @@
{{ form.groupby.label }}: {{ form.groupby(class_="form-control select2") }}
- {{ form.limit.label }}: {{ form.limit(class_="form-control select2") }}
{% block extra_fields %}{% endblock %}
Filters
diff --git a/app/templates/panoramix/viz_highcharts.html b/app/templates/panoramix/viz_highcharts.html
index 50f39273768d8..b501bfc20a28f 100644
--- a/app/templates/panoramix/viz_highcharts.html
+++ b/app/templates/panoramix/viz_highcharts.html
@@ -13,6 +13,7 @@
{{ form.rolling_periods.label }}: {{ form.rolling_periods(class_="form-control") }}
{% endif %}
+ {{ form.limit.label }}: {{ form.limit(class_="form-control select2") }}
{% endblock %}
{% block tail %}
diff --git a/app/templates/panoramix/viz_table.html b/app/templates/panoramix/viz_table.html
index d4b51b9f99bc0..01aa06acae6de 100644
--- a/app/templates/panoramix/viz_table.html
+++ b/app/templates/panoramix/viz_table.html
@@ -1,11 +1,31 @@
{% extends "panoramix/datasource.html" %}
+
+{% block head_css %}
+{{super()}}
+
+{% endblock %}
+
{% block viz %}
{{ table|safe }}
{% endblock %}
-{% block scripts %}
+{% block extra_fields %}
+ {{ form.row_limit.label }}: {{ form.row_limit(class_="form-control select2") }}
+{% endblock %}
+
+{% block tail %}
{{ super() }}
+
+
+
{% endblock %}
+
diff --git a/app/viz.py b/app/viz.py
index d15217b462e75..9cac608dd55c0 100644
--- a/app/viz.py
+++ b/app/viz.py
@@ -31,7 +31,6 @@ def fields(self):
def form_factory(datasource, form_args=None, extra_fields_dict=None):
extra_fields_dict = extra_fields_dict or {}
- limits = [0, 5, 10, 25, 50, 100, 500]
if form_args:
limit = form_args.get("limit")
@@ -54,8 +53,6 @@ class QueryForm(OmgWtForm):
granularity = TextField('Time Granularity', default="one day")
since = TextField('Since', default="one day ago")
until = TextField('Until', default="now")
- limit = SelectField(
- 'Limit', choices=[(s, s) for s in limits])
for i in range(10):
setattr(QueryForm, 'flt_col_' + str(i), SelectField(
'Filter 1', choices=[(s, s) for s in datasource.filterable_column_names]))
@@ -110,10 +107,13 @@ def query_obj(self):
groupby = args.getlist("groupby") or []
metrics = args.getlist("metrics") or ['count']
granularity = args.get("granularity", "1 day")
- granularity = utils.parse_human_timedelta(
- granularity).total_seconds() * 1000
+ if granularity != "all":
+ granularity = utils.parse_human_timedelta(
+ granularity).total_seconds() * 1000
limit = int(
- args.get("limit", config.ROW_LIMIT)) or config.ROW_LIMIT
+ args.get("limit", config.ROW_LIMIT))
+ row_limit = int(
+ args.get("row_limit", config.ROW_LIMIT))
since = args.get("since", "1 year ago")
from_dttm = utils.parse_human_datetime(since)
if from_dttm > datetime.now():
@@ -129,6 +129,7 @@ def query_obj(self):
'to_dttm': to_dttm,
'groupby': groupby,
'metrics': metrics,
+ 'row_limit': row_limit,
'filter': self.query_filters(),
'timeseries_limit': limit,
}
@@ -156,19 +157,29 @@ class TableViz(BaseViz):
verbose_name = "Table View"
template = 'panoramix/viz_table.html'
def render(self):
- if self.df is None or self.df.empty:
+ df = self.df
+ row_limit = request.args.get("row_limit")
+ if df is None or df.empty:
flash("No data.", "error")
table = None
else:
- if self.form_data.get("granularity") == "all":
- del self.df['timestamp']
- table = self.df.to_html(
+ if self.form_data.get("granularity") == "all" and 'timestamp' in df:
+ del df['timestamp']
+ table = df.to_html(
classes=[
'table', 'table-striped', 'table-bordered',
'table-condensed'],
index=False)
return super(TableViz, self).render(table=table)
+ def form_class(self):
+ limits = [10, 50, 100, 500, 1000, 5000, 10000]
+ return form_factory(self.datasource, request.args,
+ extra_fields_dict={
+ 'row_limit':
+ SelectField('Row limit', choices=[(s, s) for s in limits])
+ })
+
class HighchartsViz(BaseViz):
verbose_name = "Base Highcharts Viz"
@@ -194,6 +205,7 @@ def render(self):
values=metrics,)
rolling_periods = request.args.get("rolling_periods")
+ limit = request.args.get("limit")
rolling_type = request.args.get("rolling_type")
if rolling_periods and rolling_type:
if rolling_type == 'mean':
@@ -214,6 +226,7 @@ def render(self):
return super(TimeSeriesViz, self).render(chart_js=chart.javascript_cmd)
def form_class(self):
+ limits = [0, 5, 10, 25, 50, 100, 500]
return form_factory(self.datasource, request.args,
extra_fields_dict={
#'compare': TextField('Period Compare',),
@@ -221,6 +234,8 @@ def form_class(self):
'Rolling',
choices=[(s, s) for s in ['mean', 'sum', 'std']]),
'rolling_periods': TextField('Periods',),
+ 'limit': SelectField(
+ 'Series limit', choices=[(s, s) for s in limits])
})
def bake_query(self):