Преглед изворни кода

HUE-1777 [beeswax] Unify is_auto status of the queries

Example queries not modified are now seen as non auto.
Showing all queries by defaut.
Auto queries are not shown as Saved queries anymore in My queries.
The UX is bad, we should have 2 sections with radio on/off for auto query
and see all queries.
Tested with search and flipping auto/non auto.

Beeswax examples queries should belong to sample user.

Do not remove the header row in a gzip file in create table.
Romain Rigaux пре 12 година
родитељ
комит
742f1d175e

+ 18 - 15
apps/beeswax/data/designs.json

@@ -5,13 +5,14 @@
       "type":"0",
       "data":{
          "query":{
-            "query":"SELECT sample_07.description, sample_07.salary\nFROM\n  sample_07\nWHERE\n( sample_07.salary > 100000)\nORDER BY sample_07.salary DESC\nLIMIT 1000",
-            "type":null,
-            "email_notify":null,
-            "is_parameterized":null
+            "query":"SELECT sample_07.description, sample_07.salary\r\nFROM\r\n  sample_07\r\nWHERE\r\n( sample_07.salary > 100000)\r\nORDER BY sample_07.salary DESC\r\nLIMIT 1000",
+            "type":0,
+            "email_notify":false,
+            "is_parameterized":false,
+            "database":"default"
          },
          "functions":[ ],
-         "VERSION":"0.4.0",
+         "VERSION":"0.4.1",
          "file_resources":[ ],
          "settings":[ ]
       }
@@ -22,13 +23,14 @@
       "type":"0",
       "data":{
          "query":{
-            "query":"SELECT s07.description, s07.salary, s08.salary,\n  s08.salary - s07.salary\nFROM\n  sample_07 s07 JOIN sample_08 s08\nON ( s07.code = s08.code)\nWHERE\n s07.salary < s08.salary\nORDER BY s08.salary-s07.salary DESC\nLIMIT 1000",
-            "type":null,
-            "email_notify":null,
-            "is_parameterized":null
+            "query":"SELECT s07.description, s07.salary, s08.salary,\r\n  s08.salary - s07.salary\r\nFROM\r\n  sample_07 s07 JOIN sample_08 s08\r\nON ( s07.code = s08.code)\r\nWHERE\r\n s07.salary < s08.salary\r\nORDER BY s08.salary-s07.salary DESC\r\nLIMIT 1000",
+            "type":0,
+            "email_notify":false,
+            "is_parameterized":false,
+            "database":"default"
          },
          "functions":[ ],
-         "VERSION":"0.4.0",
+         "VERSION":"0.4.1",
          "file_resources":[ ],
          "settings":[ ]
       }
@@ -39,13 +41,14 @@
       "type":"0",
       "data":{
          "query":{
-            "query":"SELECT s07.description, s07.total_emp, s08.total_emp, s07.salary\nFROM\n  sample_07 s07 JOIN \n  sample_08 s08\nON ( s07.code = s08.code )\nWHERE\n( s07.total_emp > s08.total_emp\n AND s07.salary > 100000 )\nORDER BY s07.salary DESC\nLIMIT 1000",
-            "type":null,
-            "email_notify":null,
-            "is_parameterized":null
+            "query":"SELECT s07.description, s07.total_emp, s08.total_emp, s07.salary\r\nFROM\r\n  sample_07 s07 JOIN \r\n  sample_08 s08\r\nON ( s07.code = s08.code )\r\nWHERE\r\n( s07.total_emp > s08.total_emp\r\n AND s07.salary > 100000 )\r\nORDER BY s07.salary DESC\nLIMIT 1000",
+            "type":0,
+            "email_notify":false,
+            "is_parameterized":false,
+            "database":"default"
          },
          "functions":[ ],
-         "VERSION":"0.4.0",
+         "VERSION":"0.4.1",
          "file_resources":[ ],
          "settings":[ ]
       }

+ 1 - 1
apps/beeswax/src/beeswax/create_table.py

