Coordinated change for function metadata cleanup

Change-Id: I4c5238a6e92b89410bbffc0c9338b36c61896a6b
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
index 1d38597..8605c77 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
@@ -57,6 +57,7 @@
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.common.util.FunctionUtil;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.asterix.lang.sqlpp.parser.SqlppParserFactory;
 import org.apache.asterix.lang.sqlpp.rewrites.SqlppRewriterFactory;
 import org.apache.asterix.lang.sqlpp.util.SqlppStatementUtil;
 import org.apache.asterix.lang.sqlpp.visitor.SqlppDeleteRewriteVisitor;
@@ -191,7 +192,7 @@
                     PrecompiledType.INSERT);
         } else if (getProcedureBodyStatement().getKind() == Statement.Kind.QUERY) {
             //TODO: Fix type dependency computation
-            SqlppRewriterFactory fact = new SqlppRewriterFactory();
+            SqlppRewriterFactory fact = new SqlppRewriterFactory(new SqlppParserFactory());
             dependencies.get(1)
                     .addAll(FunctionUtil.getFunctionDependencies(fact.createQueryRewriter(),
                             ((Query) getProcedureBodyStatement()).getBody(), metadataProvider, new ArrayList<>())
@@ -207,7 +208,7 @@
             getProcedureBodyStatement().accept(SqlppDeleteRewriteVisitor.INSTANCE, metadataProvider);
             DeleteStatement delete = (DeleteStatement) getProcedureBodyStatement();
 
-            SqlppRewriterFactory fact = new SqlppRewriterFactory();
+            SqlppRewriterFactory fact = new SqlppRewriterFactory(new SqlppParserFactory());
             dependencies = FunctionUtil.getFunctionDependencies(fact.createQueryRewriter(), delete.getQuery().getBody(),
                     metadataProvider, new ArrayList<>());
             Pair<JobSpecification, PrecompiledType> pair =
@@ -272,7 +273,7 @@
                     stats);
 
             procedure = new Procedure(dataverse, signature.getName(), signature.getArity(), getParamList(),
-                    procedureJobSpec.second.toString(), getProcedureBody(), Function.LANGUAGE_SQLPP, duration,
+                    procedureJobSpec.second.toString(), getProcedureBody(), Function.FunctionLanguage.SQLPP, duration,
                     dependencies);
 
             MetadataManager.INSTANCE.addEntity(mdTxnCtx, procedure);
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
index c989611..507c8c7 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
@@ -26,6 +26,7 @@
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.metadata.api.ExtensionMetadataDatasetId;
 import org.apache.asterix.metadata.api.IExtensionMetadataEntity;
+import org.apache.asterix.metadata.entities.Function;
 import org.apache.hyracks.algebricks.common.utils.Triple;
 
 public class Procedure implements IExtensionMetadataEntity {
@@ -37,7 +38,7 @@
     private final List<String> params;
     private final String body;
     private final String type;
-    private final String language;
+    private final Function.FunctionLanguage language;
     private final String duration;
     /*
     Dependencies are stored as an array of size two:
@@ -49,7 +50,7 @@
     private final List<List<Triple<DataverseName, String, String>>> dependencies;
 
     public Procedure(DataverseName dataverseName, String functionName, int arity, List<String> params, String type,
-            String functionBody, String language, String duration,
+            String functionBody, Function.FunctionLanguage language, String duration,
             List<List<Triple<DataverseName, String, String>>> dependencies) {
         this.procedureId = new EntityId(BADConstants.PROCEDURE_KEYWORD, dataverseName, functionName);
         this.params = params;
@@ -83,7 +84,7 @@
         return type;
     }
 
-    public String getLanguage() {
+    public Function.FunctionLanguage getLanguage() {
         return language;
     }
 
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
index d5395d2..dfcca97 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
@@ -23,8 +23,11 @@
 import java.util.List;
 
 import org.apache.asterix.builders.OrderedListBuilder;
+import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.metadata.entities.Function;
 import org.apache.asterix.metadata.entitytupletranslators.AbstractTupleTranslator;
 import org.apache.asterix.om.base.AOrderedList;
 import org.apache.asterix.om.base.ARecord;
@@ -32,6 +35,7 @@
 import org.apache.asterix.om.base.IACursor;
 import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -65,7 +69,7 @@
     }
 
     @Override
-    public Procedure createMetadataEntityFromARecord(ARecord procedureRecord) throws HyracksDataException {
+    public Procedure createMetadataEntityFromARecord(ARecord procedureRecord) throws AlgebricksException {
         String dataverseCanonicalName = ((AString) procedureRecord
                 .getValueByPos(BADMetadataRecordTypes.PROCEDURE_ARECORD_DATAVERSENAME_FIELD_INDEX)).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -88,9 +92,13 @@
                 .getValueByPos(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_DEFINITION_FIELD_INDEX))
                         .getStringValue();
 
-        String language = ((AString) procedureRecord
+        String languageValue = ((AString) procedureRecord
                 .getValueByPos(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_LANGUAGE_FIELD_INDEX))
                         .getStringValue();
+        Function.FunctionLanguage language = Function.FunctionLanguage.findByName(languageValue);
+        if (language == null) {
+            throw new AsterixException(ErrorCode.METADATA_ERROR, languageValue);
+        }
 
         String duration = ((AString) procedureRecord
                 .getValueByPos(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_DURATION_FIELD_INDEX))
@@ -196,7 +204,7 @@
 
         // write field 6
         fieldValue.reset();
-        aString.setValue(procedure.getLanguage());
+        aString.setValue(procedure.getLanguage().getName());
         stringSerde.serialize(aString, fieldValue.getDataOutput());
         recordBuilder.addField(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_LANGUAGE_FIELD_INDEX, fieldValue);