Xikui Wang has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/1006

Change subject: Add init parameter option for external functions.
......................................................................

Add init parameter option for external functions.

Add one attribute to the external function descriptor.xml
<init_parameters>STRING_VALUE</init_parameters>

Change-Id: I437880a700f61440ffab9f44035798e538fb9ff5
---
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java
M 
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
M asterixdb/asterix-external-data/src/main/resources/schema/library.xsd
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/AsterixExternalScalarFunctionInfo.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
M 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixExternalFunctionInfo.java
M 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java
12 files changed, 46 insertions(+), 12 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/06/1006/1

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java
index 92ef062..536b664 100755
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java
@@ -247,7 +247,7 @@
                     }
                     Function f = new Function(dataverse, libraryName + "#" + 
function.getName().trim(), args.size(),
                             args, function.getReturnType().trim(), 
function.getDefinition().trim(),
-                            library.getLanguage().trim(), 
function.getFunctionType().trim());
+                            library.getLanguage().trim(), 
function.getFunctionType().trim(), function.getInitParameters());
                     MetadataManager.INSTANCE.addFunction(mdTxnCtx, f);
                     if (LOGGER.isLoggable(Level.INFO)) {
                         LOGGER.info("Installed function: " + libraryName + "#" 
+ function.getName().trim());
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java
index 295b308..e1c5cde 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java
@@ -1796,9 +1796,10 @@
             if (dv == null) {
                 throw new AlgebricksException("There is no dataverse with this 
name " + dataverse + ".");
             }
+            // for cfs, assign null to init_para for now.
             Function function = new Function(dataverse, functionName, 
cfs.getaAterixFunction().getArity(),
                     cfs.getParamList(), Function.RETURNTYPE_VOID, 
cfs.getFunctionBody(), Function.LANGUAGE_AQL,
-                    FunctionKind.SCALAR.toString());
+                    FunctionKind.SCALAR.toString(), null);
             MetadataManager.INSTANCE.addFunction(mdTxnCtx, function);
 
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
diff --git 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
index 50dc28e..8888b46 100644
--- 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
+++ 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
@@ -55,6 +55,7 @@
     private final JObjectPointableVisitor pointableVisitor;
     private final PointableAllocator pointableAllocator;
     private final Map<Integer, TypeInfo> poolTypeInfo;
+    private final String initParameters;
 
     private boolean isValidResult = false;
 
@@ -71,6 +72,7 @@
         }
         this.resultHolder = objectPool.allocate(finfo.getReturnType());
         this.poolTypeInfo = new HashMap<Integer, TypeInfo>();
+        this.initParameters = finfo.getInitParameters();
 
     }
 
@@ -179,4 +181,7 @@
         objectPool.reset();
     }
 
+    public String getInitParameters() {
+        return initParameters;
+    }
 }
diff --git 
a/asterixdb/asterix-external-data/src/main/resources/schema/library.xsd 
b/asterixdb/asterix-external-data/src/main/resources/schema/library.xsd
index 75a0801..e4dac85 100644
--- a/asterixdb/asterix-external-data/src/main/resources/schema/library.xsd
+++ b/asterixdb/asterix-external-data/src/main/resources/schema/library.xsd
@@ -30,6 +30,7 @@
     <xs:element name="function_type" type="xs:string" />
     <xs:element name="definition" type="xs:string" />
     <xs:element name="factory_class" type="xs:string" />
+    <xs:element name="init_parameters" type="xs:string" />
 
 
     <!-- definition of complex elements -->
@@ -41,6 +42,7 @@
                 <xs:element ref="lib:arguments" />
                 <xs:element ref="lib:return_type" />
                 <xs:element ref="lib:definition" />
+                <xs:element ref="lib:init_parameters" />
             </xs:sequence>
         </xs:complexType>
     </xs:element>
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
index a8c3e44..16da805 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
@@ -159,7 +159,7 @@
 
     public void dropFunction(FunctionSignature signature) {
         Function function = new Function(signature.getNamespace(), 
signature.getName(), signature.getArity(), null,
-                null, null, null, null);
+                null, null, null, null, null);
         droppedCache.addFunctionIfNotExists(function);
         logAndApply(new MetadataLogicalOperation(function, false));
     }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
index 4c636d5..d9c3a21 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
@@ -387,13 +387,14 @@
     public static final int FUNCTION_ARECORD_FUNCTION_DEFINITION_FIELD_INDEX = 
5;
     public static final int FUNCTION_ARECORD_FUNCTION_LANGUAGE_FIELD_INDEX = 6;
     public static final int FUNCTION_ARECORD_FUNCTION_KIND_FIELD_INDEX = 7;
+    public static final int FUNCTION_ARECORD_FUNCTION_INIT_PARAMETERS_INDEX = 
8;
 
     private static final ARecordType createFunctionRecordType() throws 
AsterixException {
         String[] fieldNames = { "DataverseName", "Name", "Arity", "Params", 
"ReturnType", "Definition", "Language",
-                "Kind" };
+                "Kind", "InitParameters" };
         IAType[] fieldTypes = { BuiltinType.ASTRING, BuiltinType.ASTRING, 
BuiltinType.ASTRING,
                 createFunctionParamsRecordType(), BuiltinType.ASTRING, 
BuiltinType.ASTRING, BuiltinType.ASTRING,
-                BuiltinType.ASTRING };
+                BuiltinType.ASTRING, BuiltinType.ASTRING };
         return new ARecordType("FunctionRecordType", fieldNames, fieldTypes, 
true);
     }
 
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
index 7ff423c..2c84dd9 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
@@ -39,9 +39,10 @@
     private final String returnType;
     private final String language;
     private final String kind;