@@ -459,7 +459,7 @@ def load_after_create(request, database):
   """
   tablename = request.REQUEST.get('table')
   path = request.REQUEST.get('path')
-  is_remove_header = request.REQUEST.get('removeHeader').lower() == 'on'
+  is_remove_header = request.REQUEST.get('removeHeader').lower() == 'on' and not path.endswith('gz')
 
   if not tablename or not path:
     msg = _('Internal error: Missing needed parameter to load data into table.')

+ 12 - 5
apps/beeswax/src/beeswax/design.py

@@ -68,11 +68,12 @@ class HQLdesign(object):
     """Initialize the design from a valid form data."""
     if form is not None:
       assert isinstance(form, MultiForm)
-      self._data_dict = dict(
-          query = normalize_form_dict(form.query, HQLdesign._QUERY_ATTRS),
-          settings = normalize_formset_dict(form.settings, HQLdesign._SETTINGS_ATTRS),
-          file_resources = normalize_formset_dict(form.file_resources, HQLdesign._FILE_RES_ATTRS),
-          functions = normalize_formset_dict(form.functions, HQLdesign._FUNCTIONS_ATTRS))
+      self._data_dict = {
+          'query': normalize_form_dict(form.query, HQLdesign._QUERY_ATTRS),
+          'settings': normalize_formset_dict(form.settings, HQLdesign._SETTINGS_ATTRS),
+          'file_resources': normalize_formset_dict(form.file_resources, HQLdesign._FILE_RES_ATTRS),
+          'functions': normalize_formset_dict(form.functions, HQLdesign._FUNCTIONS_ATTRS)
+      }
       if query_type is not None:
         self._data_dict['query']['type'] = query_type
 
@@ -168,6 +169,12 @@ class HQLdesign(object):
     hql_query = strip_trailing_semicolon(self.hql_query)
     return [strip_trailing_semicolon(statement.strip()) for statement in split_statements(hql_query)]
 
+  def __eq__(self, other):
+    return (isinstance(other, self.__class__) and self.__dict__ == other.__dict__)
+
+  def __ne__(self, other):
+    return not self.__eq__(other)
+
 
 def split_statements(hql):
   """

+ 3 - 2
apps/beeswax/src/beeswax/management/commands/beeswax_install_examples.py

@@ -48,14 +48,15 @@ class Command(NoArgsCommand):
   def handle_noargs(self, **options):
     exception = None
 
+    # Documents will belong to this user but we run the install as the current user
     try:
-      install_sample_user() # Documents will belong to this user but we run the install as the current user
+      sample_user = install_sample_user()
       self._install_tables(options['user'], options['app_name'])
     except Exception, ex:
       exception = ex
 
     try:
-      self._install_queries(options['user'], options['app_name'])
+      self._install_queries(sample_user, options['app_name'])
     except Exception, ex:
       exception = ex
 

+ 5 - 1
apps/beeswax/src/beeswax/models.py

@@ -233,7 +233,11 @@ class SavedQuery(models.Model):
     ordering = ['-mtime']
 
   def get_design(self):
-    return HQLdesign.loads(self.data)
+    try:
+      return HQLdesign.loads(self.data)
+    except ValueError:
+      # data is empty
+      pass
 
   def clone(self):
     """clone() -> A new SavedQuery with a deep copy of the same data"""

+ 1 - 1
apps/beeswax/src/beeswax/server/hive_server2_lib.py

@@ -436,7 +436,7 @@ class HiveServerClient:
     req = TGetTablesReq(schemaName=database, tableName=table_names)
     res = self.call(self._client.GetTables, req)
 
-    results, schema = self.fetch_result(res.operationHandle)
+    results, schema = self.fetch_result(res.operationHandle, max_rows=5000)
     self.close_operation(res.operationHandle)
 
     return HiveServerTRowSet(results.results, schema.schema).cols(('TABLE_NAME',))

+ 5 - 5
apps/beeswax/src/beeswax/templates/list_history.mako

@@ -76,22 +76,22 @@ ${ layout.menubar(section='history') }
                         % endif
                     % endif
 
-                     % if filter_params.get(prefix + 'auto_query', None):
+                     % if filter_params.get(prefix + 'auto_query', 'on') == 'off':
                       <%
                         my_querydict = filter_params.copy()
-                        my_querydict[prefix + 'auto_query'] = ''
+                        my_querydict[prefix + 'auto_query'] = 'on'
                         if filter:
                           my_querydict[prefix + 'search'] = filter
                       %>
