Till Westmann has uploaded a new change for review.

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

Change subject: ConstantExpressionUtil improvements
......................................................................

ConstantExpressionUtil improvements

Change-Id: I636538d6ea6c6a527aac1eb9cacdcc40a8489c02
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/MetadataBuiltinFunctions.java
M 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ClosedRecordConstructorResultType.java
M 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/OpenRecordConstructorResultType.java
M 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordAddFieldsTypeComputer.java
R 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/util/ConstantExpressionUtil.java
M 
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java
11 files changed, 53 insertions(+), 110 deletions(-)


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

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
index 6e8bd69..3ba7084 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
@@ -23,10 +23,9 @@
 import java.util.Collections;
 
 import org.apache.asterix.algebra.base.AsterixOperatorAnnotations;
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import org.apache.asterix.lang.common.util.FunctionUtil;
 import org.apache.asterix.om.base.AInt32;
-import org.apache.asterix.om.base.AString;
-import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
 import org.apache.asterix.om.types.ARecordType;
@@ -141,7 +140,7 @@
     @SuppressWarnings("unchecked")
     private static ILogicalExpression createFieldAccessByIndex(ARecordType 
recType,
             AbstractFunctionCallExpression fce) {
-        String s = getStringSecondArgument(fce);
+        String s = ConstantExpressionUtil.getStringArgument(fce, 1);
         if (s == null) {
             return null;
         }
@@ -151,22 +150,6 @@
         }
         return new ScalarFunctionCallExpression(
                 
FunctionUtil.getFunctionInfo(AsterixBuiltinFunctions.FIELD_ACCESS_BY_INDEX), 
fce.getArguments().get(0),
-                new MutableObject<ILogicalExpression>(new 
ConstantExpression(new AsterixConstantValue(new AInt32(k)))));
-    }
-
-    private static String 
getStringSecondArgument(AbstractFunctionCallExpression expr) {
-        ILogicalExpression e2 = expr.getArguments().get(1).getValue();
-        if (e2.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
-            return null;
-        }
-        ConstantExpression c = (ConstantExpression) e2;
-        if (!(c.getValue() instanceof AsterixConstantValue)) {
-            return null;
-        }
-        IAObject v = ((AsterixConstantValue) c.getValue()).getObject();
-        if (v.getType().getTypeTag() != ATypeTag.STRING) {
-            return null;
-        }
-        return ((AString) v).getStringValue();
+                new MutableObject<>(new ConstantExpression(new 
AsterixConstantValue(new AInt32(k)))));
     }
 }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java
index 9d9dda0..fec564e 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java
@@ -23,6 +23,7 @@
 import java.nio.ByteBuffer;
 import java.util.List;
 
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.dataflow.data.common.AqlExpressionTypeComputer;
 import org.apache.asterix.dataflow.data.nontagged.AqlMissingWriterFactory;
@@ -35,7 +36,6 @@
 import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
 import org.apache.asterix.formats.nontagged.AqlTypeTraitProvider;
 import org.apache.asterix.jobgen.QueryLogicalExpressionJobGen;
-import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
@@ -204,9 +204,7 @@
             }
             if 
