瀏覽代碼

HUE-5792 [search] Dynamic creation of a new dashboard

Romain Rigaux 8 年之前
父節點
當前提交
1f28feb

+ 13 - 11
apps/impala/src/impala/dashboard_api.py

@@ -166,7 +166,7 @@ class SQLApi():
 
     return {
       'schema': {
-        'fields': 
+        'fields':
             dict([(col['name'], {
               'name': str(escape(col['name'])),
               'type': str(col['type']),
@@ -175,7 +175,7 @@ class SQLApi():
               'indexed': False,
               'stored': True,
               'required': col.get('primary_key') == 'true'
-          }) 
+          })
           for col in table_metadata['extended_columns']]
         )
       }
@@ -183,7 +183,9 @@ class SQLApi():
 
 
   def schema_fields(self, collection):
-    return {'fields': self.fields(collection)}
+    return {
+      'fields': [f for f in self.fields(collection)['schema']['fields'].itervalues()]
+    }
 
 
   def luke(self, collection):
@@ -204,7 +206,7 @@ class SQLApi():
 
     result = self._sync_execute(sql, database)
 
-    if result:      
+    if result:
       stats = list(result['data'])
       min_value, max_value = stats[0]
       maybe_is_big_int_date = isinstance(min_value, (int, long))
@@ -231,7 +233,7 @@ class SQLApi():
   def get(self, dashboard, doc_id):
     database, table = self._get_database_table_names(dashboard['name'])
     field = self._get_field(dashboard, dashboard['idField'])
-    quotes = '' if self._is_number(field['type']) else "'" 
+    quotes = '' if self._is_number(field['type']) else "'"
 
     sql = "SELECT * FROM `%(database)s`.`%(table)s` WHERE `%(idField)s` = %(quotes)s%(doc_id)s%(quotes)s" % {
       'database': database,
@@ -242,8 +244,8 @@ class SQLApi():
     }
 
     result = self._sync_execute(sql, database)
-    
-    if result:    
+
+    if result:
       cols = [col['name'] for col in result['meta']]
       rows = list(result['data']) # No escape_rows
       doc_data = dict([(header, cell) for row in rows for header, cell in zip(cols, row)])
@@ -300,7 +302,7 @@ class SQLApi():
             LOG.warning("Failed to cancel query: %s" % e)
             api.close_statement(snippet)
           raise OperationTimeout(e)
-        
+
     return result
 
   def _convert_result(self, result, dashboard, facet, query):
@@ -497,7 +499,7 @@ class SQLApi():
 
   def _get_time_filter_query(self, collection, query):
     props = self._get_time_filter_range(collection, query)
-    
+
     if props:
       return "(`%(field)s` >= %(from)s AND `%(field)s` <= %(to)s)" %  props
     else:
@@ -685,7 +687,7 @@ def augment_date_range_list(source_rows, start, end, delta, nb_cols):
   current = start_ts
   indexed_rows = dict([(row[0], row) for row in source_rows])
   augmented = []
-  
+
   while current <= end_ts:
     if str(current) in indexed_rows:
       augmented.append(indexed_rows[str(current)])
@@ -700,7 +702,7 @@ def augment_number_range_list(source_rows, start, end, delta, nb_cols):
   current = start
   indexed_rows = dict([(row[0], row) for row in source_rows])
   augmented = []
-  
+
   while current <= end:
     if current in indexed_rows:
       augmented.append(indexed_rows[current])

+ 4 - 5
apps/search/src/search/models.py

@@ -546,8 +546,6 @@ class Collection2(object):
 
   def get_default(self, user, name, engine='solr'):
     fields = self.fields_data(user, name, engine)
-    print 'aaaaaaaaaaaaaaaaa'
-    print fields
     id_field = [field['name'] for field in fields if field.get('isId')]
 
     if id_field:
@@ -618,14 +616,15 @@ class Collection2(object):
   @classmethod
   def _make_luke_from_schema_fields(cls, schema_fields):
     return dict([
-          (f['name'], {
+        (f['name'], {
               'copySources': [],
               'type': f['type'],
               'required': True,
               'uniqueKey': f.get('uniqueKey'),
               'flags': u'%s-%s-----OF-----l' % ('I' if f['indexed'] else '-', 'S' if f['stored'] else '-'), u'copyDests': []
-          })
-        for f in schema_fields['fields']])
+        })
+        for f in schema_fields['fields']
+    ])
 
   def get_absolute_url(self):
     return reverse('search:index') + '?collection=%s' % self.id

+ 1 - 1
apps/search/src/search/static/search/js/search.ko.js

