From 36a58e88850f9a09bac37f5cd2dee8bdb1677cb1 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Wed, 12 Aug 2015 21:22:02 -0700 Subject: [PATCH] Minor fixes and improvments --- app/models.py | 6 ++-- app/templates/panoramix/datasource.html | 1 - app/templates/panoramix/viz_highcharts.html | 1 + app/templates/panoramix/viz_table.html | 24 ++++++++++++-- app/viz.py | 35 +++++++++++++++------ 5 files changed, 52 insertions(+), 15 deletions(-) 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):