+    private final String initParameters;
 
     public Function(String dataverseName, String functionName, int arity, 
List<String> params, String returnType,
-            String functionBody, String language, String functionKind) {
+            String functionBody, String language, String functionKind, String 
initParameters) {
         this.dataverse = dataverseName;
         this.name = functionName;
         this.params = params;
@@ -50,6 +51,7 @@
         this.language = language;
         this.kind = functionKind;
         this.arity = arity;
+        this.initParameters = initParameters;
     }
 
     public String getDataverseName() {
@@ -94,4 +96,7 @@
         return cache.dropFunction(this);
     }
 
+    public String getInitParameters() {
+        return initParameters;
+    }
 }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
index 72fe79d..129547c 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
@@ -37,6 +37,7 @@
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.base.IACursor;
 import org.apache.asterix.om.types.AOrderedListType;
+import org.apache.hadoop.hive.ql.io.orc.Metadata;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -101,8 +102,12 @@
 
         String functionKind = ((AString) functionRecord
                 
.getValueByPos(MetadataRecordTypes.FUNCTION_ARECORD_FUNCTION_KIND_FIELD_INDEX)).getStringValue();
+
+        String functionInitParameters = ((AString) 
functionRecord.getValueByPos(MetadataRecordTypes
+                
.FUNCTION_ARECORD_FUNCTION_INIT_PARAMETERS_INDEX)).getStringValue();
+
         return new Function(dataverseName, functionName, 
Integer.parseInt(arity), params, returnType, definition,
-                language, functionKind);
+                language, functionKind, functionInitParameters);
 
     }
 
@@ -181,6 +186,12 @@
         stringSerde.serialize(aString, fieldValue.getDataOutput());
         
recordBuilder.addField(MetadataRecordTypes.FUNCTION_ARECORD_FUNCTION_KIND_FIELD_INDEX,
 fieldValue);
 
+        // write field 8, Init Parameter
+        fieldValue.reset();
+        aString.setValue(function.getInitParameters()+"");
+        stringSerde.serialize(aString, fieldValue.getDataOutput());
+        
recordBuilder.addField(MetadataRecordTypes.FUNCTION_ARECORD_FUNCTION_INIT_PARAMETERS_INDEX,
 fieldValue);
+
         // write record
         recordBuilder.write(tupleBuilder.getDataOutput(), true);
         tupleBuilder.addFieldEndOffset();
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/AsterixExternalScalarFunctionInfo.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/AsterixExternalScalarFunctionInfo.java
index c15ec8a..2c3d34d 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/AsterixExternalScalarFunctionInfo.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/AsterixExternalScalarFunctionInfo.java
@@ -31,8 +31,8 @@
     private static final long serialVersionUID = 1L;
 
     public AsterixExternalScalarFunctionInfo(String namespace, AsterixFunction 
asterixFunction, IAType returnType,
-            String body, String language, List<IAType> argumentTypes, 
IResultTypeComputer rtc) {
-        super(namespace, asterixFunction, FunctionKind.SCALAR, argumentTypes, 
returnType, rtc, body, language);
+            String body, String language, List<IAType> argumentTypes,String 
initParas, IResultTypeComputer rtc) {
+        super(namespace, asterixFunction, FunctionKind.SCALAR, argumentTypes, 
returnType, rtc, body, language, initParas);
     }
 
     public AsterixExternalScalarFunctionInfo() {
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
index a3cc689..9194cfe 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
@@ -85,7 +85,7 @@
 
         AsterixExternalScalarFunctionInfo scalarFunctionInfo = new 
AsterixExternalScalarFunctionInfo(fid.getNamespace(),
                 new AsterixFunction(fid.getName(), fid.getArity()), 
returnType, function.getFunctionBody(),
-                function.getLanguage(), arguments, typeComputer);
+                function.getLanguage(), arguments, 
function.getInitParameters(), typeComputer);
         return scalarFunctionInfo;
     }
 
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixExternalFunctionInfo.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixExternalFunctionInfo.java
index 25a8d72..92ad797 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixExternalFunctionInfo.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixExternalFunctionInfo.java
@@ -32,6 +32,7 @@
     private final List<IAType> argumentTypes;
     private final String body;
     private final String language;
+    private final String initParameters;
     private final FunctionKind kind;
     private final IAType returnType;
 
@@ -43,11 +44,12 @@
         language = null;
         kind = null;
         returnType = null;
-
+        initParameters = null;
     }
 
     public AsterixExternalFunctionInfo(String namespace, AsterixFunction 
asterixFunction, FunctionKind kind,
-            List<IAType> argumentTypes, IAType returnType, IResultTypeComputer 
rtc, String body, String language) {
+            List<IAType> argumentTypes, IAType returnType, IResultTypeComputer 
rtc, String body, String language,
+                                       String initParas) {
         super(namespace, asterixFunction, true);
         this.rtc = rtc;
         this.argumentTypes = argumentTypes;
@@ -55,6 +57,7 @@
         this.language = language;
         this.kind = kind;
         this.returnType = returnType;
+        this.initParameters = initParas;
     }
 
     public IResultTypeComputer getResultTypeComputer() {
@@ -90,4 +93,8 @@
         return returnType;
     }
 
+    @Override
+    public String getInitParameters() {
+        return initParameters;
+    }
 }
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java
index 070fa97..58e8f19 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IExternalFunctionInfo.java
@@ -40,4 +40,6 @@
 
     public FunctionKind getKind();
 
+    public String getInitParameters();
+
 }

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/1006
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I437880a700f61440ffab9f44035798e538fb9ff5
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Xikui Wang <[email protected]>

Reply via email to