@@ -1108,7 +1108,7 @@ var Collection = function (vm, collection) {
 
   self.template.filteredModalFields = ko.pureComputed(function () {
     var filter = self.template.fieldsModalFilter();
-    if (!filter) {
+    if (! filter) {
       return self.template.availableWidgetFields();
     } else {
       return ko.utils.arrayFilter(self.template.availableWidgetFields(), function (field) {

+ 78 - 66
apps/search/src/search/templates/common_search.mako

@@ -3445,6 +3445,71 @@ function queryTypeahead(query, process) {
   }
 }
 
+function newSearch() {
+  
+  ko.cleanNode($('#searchComponents')[0]);
+  viewModel = new SearchViewModel(${ collection.get_json(user) | n,unicode }, ${ query | n,unicode }, ${ initial | n,unicode });
+
+  ko.applyBindings(viewModel, $('#searchComponents')[0]);
+
+  viewModel.timelineChartTypes = ko.observableArray([
+    {
+      value: "line",
+      label: "${ _('Lines')}"
+    },
+    {
+      value: "bar",
+      label: "${ _('Bars')}"
+    }
+  ]);
+
+  viewModel.init(function(data){
+    $(".chosen-select").trigger("chosen:updated");
+  });
+
+  viewModel.isRetrievingResults.subscribe(function(value){
+    if (! value){
+      resizeFieldsList();
+    }
+  });
+
+  viewModel.isEditing.subscribe(function(value){
+    if (value){
+      window.setTimeout(function(){
+        if ($(".slider-cnt").length > 0 && $(".slider-cnt").data("slider")){
+          $(".slider-cnt").slider("redraw");
+        }
+      }, 300);
+    }
+  });
+
+  viewModel.isPlayerMode.subscribe(function(value) {
+    if (value){
+      $(".navigator").hide();
+      $("body").css("paddingTop", "40px");
+    }
+    else {
+      $(".navigator").show();
+      $("body").css("paddingTop", "80px");
+    }
+  });
+
+  var _refreshTimeout = null;
+
+  viewModel.collection.autorefresh.subscribe(function (value) {
+    if (value) {
+      refresh();
+    }
+    else {
+      window.clearTimeout(_refreshTimeout);
+    }
+  });
+
+  viewModel.collection.autorefreshSeconds.subscribe(function (value) {
+    checkAutoRefresh();
+  });
+  }
+
 $(document).ready(function () {
 
   var _resizeTimeout = -1;
@@ -3500,68 +3565,24 @@ $(document).ready(function () {
     }, 200);
   });
 
-  var _query = ${ query | n,unicode };
-  viewModel = new SearchViewModel(${ collection.get_json(user) | n,unicode }, _query, ${ initial | n,unicode });
-
-  viewModel.timelineChartTypes = ko.observableArray([
-    {
-      value: "line",
-      label: "${ _('Lines')}"
-    },
-    {
-      value: "bar",
-      label: "${ _('Bars')}"
-    }
-  ]);
-
+/*
+function newSearch() {
+  ko.cleanNode($('#searchComponents')[0]);
+  viewModel = new SearchViewModel(${ collection.get_json(user) | n,unicode }, ${ query | n,unicode }, ${ initial | n,unicode });
   ko.applyBindings(viewModel, $('#searchComponents')[0]);
 
-  viewModel.init(function(data){
-    $(".chosen-select").trigger("chosen:updated");
-  });
-
-  viewModel.isRetrievingResults.subscribe(function(value){
-    if (! value){
-      resizeFieldsList();
-    }
-  });
-
-  viewModel.isEditing.subscribe(function(value){
-    if (value){
-      window.setTimeout(function(){
-        if ($(".slider-cnt").length > 0 && $(".slider-cnt").data("slider")){
-          $(".slider-cnt").slider("redraw");
-        }
-      }, 300);
-    }
-  });
-
-  viewModel.isPlayerMode.subscribe(function(value) {
-    if (value){
-      $(".navigator").hide();
-      $("body").css("paddingTop", "40px");
-    }
-    else {
-      $(".navigator").show();
-      $("body").css("paddingTop", "80px");
-    }
-  });
-
-  var _refreshTimeout = null;
+  viewModel.init();
+  //viewModel.collection.facets.removeAll();
+  //viewModel.columns([]);
 
-  viewModel.collection.autorefresh.subscribe(function (value) {
-    if (value) {
-      refresh();
-    }
-    else {
-      window.clearTimeout(_refreshTimeout);
-    }
-  });
+  viewModel.search();
+}*/
 
-  viewModel.collection.autorefreshSeconds.subscribe(function (value) {
-    checkAutoRefresh();
-  });
+  var _query = ${ query | n,unicode };
 
+  newSearch();
+  
+  
   if (viewModel.collection.autorefresh()) {
     refresh();
   }
@@ -3585,15 +3606,6 @@ $(document).ready(function () {
     checkAutoRefresh();
   });
 
-  function newSearch() {
-    ko.cleanNode($('#searchComponents')[0]);
-    viewModel = new SearchViewModel(${ collection.get_json(user) | n,unicode }, _query, ${ initial | n,unicode });
-    ko.applyBindings(viewModel, $('#searchComponents')[0]);
-    viewModel.init();
-    
-    viewModel.search();
-  }
-
   $("#addFacetDemiModal").on("hidden", function () {
     if (typeof selectedWidget.hasBeenSelected == "undefined"){
       addFacetDemiModalFieldCancel();

+ 8 - 5
apps/search/src/search/views.py

@@ -87,7 +87,10 @@ def index(request, is_mobile=False, is_embeddable=False):
   return render(template, request, {
     'collection': collection,
     'query': json.dumps(query),
-    'initial': json.dumps({'collections': [], 'layout': DEFAULT_LAYOUT, 'is_latest': LATEST.get(),
+    'initial': json.dumps({
+        'collections': [],
+        'layout': DEFAULT_LAYOUT,
+        'is_latest': LATEST.get(),
         'engines': get_engines(request.user)
     }),
     'is_owner': collection_doc.doc.get().can_write(request.user),
@@ -118,10 +121,10 @@ def new_search(request, is_embeddable=False):
     'collection': collection,
     'query': query,
     'initial': json.dumps({
-         'collections': collections,
-         'layout': DEFAULT_LAYOUT,
-         'is_latest': LATEST.get(),
-         'engines': get_engines(request.user)
+        'collections': collections,
+        'layout': DEFAULT_LAYOUT,
+        'is_latest': LATEST.get(),
+        'engines': get_engines(request.user)
      }),
     'is_owner': True,
     'can_edit_index': can_edit_index(request.user)