You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by ti...@apache.org on 2018/03/11 00:21:30 UTC

[3/3] asterixdb git commit: [NO ISSUE][EXT] Java UDF framework refactoring

[NO ISSUE][EXT] Java UDF framework refactoring

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

Details:
1. Separated the JObjects and its subtypes.
2. Add JBuiltinTypes so we don't have to create an object to get JType.
3. Dead code removal.
4. Memory usage optimization in JRecord Serialization.
5. Several fixes about incomplete type implementations in Java UDF and
getting JObjects in UDF examples.

Change-Id: I3b648191b73fe4aad4f2a6ba1c2066c872fa16a9
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2405
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <je...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <je...@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/bb49e5e3
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/bb49e5e3
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/bb49e5e3

Branch: refs/heads/master
Commit: bb49e5e391cf9dc3e9d3a081bf238277fe748a17
Parents: c49e25e
Author: Xikui Wang <xk...@gmail.com>
Authored: Fri Mar 9 10:25:48 2018 -0800
Committer: Till Westmann <ti...@apache.org>
Committed: Sat Mar 10 16:21:00 2018 -0800

----------------------------------------------------------------------
 .../apache/asterix/external/api/IJObject.java   |   10 +-
 .../asterix/external/api/IJRecordAccessor.java  |    4 +-
 .../org/apache/asterix/external/api/IJType.java |    7 +-
 .../external/library/ExternalFunction.java      |   10 -
 .../external/library/JTypeObjectFactory.java    |   53 +-
 .../external/library/JavaFunctionHelper.java    |    9 +-
 .../external/library/ResultCollector.java       |  135 --
 .../external/library/java/JBuiltinType.java     |  165 +++
 .../external/library/java/JObjectAccessors.java |   75 +-
 .../library/java/JObjectPointableVisitor.java   |    1 -
 .../external/library/java/JObjectUtil.java      |  427 -------
 .../asterix/external/library/java/JObjects.java | 1202 ------------------
 .../asterix/external/library/java/JTypeTag.java |    1 -
 .../ByteArrayAccessibleDataInputStream.java     |   33 +
 .../base/ByteArrayAccessibleInputStream.java    |   48 +
 .../external/library/java/base/JBoolean.java    |   68 +
 .../external/library/java/base/JByte.java       |   60 +
 .../external/library/java/base/JCircle.java     |   65 +
 .../external/library/java/base/JDate.java       |   59 +
 .../external/library/java/base/JDateTime.java   |   59 +
 .../external/library/java/base/JDouble.java     |   60 +
 .../external/library/java/base/JDuration.java   |   60 +
 .../external/library/java/base/JFloat.java      |   60 +
 .../external/library/java/base/JInt.java        |   60 +
 .../external/library/java/base/JInterval.java   |   67 +
 .../external/library/java/base/JLine.java       |   69 +
 .../external/library/java/base/JList.java       |   62 +
 .../external/library/java/base/JLong.java       |   60 +
 .../external/library/java/base/JMissing.java    |   53 +
 .../external/library/java/base/JNull.java       |   59 +
 .../external/library/java/base/JObject.java     |   56 +
 .../library/java/base/JOrderedList.java         |   85 ++
 .../external/library/java/base/JPoint.java      |   74 ++
 .../external/library/java/base/JPoint3D.java    |   67 +
 .../external/library/java/base/JPolygon.java    |   73 ++
 .../external/library/java/base/JRecord.java     |  198 +++
 .../external/library/java/base/JRectangle.java  |   64 +
 .../external/library/java/base/JShort.java      |   60 +
 .../external/library/java/base/JString.java     |   60 +
 .../external/library/java/base/JTime.java       |   59 +
 .../library/java/base/JUnorderedList.java       |   90 ++
 .../external/library/AddHashTagsFunction.java   |   15 +-
 .../library/AddHashTagsInPlaceFunction.java     |   11 +-
 .../external/library/AllTypesFunction.java      |   37 +-
 .../external/library/CapitalFinderFunction.java |    7 +-
 .../external/library/EchoDelayFunction.java     |    2 +-
 .../library/KeywordsDetectorFunction.java       |   12 +-
 .../external/library/ParseTweetFunction.java    |   12 +-
 .../asterix/external/library/SumFunction.java   |    2 +-
 .../external/library/UpperCaseFunction.java     |    6 +-
 .../serde/ARecordSerializerDeserializer.java    |    4 +-
 51 files changed, 2185 insertions(+), 1910 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJObject.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJObject.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJObject.java
index 250e4fa..9ea400e 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJObject.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJObject.java
@@ -21,16 +21,16 @@ package org.apache.asterix.external.api;
 import java.io.DataOutput;
 
 import org.apache.asterix.om.base.IAObject;
