Переглянути джерело

HUE-7487 [editor] Propose setting 'max_row_size' on error

jdesjean 8 роки тому
батько
коміт
a97cb675e6

+ 20 - 0
desktop/core/src/desktop/templates/config_ko_components.mako

@@ -458,6 +458,22 @@ from desktop.views import _ko
             }))
           }
         });
+
+        this._editorSettingsUpdate = huePubSub.subscribe('editor.settings.update', function (data) {
+          var setting;
+          for (var i = 0; i < self.values.length; i++) {
+            if (self.values().key == data.key) {
+              setting = self.values()[i];
+              break;
+            }
+          }
+          if (!setting) {
+            self.addValue();
+            setting = self.values()[self.values().length - 1];
+          }
+          setting.key(data.key);
+          setting.value(data.value);
+        });
       }
 
       KeyValueListInputViewModel.prototype.addValue = function () {
@@ -474,6 +490,10 @@ from desktop.views import _ko
         self.values.remove(valueToRemove);
       };
 
+      KeyValueListInputViewModel.prototype.dispose = function () {
+        this._editorSettingsUpdate.remove();
+      };
+
       ko.components.register('key-value-list-input', {
         viewModel: KeyValueListInputViewModel,
         template: { element: 'key-value-list-input-template' }

+ 27 - 0
desktop/libs/notebook/src/notebook/decorators.py

@@ -17,6 +17,8 @@
 
 import json
 import logging
+import math
+import re
 
 from django.forms import ValidationError
 from django.http import Http404
@@ -114,6 +116,15 @@ def api_error_handler(func):
       LOG.exception('Error running %s' % func)
       response['status'] = 1
       response['message'] = smart_unicode(e)
+      if response['message'].index("max_row_size"):
+        size = re.search(r"(\d+.?\d*) (.B)", response['message'])
+        if size and size.group(1):
+          response['help'] = {
+            'setting': {
+              'name': 'max_row_size',
+              'value':str(int(_closest_power_of_2(_to_size_in_bytes(size.group(1), size.group(2)))))
+            }
+          }
       if e.handle:
         response['handle'] = e.handle
       if e.extra:
@@ -135,6 +146,22 @@ def api_error_handler(func):
 
   return decorator
 
+def _closest_power_of_2(number):
+  return math.pow(2, math.ceil(math.log(number, 2)))
+
+def _to_size_in_bytes(size, unit):
+  unit_size = 1
+  unit = unit.upper()
+  if unit[0] == 'K':
+    unit_size = unit_size * 1024
+  elif unit[0] == 'M':
+    unit_size = unit_size * 1024 * 1024
+  elif unit[0] == 'G':
+    unit_size = unit_size * 1024 * 1024 * 1024
+  elif unit[0] == 'T':
+    unit_size = unit_size * 1024 * 1024 * 1024 * 1024
+
+  return float(size) * unit_size
 
 def json_error_handler(view_fn):
   def decorator(*args, **kwargs):

+ 2 - 0
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -1175,12 +1175,14 @@ var EditorViewModel = (function() {
 
           self.errors.push({
             message: data.message.replace(match[0], 'line ' + errorLine + (errorCol !== null ? ':' + errorCol : '')),
+            help: null,
             line: errorLine - 1,
             col: errorCol
           })
         } else {
           self.errors.push({
             message: data.message,
+            help: data.help,
             line: null,
             col: null
           });

+ 9 - 0
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -1627,6 +1627,15 @@ ${ sqlSyntaxDropdown.sqlSyntaxDropdown() }
     <div class="snippet-error-container alert alert-error" style="margin-bottom: 0" data-bind="visible: errors().length > 0">
       <ul class="unstyled" data-bind="foreach: errors">
         <li data-bind="text: message"></li>
+        <!-- ko if: help -->
+        <li><a href="javascript:void(0)" data-bind="click: function() {
+          huePubSub.publish('editor.settings.update', {
+            key: $data.help.setting.name,
+            value: $data.help.setting.value
+          });
+          $parent.settingsVisible(true);
+        }">${ _("Update max_row_size setting.") }</a></li>
+        <!-- /ko -->
       </ul>
     </div>
     <div class="snippet-error-container alert alert-error" style="margin-bottom: 0" data-bind="visible: aceErrors().length > 0">