Browse Source

HUE-6445 [editor] Parameterization without curly brackets not working in Pig editor

Romain Rigaux 8 years ago
parent
commit
551ac92

+ 1 - 1
desktop/libs/liboozie/src/liboozie/submission2.py

@@ -283,7 +283,7 @@ STORED AS TEXTFILE %s""" % (self.properties.get('send_result_path'), '\n\n\n'.jo
         elif action.data['type'] == 'pig-document':
           from notebook.models import Notebook
           notebook = Notebook(document=Document2.objects.get_by_uuid(user=self.user, uuid=action.data['properties']['uuid']))
-          statements = notebook.get_data()['snippets'][0]['statement_raw']
+          statements = notebook.get_data()['snippets'][0]['statement']
 
           self._create_file(deployment_dir, action.data['name'] + '.pig', statements)
 

+ 72 - 7
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -554,16 +554,81 @@ var EditorViewModel = (function() {
     self.variables.subscribe(function (newValue) {
       $(document).trigger("updateResultHeaders", self);
     });
+    self.hasCurlyBracketParameters = ko.computed(function() {
+      return self.type() != 'pig';
+    });
+    self.getPigParameters = function() {
+      var params = {};
+      var variables = self.statement_raw().match(/([^\\]|^)\$[^\d'"](\w*)/g);
+      var declares = self.statement_raw().match(/%declare +([^ ])+/gi);
+      var defaults = self.statement_raw().match(/%default +([^;])+/gi);
+      var macro_defines = self.statement_raw().match(/define [^ ]+ *\(([^\)]*)\)/gi); // no multiline
+      var macro_returns = self.statement_raw().match(/returns +([^\{]*)/gi); // no multiline
+
+      if (variables) {
+        $.each(variables, function(index, param) {
+          var p = param.substring(param.indexOf('$') + 1);
+          params[p] = '';
+        });
+      }
+      if (declares) {
+        $.each(declares, function(index, param) {
+          param = param.match(/(\w+)/g);
+          if (param && param.length >= 2) {
+            delete params[param[1]];
+          }
+        });
+      }
+      if (defaults) {
+        $.each(defaults, function(index, param) {
+          var line = param.match(/(\w+)/g);
+          if (line && line.length >= 2) {
+            var name = line[1];
+            params[name] = param.substring(param.indexOf(name) + name.length + 1);
+          }
+        });
+      }
+      if (macro_defines) {
+        $.each(macro_defines, function(index, params_line) {
+          var param_line = params_line.match(/(\w+)/g);
+          if (param_line && param_line.length > 2) {
+            $.each(param_line, function(index, param) {
+              if (index >= 2) { // Skips define NAME
+                delete params[param];
+              }
+            });
+          }
+        });
+      }
+      if (macro_returns) {
+        $.each(macro_returns, function(index, params_line) {
+          var param_line = params_line.match(/(\w+)/g);
+          if (param_line) {
+            $.each(param_line, function(index, param) {
+              if (index >= 1) { // Skip returns
+                delete params[param];
+              }
+            });
+          }
+        });
+      }
+
+      return params;
+    };
     self.variableNames = ko.computed(function () {
-      var re = /(?:^|\W)\${(\w+)(?!\w)}/g;
+      if (self.type() == 'pig') {
+        return Object.keys(self.getPigParameters());
+      } else {
+        var re = /(?:^|\W)\${(\w+)(?!\w)}/g;
 
-      var match, matches = [];
-      while (match = re.exec(self.statement_raw())) {
-        if (matches.indexOf(match[1]) == -1) {
-          matches.push(match[1]);
+        var match, matches = [];
+        while (match = re.exec(self.statement_raw())) {
+          if (matches.indexOf(match[1]) == -1) {
+            matches.push(match[1]);
+          }
         }
+        return matches;
       }
-      return matches;
     });
     self.variableNames.extend({ rateLimit: 150 });
     self.variableNames.subscribe(function (newVal) {
@@ -611,7 +676,7 @@ var EditorViewModel = (function() {
     self.statement = ko.computed(function () {
       var statement = self.isSqlDialect() ? (self.selectedStatement() ? self.selectedStatement() : (self.positionStatement() && HAS_OPTIMIZER ? self.positionStatement() : self.statement_raw())) : self.statement_raw();
       $.each(self.variables(), function (index, variable) {
-        statement = statement.replace(RegExp("([^\\\\])?\\${" + variable.name() + "}", "g"), "$1" + variable.value());
+        statement = statement.replace(RegExp("([^\\\\])?\\$" + (self.hasCurlyBracketParameters() ? "{" : "") + variable.name() + (self.hasCurlyBracketParameters() ? "}" : ""), "g"), "$1" + variable.value());
       });
       return statement;
     });