Browse Source

[impala] Integrate bar chart data

Romain Rigaux 11 years ago
parent
commit
724db29

+ 6 - 5
apps/impala/src/impala/templates/dashboard.mako

@@ -223,7 +223,8 @@ ${ dashboard.layout_skeleton() }
     <span data-bind="foreach: {data: data(), afterRender: function(){ $root.getWidgetById($parent.id()).isLoading(false); }} ">
     <span data-bind="foreach: {data: data(), afterRender: function(){ $root.getWidgetById($parent.id()).isLoading(false); }} ">
       <div>
       <div>
         <a href="javascript: void(0)">
         <a href="javascript: void(0)">
-          <span data-bind="text: $data, click: function(){ $root.query.toggleFacet({facet: $data, widget: $parent}) }"></span>
+          <span data-bind="text: $data.value, click: function(){ $root.query.toggleFacet({facet: $data, widget: $parent}) }"></span>
+          (<span data-bind="text: $data.count, click: function(){ $root.query.toggleFacet({facet: $data, widget: $parent}) }"></span>)
           <i class="fa fa-times" data-bind="visible: $parent.data().length == 1"></i>
           <i class="fa fa-times" data-bind="visible: $parent.data().length == 1"></i>
         </a>
         </a>
       </div>
       </div>
@@ -450,8 +451,8 @@ ${ dashboard.import_charts() }
     $(data.counts()).each(function (cnt, item) {
     $(data.counts()).each(function (cnt, item) {
       var _item = {
       var _item = {
         widget_id: data.widget_id,
         widget_id: data.widget_id,
-        count: parseInt(Math.random()*1000),
-        value: item[0]
+        count: item.count(),
+        value: item.value()
       }
       }
       item.widget_id = data.widget_id;
       item.widget_id = data.widget_id;
       _data.push({
       _data.push({
@@ -470,8 +471,8 @@ ${ dashboard.import_charts() }
     $(rawDatum.counts()).each(function (cnt, item) {
     $(rawDatum.counts()).each(function (cnt, item) {
       var _item = {
       var _item = {
         widget_id: rawDatum.widget_id,
         widget_id: rawDatum.widget_id,
-        count: parseInt(Math.random()*1000),
-        value: item[0]
+        count: item.count(),
+        value: item.value()
       }
       }
       item.widget_id = rawDatum.widget_id;
       item.widget_id = rawDatum.widget_id;
       _data.push({
       _data.push({

+ 1 - 1
apps/impala/src/impala/urls.py

@@ -21,7 +21,7 @@ from beeswax.urls import urlpatterns as beeswax_urls
 
 
 
 
 urlpatterns = patterns('impala.views',
 urlpatterns = patterns('impala.views',
-  url(r'^dashboard$', 'dashboard', name='dashboard'),
+  url(r'^dashboard/$', 'dashboard', name='dashboard'),
   url(r'^dashboard/query', 'query', name='query'),
   url(r'^dashboard/query', 'query', name='query'),
   
   
   url(r'^dashboard/new_facet$', 'new_facet', name='new_facet'),
   url(r'^dashboard/new_facet$', 'new_facet', name='new_facet'),

+ 10 - 6
apps/impala/src/impala/views.py

@@ -64,12 +64,13 @@ def query(request):
     filters = ''
     filters = ''
 
 
   if 'facet' in request.POST:
   if 'facet' in request.POST:
-    if request.POST.get('facet') == 'count':
-      template = "SELECT DISTINCT %(field)s FROM %(database)s.%(table)s WHERE %(field)s IS NOT NULL %(filters)s GROUP BY %(field)s ORDER BY %(field)s DESC LIMIT %(limit)s"
-    else:      
-      # select count(*) as top, salary FROM sample_07 group by salary order by top desc limit 10
-      # select count(*) as top, salary/100 FROM sample_07 group by salary/100 order by top desc limit 10      
+    if request.POST.get('facet') == 'count' or True:
+      template = "SELECT %(field)s, COUNT(*) AS top FROM %(database)s.%(table)s WHERE %(field)s IS NOT NULL %(filters)s GROUP BY %(field)s ORDER BY top DESC LIMIT %(limit)s"
+    elif request.POST.get('facet') == 'range':
+      template = "SELECT cast(%(field)s / 10000 AS int), COUNT(*) AS top FROM %(database)s.%(table)s WHERE %(field)s IS NOT NULL %(filters)s GROUP BY cast(%(field)s / 10000 AS int) ORDER BY top DESC LIMIT %(limit)s"    
+    else:            
       template = "SELECT DISTINCT %(field)s FROM %(database)s.%(table)s WHERE %(field)s IS NOT NULL %(filters)s ORDER BY %(field)s DESC LIMIT %(limit)s"
       template = "SELECT DISTINCT %(field)s FROM %(database)s.%(table)s WHERE %(field)s IS NOT NULL %(filters)s ORDER BY %(field)s DESC LIMIT %(limit)s"
+    
     facet = json.loads(request.POST['facet'])
     facet = json.loads(request.POST['facet'])
     hql = template % {
     hql = template % {
           'database': database,
           'database': database,
@@ -101,7 +102,10 @@ def query(request):
 
 
   if handle:
   if handle:
     data = db.fetch(handle, rows=100)
     data = db.fetch(handle, rows=100)
-    result['data'] = list(data.rows())
+    if 'facet' in request.POST:
+      result['data'] = [{"value": row[0], "count": row[1], "selected": False, "cat": facet['field']} for row in data.rows()]
+    else:
+      result['data'] = list(data.rows())
     result['cols'] = list(data.cols())
     result['cols'] = list(data.cols())
     result['status'] = 0
     result['status'] = 0
     db.close(handle)
     db.close(handle)

+ 2 - 2
apps/impala/static/js/impala-dashboard.ko.js

@@ -209,7 +209,7 @@ var Dashboard = function (vm, dashboard) {
 var ImpalaDashboardViewModel = function (query_json, dashboard_json, initial_json) {
 var ImpalaDashboardViewModel = function (query_json, dashboard_json, initial_json) {
     var self = this;
     var self = this;
 
 
-    self.isEditing = ko.observable(false);
+    self.isEditing = ko.observable(true);
     self.toggleEditing = function () {
     self.toggleEditing = function () {
       self.isEditing(! self.isEditing());
       self.isEditing(! self.isEditing());
     };
     };
@@ -277,7 +277,7 @@ var ImpalaDashboardViewModel = function (query_json, dashboard_json, initial_jso
           }          
           }          
         })
         })
       .fail(function (xhr, textStatus, errorThrown) {
       .fail(function (xhr, textStatus, errorThrown) {
-    	  $(document).trigger("error", textStatus);
+    	  $(document).trigger("error", errorThrown);
        });
        });
     };
     };