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);
+        }
+    }
 }

Reply via email to