Ver Fonte

HUE-1419 [pig] Show error line

Error line and word is highlighted in case of error
Enrico Berti há 12 anos atrás
pai
commit
7b206d627c

+ 27 - 4
apps/pig/src/pig/templates/app.mako

@@ -47,7 +47,7 @@ ${ commonheader(None, "pig", user, "100px") | n,unicode }
       </%def>
 
       <%def name="creation()">
-          <button class="btn fileToolbarBtn" title="${_('Create a new script')}" data-bind="click: confirmNewScript"><i class="icon-plus-sign"></i> ${_('New script')}</button>
+          <button class="btn fileToolbarBtn" title="${_('Create a new script')}" data-bind="click: confirmNewScript"><i class="icon-plus-sign"></i> ${_('New Script')}</button>
       </%def>
     </%actionbar:render>
     <div class="alert alert-info" data-bind="visible: scripts().length == 0">
@@ -577,7 +577,7 @@ ${ commonheader(None, "pig", user, "100px") | n,unicode }
 <script src="/pig/static/js/pig.ko.js" type="text/javascript" charset="utf-8"></script>
 <script src="/static/ext/js/routie-0.3.0.min.js" type="text/javascript" charset="utf-8"></script>
 <script src="/static/ext/js/codemirror-3.11.js"></script>
-<script src="/static/ext/js/codemirror-pig.js"></script>
+<script src="/static/js/Source/jHue/codemirror-pig.js"></script>
 <script src="/static/js/Source/jHue/codemirror-show-hint.js"></script>
 <script src="/static/js/Source/jHue/codemirror-pig-hint.js"></script>
 <script src="/beeswax/static/js/autocomplete.utils.js" type="text/javascript" charset="utf-8"></script>
@@ -620,6 +620,8 @@ ${ commonheader(None, "pig", user, "100px") | n,unicode }
 
   var HIVE_AUTOCOMPLETE_BASE_URL = "${ autocomplete_base_url | n,unicode }";
 
+  var codeMirror;
+
   $(document).ready(function () {
     viewModel.updateScripts();
 
@@ -713,7 +715,7 @@ ${ commonheader(None, "pig", user, "100px") | n,unicode }
         CodeMirror.showHint(cm, CodeMirror.pigHint);
       }
     }
