[SYSTEMML-1840] Fix missing validation of transform* specifications

Currently, all transform builtin functions parse the provided transform
specification during runtime but not during initial compilation. This
patch fixes this missing validation to give users immediate feedback on
potential syntax errors, even before reading potentially large data.


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/fcfbd3d2
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/fcfbd3d2
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/fcfbd3d2

Branch: refs/heads/master
Commit: fcfbd3d2473a555b139371ebe4d49714d5dabe48
Parents: 89632b5
Author: Matthias Boehm <mboe...@gmail.com>
Authored: Mon Aug 14 23:10:38 2017 -0700
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Tue Aug 15 12:48:29 2017 -0700

----------------------------------------------------------------------
 .../ParameterizedBuiltinFunctionExpression.java | 26 +++++++++++++++-----
 1 file changed, 20 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/fcfbd3d2/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
 
b/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
index f90b7ef..2768cc1 100644
--- 
a/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
+++ 
b/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
@@ -26,6 +26,7 @@ import java.util.HashSet;
 
 import org.apache.sysml.hops.Hop.ParamBuiltinOp;
 import org.apache.sysml.parser.LanguageException.LanguageErrorCodes;
+import org.apache.wink.json4j.JSONObject;
 
 
 public class ParameterizedBuiltinFunctionExpression extends DataIdentifier 
@@ -288,6 +289,7 @@ public class ParameterizedBuiltinFunctionExpression extends 
DataIdentifier
                
                //validate specification
                checkDataValueType("transformapply", TF_FN_PARAM_SPEC, 
DataType.SCALAR, ValueType.STRING, conditional);
+               validateTransformSpec(TF_FN_PARAM_SPEC, conditional);
                
                //set output dimensions
                output.setDataType(DataType.MATRIX);
@@ -304,6 +306,7 @@ public class ParameterizedBuiltinFunctionExpression extends 
DataIdentifier
                
                //validate specification
                checkDataValueType("transformdecode", TF_FN_PARAM_SPEC, 
DataType.SCALAR, ValueType.STRING, conditional);
+               validateTransformSpec(TF_FN_PARAM_SPEC, conditional);
                
                //set output dimensions
                output.setDataType(DataType.FRAME);
@@ -316,6 +319,7 @@ public class ParameterizedBuiltinFunctionExpression extends 
DataIdentifier
        {
                //validate specification
                checkDataValueType("transformmeta", TF_FN_PARAM_SPEC, 
DataType.SCALAR, ValueType.STRING, conditional);
+               validateTransformSpec(TF_FN_PARAM_SPEC, conditional);
                
                //validate meta data path 
                checkDataValueType("transformmeta", TF_FN_PARAM_MTD, 
DataType.SCALAR, ValueType.STRING, conditional);
@@ -334,6 +338,7 @@ public class ParameterizedBuiltinFunctionExpression extends 
DataIdentifier
                
                //validate specification
                checkDataValueType("transformencode", TF_FN_PARAM_SPEC, 
DataType.SCALAR, ValueType.STRING, conditional);
+               validateTransformSpec(TF_FN_PARAM_SPEC, conditional);
                
                //set output dimensions 
                output1.setDataType(DataType.MATRIX);
@@ -344,6 +349,20 @@ public class ParameterizedBuiltinFunctionExpression 
extends DataIdentifier
                output2.setDimensions(-1, -1);
        }
        
+       private void validateTransformSpec(String pname, boolean conditional) 
throws LanguageException {
+               Expression data = getVarParam(pname);
+               if( data instanceof StringIdentifier ) {
+                       try {
+                               StringIdentifier spec = (StringIdentifier)data;
+                               new JSONObject(spec.getValue());
+                       }
+                       catch(Exception ex) {
+                               raiseValidateError("Transform specification 
parsing issue: ", 
+                                       conditional, ex.getMessage());
+                       }
+               }
+       }
+       
        private void validateReplace(DataIdentifier output, boolean 
conditional) throws LanguageException {
                //check existence and correctness of arguments
                Expression target = getVarParam("target");
@@ -721,11 +740,6 @@ public class ParameterizedBuiltinFunctionExpression 
extends DataIdentifier
 
        @Override
        public boolean multipleReturns() {
-               switch(_opcode) {
-                       case TRANSFORMENCODE:
-                               return true;
-                       default:
-                               return false;
-               }
+               return (_opcode == 
ParameterizedBuiltinFunctionOp.TRANSFORMENCODE);
        }
 }

Reply via email to