This is an automated email from the ASF dual-hosted git repository.
mhubail pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new 0a56656e9a [ASTERIXDB-3483]: Function Owner changes
0a56656e9a is described below
commit 0a56656e9ac93e1833f940262942b040a50bb000
Author: janhavitripurwar <[email protected]>
AuthorDate: Mon Oct 7 18:53:48 2024 +0530
[ASTERIXDB-3483]: Function Owner changes
- user model changes: no
- storage format changes: no
- interface changes: yes
details:
- Add 'Creator' nested open fields in the function entity.
- Extend methods to pass the creator.
- Add newFunction method.
- This change is backward compatible.
Ext-ref: MB-62971
Change-Id: I4491f53200a20f2598dd9e3a72424f5050076c89
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18943
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Murtadha Hubail <[email protected]>
---
.../asterix/app/translator/QueryTranslator.java | 17 +++++-----
.../asterix/lang/common/util/ExpressionUtils.java | 2 +-
.../rewrites/visitor/SqlppLoadAccessedDataset.java | 4 +--
.../metadata/MetadataTransactionContext.java | 2 +-
.../asterix/metadata/entities/EntityDetails.java | 22 +++++++++++--
.../apache/asterix/metadata/entities/Function.java | 9 +++++-
.../FunctionTupleTranslator.java | 36 +++++++++++++++++++++-
7 files changed, 76 insertions(+), 16 deletions(-)
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index d6bace5ff5..d1d61a077d 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -444,7 +444,8 @@ public class QueryTranslator extends AbstractLangTranslator
implements IStatemen
handleAdapterDropStatement(metadataProvider, stmt);
break;
case CREATE_FUNCTION:
- handleCreateFunctionStatement(metadataProvider, stmt,
stmtRewriter, requestParameters);
+ handleCreateFunctionStatement(metadataProvider, stmt,
stmtRewriter, requestParameters,
+ Creator.DEFAULT_CREATOR);
break;
case FUNCTION_DROP:
handleFunctionDropStatement(metadataProvider, stmt,
requestParameters);
@@ -3085,7 +3086,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
}
public void handleCreateFunctionStatement(MetadataProvider
metadataProvider, Statement stmt,
- IStatementRewriter stmtRewriter, IRequestParameters
requestParameters) throws Exception {
+ IStatementRewriter stmtRewriter, IRequestParameters
requestParameters, Creator creator) throws Exception {
CreateFunctionStatement cfs = (CreateFunctionStatement) stmt;
FunctionSignature signature = cfs.getFunctionSignature();
DataverseName funDataverse = signature.getDataverseName();
@@ -3118,7 +3119,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
lockUtil.createFunctionBegin(lockManager, metadataProvider.getLocks(),
databaseName, dataverseName,
signature.getName(), libraryDatabaseName,
libraryDataverseName, libraryName);
try {
- doCreateFunction(metadataProvider, cfs, signature, stmtRewriter,
requestParameters);
+ doCreateFunction(metadataProvider, cfs, signature, stmtRewriter,
requestParameters, creator);
} finally {
metadataProvider.getLocks().unlock();
metadataProvider.setDefaultNamespace(activeNamespace);
@@ -3126,8 +3127,8 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
}
protected CreateResult doCreateFunction(MetadataProvider metadataProvider,
CreateFunctionStatement cfs,
- FunctionSignature functionSignature, IStatementRewriter
stmtRewriter, IRequestParameters requestParameters)
- throws Exception {
+ FunctionSignature functionSignature, IStatementRewriter
stmtRewriter, IRequestParameters requestParameters,
+ Creator creator) throws Exception {
DataverseName dataverseName = functionSignature.getDataverseName();
String databaseName = functionSignature.getDatabaseName();
SourceLocation sourceLoc = cfs.getSourceLocation();
@@ -3244,7 +3245,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
function = new Function(functionSignature, paramNames,
paramTypes, returnTypeSignature, null,
FunctionKind.SCALAR.toString(), library.getLanguage(),
libraryDatabaseName,
libraryDataverseName, libraryName, externalIdentifier,
cfs.getNullCall(),
- cfs.getDeterministic(), cfs.getResources(),
dependencies);
+ cfs.getDeterministic(), cfs.getResources(),
dependencies, creator);
} else {
List<Pair<VarIdentifier, TypeExpression>> paramList =
cfs.getParameters();
int paramCount = paramList.size();
@@ -3283,7 +3284,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
newInlineTypes = Collections.emptyMap();
function = new Function(functionSignature, paramNames, null,
null, cfs.getFunctionBody(),
FunctionKind.SCALAR.toString(),
compilationProvider.getParserFactory().getLanguage(), null,
- null, null, null, null, null, null, dependencies);
+ null, null, null, null, null, null, dependencies,
creator);
}
if (existingFunction == null) {
@@ -3309,6 +3310,8 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
}
MetadataManager.INSTANCE.updateFunction(mdTxnCtx, function);
}
+ beforeTxnCommit(metadataProvider, creator,
+ EntityDetails.newFunction(databaseName, dataverseName,
function.getName(), function.getArity()));
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Installed function: " + functionSignature);
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
index eaf9cce5e2..419d677b94 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
@@ -296,7 +296,7 @@ public class ExpressionUtils {
if (seenFunctions.add(signature)) {
String functionName = signature.getName() + "(" +
signature.getArity() + ")";
metadataProvider.addAccessedEntity(EntityDetails.newFunction(signature.getDatabaseName(),
- signature.getDataverseName(),
functionName));
+ signature.getDataverseName(),
functionName, 0));
outFunctionDependencies.add(new
DependencyFullyQualifiedName(signature.getDatabaseName(),
signature.getDataverseName(),
signature.getName(),
Integer.toString(signature.getArity())));
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppLoadAccessedDataset.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppLoadAccessedDataset.java
index 60a7f2858a..7981d5554c 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppLoadAccessedDataset.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppLoadAccessedDataset.java
@@ -99,8 +99,8 @@ public class SqlppLoadAccessedDataset extends
AbstractSqlppSimpleExpressionVisit
return;
}
String functionName = signature.getName() + "(" +
signature.getArity() + ")";
- context.getMetadataProvider().addAccessedEntity(
- EntityDetails.newFunction(signature.getDatabaseName(),
signature.getDataverseName(), functionName));
+
context.getMetadataProvider().addAccessedEntity(EntityDetails.newFunction(signature.getDatabaseName(),
+ signature.getDataverseName(), functionName, 0));
}
}
}
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 6077d294c5..70bf83ac52 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
@@ -203,7 +203,7 @@ public class MetadataTransactionContext extends
MetadataCache {
public void dropFunction(FunctionSignature signature) {
Function function = new Function(signature, null, null, null, null,
null, null, null, null, null, null, false,
- false, null, null);
+ false, null, null, null);
droppedCache.addFunctionIfNotExists(function);
logAndApply(new MetadataLogicalOperation(function, false));
}
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
index df44ecf62c..23353ebe8f 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
@@ -39,7 +39,9 @@ public class EntityDetails {
private final String databaseName;
private final DataverseName dataverseName;
private final String entityName;
- private EntityType entityType;
+ private final EntityType entityType;
+ // The number of arguments that the function accepts. Relevant only for
function entity.
+ private int functionArity;
private EntityDetails(String databaseName, DataverseName dataverseName,
String entityName, EntityType entityType) {
this.databaseName = databaseName;
@@ -48,6 +50,15 @@ public class EntityDetails {
this.entityType = entityType;
}
+ private EntityDetails(String databaseName, DataverseName dataverseName,
String entityName, EntityType entityType,
+ int functionArity) {
+ this.databaseName = databaseName;
+ this.dataverseName = dataverseName;
+ this.entityName = entityName;
+ this.entityType = entityType;
+ this.functionArity = functionArity;
+ }
+
public static EntityDetails newDatabase(String databaseName) {
return new EntityDetails(databaseName, null, null,
EntityType.DATABASE);
}
@@ -64,8 +75,9 @@ public class EntityDetails {
return new EntityDetails(databaseName, dataverseName, viewName,
EntityType.VIEW);
}
- public static EntityDetails newFunction(String databaseName, DataverseName
dataverseName, String functionName) {
- return new EntityDetails(databaseName, dataverseName, functionName,
EntityType.FUNCTION);
+ public static EntityDetails newFunction(String databaseName, DataverseName
dataverseName, String functionName,
+ int functionArity) {
+ return new EntityDetails(databaseName, dataverseName, functionName,
EntityType.FUNCTION, functionArity);
}
public static EntityDetails newSynonym(String databaseName, DataverseName
dataverseName, String synonymName) {
@@ -91,4 +103,8 @@ public class EntityDetails {
public EntityType getEntityType() {
return entityType;
}
+
+ public int getFunctionArity() {
+ return functionArity;
+ }
}
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 82c9514ede..3c1515b572 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
@@ -29,6 +29,7 @@ import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
import org.apache.asterix.metadata.MetadataCache;
import org.apache.asterix.metadata.api.IMetadataEntity;
+import org.apache.asterix.metadata.utils.Creator;
import org.apache.asterix.om.types.TypeSignature;
public class Function implements IMetadataEntity<Function> {
@@ -49,12 +50,13 @@ public class Function implements IMetadataEntity<Function> {
private final Boolean nullCall; // null for SQL++ and AQL functions
private final Map<String, String> resources;
private final List<List<DependencyFullyQualifiedName>> dependencies;
+ private final Creator creator;
public Function(FunctionSignature signature, List<String> paramNames,
List<TypeSignature> paramTypes,
TypeSignature returnType, String functionBody, String
functionKind, String language,
String libraryDatabaseName, DataverseName libraryDataverseName,
String libraryName,
List<String> externalIdentifier, Boolean nullCall, Boolean
deterministic, Map<String, String> resources,
- List<List<DependencyFullyQualifiedName>> dependencies) {
+ List<List<DependencyFullyQualifiedName>> dependencies, Creator
creator) {
this.signature = signature;
this.paramNames = paramNames;
this.paramTypes = paramTypes;
@@ -72,6 +74,7 @@ public class Function implements IMetadataEntity<Function> {
this.dependencies = dependencies == null
? Arrays.asList(Collections.emptyList(),
Collections.emptyList(), Collections.emptyList())
: dependencies;
+ this.creator = creator;
}
public FunctionSignature getSignature() {
@@ -161,6 +164,10 @@ public class Function implements IMetadataEntity<Function>
{
return dependencies;
}
+ public Creator getCreator() {
+ return creator;
+ }
+
@Override
public Function addToCache(MetadataCache cache) {
return cache.addFunctionIfNotExists(this);
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 819121276a..2741d12add 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
@@ -61,6 +61,7 @@ import org.apache.asterix.metadata.MetadataNode;
import org.apache.asterix.metadata.bootstrap.FunctionEntity;
import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
import org.apache.asterix.metadata.entities.Function;
+import org.apache.asterix.metadata.utils.Creator;
import org.apache.asterix.om.base.ABoolean;
import org.apache.asterix.om.base.ANull;
import org.apache.asterix.om.base.AOrderedList;
@@ -203,10 +204,11 @@ public class FunctionTupleTranslator extends
AbstractDatatypeTupleTranslator<Fun
}
FunctionSignature signature = new FunctionSignature(databaseName,
dataverseName, functionName, arity);
+ Creator creator = Creator.createOrDefault(functionRecord);
return new Function(signature, paramNames, paramTypes, returnType,
definition, functionKind, language,
libraryDatabaseName, libraryDataverseName, libraryName,
externalIdentifier, nullCall, deterministic,
- resources, dependencies);
+ resources, dependencies, creator);
}
private List<TypeSignature> getParamTypes(ARecord functionRecord, String
functionDatabaseName,
@@ -432,6 +434,7 @@ public class FunctionTupleTranslator extends
AbstractDatatypeTupleTranslator<Fun
writeLibrary(function);
writeNullCall(function);
writeDeterministic(function);
+ writeFunctionCreator(function);
}
protected void writeResources(Function function) throws
HyracksDataException {
@@ -688,4 +691,35 @@ public class FunctionTupleTranslator extends
AbstractDatatypeTupleTranslator<Fun
throw new AsterixException(ErrorCode.METADATA_ERROR, language);
}
}
+
+ private void writeFunctionCreator(Function function) throws
HyracksDataException {
+ if (functionEntity.databaseNameIndex() >= 0) {
+ Creator creatorInfo = function.getCreator();
+ RecordBuilder creatorObject = new RecordBuilder();
+ creatorObject.reset(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_CREATOR_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(creatorInfo.getName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ creatorObject.addField(fieldName, fieldValue);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_CREATOR_UUID);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(creatorInfo.getUuid());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ creatorObject.addField(fieldName, fieldValue);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.CREATOR_ARECORD_FIELD_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ creatorObject.write(fieldValue.getDataOutput(), true);
+ recordBuilder.addField(fieldName, fieldValue);
+ }
+ }
}