-    var codeMirror = CodeMirror(function (elt) {
+    codeMirror = CodeMirror(function (elt) {
       scriptEditor.parentNode.replaceChild(elt, scriptEditor);
     }, {
       value: scriptEditor.value,
@@ -803,6 +805,10 @@ ${ commonheader(None, "pig", user, "100px") | n,unicode }
       if (codeMirror.getValue() == LABELS.NEW_SCRIPT_CONTENT) {
         codeMirror.setValue("");
       }
+      if (errorWidget != null) {
+        errorWidget.clear();
+        errorWidget = null;
+      }
     });
 
     codeMirror.on("blur", function () {
@@ -945,6 +951,22 @@ ${ commonheader(None, "pig", user, "100px") | n,unicode }
       });
     }
 
+    var errorWidget = null;
+
+    function checkForErrors(newLines) {
+      $(newLines).each(function (cnt, line) {
+        if (line.indexOf(" ERROR ") > -1) {
+          var _lineNo = line.match(/[Ll]ine \d*/) != null ? line.match(/[Ll]ine \d*/)[0].split(" ")[1] * 1 : -1;
+          var _colNo = line.match(/[Cc]olumn \d*/) != null ? line.match(/[Cc]olumn \d*/)[0].split(" ")[1] * 1 : -1;
+          if (_lineNo != -1 && _colNo != -1 && errorWidget == null) {
+            errorWidget = codeMirror.addLineWidget(_lineNo - 1, $("<div>").addClass("editorError").html("<i class='icon-exclamation-sign'></i> " + line)[0], {coverGutter: true, noHScroll: true});
+            codeMirror.setSelection({line: _lineNo - 1, ch: _colNo}, {line: _lineNo - 1, ch: _colNo + codeMirror.getLine(_lineNo - 1).substring(_colNo).split(" ")[0].length});
+            $(document).trigger("showEditor");
+          }
+        }
+      });
+    }
+
     function refreshLogs() {
       if (viewModel.currentScript().watchUrl() != "") {
         $.getJSON(viewModel.currentScript().watchUrl(), function (data) {
@@ -958,6 +980,7 @@ ${ commonheader(None, "pig", user, "100px") | n,unicode }
             var newLines = data.logs.pig.split("\n").slice(_logsEl.html().split("<br>").length);
             if (newLines.length > 0){
               _logsEl.html(_logsEl.html() + newLines.join("<br>") + "<br>");
+              checkForErrors(newLines);
             }
             window.setTimeout(function () {
               resizeLogs();
@@ -1103,7 +1126,7 @@ ${ commonheader(None, "pig", user, "100px") | n,unicode }
                     _foundLastRun = pastScript;
                   }
                 });
-                viewModel.currentScript().watchUrl(_foundLastRun.watchUrl);
+                viewModel.currentScript().watchUrl(_foundLastRun != null ? _foundLastRun.watchUrl : "");
                 $(document).trigger("startLogsRefresh");
                 showSection("editor", "logs");
               }

+ 7 - 0
apps/pig/static/css/pig.css

@@ -121,3 +121,10 @@
 .unsaved {
   border-bottom: 1px solid #C63D37;
 }
+
+.editorError {
+  color: #B94A48;
+  background-color: #F2DEDE;
+  padding: 4px;
+  font-size: 11px;
+}

+ 22 - 21
desktop/core/static/ext/js/codemirror-pig.js → desktop/core/static/js/Source/jHue/codemirror-pig.js

@@ -1,5 +1,5 @@
 /*
- *	Pig Latin Mode for CodeMirror 2 
+ *	Pig Latin Mode for CodeMirror 2
  *	@author Prasanth Jayachandran
  *	@link 	https://github.com/prasanthj/pig-codemirror-2
  *  This implementation is adapted from PL/SQL mode in CodeMirror 2.
@@ -9,20 +9,20 @@ CodeMirror.defineMode("pig", function(_config, parserConfig) {
 		builtins = parserConfig.builtins,
 		types = parserConfig.types,
 		multiLineStrings = parserConfig.multiLineStrings;
-	
+
 	var isOperatorChar = /[*+\-%<>=&?:\/!|]/;
-	
+
 	function chain(stream, state, f) {
 		state.tokenize = f;
 		return f(stream, state);
 	}
-	
+
 	var type;
 	function ret(tp, style) {
 		type = tp;
 		return style;
 	}
-	
+
 	function tokenComment(stream, state) {
 		var isEnd = false;
 		var ch;
@@ -35,7 +35,7 @@ CodeMirror.defineMode("pig", function(_config, parserConfig) {
 		}
 		return ret("comment", "comment");
 	}
-	
+
 	function tokenString(quote) {
 		return function(stream, state) {
 			var escaped = false, next, end = false;
@@ -50,10 +50,10 @@ CodeMirror.defineMode("pig", function(_config, parserConfig) {
 			return ret("string", "error");
 		};
 	}
-	
+
 	function tokenBase(stream, state) {
 		var ch = stream.next();
-		
+
 		// is a start of string?
 		if (ch == '"' || ch == "'")
 			return chain(stream, state, tokenString(ch));
@@ -115,7 +115,7 @@ CodeMirror.defineMode("pig", function(_config, parserConfig) {
 			return ret("variable", "pig-word");
 		}
 	}
-	
+
 	// Interface
 	return {
 		startState: function() {
@@ -124,7 +124,7 @@ CodeMirror.defineMode("pig", function(_config, parserConfig) {
 				startOfLine: true
 			};
 		},
-		
+
 		token: function(stream, state) {
 			if(stream.eatSpace()) return null;
 			var style = state.tokenize(stream, state);
@@ -140,9 +140,10 @@ CodeMirror.defineMode("pig", function(_config, parserConfig) {
  		return obj;
  	}
 
+
 	// builtin funcs taken from trunk revision 1303237
-	var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " 
-	+ "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "
+	var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL "
+	+ "CONCAT COPYFROMLOCAL COPYTOLOCAL CAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "
 	+ "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG "
 	+ "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN "
 	+ "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER "
@@ -150,18 +151,18 @@ CodeMirror.defineMode("pig", function(_config, parserConfig) {
 	+ "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  "
 	+ "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "
 	+ "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
-	+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; 
-	
+	+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER EVAL PIGDUMP PIGSTORAGE";
+
 	// taken from QueryLexer.g
-	var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
+	var pKeywords = "%DECLARE %DEFAULT VOID IMPORT RETURNS ARRANGE DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP CP CD DU "
 	+ "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
-	+ "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE "
-	+ "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " 
-	+ "NEQ MATCHES TRUE FALSE REGISTER DUMP"; 
-	
+	+ "PARTITION GROUP AND ANY OR NOT GENERATE FLATTEN ASC DESC DESCRIBE EXPLAIN IS STREAM THROUGH STORE MAPREDUCE "
+	+ "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE "
+	+ "NEQ MATCHES TRUE FALSE REGISTER DUMP EXEC HELP ILLUSTRATE KILL LS MKDIR MV PIG PWD QUIT RM RMF RUN SET ";
+
 	// data types
-	var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP ";
-	
+	var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP DATETIME ";
+
 	CodeMirror.defineMIME("text/x-pig", {
 	  name: "pig",
 	  builtins: keywords(pBuiltins),