(expr.getFunctionIdentifier().equals(AsterixBuiltinFunctions.FIELD_ACCESS_BY_NAME))
 {
                 ARecordType rt = (ARecordType) 
_emptyTypeEnv.getType(expr.getArguments().get(0).getValue());
-                String str =
-                        ((AString) ((AsterixConstantValue) 
((ConstantExpression) expr.getArguments().get(1).getValue())
-                                .getValue()).getObject()).getStringValue();
+                String str = 
ConstantExpressionUtil.getStringConstant(expr.getArguments().get(1).getValue());
                 int k = rt.getFieldIndex(str);
                 if (k >= 0) {
                     // wait for the ByNameToByIndex rule to apply
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
index 165d749..079f61a 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
@@ -24,6 +24,7 @@
 import java.util.List;
 
 import org.apache.asterix.algebra.base.AsterixOperatorAnnotations;
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.metadata.declared.AqlDataSource;
 import org.apache.asterix.metadata.declared.AqlDataSource.AqlDataSourceType;
@@ -131,14 +132,8 @@
         if (dataset.getDatasetType() != DatasetType.INTERNAL) {
             return false;
         }
-        ILogicalExpression e1 = accessFun.getArguments().get(1).getValue();
-        if (e1.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
-            return false;
-        }
-        ConstantExpression ce = (ConstantExpression) e1;
-        IAObject obj = ((AsterixConstantValue) ce.getValue()).getObject();
-        if (obj.getType().getTypeTag() != ATypeTag.STRING) {
-            int pos = ((AInt32) obj).getIntegerValue();
+        final Integer pos = 
ConstantExpressionUtil.getIntConstant(accessFun.getArguments().get(1).getValue());
+        if (pos != null) {
             String tName = dataset.getItemTypeName();
             IAType t = mp.findType(dataset.getItemTypeDataverseName(), tName);
             if (t.getTypeTag() != ATypeTag.RECORD) {
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java
index 69c9f7d..bb382f0 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java
@@ -18,7 +18,7 @@
  */
 package org.apache.asterix.optimizer.rules;
 
-import static 
org.apache.asterix.algebra.util.ConstantExpressionUtil.getStringArgument;
+import static 
org.apache.asterix.om.util.ConstantExpressionUtil.getStringArgument;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
index ed1803d..b3e9e09 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
@@ -24,13 +24,13 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
 import org.apache.asterix.dataflow.data.common.AqlExpressionTypeComputer;
 import org.apache.asterix.metadata.api.IMetadataEntity;
 import org.apache.asterix.metadata.declared.AqlMetadataProvider;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.metadata.utils.DatasetUtils;
-import org.apache.asterix.om.base.AInt32;
 import org.apache.asterix.om.base.AOrderedList;
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.constants.AsterixConstantValue;
@@ -699,21 +699,18 @@
         List<String> nestedAccessFieldName = null;
         int fieldIndex = -1;
         if (funcIdent == AsterixBuiltinFunctions.FIELD_ACCESS_BY_NAME) {
-            ILogicalExpression nameArg = 
funcExpr.getArguments().get(1).getValue();
-            if (nameArg.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
+            fieldName = ConstantExpressionUtil.getStringArgument(funcExpr, 1);
+            if (fieldName == null) {
                 return null;
             }
-            ConstantExpression constExpr = (ConstantExpression) nameArg;
-            fieldName = ((AString) ((AsterixConstantValue) 
constExpr.getValue()).getObject()).getStringValue();
             isFieldAccess = true;
             isByName = true;
         } else if (funcIdent == AsterixBuiltinFunctions.FIELD_ACCESS_BY_INDEX) 
{
-            ILogicalExpression idxArg = 
funcExpr.getArguments().get(1).getValue();
-            if (idxArg.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
+            Integer idx = ConstantExpressionUtil.getIntArgument(funcExpr, 1);
+            if (idx == null) {
                 return null;
             }
-            ConstantExpression constExpr = (ConstantExpression) idxArg;
-            fieldIndex = ((AInt32) ((AsterixConstantValue) 
constExpr.getValue()).getObject()).getIntegerValue();
+            fieldIndex = idx;
             isFieldAccess = true;
         } else if (funcIdent == AsterixBuiltinFunctions.FIELD_ACCESS_NESTED) {
             ILogicalExpression nameArg = 
funcExpr.getArguments().get(1).getValue();
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/MetadataBuiltinFunctions.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/MetadataBuiltinFunctions.java
index 9bddd8e..1045898 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/MetadataBuiltinFunctions.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/MetadataBuiltinFunctions.java
@@ -20,19 +20,16 @@
 
 import org.apache.asterix.metadata.declared.AqlMetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
-import org.apache.asterix.om.base.AString;
-import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
 import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import 
org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
 import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
 
@@ -67,11 +64,10 @@
                 if (t1.getTypeTag() != ATypeTag.STRING) {
                     throw new AlgebricksException("Illegal type " + t1 + " for 
dataset() argument.");
                 }
-                if (a1.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
+                String datasetArg = 
ConstantExpressionUtil.getStringConstant(a1);
+                if (datasetArg == null) {
                     return BuiltinType.ANY;
                 }
-                AsterixConstantValue acv = (AsterixConstantValue) 
((ConstantExpression) a1).getValue();
-                String datasetArg = ((AString) 
acv.getObject()).getStringValue();
                 AqlMetadataProvider metadata = ((AqlMetadataProvider) mp);
                 Pair<String, String> datasetInfo = getDatasetInfo(metadata, 
datasetArg);
                 String dataverseName = datasetInfo.first;
@@ -111,11 +107,10 @@
                 if (t1.getTypeTag() != ATypeTag.STRING) {
                     throw new AlgebricksException("Illegal type " + t1 + " for 
feed-ingest argument.");
                 }
-                if (a1.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
+                String typeArg = ConstantExpressionUtil.getStringConstant(a1);
+                if (typeArg == null) {
                     return BuiltinType.ANY;
                 }
-                AsterixConstantValue acv = (AsterixConstantValue) 
((ConstantExpression) a1).getValue();
-                String typeArg = ((AString) acv.getObject()).getStringValue();
                 AqlMetadataProvider metadata = ((AqlMetadataProvider) mp);
                 Pair<String, String> argInfo = getDatasetInfo(metadata, 
typeArg);
                 String dataverseName = argInfo.first;
@@ -148,11 +143,10 @@
                 if (t1.getTypeTag() != ATypeTag.STRING) {
                     throw new AlgebricksException("Illegal type " + t1 + " for 
dataset() argument.");
                 }
-                if (a1.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
+                String datasetArg = 
ConstantExpressionUtil.getStringConstant(a1);
+                if (datasetArg == null) {
                     return BuiltinType.ANY;
                 }
-                AsterixConstantValue acv = (AsterixConstantValue) 
((ConstantExpression) a1).getValue();
-                String datasetArg = ((AString) 
acv.getObject()).getStringValue();
                 AqlMetadataProvider metadata = ((AqlMetadataProvider) mp);
                 Pair<String, String> datasetInfo = getDatasetInfo(metadata, 
datasetArg);
                 String dataverseName = datasetInfo.first;
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ClosedRecordConstructorResultType.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ClosedRecordConstructorResultType.java
index 1aa06bd..e337ea8 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ClosedRecordConstructorResultType.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ClosedRecordConstructorResultType.java
@@ -21,20 +21,17 @@
 
 import java.util.Iterator;
 
-import org.apache.asterix.om.base.AString;
-import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
 import org.apache.asterix.om.typecomputer.base.TypeCastUtils;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.AUnionType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import 
org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
 import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
 
@@ -69,10 +66,8 @@
                 e2Type = 
AUnionType.createUnknownableType(unionType.getActualType());
             }
             fieldTypes[i] = e2Type;
-            if (e1.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
-                ConstantExpression nameExpr = (ConstantExpression) e1;
-                fieldNames[i] = ((AString) ((AsterixConstantValue) 
nameExpr.getValue()).getObject()).getStringValue();
-            } else {
+            fieldNames[i] = ConstantExpressionUtil.getStringConstant(e1);
+            if (fieldNames[i] == null) {
                 throw new AlgebricksException(
                         "Field name " + i + "(" + e1 + ") in call to 
closed-record-constructor is not a constant.");
             }
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/OpenRecordConstructorResultType.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/OpenRecordConstructorResultType.java
index 04d879f..a12bc1d 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/OpenRecordConstructorResultType.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/OpenRecordConstructorResultType.java
@@ -25,19 +25,16 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.asterix.om.base.AString;
-import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
 import org.apache.asterix.om.typecomputer.base.TypeCastUtils;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.types.TypeHelper;
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import 
org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
 import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
 
@@ -71,12 +68,7 @@
             ILogicalExpression e1 = argIter.next().getValue();
             ILogicalExpression e2 = argIter.next().getValue();
             IAType t2 = (IAType) env.getType(e2);
-            String fieldName = null;
-            if (e1.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
-                ConstantExpression nameExpr = (ConstantExpression) e1;
-                AsterixConstantValue acv = (AsterixConstantValue) 
nameExpr.getValue();
-                fieldName = ((AString) acv.getObject()).getStringValue();
-            }
+            String fieldName = ConstantExpressionUtil.getStringConstant(e1);
             if (fieldName != null && t2 != null && TypeHelper.isClosed(t2)) {
                 namesList.add(fieldName);
                 typesList.add(t2);
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordAddFieldsTypeComputer.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordAddFieldsTypeComputer.java
index 97f4e92..efe8287 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordAddFieldsTypeComputer.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordAddFieldsTypeComputer.java
@@ -27,9 +27,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.asterix.om.base.AString;
-import org.apache.asterix.om.base.IAObject;
-import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
 import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.ARecordType;
@@ -37,13 +34,13 @@
 import org.apache.asterix.om.types.AUnionType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.types.TypeHelper;
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractLogicalExpression;
-import 
org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
 import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
 
@@ -97,7 +94,7 @@
             AbstractFunctionCallExpression f = 
(AbstractFunctionCallExpression) arg1;
             List<Mutable<ILogicalExpression>> args = f.getArguments();
 
-            AString fieldName = null;
+            String fieldName = null;
             IAType fieldType = null;
 
             // Iterating through the orderlist input
@@ -110,29 +107,18 @@
                     for (int j = 0; j < fn.length; j++) {
                         if (fn[j].equals(FIELD_NAME_NAME)) {
                             ILogicalExpression fieldNameExpr = 
recConsExpr.getArguments().get(j).getValue();
-                            switch (fieldNameExpr.getExpressionTag()) {
-                                case CONSTANT: // Top fields only
-                                    IAObject object = ((AsterixConstantValue) 
((ConstantExpression) fieldNameExpr)
-                                            .getValue()).getObject();
-                                    if (object.getType().getTypeTag() == 
ATypeTag.STRING) {
-                                        // Get the actual "field-name" string
-                                        ILogicalExpression recFieldExpr = 
recConsExpr.getArguments().get(j + 1)
-                                                .getValue();
-                                        if (recFieldExpr.getExpressionTag() == 
LogicalExpressionTag.CONSTANT) {
-                                            fieldName = (AString) 
((AsterixConstantValue) ((ConstantExpression) recFieldExpr)
-                                                    .getValue()).getObject();
-                                        }
-                                    }
-                                    break;
-                                default:
-                                    throw new 
AlgebricksException(fieldNameExpr + " is not supported.");
+                            if 
(ConstantExpressionUtil.getStringConstant(fieldNameExpr) == null) {
+                                throw new AlgebricksException(fieldNameExpr + 
" is not supported.");
                             }
+                            // Get the actual "field-name" string
+                            ILogicalExpression recFieldExpr = 
recConsExpr.getArguments().get(j + 1).getValue();
+                            fieldName = 
ConstantExpressionUtil.getStringConstant(recFieldExpr);
                         } else if (fn[j].equals(FIELD_VALUE_VALUE)) {
                             fieldType = ft[j];
                         }
                     }
                     if (fieldName != null) {
-                        additionalFields.put(fieldName.getStringValue(), 
fieldType);
+                        additionalFields.put(fieldName, fieldType);
                     }
                 }
             }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/util/ConstantExpressionUtil.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/util/ConstantExpressionUtil.java
similarity index 82%
rename from 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/util/ConstantExpressionUtil.java
rename to 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/util/ConstantExpressionUtil.java
index 300ef9d..9d92242 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/util/ConstantExpressionUtil.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/util/ConstantExpressionUtil.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.algebra.util;
+package org.apache.asterix.om.util;
 
 import org.apache.asterix.om.base.AInt32;
 import org.apache.asterix.om.base.AString;
@@ -31,8 +31,7 @@
 
 public class ConstantExpressionUtil {
 
-    private static IAObject 
getAsterixConstantValue(AbstractFunctionCallExpression f, int index, ATypeTag 
typeTag) {
-        final ILogicalExpression expr = f.getArguments().get(index).getValue();
+    private static IAObject getConstantIaObject(ILogicalExpression expr, 
ATypeTag typeTag) {
         if (expr.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
             return null;
         }
@@ -44,16 +43,24 @@
         return iaObject.getType().getTypeTag() == typeTag ? iaObject : null;
     }
 
-    public static Integer getIntArgument(AbstractFunctionCallExpression f, int 
index) {
-        final IAObject iaObject = getAsterixConstantValue(f, index, 
ATypeTag.INT32);
+    public static Integer getIntConstant(ILogicalExpression expr) {
+        final IAObject iaObject = getConstantIaObject(expr, ATypeTag.INT32);
         return iaObject != null ? ((AInt32) iaObject).getIntegerValue() : null;
     }
 
-    public static String getStringArgument(AbstractFunctionCallExpression f, 
int index) {
-        final IAObject iaObject = getAsterixConstantValue(f, index, 
ATypeTag.STRING);
+    public static String getStringConstant(ILogicalExpression expr) {
+        final IAObject iaObject = getConstantIaObject(expr, ATypeTag.STRING);
         return iaObject != null ? ((AString) iaObject).getStringValue() : null;
     }
 
+    public static Integer getIntArgument(AbstractFunctionCallExpression f, int 
index) {
+        return getIntConstant(f.getArguments().get(index).getValue());
+    }
+
+    public static String getStringArgument(AbstractFunctionCallExpression f, 
int index) {
+        return getStringConstant(f.getArguments().get(index).getValue());
+    }
+
     public static Integer getIntArgument(ILogicalExpression expr, int index) {
         return expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL
                 ? getIntArgument((AbstractFunctionCallExpression) expr, index) 
: null;
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java
index 8737360..5955e57 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java
@@ -61,6 +61,7 @@
 import org.apache.asterix.om.types.AUnionType;
 import org.apache.asterix.om.types.AUnorderedListType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.util.ConstantExpressionUtil;
 import 
org.apache.asterix.runtime.aggregates.collections.ListifyAggregateDescriptor;
 import org.apache.asterix.runtime.evaluators.common.CreateMBREvalFactory;
 import org.apache.asterix.runtime.evaluators.common.FunctionManagerImpl;
@@ -77,7 +78,6 @@
 import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
 import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
@@ -468,19 +468,15 @@
                 for (int i = 0; i < n; i++) {
                     Mutable<ILogicalExpression> argRef = 
expr.getArguments().get(2 * i);
                     ILogicalExpression arg = argRef.getValue();
-                    if (arg.getExpressionTag() == 
LogicalExpressionTag.CONSTANT) {
-                        String fn =
-                                ((AString) ((AsterixConstantValue) 
((ConstantExpression) arg).getValue()).getObject())
-                                        .getStringValue();
-                        open[i] = true;
+                    open[i] = true;
+                    final String fn = 
ConstantExpressionUtil.getStringConstant(arg);
+                    if (fn != null) {
                         for (String s : recType.getFieldNames()) {
                             if (s.equals(fn)) {
                                 open[i] = false;
                                 break;
                             }
                         }
-                    } else {
-                        open[i] = true;
                     }
                 }
                 return open;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I636538d6ea6c6a527aac1eb9cacdcc40a8489c02
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Till Westmann <[email protected]>

Reply via email to