This is an automated email from the ASF dual-hosted git repository.

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit f9268569746d351e873fa922558c7ee95bebf90e
Author: Dmitry Lychagin <[email protected]>
AuthorDate: Wed Apr 15 10:20:14 2020 -0700

    [NO ISSUE][COMP] Extensible item type check in CREATE DATASET
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - Introduce QueryTranslator.validateDatasetItemType().
      By overriding this method product extensions can further
      restrict types that are allowed for dataset creation.
    
    Change-Id: I426430707766b7b6049abd2687bee69c011335fb
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/5785
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Hussain Towaileb <[email protected]>
---
 .../asterix/app/translator/QueryTranslator.java    | 27 ++++++++++++----------
 1 file changed, 15 insertions(+), 12 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 e211531..9d427ec 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
@@ -636,6 +636,7 @@ public class QueryTranslator extends AbstractLangTranslator 
implements IStatemen
                                 itemTypeDataverseName + "." + itemTypeName);
                     }
                     itemType = itemTypeEntity.getDatatype();
+                    validateDatasetItemType(dsType, itemType, false, 
sourceLoc);
                     break;
                 case RECORD:
                     itemTypeDataverseName = dataverseName;
@@ -643,6 +644,7 @@ public class QueryTranslator extends AbstractLangTranslator 
implements IStatemen
                     MetadataLockUtil.createTypeBegin(lockManager, 
metadataProvider.getLocks(), itemTypeDataverseName,
                             itemTypeDataverseName + "." + itemTypeName);
                     itemType = translateType(itemTypeDataverseName, 
itemTypeName, itemTypeExpr, mdTxnCtx);
+                    validateDatasetItemType(dsType, itemType, false, 
sourceLoc);
                     MetadataManager.INSTANCE.addDatatype(mdTxnCtx,
                             new Datatype(itemTypeDataverseName, itemTypeName, 
itemType, true));
                     break;
@@ -660,13 +662,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             } else {
                 validateCompactionPolicy(compactionPolicy, 
compactionPolicyProperties, mdTxnCtx, false, sourceLoc);
             }
-            switch (dd.getDatasetType()) {
+            switch (dsType) {
                 case INTERNAL:
-                    if (itemType.getTypeTag() != ATypeTag.OBJECT) {
-                        throw new 
CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc,
-                                "Dataset type has to be a record type.");
-                    }
-
                     IAType metaItemType = null;
                     if (metaItemTypeExpr != null) {
                         switch (metaItemTypeExpr.getTypeKind()) {
@@ -679,10 +676,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                                             metaItemTypeDataverseName + "." + 
metaItemTypeName);
                                 }
                                 metaItemType = 
metaItemTypeEntity.getDatatype();
-                                if (metaItemType.getTypeTag() != 
ATypeTag.OBJECT) {
-                                    throw new 
CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc,
-                                            "Dataset meta type has to be a 
record type.");
-                                }
+                                validateDatasetItemType(dsType, metaItemType, 
true, sourceLoc);
                                 break;
                             case RECORD:
                                 metaItemTypeDataverseName = dataverseName;
@@ -691,6 +685,7 @@ public class QueryTranslator extends AbstractLangTranslator 
implements IStatemen
                                         metaItemTypeDataverseName, 
metaItemTypeDataverseName + "." + metaItemTypeName);
                                 metaItemType = 
translateType(metaItemTypeDataverseName, metaItemTypeName,
                                         metaItemTypeExpr, mdTxnCtx);
+                                validateDatasetItemType(dsType, metaItemType, 
true, sourceLoc);
                                 MetadataManager.INSTANCE.addDatatype(mdTxnCtx,
                                         new 
Datatype(metaItemTypeDataverseName, metaItemTypeName, metaItemType, true));
                                 break;
@@ -734,7 +729,7 @@ public class QueryTranslator extends AbstractLangTranslator 
implements IStatemen
                     break;
                 default:
                     throw new 
CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc,
-                            "Unknown dataset type " + dd.getDatasetType());
+                            "Unknown dataset type " + dsType);
             }
 
             // #. initialize DatasetIdFactory if it is not initialized.
@@ -748,7 +743,7 @@ public class QueryTranslator extends AbstractLangTranslator 
implements IStatemen
                     datasetDetails, dd.getHints(), dsType, 
DatasetIdFactory.generateDatasetId(),
                     MetadataUtil.PENDING_ADD_OP, compressionScheme);
             
MetadataManager.INSTANCE.addDataset(metadataProvider.getMetadataTxnContext(), 
dataset);
-            if (dd.getDatasetType() == DatasetType.INTERNAL) {
+            if (dsType == DatasetType.INTERNAL) {
                 JobSpecification jobSpec = 
DatasetUtil.createDatasetJobSpec(dataset, metadataProvider);
 
                 // #. make metadataTxn commit before calling runJob.
@@ -819,6 +814,14 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
         }
     }
 
+    protected void validateDatasetItemType(DatasetType datasetType, IAType 
itemType, boolean isMetaItemType,
+            SourceLocation sourceLoc) throws AlgebricksException {
+        if (itemType.getTypeTag() != ATypeTag.OBJECT) {
+            throw new CompilationException(ErrorCode.COMPILATION_ERROR, 
sourceLoc,
+                    String.format("Dataset %s has to be a record type.", 
isMetaItemType ? "meta type" : "type"));
+        }
+    }
+
     protected Map<String, String> createExternalDatasetProperties(DatasetDecl 
dd, MetadataProvider metadataProvider,
             MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         ExternalDetailsDecl externalDetails = (ExternalDetailsDecl) 
dd.getDatasetDetailsDecl();

Reply via email to