-import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.IAType;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public interface IJObject {
 
-    public ATypeTag getTypeTag();
+    IAType getIAType();
 
-    public IAObject getIAObject();
+    IAObject getIAObject();
 
-    public void serialize(DataOutput dataOutput, boolean writeTypeTag) throws HyracksDataException;
+    void serialize(DataOutput dataOutput, boolean writeTypeTag) throws HyracksDataException;
 
-    public void reset() throws HyracksDataException;
+    void reset() throws HyracksDataException;
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJRecordAccessor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJRecordAccessor.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJRecordAccessor.java
index 08c5dde..6a5f8fb 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJRecordAccessor.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJRecordAccessor.java
@@ -19,7 +19,7 @@
 package org.apache.asterix.external.api;
 
 import org.apache.asterix.external.library.java.JObjectPointableVisitor;
-import org.apache.asterix.external.library.java.JObjects.JRecord;
+import org.apache.asterix.external.library.java.base.JRecord;
 import org.apache.asterix.om.pointables.ARecordVisitablePointable;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.IAType;
@@ -28,7 +28,7 @@ import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public interface IJRecordAccessor {
 
-    public JRecord access(ARecordVisitablePointable pointable, IObjectPool<IJObject, IAType> objectPool,
+    JRecord access(ARecordVisitablePointable pointable, IObjectPool<IJObject, IAType> objectPool,
             ARecordType recordType, JObjectPointableVisitor pointableVisitor) throws HyracksDataException;
 
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJType.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJType.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJType.java
index 9c0ebae..adabf0f 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJType.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IJType.java
@@ -18,12 +18,9 @@
  */
 package org.apache.asterix.external.api;
 
-import org.apache.asterix.om.base.IAObject;
-import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.IAType;
 
 public interface IJType {
 
-    public ATypeTag getTypeTag();
-
-    public IAObject getIAObject();
+    IAType getIAType();
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java
index 3866665..c5b9ad6 100755
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java
@@ -27,7 +27,6 @@ import org.apache.asterix.common.library.ILibraryManager;
 import org.apache.asterix.external.api.IExternalFunction;
 import org.apache.asterix.external.api.IFunctionFactory;
 import org.apache.asterix.external.api.IFunctionHelper;
-import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.om.functions.IExternalFunctionInfo;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.EnumDeserializer;
@@ -36,7 +35,6 @@ import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
@@ -83,14 +81,6 @@ public abstract class ExternalFunction implements IExternalFunction {
         }
     }
 
-    public static ISerializerDeserializer<?> getSerDe(Object typeInfo) {
-        return SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(typeInfo);
-    }
-
-    public IExternalFunctionInfo getFinfo() {
-        return finfo;
-    }
-
     public void setArguments(IFrameTupleReference tuple) throws AlgebricksException, IOException {
         for (int i = 0; i < evaluatorFactories.length; i++) {
             argumentEvaluators[i].evaluate(tuple, inputVal);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java
index bc53f0b..f30b940 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java
@@ -19,27 +19,28 @@
 package org.apache.asterix.external.library;
 
 import org.apache.asterix.external.api.IJObject;
-import org.apache.asterix.external.library.java.JObjects;
-import org.apache.asterix.external.library.java.JObjects.JBoolean;
-import org.apache.asterix.external.library.java.JObjects.JCircle;
-import org.apache.asterix.external.library.java.JObjects.JDate;
-import org.apache.asterix.external.library.java.JObjects.JDateTime;
-import org.apache.asterix.external.library.java.JObjects.JDouble;
-import org.apache.asterix.external.library.java.JObjects.JDuration;
-import org.apache.asterix.external.library.java.JObjects.JFloat;
-import org.apache.asterix.external.library.java.JObjects.JInt;
-import org.apache.asterix.external.library.java.JObjects.JInterval;
-import org.apache.asterix.external.library.java.JObjects.JLine;
-import org.apache.asterix.external.library.java.JObjects.JLong;
-import org.apache.asterix.external.library.java.JObjects.JOrderedList;
-import org.apache.asterix.external.library.java.JObjects.JPoint;
-import org.apache.asterix.external.library.java.JObjects.JPoint3D;
-import org.apache.asterix.external.library.java.JObjects.JPolygon;
-import org.apache.asterix.external.library.java.JObjects.JRecord;
-import org.apache.asterix.external.library.java.JObjects.JRectangle;
-import org.apache.asterix.external.library.java.JObjects.JString;
-import org.apache.asterix.external.library.java.JObjects.JTime;
-import org.apache.asterix.external.library.java.JObjects.JUnorderedList;
+import org.apache.asterix.external.library.java.base.JBoolean;
+import org.apache.asterix.external.library.java.base.JCircle;
+import org.apache.asterix.external.library.java.base.JDate;
+import org.apache.asterix.external.library.java.base.JDateTime;
+import org.apache.asterix.external.library.java.base.JDouble;
+import org.apache.asterix.external.library.java.base.JDuration;
+import org.apache.asterix.external.library.java.base.JFloat;
+import org.apache.asterix.external.library.java.base.JInt;
+import org.apache.asterix.external.library.java.base.JInterval;
+import org.apache.asterix.external.library.java.base.JLine;
+import org.apache.asterix.external.library.java.base.JLong;
+import org.apache.asterix.external.library.java.base.JMissing;
+import org.apache.asterix.external.library.java.base.JNull;
+import org.apache.asterix.external.library.java.base.JOrderedList;
+import org.apache.asterix.external.library.java.base.JPoint;
+import org.apache.asterix.external.library.java.base.JPoint3D;
+import org.apache.asterix.external.library.java.base.JPolygon;
+import org.apache.asterix.external.library.java.base.JRecord;
+import org.apache.asterix.external.library.java.base.JRectangle;
+import org.apache.asterix.external.library.java.base.JString;
+import org.apache.asterix.external.library.java.base.JTime;
+import org.apache.asterix.external.library.java.base.JUnorderedList;
 import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.AUnionType;
@@ -110,22 +111,20 @@ public class JTypeObjectFactory implements IObjectFactory<IJObject, IAType> {
                 retValue = new JLong(0);
                 break;
             case NULL:
-                retValue = JObjects.JNull.INSTANCE;
+                retValue = JNull.INSTANCE;
                 break;
             case MISSING:
-                retValue = JObjects.JMissing.INSTANCE;
+                retValue = JMissing.INSTANCE;
                 break;
             case ARRAY:
                 AOrderedListType ot = (AOrderedListType) type;
                 IAType orderedItemType = ot.getItemType();
-                IJObject orderedItemObject = create(orderedItemType);
-                retValue = new JOrderedList(orderedItemObject);
+                retValue = new JOrderedList(orderedItemType);
                 break;
             case MULTISET:
                 AUnorderedListType ut = (AUnorderedListType) type;
                 IAType unorderedItemType = ut.getItemType();
-                IJObject unorderedItemObject = create(unorderedItemType);
-                retValue = new JUnorderedList(unorderedItemObject);
+                retValue = new JUnorderedList(unorderedItemType);
                 break;
             case OBJECT:
                 IAType[] fieldTypes = ((ARecordType) type).getFieldTypes();

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
index a250b4c..a264485 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
@@ -29,8 +29,7 @@ import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.external.api.IFunctionHelper;
 import org.apache.asterix.external.api.IJObject;
 import org.apache.asterix.external.library.java.JObjectPointableVisitor;
-import org.apache.asterix.external.library.java.JObjects;
-import org.apache.asterix.external.library.java.JObjects.JNull;
+import org.apache.asterix.external.library.java.base.JNull;
 import org.apache.asterix.external.library.java.JTypeTag;
 import org.apache.asterix.om.functions.IExternalFunctionInfo;
 import org.apache.asterix.om.pointables.AFlatValuePointable;
@@ -38,7 +37,6 @@ import org.apache.asterix.om.pointables.AListVisitablePointable;
 import org.apache.asterix.om.pointables.ARecordVisitablePointable;
 import org.apache.asterix.om.pointables.PointableAllocator;
 import org.apache.asterix.om.pointables.base.IVisitablePointable;
-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.container.IObjectPool;
@@ -95,12 +93,9 @@ public class JavaFunctionHelper implements IFunctionHelper {
     }
 
     private boolean checkInvalidReturnValueType(IJObject result, IAType expectedType) {
-        if (expectedType.getTypeTag() != result.getTypeTag()) {
+        if (!expectedType.deepEqual(result.getIAType())) {
             return true;
         }
-        if (expectedType.getTypeTag() == ATypeTag.OBJECT) {
-            return !expectedType.getTypeName().equals(((JObjects.JRecord) result).getRecordType().getTypeName());
-        }
         return false;
     }
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ResultCollector.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ResultCollector.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ResultCollector.java
deleted file mode 100755
index 7d8b504..0000000
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ResultCollector.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * 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.external.library;
-
-import java.io.DataOutput;
-
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.external.api.IResultCollector;
-import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
-import org.apache.asterix.om.base.AMutableDouble;
-import org.apache.asterix.om.base.AMutableFloat;
-import org.apache.asterix.om.base.AMutableInt32;
-import org.apache.asterix.om.base.AMutableOrderedList;
-import org.apache.asterix.om.base.AMutableRecord;
-import org.apache.asterix.om.base.AMutableString;
-import org.apache.asterix.om.base.AOrderedList;
-import org.apache.asterix.om.base.ARecord;
-import org.apache.asterix.om.base.IAObject;
-import org.apache.asterix.om.functions.IExternalFunctionInfo;
-import org.apache.asterix.om.types.AOrderedListType;
-import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.om.types.IAType;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IDataOutputProvider;
-
-public class ResultCollector implements IResultCollector {
-
-    private IAObject reusableResultObjectHolder;
-    private IDataOutputProvider outputProvider;
-    private IExternalFunctionInfo finfo;
-
-    public ResultCollector(IExternalFunctionInfo finfo, IDataOutputProvider outputProvider) {
-        this.finfo = finfo;
-        IAType returnType = finfo.getReturnType();
-        reusableResultObjectHolder = allocateResultObjectHolder(returnType);
-        this.outputProvider = outputProvider;
-    }
-
-    private IAObject allocateResultObjectHolder(IAType type) {
-        switch (type.getTypeTag()) {
-            case INTEGER:
-                return new AMutableInt32(0);
-            case FLOAT:
-                return new AMutableFloat(0f);
-            case DOUBLE:
-                return new AMutableDouble(0);
-            case STRING:
-                return new AMutableString("");
-            case ARRAY:
-                return new AMutableOrderedList((AOrderedListType) type);
-            case OBJECT:
-                IAType[] fieldType = ((ARecordType) type).getFieldTypes();
-                IAObject[] fieldObjects = new IAObject[fieldType.length];
-                for (int i = 0; i < fieldType.length; i++) {
-                    fieldObjects[i] = allocateResultObjectHolder(fieldType[i]);
-                }
-                return new AMutableRecord((ARecordType) type, fieldObjects);
-            default:
-                break;
-        }
-        return null;
-    }
-
-    @Override
-    public void writeDoubleResult(double result) throws AsterixException {
-        ((AMutableDouble) reusableResultObjectHolder).setValue(result);
-        serializeResult(reusableResultObjectHolder);
-    }
-
-    @Override
-    public void writeFloatResult(float result) throws AsterixException {
-        ((AMutableDouble) reusableResultObjectHolder).setValue(result);
-        serializeResult(reusableResultObjectHolder);
-    }
-
-    @Override
-    public void writeIntResult(int result) throws AsterixException {
-        ((AMutableInt32) reusableResultObjectHolder).setValue(result);
-        serializeResult(reusableResultObjectHolder);
-    }
-
-    @Override
-    public void writeStringResult(String result) throws AsterixException {
-        ((AMutableString) reusableResultObjectHolder).setValue(result);
-        serializeResult(reusableResultObjectHolder);
-
-    }
-
-    @Override
-    public void writeRecordResult(ARecord result) throws AsterixException {
-        serializeResult(result);
-    }
-
-    @Override
-    public void writeListResult(AOrderedList list) throws AsterixException {
-        serializeResult(list);
-    }
-
-    @Override
-    public IAObject getComplexTypeResultHolder() {
-        return reusableResultObjectHolder;
-    }
-
-    @SuppressWarnings("unchecked")
-    private void serializeResult(IAObject object) throws AsterixException {
-        try {
-            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(finfo.getReturnType())
-                    .serialize(reusableResultObjectHolder, outputProvider.getDataOutput());
-        } catch (HyracksDataException hde) {
-            throw new AsterixException(hde);
-        }
-    }
-
-    @Override
-    public DataOutput getDataOutput() {
-        return outputProvider.getDataOutput();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JBuiltinType.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JBuiltinType.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JBuiltinType.java
new file mode 100644
index 0000000..7d28ac4
--- /dev/null
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JBuiltinType.java
@@ -0,0 +1,165 @@
+/*
+ * 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.external.library.java;
+
+import org.apache.asterix.external.api.IJType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+
+public abstract class JBuiltinType implements IJType {
+
+    private JBuiltinType() {
+        // no op
+    }
+
+    public static final JBuiltinType JBOOLEAN = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ABOOLEAN;
+        }
+    };
+
+    public static final JBuiltinType JBYTE = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.AINT8;
+        }
+    };
+    public static final JBuiltinType JCIRCLE = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ACIRCLE;
+        }
+    };
+    public static final JBuiltinType JDATE = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ADATE;
+        }
+    };
+    public static final JBuiltinType JDATETIME = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ADATETIME;
+        }
+    };
+
+    public static final JBuiltinType JDOUBLE = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ADOUBLE;
+        }
+    };
+
+    public static final JBuiltinType JDURATION = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ADURATION;
+        }
+    };
+
+    public static final JBuiltinType JFLOAT = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.AFLOAT;
+        }
+    };
+
+    public static final JBuiltinType JINT = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.AINT32;
+        }
+    };
+
+    public static final JBuiltinType JINTERVAL = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.AINTERVAL;
+        }
+    };
+
+    public static final JBuiltinType JLINE = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ALINE;
+        }
+    };
+    public static final JBuiltinType JLONG = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.AINT64;
+        }
+    };
+    public static final JBuiltinType JMISSING = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.AMISSING;
+        }
+    };
+    public static final JBuiltinType JNULL = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ANULL;
+        }
+    };
+    public static final JBuiltinType JPOINT = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.APOINT;
+        }
+    };
+    public static final JBuiltinType JPOINT3D = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.APOINT3D;
+        }
+    };
+    public static final JBuiltinType JPOLYGON = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.APOLYGON;
+        }
+    };
+    public static final JBuiltinType JRECTANGLE = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ARECTANGLE;
+        }
+    };
+    public static final JBuiltinType JSHORT = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.AINT16;
+        }
+    };
+    public static final JBuiltinType JSTRING = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ASTRING;
+        }
+    };
+    public static final JBuiltinType JTIME = new JBuiltinType() {
+        @Override
+        public IAType getIAType() {
+            return BuiltinType.ATIME;
+        }
+    };
+
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
index 8f35c80..0a706d1 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
@@ -49,28 +49,28 @@ import org.apache.asterix.external.api.IJObject;
 import org.apache.asterix.external.api.IJObjectAccessor;
 import org.apache.asterix.external.api.IJRecordAccessor;
 import org.apache.asterix.external.library.TypeInfo;
-import org.apache.asterix.external.library.java.JObjects.JBoolean;
-import org.apache.asterix.external.library.java.JObjects.JByte;
-import org.apache.asterix.external.library.java.JObjects.JCircle;
-import org.apache.asterix.external.library.java.JObjects.JDate;
-import org.apache.asterix.external.library.java.JObjects.JDateTime;
-import org.apache.asterix.external.library.java.JObjects.JDouble;
-import org.apache.asterix.external.library.java.JObjects.JDuration;
-import org.apache.asterix.external.library.java.JObjects.JFloat;
-import org.apache.asterix.external.library.java.JObjects.JInt;
-import org.apache.asterix.external.library.java.JObjects.JInterval;
-import org.apache.asterix.external.library.java.JObjects.JLine;
-import org.apache.asterix.external.library.java.JObjects.JList;
-import org.apache.asterix.external.library.java.JObjects.JLong;
-import org.apache.asterix.external.library.java.JObjects.JOrderedList;
-import org.apache.asterix.external.library.java.JObjects.JPoint;
-import org.apache.asterix.external.library.java.JObjects.JPoint3D;
-import org.apache.asterix.external.library.java.JObjects.JPolygon;
-import org.apache.asterix.external.library.java.JObjects.JRecord;
-import org.apache.asterix.external.library.java.JObjects.JRectangle;
-import org.apache.asterix.external.library.java.JObjects.JString;
-import org.apache.asterix.external.library.java.JObjects.JTime;
-import org.apache.asterix.external.library.java.JObjects.JUnorderedList;
+import org.apache.asterix.external.library.java.base.JBoolean;
+import org.apache.asterix.external.library.java.base.JByte;
+import org.apache.asterix.external.library.java.base.JCircle;
+import org.apache.asterix.external.library.java.base.JDate;
+import org.apache.asterix.external.library.java.base.JDateTime;
+import org.apache.asterix.external.library.java.base.JDouble;
+import org.apache.asterix.external.library.java.base.JDuration;
+import org.apache.asterix.external.library.java.base.JFloat;
+import org.apache.asterix.external.library.java.base.JInt;
+import org.apache.asterix.external.library.java.base.JInterval;
+import org.apache.asterix.external.library.java.base.JLine;
+import org.apache.asterix.external.library.java.base.JList;
+import org.apache.asterix.external.library.java.base.JLong;
+import org.apache.asterix.external.library.java.base.JOrderedList;
+import org.apache.asterix.external.library.java.base.JPoint;
+import org.apache.asterix.external.library.java.base.JPoint3D;
+import org.apache.asterix.external.library.java.base.JPolygon;
+import org.apache.asterix.external.library.java.base.JRecord;
+import org.apache.asterix.external.library.java.base.JRectangle;
+import org.apache.asterix.external.library.java.base.JString;
+import org.apache.asterix.external.library.java.base.JTime;
+import org.apache.asterix.external.library.java.base.JUnorderedList;
 import org.apache.asterix.om.base.ACircle;
 import org.apache.asterix.om.base.ADuration;
 import org.apache.asterix.om.base.ALine;
@@ -147,6 +147,21 @@ public class JObjectAccessors {
             case DURATION:
                 accessor = new JDurationAccessor();
                 break;
+            case INTERVAL:
+                accessor = new JIntervalAccessor();
+                break;
+            case CIRCLE:
+                accessor = new JCircleAccessor();
+                break;
+            case POLYGON:
+                accessor = new JPolygonAccessor();
+                break;
+            case RECTANGLE:
+                accessor = new JRectangleAccessor();
+                break;
+            case TIME:
+                accessor = new JTimeAccessor();
+                break;
             case NULL:
                 accessor = new JNullAccessor();
                 break;
@@ -272,16 +287,14 @@ public class JObjectAccessors {
             int s = pointable.getStartOffset();
             int l = pointable.getLength();
 
-            String v = null;
+            String v;
             try {
                 v = reader.readUTF(new DataInputStream(new ByteArrayInputStream(b, s + 1, l - 1)));
             } catch (IOException e) {
                 throw HyracksDataException.create(e);
             }
-            JObjectUtil.getNormalizedString(v);
-
             IJObject jObject = objectPool.allocate(BuiltinType.ASTRING);
-            ((JString) jObject).setValue(JObjectUtil.getNormalizedString(v));
+            ((JString) jObject).setValue(v);
             return jObject;
         }
     }
@@ -598,14 +611,4 @@ public class JObjectAccessors {
             return list;
         }
     }
-
-    public static class JUnorderedListAccessor implements IJObjectAccessor {
-
-        @Override
-        public IJObject access(IVisitablePointable pointable, IObjectPool<IJObject, IAType> objectPool)
-                throws HyracksDataException {
-            return null;
-        }
-
-    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java
index 960b346..f112ed2 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java
@@ -21,7 +21,6 @@ package org.apache.asterix.external.library.java;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.external.api.IJListAccessor;
 import org.apache.asterix.external.api.IJObject;
 import org.apache.asterix.external.api.IJObjectAccessor;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bb49e5e3/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectUtil.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectUtil.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectUtil.java
deleted file mode 100644
index 5bc1ec2..0000000
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectUtil.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * 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.external.library.java;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.RuntimeDataException;
-import org.apache.asterix.dataflow.data.nontagged.serde.AStringSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.SerializerDeserializerUtil;
-import org.apache.asterix.external.api.IJObject;
-import org.apache.asterix.external.library.java.JObjects.ByteArrayAccessibleDataInputStream;
-import org.apache.asterix.external.library.java.JObjects.JBoolean;
-import org.apache.asterix.external.library.java.JObjects.JCircle;
-import org.apache.asterix.external.library.java.JObjects.JDate;
-import org.apache.asterix.external.library.java.JObjects.JDateTime;
-import org.apache.asterix.external.library.java.JObjects.JDouble;
-import org.apache.asterix.external.library.java.JObjects.JDuration;
-import org.apache.asterix.external.library.java.JObjects.JFloat;
-import org.apache.asterix.external.library.java.JObjects.JInt;
-import org.apache.asterix.external.library.java.JObjects.JInterval;
-import org.apache.asterix.external.library.java.JObjects.JLine;
-import org.apache.asterix.external.library.java.JObjects.JOrderedList;
-import org.apache.asterix.external.library.java.JObjects.JPoint;
-import org.apache.asterix.external.library.java.JObjects.JPoint3D;
-import org.apache.asterix.external.library.java.JObjects.JPolygon;
-import org.apache.asterix.external.library.java.JObjects.JRecord;
-import org.apache.asterix.external.library.java.JObjects.JRectangle;
-import org.apache.asterix.external.library.java.JObjects.JString;
-import org.apache.asterix.external.library.java.JObjects.JTime;
-import org.apache.asterix.external.library.java.JObjects.JUnorderedList;
-import org.apache.asterix.om.base.APoint;
-import org.apache.asterix.om.types.AOrderedListType;
-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.AUnorderedListType;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.EnumDeserializer;
-import org.apache.asterix.om.types.IAType;
-import org.apache.asterix.om.util.container.IObjectPool;
-import org.apache.asterix.om.utils.NonTaggedFormatUtil;
-
-public class JObjectUtil {
-
-    /**
-     * Normalize an input string by removing linebreaks, and replace them with space
-     * Also remove non-readable special characters
-     *
-     * @param originalString
-     *            The input String
-     * @return
-     *         String - the normalized string
-     */
-    public static String getNormalizedString(String originalString) {
-        int len = originalString.length();
-        char asciiBuff[] = new char[len];
-        int j = 0;
-        for (int i = 0; i < len; i++) {
-            char c = originalString.charAt(i);
-            if (c == '\n' || c == '\t' || c == '\r') {
-                asciiBuff[j] = ' ';
-                j++;
-            } else if (c > 0 && c <= 0x7f) {
-                asciiBuff[j] = c;
-                j++;
-            }
-        }
-
-        return new String(asciiBuff).trim();
-    }
-
-    public static IJObject getJType(ATypeTag typeTag, IAType type, ByteArrayAccessibleDataInputStream dis,
-            IObjectPool<IJObject, IAType> objectPool) throws IOException {
-        IJObject jObject;
-
-        switch (typeTag) {
-
-            case INTEGER: {
-                int v = dis.readInt();
-                jObject = objectPool.allocate(BuiltinType.AINT32);
-                ((JInt) jObject).setValue(v);
-                break;
-            }
-
-            case FLOAT: {
-                float v = dis.readFloat();
-                jObject = objectPool.allocate(BuiltinType.AFLOAT);
-                ((JFloat) jObject).setValue(v);
-                break;
-            }
-
-            case DOUBLE: {
-                double value = dis.readDouble();
-                jObject = objectPool.allocate(BuiltinType.ADOUBLE);
-                ((JDouble) jObject).setValue(value);
-                break;
-            }
-
-            case STRING: {
-                String v = dis.readUTF();
-                jObject = objectPool.allocate(BuiltinType.ASTRING);
-                ((JString) jObject).setValue(v);
-                break;
-            }
-
-            case BOOLEAN:
-                jObject = objectPool.allocate(BuiltinType.ABOOLEAN);
-                ((JBoolean) jObject).setValue(dis.readBoolean());
-                break;
-
-            case DATE: {
-                int d = dis.readInt();
-                jObject = objectPool.allocate(BuiltinType.ADATE);
-                ((JDate) jObject).setValue(d);
-                break;
-            }
-
-            case DATETIME: {
-                jObject = objectPool.allocate(BuiltinType.ADATETIME);
-                long value = dis.readLong();
-                ((JDateTime) jObject).setValue(value);
-                break;
-            }
-
-            case DURATION: {
-                jObject = objectPool.allocate(BuiltinType.ADURATION);
-                int months = dis.readInt();
-                long msecs = dis.readLong();
-                ((JDuration) jObject).setValue(months, msecs);
-                break;
-            }
-
-            case TIME: {
-                jObject = objectPool.allocate(BuiltinType.ATIME);
-                int time = dis.readInt();
-                ((JTime) jObject).setValue(time);
-                break;
-            }
-
-            case INTERVAL: {
-                jObject = objectPool.allocate(BuiltinType.AINTERVAL);
-                long start = dis.readLong();
-                long end = dis.readLong();
-                byte intervalType = dis.readByte();
-                ((JInterval) jObject).setValue(start, end, intervalType);
-                break;
-            }
-
-            case CIRCLE: {
-                jObject = objectPool.allocate(BuiltinType.ACIRCLE);
-                double x = dis.readDouble();
-                double y = dis.readDouble();
-                double radius = dis.readDouble();
-                JPoint jpoint = (JPoint) objectPool.allocate(BuiltinType.APOINT);
-                jpoint.setValue(x, y);
-                ((JCircle) jObject).setValue(jpoint, radius);
-                break;
-            }
-
-            case POINT: {
-                jObject = objectPool.allocate(BuiltinType.APOINT);
-                double x = dis.readDouble();
-                double y = dis.readDouble();
-                ((JPoint) jObject).setValue(x, y);
-                break;
-            }
-
-            case POINT3D: {
-                jObject = objectPool.allocate(BuiltinType.APOINT3D);
-                double x = dis.readDouble();
-                double y = dis.readDouble();
-                double z = dis.readDouble();
-                ((JPoint3D) jObject).setValue(x, y, z);
-                break;
-            }
-
-            case LINE: {
-                jObject = objectPool.allocate(BuiltinType.ALINE);
-                double x1 = dis.readDouble();
-                double y1 = dis.readDouble();
-                double x2 = dis.readDouble();
-                double y2 = dis.readDouble();
-                JPoint jpoint1 = (JPoint) objectPool.allocate(BuiltinType.APOINT);
-                jpoint1.setValue(x1, y1);
-                JPoint jpoint2 = (JPoint) objectPool.allocate(BuiltinType.APOINT);
-                jpoint2.setValue(x2, y2);
-                ((JLine) jObject).setValue(jpoint1, jpoint2);
-                break;
-            }
-
-            case POLYGON: {
-                jObject = objectPool.allocate(BuiltinType.APOLYGON);
-                short numberOfPoints = dis.readShort();
-                List<JPoint> points = new ArrayList<JPoint>();
-                for (int i = 0; i < numberOfPoints; i++) {
-                    JPoint p1 = (JPoint) objectPool.allocate(BuiltinType.APOINT);
-                    p1.setValue(dis.readDouble(), dis.readDouble());
-                    points.add(p1);
-                }
-                ((JPolygon) jObject).setValue(points.toArray(new APoint[] {}));
-                break;
-            }
-
-            case RECTANGLE: {
-                jObject = objectPool.allocate(BuiltinType.ARECTANGLE);
-                double x1 = dis.readDouble();
-                double y1 = dis.readDouble();
-                double x2 = dis.readDouble();
-                double y2 = dis.readDouble();
-                JPoint jpoint1 = (JPoint) objectPool.allocate(BuiltinType.APOINT);
-                jpoint1.setValue(x1, y1);
-                JPoint jpoint2 = (JPoint) objectPool.allocate(BuiltinType.APOINT);
-                jpoint2.setValue(x2, y2);
-                ((JRectangle) jObject).setValue(jpoint1, jpoint2);
-                break;
-            }
-
-            case MULTISET: {
-                AUnorderedListType listType = (AUnorderedListType) type;
-                IAType elementType = listType.getItemType();
-                jObject = objectPool.allocate(listType);
-
-                boolean fixedSize = false;
-                ATypeTag tag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(dis.readByte());
-                switch (tag) {
-                    case STRING:
-                    case OBJECT:
-                    case ARRAY:
-                    case MULTISET:
-                    case ANY:
-                        fixedSize = false;
-                        break;
-                    default:
-                        fixedSize = true;
-                        break;
-                }
-                dis.readInt(); // list size
-                int numberOfitems;
-                numberOfitems = dis.readInt();
-                if (numberOfitems <= 0) {
-                    break;
-                }
-                if (!fixedSize) {
-                    for (int i = 0; i < numberOfitems; i++) {
-                        dis.readInt();
-                    }
-                }
-                for (int i = 0; i < numberOfitems; i++) {
-                    IJObject v = getJType(elementType.getTypeTag(), elementType, dis, objectPool);
-                    ((JUnorderedList) jObject).add(v);
-                }
-                break;
-            }
-            case ARRAY: {
-                AOrderedListType listType = (AOrderedListType) type;
-                IAType elementType = listType.getItemType();
-                jObject = objectPool.allocate(listType);
-                boolean fixedSize = false;
-                ATypeTag tag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(dis.readByte());
-                switch (tag) {
-                    case STRING:
-                    case OBJECT:
-                    case ARRAY:
-                    case MULTISET:
-                    case ANY:
-                        fixedSize = false;
-                        break;
-                    default:
-                        fixedSize = true;
-                        break;
-                }
-
-                dis.readInt(); // list size
-                int numberOfitems;
-                numberOfitems = dis.readInt();
-                if (numberOfitems <= 0) {
-                    break;
-                }
-                if (!fixedSize) {
-                    for (int i = 0; i < numberOfitems; i++) {
-                        dis.readInt();
-                    }
-                }
-                for (int i = 0; i < numberOfitems; i++) {
-                    IJObject v = getJType(elementType.getTypeTag(), elementType, dis, objectPool);
-                    ((JOrderedList) jObject).add(v);
-                }
-                break;
-            }
-            case OBJECT:
-                ARecordType recordType = (ARecordType) type;
-                int numberOfSchemaFields = recordType.getFieldTypes().length;
-                byte[] recordBits = dis.getInputStream().getArray();
-                boolean isExpanded = false;
-                dis.getInputStream();
-                int[] fieldOffsets = new int[numberOfSchemaFields];
-                IJObject[] closedFields = new IJObject[numberOfSchemaFields];
-
-                dis.skip(4); // reading length is not required.
-                if (recordType.isOpen()) {
-                    isExpanded = dis.readBoolean();
-                    if (isExpanded) {
-                        dis.readInt();
-                    } else {
-                    }
-                } else {
-                }
-
-                if (numberOfSchemaFields > 0) {
-                    dis.readInt();
-                    int nullBitMapOffset = 0;
-                    boolean hasOptionalFields = NonTaggedFormatUtil.hasOptionalField(recordType);
-                    if (hasOptionalFields) {
-                        nullBitMapOffset = dis.getInputStream().getPosition();
-                        dis.getInputStream();
-                    } else {
-                        dis.getInputStream();
-                    }
-                    for (int i = 0; i < numberOfSchemaFields; i++) {
-                        fieldOffsets[i] = dis.readInt();
-                    }
-                    for (int fieldNumber = 0; fieldNumber < numberOfSchemaFields; fieldNumber++) {
-                        if (hasOptionalFields) {
-                            byte b1 = recordBits[nullBitMapOffset + fieldNumber / 8];
-                            int p = 1 << (7 - (fieldNumber % 8));
-                            if ((b1 & p) == 0) {
-                                continue;
-                            }
-                        }
-                        IAType[] fieldTypes = recordType.getFieldTypes();
-                        ATypeTag fieldValueTypeTag = null;
-
-                        IAType fieldType = fieldTypes[fieldNumber];
-                        if (fieldTypes[fieldNumber].getTypeTag() == ATypeTag.UNION) {
-                            if (((AUnionType) fieldTypes[fieldNumber]).isUnknownableType()) {
-                                fieldType = ((AUnionType) fieldTypes[fieldNumber]).getActualType();
-                                fieldValueTypeTag = fieldType.getTypeTag();
-                            }
-                        } else {
-                            fieldValueTypeTag = fieldTypes[fieldNumber].getTypeTag();
-                        }
-                        closedFields[fieldNumber] = getJType(fieldValueTypeTag, fieldType, dis, objectPool);
-                    }
-                }
-                if (isExpanded) {
-                    int numberOfOpenFields = dis.readInt();
-                    String[] fieldNames = new String[numberOfOpenFields];
-                    IAType[] fieldTypes = new IAType[numberOfOpenFields];
-                    IJObject[] openFields = new IJObject[numberOfOpenFields];
-                    for (int i = 0; i < numberOfOpenFields; i++) {
-                        dis.readInt();
-                        dis.readInt();
-                    }
-                    for (int i = 0; i < numberOfOpenFields; i++) {
-                        fieldNames[i] = AStringSerializerDeserializer.INSTANCE.deserialize(dis).getStringValue();
-                        ATypeTag openFieldTypeTag = SerializerDeserializerUtil.deserializeTag(dis);
-                        openFields[i] = getJType(openFieldTypeTag, null, dis, objectPool);
-                        fieldTypes[i] = openFields[i].getIAObject().getType();
-                    }
-                    ARecordType openPartRecType = new ARecordType(null, fieldNames, fieldTypes, true);
-                    if (numberOfSchemaFields > 0) {
-                        ARecordType mergedRecordType = mergeRecordTypes(recordType, openPartRecType);
-                        IJObject[] mergedFields = mergeFields(closedFields, openFields);
-                        jObject = objectPool.allocate(recordType);
-                        return new JRecord(mergedRecordType, mergedFields);
-                    } else {
-                        return new JRecord(recordType, openFields);
-                    }
-                } else {
-                    return new JRecord(recordType, closedFields);
-                }
-
-            default:
-                throw new RuntimeDataException(ErrorCode.LIBRARY_JOBJECT_UTIL_ILLEGAL_ARGU_TYPE, typeTag);
-        }
-        return jObject;
-    }
-
-    private static IJObject[] mergeFields(IJObject[] closedFields, IJObject[] openFields) {
-        IJObject[] fields = new IJObject[closedFields.length + openFields.length];
-        int i = 0;
-        for (; i < closedFields.length; i++) {
-            fields[i] = closedFields[i];
-        }
-        for (int j = 0; j < openFields.length; j++) {
-            fields[closedFields.length + j] = openFields[j];
-        }
-        return fields;
-    }
-
-    private static ARecordType mergeRecordTypes(ARecordType recType1, ARecordType recType2) {
-
-        String[] fieldNames = new String[recType1.getFieldNames().length + recType2.getFieldNames().length];
-        IAType[] fieldTypes = new IAType[recType1.getFieldTypes().length + recType2.getFieldTypes().length];
-
-        int i = 0;
-        for (; i < recType1.getFieldNames().length; i++) {
-            fieldNames[i] = recType1.getFieldNames()[i];
-            fieldTypes[i] = recType1.getFieldTypes()[i];
-        }
-
-        for (int j = 0; j < recType2.getFieldNames().length; i++, j++) {
-            fieldNames[i] = recType2.getFieldNames()[j];
-            fieldTypes[i] = recType2.getFieldTypes()[j];
-        }
-        return new ARecordType(null, fieldNames, fieldTypes, true);
-    }
-}