-                      <li><a href="?${my_querydict.urlencode()}">${_('Show user queries')}</a></li>
+                      <li><a href="?${my_querydict.urlencode()}">${_('Show auto queries')}</a></li>
                     % else:
                       <%
                         my_querydict = filter_params.copy()
-                        my_querydict[prefix + 'auto_query'] = 'on'
+                        my_querydict[prefix + 'auto_query'] = 'off'
                         if filter:
                           my_querydict[prefix + 'search'] = filter
                       %>
-                      <li><a href="?${my_querydict.urlencode()}">${_('Show auto actions')}</a></li>
+                      <li><a href="?${my_querydict.urlencode()}">${_('Show only saved queries')}</a></li>
                     % endif
                 </ul>
             </div>

+ 7 - 10
apps/beeswax/src/beeswax/views.py

@@ -86,6 +86,7 @@ def save_design(request, form, type_, design, explicit_save):
   else:
     raise ValueError(_('Invalid design type %(type)s') % {'type': type_})
 
+  # design here means SavedQuery
   old_design = design
   design_obj = design_cls(form, query_type=type_)
   new_data = design_obj.dumps()
@@ -96,7 +97,7 @@ def save_design(request, form, type_, design, explicit_save):
     design.name = form.saveform.cleaned_data['name']
     design.desc = form.saveform.cleaned_data['desc']
     design.is_auto = False
-  elif new_data != old_design.data:
+  elif design_obj != old_design.get_design():
     # Auto save iff the data is different
     if old_design.id is not None:
       # Clone iff the parent design isn't a new unsaved model
@@ -222,10 +223,6 @@ def list_designs(request):
                   Accepts the form "-date", which sort in descending order.
                   Default to "-date".
     text=<frag> - Search for fragment "frag" in names and descriptions.
-
-  Depending on Beeswax configuration parameter ``SHOW_ONLY_PERSONAL_SAVED_QUERIES``,
-  only the personal queries of the user will be returned (even if another user is
-  specified in ``filterargs``).
   """
   DEFAULT_PAGE_SIZE = 20
   app_name= get_app_name(request)
@@ -322,7 +319,7 @@ def list_query_history(request):
                             "date", "state", "name" (design name), and "type" (design type)
                           Accepts the form "-date", which sort in descending order.
                           Default to "-date".
-    auto_query=<bool>   - Show auto generated actions (drop table, read data, etc). Default False
+    auto_query=<bool>   - Show auto generated actions (drop table, read data, etc). Default True
   """
   DEFAULT_PAGE_SIZE = 30
   prefix = 'q-'
@@ -386,6 +383,7 @@ def execute_query(request, design_id=None):
   databases = []
   query_server = get_query_server_config(app_name)
   db = dbms.get(request.user, query_server)
+
   try:
     databases = get_db_choices(request)
   except Exception, ex:
@@ -1153,7 +1151,6 @@ def _list_designs(user, querydict, page_size, prefix="", is_trashed=False):
   )
 
   # Trash and security
-  # Discarding is_auto for now
   if is_trashed:
     db_queryset = Document.objects.trashed_docs(SavedQuery, user)
   else:
@@ -1193,7 +1190,7 @@ def _list_designs(user, querydict, page_size, prefix="", is_trashed=False):
     sort_dir, sort_attr = DEFAULT_SORT
   db_queryset = db_queryset.order_by(sort_dir + SORT_ATTR_TRANSLATION[sort_attr])
 
-  designs = [job.content_object for job in db_queryset.all() if job.content_object]
+  designs = [job.content_object for job in db_queryset.all() if job.content_object and job.content_object.is_auto == False]
 
   pagenum = int(querydict.get(prefix + 'page', 1))
   paginator = Paginator(designs, page_size)
@@ -1307,8 +1304,8 @@ def _list_query_history(user, querydict, page_size, prefix=""):
   #
   # Queries without designs are the ones we submitted on behalf of the user,
   # (e.g. view table data). Exclude those when returning query history.
-  if not querydict.get(prefix + 'auto_query', False):
-    db_queryset = db_queryset.filter(design__isnull=False)
+  if querydict.get(prefix + 'auto_query', 'on') != 'on':
+    db_queryset = db_queryset.exclude(design__isnull=False, design__is_auto=True)
 
   user_filter = querydict.get(prefix + 'user', user.username)
   if user_filter != ':all':