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]>