[NO ISSUE]Introduce convenience methods for pointables

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- Introduce utils to convert pointables into adm nodes.
- Such functions can be useful for tuple translation of
  Metadata entities, reading constant records in with
  clauses in DDLs, and for debugging runtime.

Change-Id: I705e75d573a7f2c888dd7d83b4c24a2c7050eb88
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2733
Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <ti...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/5ff3230e
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/5ff3230e
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/5ff3230e

Branch: refs/heads/master
Commit: 5ff3230e7b3f51e787f432ff098d0b02c961a808
Parents: ac3a16a
Author: Abdullah Alamoudi <bamou...@gmail.com>
Authored: Tue Jul 3 14:12:07 2018 -0700
Committer: abdullah alamoudi <bamou...@gmail.com>
Committed: Tue Jul 3 16:27:40 2018 -0700

----------------------------------------------------------------------
 .../asterix/app/translator/QueryTranslator.java |  56 ++++---
 .../asterix/common/exceptions/ErrorCode.java    |   3 +
 .../main/resources/asx_errormsg/en.properties   |   3 +
 asterixdb/asterix-lang-common/pom.xml           |   5 -
 .../lang/common/util/LangRecordParseUtil.java   | 125 ++++++--------
 .../asterix/metadata/MetadataManager.java       |  30 +++-
 .../apache/asterix/metadata/MetadataNode.java   |  26 ++-
 .../asterix/metadata/entities/Dataset.java      |  16 +-
 .../asterix/metadata/entities/Dataverse.java    |  15 ++
 .../SerializerDeserializerProvider.java         |   7 +-
 .../formats/nontagged/TypeTraitProvider.java    |   2 +-
 .../asterix/object/base/AdmArrayNode.java       |  32 +++-
 .../asterix/object/base/AdmBigIntNode.java      |  10 ++
 .../asterix/object/base/AdmBooleanNode.java     |   9 +
 .../asterix/object/base/AdmDoubleNode.java      |   9 +
 .../apache/asterix/object/base/AdmNullNode.java |   9 +
 .../asterix/object/base/AdmObjectNode.java      |  72 +++++++-
 .../asterix/object/base/AdmStringNode.java      |  11 ++
 .../apache/asterix/object/base/IAdmNode.java    |  25 ++-
 .../nonvisitor/AIntervalPointable.java          |   1 +
 .../pointables/nonvisitor/AListPointable.java   |  14 +-
 .../pointables/nonvisitor/ARecordPointable.java |  25 ++-
 .../apache/asterix/om/utils/AdmNodeUtils.java   | 163 +++++++++++++++++++
 .../hyracks/data/std/api/AbstractPointable.java |   1 +
 .../hyracks/data/std/api/IPointableFactory.java |   4 +-
 .../data/std/primitive/BooleanPointable.java    |   5 +-
 .../data/std/primitive/BytePointable.java       |   1 +
 .../data/std/primitive/DoublePointable.java     |  11 +-
 .../data/std/primitive/FloatPointable.java      |   1 +
 .../data/std/primitive/IntegerPointable.java    |   1 +
 .../std/primitive/RawUTF8StringPointable.java   |   1 +
 .../data/std/primitive/ShortPointable.java      |   1 +
 .../std/primitive/TaggedValuePointable.java     |  26 +--
 .../primitive/UTF8StringLowercasePointable.java |   1 +
 .../UTF8StringLowercaseTokenPointable.java      |   1 +
 .../data/std/primitive/UTF8StringPointable.java |   9 +-
 .../java/org/apache/hyracks/util/ExitUtil.java  |   3 +
 .../org/apache/hyracks/util/NetworkUtil.java    |   2 +-
 .../hyracks/util/string/UTF8StringUtil.java     |  11 +-
 .../hyracks/util/string/UTF8StringWriter.java   |  15 +-
 40 files changed, 596 insertions(+), 166 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
----------------------------------------------------------------------
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 6bb6f35..4d71715 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
@@ -459,26 +459,13 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
     }
 
     protected void handleCreateDataverseStatement(MetadataProvider 
metadataProvider, Statement stmt) throws Exception {
-
         CreateDataverseStatement stmtCreateDataverse = 
(CreateDataverseStatement) stmt;
         String dvName = stmtCreateDataverse.getDataverseName().getValue();
         MetadataTransactionContext mdTxnCtx = 
MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-
         lockManager.acquireDataverseReadLock(metadataProvider.getLocks(), 
dvName);
         try {
-            Dataverse dv = 
MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), 
dvName);
-            if (dv != null) {
-                if (stmtCreateDataverse.getIfNotExists()) {
-                    MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
-                    return;
-                } else {
-                    throw new CompilationException(ErrorCode.DATAVERSE_EXISTS, 
stmt.getSourceLocation(), dvName);
-                }
-            }
-            
MetadataManager.INSTANCE.addDataverse(metadataProvider.getMetadataTxnContext(),
-                    new Dataverse(dvName, stmtCreateDataverse.getFormat(), 
MetadataUtil.PENDING_NO_OP));
-            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+            doCreateDataverseStatement(mdTxnCtx, metadataProvider, 
stmtCreateDataverse);
         } catch (Exception e) {
             abort(e, e, mdTxnCtx);
             throw e;
@@ -487,6 +474,26 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
         }
     }
 
+    @SuppressWarnings("squid:S00112")
+    protected boolean doCreateDataverseStatement(MetadataTransactionContext 
mdTxnCtx, MetadataProvider metadataProvider,
+            CreateDataverseStatement stmtCreateDataverse) throws Exception {
+        String dvName = stmtCreateDataverse.getDataverseName().getValue();
+        Dataverse dv = 
MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), 
dvName);
+        if (dv != null) {
+            if (stmtCreateDataverse.getIfNotExists()) {
+                MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+                return false;
+            } else {
+                throw new CompilationException(ErrorCode.DATAVERSE_EXISTS, 
stmtCreateDataverse.getSourceLocation(),
+                        dvName);
+            }
+        }
+        
MetadataManager.INSTANCE.addDataverse(metadataProvider.getMetadataTxnContext(),
+                new Dataverse(dvName, stmtCreateDataverse.getFormat(), 
MetadataUtil.PENDING_NO_OP));
+        MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+        return true;
+    }
+
     protected static void validateCompactionPolicy(String compactionPolicy,
             Map<String, String> compactionPolicyProperties, 
MetadataTransactionContext mdTxnCtx,
             boolean isExternalDataset, SourceLocation sourceLoc) throws 
CompilationException, Exception {
@@ -1220,19 +1227,29 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             throw new CompilationException(ErrorCode.COMPILATION_ERROR, 
sourceLoc,
                     MetadataBuiltinEntities.DEFAULT_DATAVERSE_NAME + " 
dataverse can't be dropped");
         }
+        lockManager.acquireDataverseWriteLock(metadataProvider.getLocks(), 
dataverseName);
+        try {
+            doDropDataverse(stmtDelete, sourceLoc, metadataProvider, hcc);
+        } finally {
+            metadataProvider.getLocks().unlock();
+            
ExternalDatasetsRegistry.INSTANCE.releaseAcquiredLocks(metadataProvider);
+        }
+    }
 
