瀏覽代碼

HUE-3228 [dashboard] Support number range facet display

Romain Rigaux 8 年之前
父節點
當前提交
6d3df45
共有 2 個文件被更改,包括 33 次插入8 次删除
  1. 32 7
      apps/impala/src/impala/dashboard_api.py
  2. 1 1
      desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

+ 32 - 7
apps/impala/src/impala/dashboard_api.py

@@ -59,7 +59,7 @@ class SQLApi():
 
     if facet:
       if facet['type'] == 'nested':
-        fields_dimensions = ['`%(field)s`' % f for f in self._get_dimension_fields(facet)]
+        fields_dimensions = [self._get_dimension_field(f)['name'] for f in self._get_dimension_fields(facet)]
         last_dimension_seen = False
         fields = []
         for f in reversed(facet['properties']['facets']):
@@ -67,25 +67,26 @@ class SQLApi():
             if not last_dimension_seen:
               fields.insert(0, 'COUNT(*) AS Count')
               last_dimension_seen = True
-            fields.insert(0, '`%(field)s`' % f)
+            fields.insert(0, self._get_dimension_field(f)['select'])
           else:
             if not last_dimension_seen:
               fields.insert(0, self._get_aggregate_function(f))
 
         if not last_dimension_seen:
           fields.insert(0, 'COUNT(*) as Count')
-        fields.insert(0, '`%(field)s`' % facet)
+        fields.insert(0, self._get_dimension_field(facet)['select'])
 
         sql = '''SELECT %(fields)s
         FROM %(database)s.%(table)s
         %(filters)s
         GROUP BY %(fields_dimensions)s
-        ORDER BY Count DESC
+        ORDER BY %(order_by)s
         LIMIT %(limit)s''' % {
             'database': database,
             'table': table,
             'fields': ', '.join(fields),
             'fields_dimensions': ', '.join(fields_dimensions),
+            'order_by': ', '.join([self._get_dimension_field(f)['order_by'] for f in self._get_dimension_fields(facet)]),
             'filters': self._convert_filters_to_where(filters),
             'limit': LIMIT
         }
@@ -296,11 +297,11 @@ class SQLApi():
               f.append(sql_condition % (fq['field'], exclude, value))
         clauses.append(' OR '.join(f))
       elif fq['type'] == 'range':
-        clauses.append("`%(field)s` >= %(to)s AND `%(field)s` < %(from)s" % {
+        clauses.append("`%(field)s` >= %(from)s AND `%(field)s` < %(to)s" % {
           'field': fq['field'],
           'to': fq['properties'][0]['to'],
           'from': fq['properties'][0]['from']
-        })        
+        })
 
     return clauses
 
@@ -334,6 +335,30 @@ class SQLApi():
         fields.extend(map(lambda a: str(a), [_p['value'] for _p in f['percentiles']]))
       return '%s(%s)' % (f['function'], ','.join(fields))
 
+  def _get_dimension_field(self, facet):
+    # facet salary --> cast(salary / 11000 as INT) * 10 AS salary_range
+    # facet salary --> salary_range
+    # facets --> Count DESC   |   salary_range ASC
+    if facet['properties']['canRange']:
+      field_name = '`%(field)s_range`' % facet
+      order_by = '`%(field)s_range` ASC' % facet
+      if facet['properties']['isDate']:
+        pass
+      else:
+        slot = max((facet['properties']['end'] - facet['properties']['start']) / facet['properties']['limit'], 1)
+
+        select = 'cast(`%(field)s` / %(slot)s AS int) * %(slot)s AS %(field_name)s' % {'field': facet['field'], 'slot': slot, 'field_name': field_name}
+    else:
+      field_name = '`%(field)s`' % facet
+      select = field_name
+      order_by = 'Count DESC'
+
+    return {
+      'name': field_name,
+      'select': select,
+      'order_by': order_by
+    }
+
   def _get_field(self, collection, name):
     _field = [_f for _f in collection['template']['fieldsAttributes'] if _f['name'] == name]
     if _field:
@@ -405,7 +430,7 @@ class SQLApi():
         })
     elif dimension == 2:
       for row in rows:
-        value_fields = [f['field'] for f in dimension_fields] # e.g. SELECT `job`, avg(salary), `gender`, COUNT(*), avg(salary)
+        value_fields = [f['field'] for f in dimension_fields] # e.g. SELECT `job`, cast(salary / 11000 as INT) * 10 AS salary_range, `gender`, COUNT(*), avg(salary)
         fq_values = [row[0], row[1]]
         counts.append({
             "count": row[-1],

+ 1 - 1
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -532,7 +532,7 @@ DROP TABLE IF EXISTS `%(table)s`;
 
     response = self._get_current_statement(db, snippet)
     query = response['statement']
-    print query
+
     api = OptimizerApi()
 
     return api.query_compatibility(source_platform, target_platform, query)