+    protected boolean doDropDataverse(DataverseDropStatement stmtDelete, 
SourceLocation sourceLoc,
+            MetadataProvider metadataProvider, IHyracksClientConnection hcc) 
throws Exception {
+        String dataverseName = stmtDelete.getDataverseName().getValue();
         ProgressState progress = ProgressState.NO_PROGRESS;
         MetadataTransactionContext mdTxnCtx = 
MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         List<JobSpecification> jobsToExecute = new ArrayList<>();
-        lockManager.acquireDataverseWriteLock(metadataProvider.getLocks(), 
dataverseName);
         try {
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
dataverseName);
             if (dv == null) {
                 if (stmtDelete.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
-                    return;
+                    return false;
                 } else {
                     throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
                 }
@@ -1336,6 +1353,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                 activeDataverse = null;
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+            return true;
         } catch (Exception e) {
             if (bActiveTxn) {
                 abort(e, e, mdTxnCtx);
@@ -1369,11 +1387,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                             + ") couldn't be removed from the metadata", e);
                 }
             }
-
             throw e;
-        } finally {
-            metadataProvider.getLocks().unlock();
-            
ExternalDatasetsRegistry.INSTANCE.releaseAcquiredLocks(metadataProvider);
         }
     }
 
@@ -2871,7 +2885,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
 
     @Override
     public String getActiveDataverseName(String dataverse) {
-        return (dataverse != null) ? dataverse : 
activeDataverse.getDataverseName();
+        return (dataverse != null && !dataverse.isEmpty()) ? dataverse : 
activeDataverse.getDataverseName();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
index 447f851..d919d0e 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
@@ -168,6 +168,9 @@ public class ErrorCode {
     public static final int TYPE_EXISTS = 1085;
     public static final int PARAMETER_NO_VALUE = 1086;
     public static final int COMPILATION_INVALID_NUM_OF_ARGS = 1087;
+    public static final int FIELD_NOT_FOUND = 1088;
+    public static final int FIELD_NOT_OF_TYPE = 1089;
+    public static final int ARRAY_FIELD_ELEMENTS_MUST_BE_OF_TYPE = 1090;
 
     // Feed errors
     public static final int DATAFLOW_ILLEGAL_STATE = 3001;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties 
b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
index 720ff57..ac51570 100644
--- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
+++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
@@ -155,6 +155,9 @@
 1085 = A datatype with this name %1$s already exists
 1086 = No value for parameter: %1$s
 1087 = Invalid number of arguments: at least %1$d arguments are required for 
function %2$s
+1088 = Required field %1$s was not found
+1089 = Field %1$s must be of type %2$s but found to be of type %3$s
+1090 = Field %1$s must be of an array of type %2$s but found to contain an 
item of type %3$s
 
 # Feed Errors
 3001 = Illegal state.

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-lang-common/pom.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-common/pom.xml 
b/asterixdb/asterix-lang-common/pom.xml
index b20bd58..96123d0 100644
--- a/asterixdb/asterix-lang-common/pom.xml
+++ b/asterixdb/asterix-lang-common/pom.xml
@@ -103,10 +103,5 @@
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-data-std</artifactId>
-    </dependency>
   </dependencies>
-
 </project>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java
index 8367fa0..c358444 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java
@@ -23,66 +23,53 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
-import org.apache.asterix.builders.OrderedListBuilder;
-import org.apache.asterix.builders.RecordBuilder;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Literal;
 import org.apache.asterix.lang.common.expression.FieldBinding;
 import org.apache.asterix.lang.common.expression.ListConstructor;
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
+import org.apache.asterix.object.base.AdmArrayNode;
+import org.apache.asterix.object.base.AdmBigIntNode;
+import org.apache.asterix.object.base.AdmBooleanNode;
+import org.apache.asterix.object.base.AdmDoubleNode;
+import org.apache.asterix.object.base.AdmNullNode;
+import org.apache.asterix.object.base.AdmObjectNode;
+import org.apache.asterix.object.base.AdmStringNode;
+import org.apache.asterix.object.base.IAdmNode;
 import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.base.ADouble;
 import org.apache.asterix.om.base.AInt64;
 import org.apache.asterix.om.base.AMutableString;
-import org.apache.asterix.om.base.ANull;
 import org.apache.asterix.om.base.AOrderedList;
 import org.apache.asterix.om.base.ARecord;
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.base.IACursor;
 import org.apache.asterix.om.base.IAObject;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.asterix.om.types.ATypeTag;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 
-@SuppressWarnings("unchecked")
 public class LangRecordParseUtil {
     private static final String NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE =
             "JSON record can only have expressions [%1$s, %2$s, %3$s]";
-    private static final ISerializerDeserializer<ADouble> doubleSerde =
-            
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
-    private static final ISerializerDeserializer<AString> stringSerde =
-            
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
-    private static final ISerializerDeserializer<AInt64> intSerde =
-            
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
-    private static final ISerializerDeserializer<ABoolean> booleanSerde =
-            
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
-    private static final ISerializerDeserializer<ANull> nullSerde =
-            
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
 
     private LangRecordParseUtil() {
     }
 
-    private static void parseExpression(Expression expr, 
ArrayBackedValueStorage serialized)
-            throws HyracksDataException, CompilationException {
+    private static IAdmNode parseExpression(Expression expr) throws 
HyracksDataException, CompilationException {
         switch (expr.getKind()) {
             case LITERAL_EXPRESSION:
-                parseLiteral((LiteralExpr) expr, serialized);
-                break;
+                return parseLiteral((LiteralExpr) expr);
             case RECORD_CONSTRUCTOR_EXPRESSION:
-                parseRecord((RecordConstructor) expr, serialized, true, 
Collections.emptyList());
-                break;
+                return parseRecord((RecordConstructor) expr, 
Collections.emptyList());
             case LIST_CONSTRUCTOR_EXPRESSION:
-                parseList((ListConstructor) expr, serialized);
-                break;
+                return parseList((ListConstructor) expr);
             default:
                 throw new HyracksDataException(ErrorCode.ASTERIX, 
ErrorCode.PARSE_ERROR,
                         NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE,
@@ -92,41 +79,30 @@ public class LangRecordParseUtil {
         }
     }
 
-    public static void parseRecord(RecordConstructor recordValue, 
ArrayBackedValueStorage serialized, boolean tagged,
-            List<Pair<String, String>> defaults) throws HyracksDataException, 
CompilationException {
+    public static AdmObjectNode parseRecord(RecordConstructor recordValue, 
List<Pair<String, String>> defaults)
+            throws HyracksDataException, CompilationException {
+        AdmObjectNode record = new AdmObjectNode();
         AMutableString fieldNameString = new AMutableString(null);
-        ArrayBackedValueStorage fieldName = new ArrayBackedValueStorage();
-        ArrayBackedValueStorage fieldValue = new ArrayBackedValueStorage();
-        RecordBuilder recordBuilder = new RecordBuilder();
-        recordBuilder.reset(RecordUtil.FULLY_OPEN_RECORD_TYPE);
-        recordBuilder.init();
         List<FieldBinding> fbList = recordValue.getFbList();
         HashSet<String> fieldNames = new HashSet<>();
         for (FieldBinding fb : fbList) {
-            fieldName.reset();
-            fieldValue.reset();
             // get key
             
fieldNameString.setValue(exprToStringLiteral(fb.getLeftExpr()).getStringValue());
             if (!fieldNames.add(fieldNameString.getStringValue())) {
                 throw new HyracksDataException(
                         "Field " + fieldNameString.getStringValue() + " was 
specified multiple times");
             }
-            stringSerde.serialize(fieldNameString, fieldName.getDataOutput());
             // get value
-            parseExpression(fb.getRightExpr(), fieldValue);
-            recordBuilder.addField(fieldName, fieldValue);
+            IAdmNode value = parseExpression(fb.getRightExpr());
+            record.set(fieldNameString.getStringValue(), value);
         }
         // defaults
         for (Pair<String, String> kv : defaults) {
             if (!fieldNames.contains(kv.first)) {
-                fieldName.reset();
-                fieldValue.reset();
-                stringSerde.serialize(new AString(kv.first), 
fieldName.getDataOutput());
-                stringSerde.serialize(new AString(kv.second), 
fieldValue.getDataOutput());
-                recordBuilder.addField(fieldName, fieldValue);
+                record.set(kv.first, new AdmStringNode(kv.second));
             }
         }
-        recordBuilder.write(serialized.getDataOutput(), tagged);
+        return record;
     }
 
     public static Literal exprToStringLiteral(Expression expr) throws 
CompilationException {
@@ -143,51 +119,37 @@ public class LangRecordParseUtil {
         return keyLiteral;
     }
 
-    private static void parseList(ListConstructor valueExpr, 
ArrayBackedValueStorage serialized)
-            throws CompilationException, HyracksDataException {
+    private static AdmArrayNode parseList(ListConstructor valueExpr) throws 
CompilationException, HyracksDataException {
         if (valueExpr.getType() != 
ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR) {
             throw new HyracksDataException(ErrorCode.ASTERIX, 
ErrorCode.PARSE_ERROR, "JSON List can't be of type %1$s",
                     valueExpr.getType());
         }
-        ArrayBackedValueStorage serializedValue = new 
ArrayBackedValueStorage();
-        OrderedListBuilder listBuilder = new OrderedListBuilder();
-        listBuilder.reset(null);
-        for (Expression expr : valueExpr.getExprList()) {
-            serializedValue.reset();
-            parseExpression(expr, serializedValue);
-            listBuilder.addItem(serializedValue);
+        List<Expression> exprs = valueExpr.getExprList();
+        AdmArrayNode list = new AdmArrayNode(exprs.size());
+        for (Expression expr : exprs) {
+            list.add(parseExpression(expr));
         }
-        listBuilder.write(serialized.getDataOutput(), true);
+        return list;
     }
 
-    private static void parseLiteral(LiteralExpr objectExpr, 
ArrayBackedValueStorage serialized)
-            throws HyracksDataException {
+    private static IAdmNode parseLiteral(LiteralExpr objectExpr) throws 
HyracksDataException {
         Literal value = objectExpr.getValue();
         switch (value.getLiteralType()) {
             case DOUBLE:
-                doubleSerde.serialize(new ADouble((Double) value.getValue()), 
serialized.getDataOutput());
-                break;
+            case FLOAT:
+                return new AdmDoubleNode((Double) value.getValue());
             case TRUE:
-                booleanSerde.serialize(ABoolean.TRUE, 
serialized.getDataOutput());
-                break;
+                return AdmBooleanNode.TRUE;
             case FALSE:
-                booleanSerde.serialize(ABoolean.FALSE, 
serialized.getDataOutput());
-                break;
-            case FLOAT:
-                doubleSerde.serialize(new ADouble((Float) value.getValue()), 
serialized.getDataOutput());
-                break;
+                return AdmBooleanNode.FALSE;
             case INTEGER:
-                intSerde.serialize(new AInt64(((Integer) 
value.getValue()).longValue()), serialized.getDataOutput());
-                break;
+                return new AdmBigIntNode((Integer) value.getValue());
             case LONG:
-                intSerde.serialize(new AInt64((Long) value.getValue()), 
serialized.getDataOutput());
-                break;
+                return new AdmBigIntNode((Long) value.getValue());
             case NULL:
-                nullSerde.serialize(ANull.NULL, serialized.getDataOutput());
-                break;
+                return AdmNullNode.INSTANCE;
             case STRING:
-                stringSerde.serialize(new AString((String) value.getValue()), 
serialized.getDataOutput());
-                break;
+                return new AdmStringNode((String) value.getValue());
             default:
                 throw new HyracksDataException(ErrorCode.ASTERIX, 
ErrorCode.PARSE_ERROR, "Unknown Literal Type %1$s",
                         value.getLiteralType());
@@ -203,6 +165,21 @@ public class LangRecordParseUtil {
         }
     }
 
+    public static void recordToMap(Map<String, String> map, AdmObjectNode 
record) throws AlgebricksException {
+        for (Entry<String, IAdmNode> field : record.getFields()) {
+            String value = aObjToString(field.getValue());
+            map.put(field.getKey(), value);
+        }
+    }
+
+    private static String aObjToString(IAdmNode aObj) {
+        if (aObj.getType() == ATypeTag.STRING) {
+            return ((AdmStringNode) aObj).get();
+        } else {
+            return aObj.toString();
+        }
+    }
+
     public static String aObjToString(IAObject aObj) throws 
AlgebricksException {
         switch (aObj.getType().getTypeTag()) {
             case DOUBLE:

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
index 4474684..e5ee163 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
@@ -25,8 +25,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
@@ -60,6 +58,9 @@ import org.apache.asterix.om.types.ARecordType;
 import 
org.apache.asterix.transaction.management.opcallbacks.AbstractIndexModificationOperationCallback.Operation;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.util.ExitUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * Provides access to Asterix metadata via remote methods to the metadata node.
@@ -94,6 +95,7 @@ import org.apache.hyracks.api.exceptions.HyracksDataException;
  * with transaction ids of regular jobs or other metadata transactions.
  */
 public abstract class MetadataManager implements IMetadataManager {
+    private static final Logger LOGGER = LogManager.getLogger();
     private final MetadataCache cache = new MetadataCache();
     protected final Collection<IAsterixStateProxy> proxies;
     protected IMetadataNode metadataNode;
@@ -132,15 +134,29 @@ public abstract class MetadataManager implements 
IMetadataManager {
         return new MetadataTransactionContext(txnId);
     }
 
+    @SuppressWarnings("squid:S1181")
     @Override
-    public void commitTransaction(MetadataTransactionContext ctx) throws 
RemoteException, ACIDException {
-        metadataNode.commitTransaction(ctx.getTxnId());
-        cache.commit(ctx);
+    public void commitTransaction(MetadataTransactionContext ctx) {
+        try {
+            metadataNode.commitTransaction(ctx.getTxnId());
+            cache.commit(ctx);
+        } catch (Throwable th) {
+            // Metadata node should abort all transactions on re-joining the 
new CC
+            LOGGER.fatal("Failure committing a metadata transaction", th);
+            ExitUtil.halt(ExitUtil.EC_FAILED_TO_COMMIT_METADATA_TXN);
+        }
     }
 
+    @SuppressWarnings("squid:S1181")
     @Override
-    public void abortTransaction(MetadataTransactionContext ctx) throws 
RemoteException, ACIDException {
-        metadataNode.abortTransaction(ctx.getTxnId());
+    public void abortTransaction(MetadataTransactionContext ctx) {
+        try {
+            metadataNode.abortTransaction(ctx.getTxnId());
+        } catch (Throwable th) {
+            // Metadata node should abort all transactions on re-joining the 
new CC
+            LOGGER.fatal("Failure aborting a metadata transaction", th);
+            ExitUtil.halt(ExitUtil.EC_FAILED_TO_ABORT_METADATA_TXN);
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index 543b794..164c867 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -30,18 +30,15 @@ import 
org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
-import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
 import org.apache.asterix.common.dataflow.LSMIndexUtil;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
-import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.IRecoveryManager.ResourceType;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import 
org.apache.asterix.common.transactions.ITransactionManager.AtomicityLevel;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
 import org.apache.asterix.common.transactions.ITxnIdFactory;
-import org.apache.asterix.common.transactions.ImmutableDatasetId;
 import org.apache.asterix.common.transactions.TransactionOptions;
 import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.common.utils.StoragePathUtil;
@@ -124,10 +121,13 @@ import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.util.ExitUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class MetadataNode implements IMetadataNode {
     private static final long serialVersionUID = 1L;
-
+    private static final Logger LOGGER = LogManager.getLogger();
     // shared between core and extension
     private IDatasetLifecycleManager datasetLifecycleManager;
     private ITransactionSubsystem transactionSubsystem;
@@ -172,14 +172,28 @@ public class MetadataNode implements IMetadataNode {
         
transactionSubsystem.getTransactionManager().beginTransaction(transactionId, 
options);
     }
 
+    @SuppressWarnings("squid:S1181")
     @Override
     public void commitTransaction(TxnId txnId) throws RemoteException, 
ACIDException {
-        transactionSubsystem.getTransactionManager().commitTransaction(txnId);
+        try {
+            
transactionSubsystem.getTransactionManager().commitTransaction(txnId);
+        } catch (Throwable th) {
+            // Metadata node should abort all Metadata transactions on re-start
+            LOGGER.fatal("Failure committing a metadata transaction", th);
+            ExitUtil.halt(ExitUtil.EC_FAILED_TO_COMMIT_METADATA_TXN);
+        }
     }
 
+    @SuppressWarnings("squid:S1181")
     @Override
     public void abortTransaction(TxnId txnId) throws RemoteException, 
ACIDException {
-        transactionSubsystem.getTransactionManager().abortTransaction(txnId);
+        try {
+            
transactionSubsystem.getTransactionManager().abortTransaction(txnId);
+        } catch (Throwable th) {
+            // Metadata node should abort all uncommitted transactions on 
re-start
+            LOGGER.fatal("Failure committing a metadata transaction", th);
+            ExitUtil.halt(ExitUtil.EC_FAILED_TO_ABORT_METADATA_TXN);
+        }
     }
 
     // TODO(amoudi): make all metadata operations go through the generic 
methods

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
index bcd05ee..d0a22b7 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
@@ -127,9 +127,6 @@ public class Dataset implements IMetadataEntity<Dataset>, 
IDataset {
      */
     private static final long serialVersionUID = 1L;
     private static final Logger LOGGER = LogManager.getLogger();
-    //TODO: Remove Singletons
-    private static final BTreeResourceFactoryProvider 
bTreeResourceFactoryProvider =
-            BTreeResourceFactoryProvider.INSTANCE;
     private static final RTreeResourceFactoryProvider 
rTreeResourceFactoryProvider =
             RTreeResourceFactoryProvider.INSTANCE;
     private static final InvertedIndexResourceFactoryProvider 
invertedIndexResourceFactoryProvider =
@@ -153,10 +150,6 @@ public class Dataset implements IMetadataEntity<Dataset>, 
IDataset {
     private final long rebalanceCount;
     private int pendingOp;
 
-    /*
-     * Transient (For caching)
-     */
-
     public Dataset(String dataverseName, String datasetName, String 
recordTypeDataverseName, String recordTypeName,
             String nodeGroupName, String compactionPolicy, Map<String, String> 
compactionPolicyProperties,
             IDatasetDetails datasetDetails, Map<String, String> hints, 
DatasetType datasetType, int datasetId,
@@ -473,8 +466,9 @@ public class Dataset implements IMetadataEntity<Dataset>, 
IDataset {
         IResourceFactory resourceFactory;
         switch (index.getIndexType()) {
             case BTREE:
-                resourceFactory = 
bTreeResourceFactoryProvider.getResourceFactory(mdProvider, this, index, 
recordType,
-                        metaType, mergePolicyFactory, mergePolicyProperties, 
filterTypeTraits, filterCmpFactories);
+                resourceFactory = 
BTreeResourceFactoryProvider.INSTANCE.getResourceFactory(mdProvider, this, 
index,
+                        recordType, metaType, mergePolicyFactory, 
mergePolicyProperties, filterTypeTraits,
+                        filterCmpFactories);
                 break;
             case RTREE:
                 resourceFactory = 
rTreeResourceFactoryProvider.getResourceFactory(mdProvider, this, index, 
recordType,
@@ -853,4 +847,8 @@ public class Dataset implements IMetadataEntity<Dataset>, 
IDataset {
         }
         return partitions;
     }
+
+    public String getFullyQualifiedName() {
+        return dataverseName + '.' + datasetName;
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java
index 1b40484..35d21a0 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java
@@ -65,4 +65,19 @@ public class Dataverse implements IMetadataEntity<Dataverse> 
{
     public String toString() {
         return getClass().getSimpleName() + ":" + dataverseName;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof Dataverse)) {
+            return false;
+        }
+        Dataverse other = (Dataverse) o;
+        return dataverseName.equals(other.getDataverseName());
+    }
+
+    @Override
+    public int hashCode() {
+        return dataverseName.hashCode();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java
index d66673d..0cba8b6 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java
@@ -81,8 +81,7 @@ public class SerializerDeserializerProvider implements 
ISerializerDeserializerPr
     // Can't be shared among threads <Stateful>
     @SuppressWarnings("rawtypes")
     public ISerializerDeserializer getAStringSerializerDeserializer() {
-        return addTag(new AStringSerializerDeserializer(new 
UTF8StringWriter(), new UTF8StringReader()),
-                ATypeTag.STRING);
+        return addTag(new AStringSerializerDeserializer(new 
UTF8StringWriter(), new UTF8StringReader()));
     }
 
     @SuppressWarnings("rawtypes")
@@ -98,7 +97,7 @@ public class SerializerDeserializerProvider implements 
ISerializerDeserializerPr
                 // we could do smth better for nullable fields
                 return AObjectSerializerDeserializer.INSTANCE;
             default:
-                return addTag(getNonTaggedSerializerDeserializer(aqlType), 
aqlType.getTypeTag());
+                return addTag(getNonTaggedSerializerDeserializer(aqlType));
         }
     }
 
@@ -172,7 +171,7 @@ public class SerializerDeserializerProvider implements 
ISerializerDeserializerPr
     }
 
     @SuppressWarnings("rawtypes")
-    private ISerializerDeserializer addTag(final ISerializerDeserializer 
nonTaggedSerde, final ATypeTag typeTag) {
+    private ISerializerDeserializer addTag(final ISerializerDeserializer 
nonTaggedSerde) {
         return new ISerializerDeserializer<IAObject>() {
 
             private static final long serialVersionUID = 1L;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
index 9ec5a08..1836cfa 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
@@ -36,7 +36,7 @@ public class TypeTraitProvider implements ITypeTraitProvider {
     private static final ITypeTraits THIRTYTWOBYTETYPETRAIT = new TypeTrait(32 
+ 1);
     private static final ITypeTraits TWENTYFOURBYTETYPETRAIT = new 
TypeTrait(24 + 1);
 
-    private static final ITypeTraits VARLENTYPETRAIT = new TypeTrait(false, 
-1);
+    public static final ITypeTraits VARLENTYPETRAIT = new TypeTrait(false, -1);
 
     public static final TypeTraitProvider INSTANCE = new TypeTraitProvider();
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java
index e489cd5..60ef41a 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java
@@ -18,12 +18,19 @@
  */
 package org.apache.asterix.object.base;
 
+import java.io.DataOutput;
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
+import org.apache.asterix.builders.OrderedListBuilder;
+import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 
-public class AdmArrayNode implements IAdmNode {
+public class AdmArrayNode implements IAdmNode, Iterable<IAdmNode> {
+    private static final long serialVersionUID = 1L;
     private final List<IAdmNode> children;
 
     public AdmArrayNode() {
@@ -42,6 +49,10 @@ public class AdmArrayNode implements IAdmNode {
         add(AdmBooleanNode.get(value));
     }
 
+    public int size() {
+        return children.size();
+    }
+
     public void add(IAdmNode value) {
         if (value == null) {
             value = AdmNullNode.INSTANCE; // NOSONAR
@@ -74,4 +85,23 @@ public class AdmArrayNode implements IAdmNode {
     public String toString() {
         return children.toString();
     }
+
+    @Override
+    public void serializeValue(DataOutput dataOutput) throws IOException {
+        OrderedListBuilder listBuilder = new OrderedListBuilder();
+        listBuilder.reset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE);
+        ArrayBackedValueStorage itemValue = new ArrayBackedValueStorage();
+        for (int i = 0; i < children.size(); i++) {
+            itemValue.reset();
+            IAdmNode next = children.get(i);
+            next.serialize(itemValue.getDataOutput());
+            listBuilder.addItem(itemValue);
+        }
+        listBuilder.write(dataOutput, false);
+    }
+
+    @Override
+    public Iterator<IAdmNode> iterator() {
+        return children.iterator();
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java
index 0006668..61afc74 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java
@@ -18,9 +18,14 @@
  */
 package org.apache.asterix.object.base;
 
+import java.io.DataOutput;
+import java.io.IOException;
+
 import org.apache.asterix.om.types.ATypeTag;
 
 public class AdmBigIntNode implements IAdmNode {
+
+    private static final long serialVersionUID = 1L;
     private long value;
 
     public AdmBigIntNode() {
@@ -52,4 +57,9 @@ public class AdmBigIntNode implements IAdmNode {
     public String toString() {
         return Long.toString(value);
     }
+
+    @Override
+    public void serializeValue(DataOutput dataOutput) throws IOException {
+        dataOutput.writeLong(value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java
index aeebd86..721ce4c 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java
@@ -18,10 +18,14 @@
  */
 package org.apache.asterix.object.base;
 
+import java.io.DataOutput;
+import java.io.IOException;
+
 import org.apache.asterix.om.types.ATypeTag;
 
 public class AdmBooleanNode implements IAdmNode {
 
+    private static final long serialVersionUID = 1L;
     public static final AdmBooleanNode TRUE = new AdmBooleanNode(true);
     public static final AdmBooleanNode FALSE = new AdmBooleanNode(false);
     private final boolean value;
@@ -56,4 +60,9 @@ public class AdmBooleanNode implements IAdmNode {
     public String toString() {
         return Boolean.toString(value);
     }
+
+    @Override
+    public void serializeValue(DataOutput dataOutput) throws IOException {
+        dataOutput.writeBoolean(value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java
index 0150b4e..0601e63 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java
@@ -18,9 +18,13 @@
  */
 package org.apache.asterix.object.base;
 
+import java.io.DataOutput;
+import java.io.IOException;
+
 import org.apache.asterix.om.types.ATypeTag;
 
 public class AdmDoubleNode implements IAdmNode {
+    private static final long serialVersionUID = 1L;
     private double value;
 
     public AdmDoubleNode() {
@@ -53,4 +57,9 @@ public class AdmDoubleNode implements IAdmNode {
     public String toString() {
         return Double.toString(value);
     }
+
+    @Override
+    public void serializeValue(DataOutput dataOutput) throws IOException {
+        dataOutput.writeDouble(value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java
index 2804ca3..6fe8357 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java
@@ -18,10 +18,14 @@
  */
 package org.apache.asterix.object.base;
 
+import java.io.DataOutput;
+import java.io.IOException;
+
 import org.apache.asterix.om.types.ATypeTag;
 
 public class AdmNullNode implements IAdmNode {
 
+    private static final long serialVersionUID = 1L;
     public static final AdmNullNode INSTANCE = new AdmNullNode();
 
     private AdmNullNode() {
@@ -41,4 +45,9 @@ public class AdmNullNode implements IAdmNode {
     public String toString() {
         return "null";
     }
+
+    @Override
+    public void serializeValue(DataOutput dataOutput) throws IOException {
+        // Nothing to write
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java
index e35b28f..99b7176 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java
@@ -18,23 +18,43 @@
  */
 package org.apache.asterix.object.base;
 
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.apache.asterix.builders.RecordBuilder;
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
+import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 
 /**
  * An adm object instance
  */
 public class AdmObjectNode implements IAdmNode {
+
+    private static final long serialVersionUID = 1L;
+    public static final AdmObjectNode EMPTY = new 
AdmObjectNode(Collections.emptyMap());
     private final Map<String, IAdmNode> children;
 
     public AdmObjectNode() {
         children = new HashMap<>();
     }
 
+    public AdmObjectNode(Map<String, IAdmNode> children) {
+        this.children = children;
+    }
+
     @Override
     public ATypeTag getType() {
         return ATypeTag.OBJECT;
@@ -56,10 +76,13 @@ public class AdmObjectNode implements IAdmNode {
         return children.entrySet();
     }
 
-    public AdmObjectNode set(String fieldName, IAdmNode value) {
+    public AdmObjectNode set(String fieldName, IAdmNode value) throws 
CompilationException {
         if (value == null) {
             value = AdmNullNode.INSTANCE; // NOSONAR
         }
+        if (children.containsKey(fieldName)) {
+            throw new CompilationException(ErrorCode.DUPLICATE_FIELD_NAME, 
fieldName);
+        }
         children.put(fieldName, value);
         return this;
     }
@@ -92,4 +115,51 @@ public class AdmObjectNode implements IAdmNode {
         sb.append("}");
         return sb.toString();
     }
+
+    public static AdmObjectNode from(Map<String, IAdmNode> fields) {
+        return fields.isEmpty() ? EMPTY : new AdmObjectNode(fields);
+    }
+
+    public boolean isEmpty() {
+        return children.isEmpty();
+    }
+
+    @Override
+    public void serializeValue(DataOutput dataOutput) throws IOException {
+        ISerializerDeserializer<AString> stringSerde =
+                
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
+        RecordBuilder confRecordBuilder = new RecordBuilder();
+        confRecordBuilder.reset(RecordUtil.FULLY_OPEN_RECORD_TYPE);
+        confRecordBuilder.init();
+        ArrayBackedValueStorage fieldNameBytes = new ArrayBackedValueStorage();
+        ArrayBackedValueStorage fieldValueBytes = new 
ArrayBackedValueStorage();
+        for (Entry<String, IAdmNode> field : getFields()) {
+            String fieldName = field.getKey();
+            fieldValueBytes.reset();
+            fieldNameBytes.reset();
+            stringSerde.serialize(new AString(fieldName), 
fieldNameBytes.getDataOutput());
+            IAdmNode value = field.getValue();
+            value.serialize(fieldValueBytes.getDataOutput());
+            confRecordBuilder.addField(fieldNameBytes, fieldValueBytes);
+        }
+        confRecordBuilder.write(dataOutput, false);
+    }
+
+    public boolean contains(String fieldName) {
+        return children.containsKey(fieldName);
+    }
+
+    public String getString(String field) throws HyracksDataException {
+        return getString(this, field);
+    }
+
+    public static String getString(AdmObjectNode openFields, String field) 
throws HyracksDataException {
+        IAdmNode node = openFields.get(field);
+        if (node == null) {
+            throw HyracksDataException.create(ErrorCode.FIELD_NOT_FOUND, 
field);
+        } else if (node.getType() != ATypeTag.STRING) {
+            throw HyracksDataException.create(ErrorCode.FIELD_NOT_OF_TYPE, 
field, ATypeTag.STRING, node.getType());
+        }
+        return ((AdmStringNode) node).get();
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java
index 4c92f09..3dc70d1 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java
@@ -18,9 +18,15 @@
  */
 package org.apache.asterix.object.base;
 
+import java.io.DataOutput;
+import java.io.IOException;
+
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.hyracks.util.string.UTF8StringUtil;
 
 public class AdmStringNode implements IAdmNode {
+
+    private static final long serialVersionUID = 1L;
     private String value;
 
     public AdmStringNode() {
@@ -49,4 +55,9 @@ public class AdmStringNode implements IAdmNode {
         return "\"" + value + "\"";
     }
 
+    @Override
+    public void serializeValue(DataOutput dataOutput) throws IOException {
+        UTF8StringUtil.writeUTF8(value, dataOutput, null);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java
index c382fd2..98d7fe4 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java
@@ -18,12 +18,16 @@
  */
 package org.apache.asterix.object.base;
 
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.Serializable;
+
 import org.apache.asterix.om.types.ATypeTag;
 
 /**
  * An interface representing an adm node
  */
-public interface IAdmNode {
+public interface IAdmNode extends Serializable {
 
     /**
      * @return true if the object is a value, false if the object is a 
container
@@ -62,4 +66,23 @@ public interface IAdmNode {
      * reset the node
      */
     void reset();
+
+    /**
+     * Serialize the field with a type tag
+     *
+     * @param dataOutput
+     * @throws IOException
+     */
+    default void serialize(DataOutput dataOutput) throws IOException {
+        dataOutput.writeByte(getType().serialize());
+        serializeValue(dataOutput);
+    }
+
+    /**
+     * Serialize the value without a type tag
+     *
+     * @param dataOutput
+     * @throws IOException
+     */
+    void serializeValue(DataOutput dataOutput) throws IOException;
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java
index ce04f6d..299649b 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java
@@ -99,6 +99,7 @@ public class AIntervalPointable extends AbstractPointable {
         start.set(bytes, getStartOffset(), getStartSize());
     }
 
+    @Override
     public int getStartOffset() {
         return getTypeOffset() + getTypeSize();
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java
index 7c74a69..8d525f3 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java
@@ -22,7 +22,6 @@ package org.apache.asterix.om.pointables.nonvisitor;
 import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.AbstractCollectionType;
@@ -40,6 +39,7 @@ import org.apache.hyracks.data.std.primitive.IntegerPointable;
  * This class interprets the binary data representation of a list.
  *
  * List {
+ *   byte tag;
  *   byte type;
  *   int length;
  *   int numberOfItems;
@@ -62,11 +62,16 @@ public class AListPointable extends AbstractPointable {
         }
     };
 
-    public static final IPointableFactory FACTORY = new IPointableFactory() {
+    public static final AListPointableFactory FACTORY = new 
AListPointableFactory();
+
+    public static class AListPointableFactory implements IPointableFactory {
         private static final long serialVersionUID = 1L;
 
+        private AListPointableFactory() {
+        }
+
         @Override
-        public IPointable createPointable() {
+        public AListPointable createPointable() {
             return new AListPointable();
         }
 
@@ -169,7 +174,7 @@ public class AListPointable extends AbstractPointable {
             return getItemCountOffset() + getItemCountSize() + index * 
getFixedLength(inputType);
         } else {
             int offset = getItemCountOffset() + getItemCountSize() + index * 
ITEM_OFFSET_SIZE;
-            return IntegerPointable.getInteger(bytes, offset);
+            return start + IntegerPointable.getInteger(bytes, offset);
         }
     }
 
@@ -195,5 +200,4 @@ public class AListPointable extends AbstractPointable {
         }
         dOut.write(bytes, getItemOffset(inputType, index), 
getItemSize(inputType, index));
     }
-
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
index 77491e8..8ae533b 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
@@ -22,7 +22,6 @@ package org.apache.asterix.om.pointables.nonvisitor;
 import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.AUnionType;
@@ -230,6 +229,21 @@ public class ARecordPointable extends AbstractPointable {
         }
     }
 
+    /**
+     * This is always untagged
+     *
+     * @param recordType
+     * @param fieldId
+     * @param pointable
+     * @throws IOException
+     */
+    public void getClosedFieldValue(ARecordType recordType, int fieldId, 
IPointable pointable) throws IOException {
+        if (isClosedFieldNull(recordType, fieldId) || 
isClosedFieldMissing(recordType, fieldId)) {
+            throw new IllegalStateException("Can't read a null or missing 
field");
+        }
+        pointable.set(bytes, getClosedFieldOffset(recordType, fieldId), 
getClosedFieldSize(recordType, fieldId));
+    }
+
     public String getClosedFieldName(ARecordType recordType, int fieldId) {
         return recordType.getFieldNames()[fieldId];
     }
@@ -304,6 +318,14 @@ public class ARecordPointable extends AbstractPointable {
         dOut.write(bytes, getOpenFieldNameOffset(recordType, fieldId), 
getOpenFieldNameSize(recordType, fieldId));
     }
 
+    public String getOpenFieldName(ARecordType recordType, int fieldId) throws 
IOException {
+        StringBuilder str = new StringBuilder();
+        int offset = getOpenFieldNameOffset(recordType, fieldId);
+        UTF8StringUtil.toString(str, bytes, offset);
+        String fieldName = str.toString();
+        return fieldName;
+    }
+
     public int getOpenFieldNameSize(ARecordType recordType, int fieldId) {
         int utfleng = UTF8StringUtil.getUTFLength(bytes, 
getOpenFieldNameOffset(recordType, fieldId));
         return utfleng + UTF8StringUtil.getNumBytesToStoreLength(utfleng);
@@ -340,5 +362,4 @@ public class ARecordPointable extends AbstractPointable {
     public int getOpenFieldOffsetSize(ARecordType recordType, int fieldId) {
         return OPEN_FIELD_HASH_SIZE;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/AdmNodeUtils.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/AdmNodeUtils.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/AdmNodeUtils.java
new file mode 100644
index 0000000..6f4ee17
--- /dev/null
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/AdmNodeUtils.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.om.utils;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.asterix.object.base.AdmArrayNode;
+import org.apache.asterix.object.base.AdmBigIntNode;
+import org.apache.asterix.object.base.AdmBooleanNode;
+import org.apache.asterix.object.base.AdmDoubleNode;
+import org.apache.asterix.object.base.AdmNullNode;
+import org.apache.asterix.object.base.AdmObjectNode;
+import org.apache.asterix.object.base.AdmStringNode;
+import org.apache.asterix.object.base.IAdmNode;
+import org.apache.asterix.om.pointables.nonvisitor.AListPointable;
+import org.apache.asterix.om.pointables.nonvisitor.ARecordPointable;
+import org.apache.asterix.om.types.AOrderedListType;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.hyracks.data.std.primitive.BooleanPointable;
+import org.apache.hyracks.data.std.primitive.DoublePointable;
+import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class AdmNodeUtils {
+
+    private AdmNodeUtils() {
+    }
+
+    public static Map<String, IAdmNode> getOpenFields(ARecordPointable 
recPointable, ARecordType recordType)
+            throws IOException {
+        int openFieldCount = recPointable.getOpenFieldCount(recordType);
+        Map<String, IAdmNode> map = (openFieldCount == 0) ? 
Collections.emptyMap() : new HashMap<>();
+        for (int i = 0; i < openFieldCount; i++) {
+            map.put(recPointable.getOpenFieldName(recordType, i), 
getOpenField(recPointable, recordType, i));
+        }
+        return map;
+    }
+
+    private static IAdmNode getOpenField(ARecordPointable recPointable, 
ARecordType type, int i) throws IOException {
+        byte tagByte = recPointable.getOpenFieldTag(type, i);
+        ATypeTag tag = ATypeTag.VALUE_TYPE_MAPPING[tagByte];
+        switch (tag) {
+            case ARRAY:
+                return getOpenFieldAsArray(recPointable, type, i);
+            case BIGINT:
+                return new 
AdmBigIntNode(LongPointable.getLong(recPointable.getByteArray(),
+                        recPointable.getOpenFieldValueOffset(type, i) + 1));
+            case BOOLEAN:
+                return 
AdmBooleanNode.get(BooleanPointable.getBoolean(recPointable.getByteArray(),
+                        recPointable.getOpenFieldValueOffset(type, i) + 1));
+            case DOUBLE:
+                return new 
AdmDoubleNode(DoublePointable.getDouble(recPointable.getByteArray(),
+                        recPointable.getOpenFieldValueOffset(type, i) + 1));
+            case NULL:
+                return AdmNullNode.INSTANCE;
+            case OBJECT:
+                return getOpenFieldAsObject(recPointable, type, i);
+            case STRING:
+                UTF8StringPointable str = 
UTF8StringPointable.FACTORY.createPointable();
+                str.set(recPointable.getByteArray(), 
recPointable.getOpenFieldValueOffset(type, i) + 1,
+                        recPointable.getOpenFieldValueSize(type, i) - 1);
+                return new AdmStringNode(str.toString());
+            default:
+                throw new UnsupportedOperationException("Unsupported item 
type: " + tag);
+        }
+    }
+
+    private static AdmObjectNode getOpenFieldAsObject(ARecordPointable 
recPointable, ARecordType type, int i)
+            throws IOException {
+        ARecordPointable pointable = 
ARecordPointable.FACTORY.createPointable();
+        int offset = recPointable.getOpenFieldValueOffset(type, i);
+        int len = recPointable.getOpenFieldValueSize(type, i);
+        pointable.set(recPointable.getByteArray(), offset, len);
+        return new AdmObjectNode(getOpenFields(pointable, 
RecordUtil.FULLY_OPEN_RECORD_TYPE));
+    }
+
+    private static AdmArrayNode getOpenFieldAsArray(ARecordPointable 
recPointable, ARecordType type, int i)
+            throws IOException {
+        AListPointable pointable = AListPointable.FACTORY.createPointable();
+        int offset = recPointable.getOpenFieldValueOffset(type, i);
+        int len = recPointable.getOpenFieldValueSize(type, i);
+        pointable.set(recPointable.getByteArray(), offset, len);
+        return getAsAdmNode(pointable);
+    }
+
+    public static AdmArrayNode getAsAdmNode(AListPointable listPointable) 
throws IOException {
+        int count = listPointable.getItemCount();
+        AdmArrayNode node = new AdmArrayNode(count);
+        for (int i = 0; i < count; i++) {
+            byte tagByte = 
listPointable.getItemTag(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i);
+            ATypeTag itemTag = ATypeTag.VALUE_TYPE_MAPPING[tagByte];
+            switch (itemTag) {
+                case ARRAY:
+                    node.add(getOpenFieldAsArray(listPointable, i));
+                    break;
+                case BIGINT:
+                    node.add(new 
AdmBigIntNode(LongPointable.getLong(listPointable.getByteArray(),
+                            
listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i) + 
1)));
+                    break;
+                case BOOLEAN:
+                    
node.add(AdmBooleanNode.get(BooleanPointable.getBoolean(listPointable.getByteArray(),
+                            
listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i) + 
1)));
+                    break;
+                case DOUBLE:
+                    node.add(new 
AdmDoubleNode(DoublePointable.getDouble(listPointable.getByteArray(),
+                            
listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i) + 
1)));
+                    break;
+                case NULL:
+                    node.add(AdmNullNode.INSTANCE);
+                    break;
+                case OBJECT:
+                    node.add(getOpenFieldAsObject(listPointable, i));
+                    break;
+                case STRING:
+                    UTF8StringPointable str = 
UTF8StringPointable.FACTORY.createPointable();
+                    str.set(listPointable.getByteArray(),
+                            
listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i) + 1,
+                            
listPointable.getItemSize(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i));
+                    node.add(new AdmStringNode(str.toString()));
+                    break;
+                default:
+                    throw new UnsupportedOperationException("Unsupported item 
type: " + itemTag);
+            }
+        }
+        return node;
+    }
+
+    private static IAdmNode getOpenFieldAsObject(AListPointable listPointable, 
int i) throws IOException {
+        ARecordPointable pointable = 
ARecordPointable.FACTORY.createPointable();
+        int offset = 
listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i);
+        int len = 
listPointable.getItemSize(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i);
+        pointable.set(listPointable.getByteArray(), offset, len);
+        return new AdmObjectNode(AdmNodeUtils.getOpenFields(pointable, 
RecordUtil.FULLY_OPEN_RECORD_TYPE));
+    }
+
+    private static AdmArrayNode getOpenFieldAsArray(AListPointable 
listPointable, int i) throws IOException {
+        AListPointable pointable = AListPointable.FACTORY.createPointable();
+        int offset = 
listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i);
+        int len = 
listPointable.getItemSize(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i);
+        pointable.set(listPointable.getByteArray(), offset, len);
+        return getAsAdmNode(pointable);
+    }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java
index 05417a8..2e21048 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java
@@ -19,6 +19,7 @@
 package org.apache.hyracks.data.std.api;
 
 public abstract class AbstractPointable implements IPointable {
+
     protected byte[] bytes;
 
     protected int start;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java
index 5294d17..aee3047 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java
@@ -23,7 +23,7 @@ import java.io.Serializable;
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
 
 public interface IPointableFactory extends Serializable {
-    public IPointable createPointable();
+    IPointable createPointable();
 
-    public ITypeTraits getTypeTraits();
+    ITypeTraits getTypeTraits();
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
index bd18ea0..ea6086d 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
@@ -26,7 +26,6 @@ import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.api.IPointableFactory;
 
 public final class BooleanPointable extends AbstractPointable implements 
IHashable, IComparable {
-
     public static final BooleanPointableFactory FACTORY = new 
BooleanPointableFactory();
 
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
@@ -47,11 +46,11 @@ public final class BooleanPointable extends 
AbstractPointable implements IHashab
         private static final long serialVersionUID = 1L;
 
         @Override
-        public IPointable createPointable() {
+        public BooleanPointable createPointable() {
             return new BooleanPointable();
         }
 
-        public IPointable createPointable(boolean value) {
+        public BooleanPointable createPointable(boolean value) {
             BooleanPointable pointable = new BooleanPointable();
             pointable.setBoolean(value);
             return pointable;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
index 5b623e7..9e81083 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
@@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.api.IPointableFactory;
 
 public final class BytePointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
+
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
         private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
index 3464a9f..16294b3 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
@@ -27,14 +27,15 @@ import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.api.IPointableFactory;
 
 public final class DoublePointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
-    private final static double machineEpsilon;
-    static {
-        float epsilon = 1.0f;
 
+    private static final double MACHINE_EPSILON = getMachineEpsilon();
+
+    private static double getMachineEpsilon() {
+        float epsilon = 1.0f;
         do {
             epsilon /= 2.0f;
         } while ((float) (1.0 + (epsilon / 2.0)) != 1.0);
-        machineEpsilon = epsilon;
+        return epsilon;
     }
 
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
@@ -150,6 +151,6 @@ public final class DoublePointable extends 
AbstractPointable implements IHashabl
     }
 
     public static double getEpsilon() {
-        return machineEpsilon;
+        return MACHINE_EPSILON;
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
index b0f686f..4cb298f 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
@@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.api.IPointableFactory;
 
 public final class FloatPointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
+
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
         private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
index a3b9f44..03aaa97 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
@@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.api.IPointableFactory;
 
 public final class IntegerPointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
+
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
         private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java
index 70bac4d..f75db9d 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java
@@ -32,6 +32,7 @@ import org.apache.hyracks.util.string.UTF8StringUtil;
  * But it works for single-byte character languages.
  */
 public final class RawUTF8StringPointable extends AbstractPointable implements 
IHashable, IComparable {
+
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
         private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
index 70ad44c..55e6201 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
@@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.api.IPointableFactory;
 
 public final class ShortPointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
+
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
         private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java
index 7acd32c..dcb1e75 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java
@@ -20,29 +20,33 @@ import org.apache.hyracks.api.dataflow.value.ITypeTraits;
 import org.apache.hyracks.data.std.api.AbstractPointable;
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.api.IPointableFactory;
-import org.apache.hyracks.data.std.primitive.BytePointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
 
 public class TaggedValuePointable extends AbstractPointable {
-    public static final IPointableFactory FACTORY = new IPointableFactory() {
+    public static final TaggedValuePointableFactory FACTORY = new 
TaggedValuePointableFactory();
+
+    public byte getTag() {
+        return BytePointable.getByte(bytes, start);
+    }
+
+    public void getValue(IPointable value) {
+        value.set(bytes, start + 1, length - 1);
+    }
+
+    public static final class TaggedValuePointableFactory implements 
IPointableFactory {
         private static final long serialVersionUID = 1L;
 
+        private TaggedValuePointableFactory() {
+        }
+
         @Override
         public ITypeTraits getTypeTraits() {
             return VoidPointable.TYPE_TRAITS;
         }
 
         @Override
-        public IPointable createPointable() {
+        public TaggedValuePointable createPointable() {
             return new TaggedValuePointable();
         }
-    };
-
-    public byte getTag() {
-        return BytePointable.getByte(bytes, start);
-    }
 
-    public void getValue(IPointable value) {
-        value.set(bytes, start + 1, length - 1);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java
index 6e4810c..57d704f 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java
@@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointableFactory;
 import org.apache.hyracks.util.string.UTF8StringUtil;
 
 public final class UTF8StringLowercasePointable extends AbstractPointable 
implements IHashable, IComparable {
+
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
         private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java
index 66c1ab9..01af13e 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java
@@ -29,6 +29,7 @@ import org.apache.hyracks.util.string.UTF8StringUtil;
  * Instead, the length of this string is provided as a parameter.
  */
 public final class UTF8StringLowercaseTokenPointable extends AbstractPointable 
implements IHashable, IComparable {
+
     public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() {
         private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
index 376307d..518e688 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
@@ -70,11 +70,16 @@ public final class UTF8StringPointable extends 
AbstractPointable implements IHas
         }
     };
 
-    public static final IPointableFactory FACTORY = new IPointableFactory() {
+    public static final UTF8StringPointableFactory FACTORY = new 
UTF8StringPointableFactory();
+
+    public static class UTF8StringPointableFactory implements 
IPointableFactory {
         private static final long serialVersionUID = 1L;
 
+        private UTF8StringPointableFactory() {
+        }
+
         @Override
-        public IPointable createPointable() {
+        public UTF8StringPointable createPointable() {
             return new UTF8StringPointable();
         }
 

Reply via email to