Michael D. Blow has uploaded a new change for review.

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

Change subject: ASTERIXDB-1271: Revisit UUID Implementation
......................................................................

ASTERIXDB-1271: Revisit UUID Implementation

Updated UUID implementation to eliminate marshalling to/from a pair
of longs, replacing with byte [].

Change-Id: I9e90d42f6b62f80ad180dbd0c8c852db85b14173
---
M 
asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java
M 
asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java
M 
asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUUIDPrinter.java
M 
asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUUIDPrinter.java
M 
asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AUUIDPrinter.java
M 
asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AUUIDPrinter.java
M 
asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUUIDSerializerDeserializer.java
M asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
M asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
M 
asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
M 
asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java
11 files changed, 185 insertions(+), 276 deletions(-)


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

diff --git 
a/asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java
 
b/asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java
index d9a93ff..5630671 100644
--- 
a/asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java
+++ 
b/asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java
@@ -53,6 +53,7 @@
 import org.apache.asterix.om.util.container.IObjectPool;
 import org.apache.asterix.om.util.container.ListObjectPool;
 import org.apache.asterix.runtime.operators.file.adm.AdmLexer;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IMutableValueStorage;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -291,8 +292,7 @@
                     // Dealing with UUID type that is represented by a string
                     final String tokenImage = 
admLexer.getLastTokenImage().substring(1,
                             admLexer.getLastTokenImage().length() - 1);
-                    aUUID.fromStringToAMuatbleUUID(tokenImage);
-                    uuidSerde.serialize(aUUID, out);
+                    parseAUUID(out, tokenImage);
                 } else {
                     throw new ParseException(mismatchErrorMessage + 
objectType.getTypeName());
                 }
@@ -956,8 +956,7 @@
                 APolygonSerializerDeserializer.parse(unquoted, out);
                 return true;
             case UUID:
-                aUUID.fromStringToAMuatbleUUID(unquoted);
-                uuidSerde.serialize(aUUID, out);
+                parseAUUID(out, unquoted);
                 return true;
             default:
                 return false;
@@ -1104,6 +1103,15 @@
         int64Serde.serialize(aInt64, out);
     }
 
+    private void parseAUUID(DataOutput out, String tokenImage) throws 
HyracksDataException {
+        try {
+            aUUID.parseUUIDString(tokenImage);
+        } catch (AlgebricksException e) {
+            throw new ParseException(e);
+        }
+        uuidSerde.serialize(aUUID, out);
+    }
+
     /**
      * Resets the pools before parsing a top-level record.
      * In this way the elements in those pools can be re-used.
diff --git 
a/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java
 
b/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java
index 20b4124..420b2e2 100644
--- 
a/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java
+++ 
b/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java
@@ -93,7 +93,7 @@
     protected AMutableString aString = new AMutableString("");
     protected AMutableBinary aBinary = new AMutableBinary(null, 0, 0);
     protected AMutableString aStringFieldName = new AMutableString("");
-    protected AMutableUUID aUUID = new AMutableUUID(0, 0);
+    protected AMutableUUID aUUID = new AMutableUUID();
     // For temporal and spatial data types
     protected AMutableTime aTime = new AMutableTime(0);
     protected AMutableDateTime aDateTime = new AMutableDateTime(0L);
@@ -146,7 +146,7 @@
 
     // For UUID, we assume that the format is the string representation of UUID
     // (xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx) when parsing the data.
-    // Thus, we need to call UUID.fromStringToAMuatbleUUID() to convert it to 
the internal representation (two long values).
+    // Thus, we need to call UUID.fromStringToAMutableUUID() to convert it to 
the internal representation (byte []).
     @SuppressWarnings("unchecked")
     protected ISerializerDeserializer<AUUID> uuidSerde = 
AqlSerializerDeserializerProvider.INSTANCE
             .getSerializerDeserializer(BuiltinType.AUUID);
diff --git 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUUIDPrinter.java
 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUUIDPrinter.java
index 86cb7ac..a199300 100644
--- 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUUIDPrinter.java
+++ 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUUIDPrinter.java
@@ -36,10 +36,7 @@
 
     @Override
     public void print(byte[] b, int s, int l, PrintStream ps) throws 
AlgebricksException {
-        long msb = LongPointable.getLong(b, s + 1);
-        long lsb = LongPointable.getLong(b, s + 9);
-
-        ps.print("uuid(\"" + AUUID.toStringLiteralOnly(msb, lsb) + "\")");
+        ps.print("uuid(\"" + AUUID.toStringLiteralOnly(b, s + 1) + "\")");
     }
 
 }
diff --git 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUUIDPrinter.java
 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUUIDPrinter.java
index 967131f..783241d 100644
--- 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUUIDPrinter.java
+++ 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUUIDPrinter.java
@@ -36,10 +36,7 @@
 
     @Override
     public void print(byte[] b, int s, int l, PrintStream ps) throws 
AlgebricksException {
-        long msb = LongPointable.getLong(b, s + 1);
-        long lsb = LongPointable.getLong(b, s + 9);
-
-        ps.print("\"" + AUUID.toStringLiteralOnly(msb, lsb) + "\"");
+        ps.print("\"" + AUUID.toStringLiteralOnly(b, s + 1) + "\"");
     }
 
 }
diff --git 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AUUIDPrinter.java
 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AUUIDPrinter.java
index 20b87c2..ed5d4fe 100644
--- 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AUUIDPrinter.java
+++ 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AUUIDPrinter.java
@@ -36,10 +36,7 @@
 
     @Override
     public void print(byte[] b, int s, int l, PrintStream ps) throws 
AlgebricksException {
-        long msb = LongPointable.getLong(b, s + 1);
-        long lsb = LongPointable.getLong(b, s + 9);
-
-        ps.print("\"" + AUUID.toStringLiteralOnly(msb, lsb) + "\"");
+        ps.print("\"" + AUUID.toStringLiteralOnly(b, s + 1) + "\"");
     }
 
 }
diff --git 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AUUIDPrinter.java
 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AUUIDPrinter.java
index f21cdff..a37691b 100644
--- 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AUUIDPrinter.java
+++ 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AUUIDPrinter.java
@@ -36,10 +36,7 @@
 
     @Override
     public void print(byte[] b, int s, int l, PrintStream ps) throws 
AlgebricksException {
-        long msb = LongPointable.getLong(b, s + 1);
-        long lsb = LongPointable.getLong(b, s + 9);
-
-        ps.print("\"" + AUUID.toStringLiteralOnly(msb, lsb) + "\"");
+        ps.print("\"" + AUUID.toStringLiteralOnly(b, s + 1) + "\"");
     }
 
 }
diff --git 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUUIDSerializerDeserializer.java
 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUUIDSerializerDeserializer.java
index 8df0b0d..e47fcb7 100644
--- 
a/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUUIDSerializerDeserializer.java
+++ 
b/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUUIDSerializerDeserializer.java
@@ -19,14 +19,12 @@
 
 package org.apache.asterix.dataflow.data.nontagged.serde;
 
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
 import org.apache.asterix.om.base.AUUID;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import 
org.apache.hyracks.dataflow.common.data.marshalling.Integer64SerializerDeserializer;
+
+import java.io.DataInput;
+import java.io.DataOutput;
 
 public class AUUIDSerializerDeserializer implements 
ISerializerDeserializer<AUUID> {
 
@@ -39,20 +37,12 @@
 
     @Override
     public AUUID deserialize(DataInput in) throws HyracksDataException {
-        long msb = Integer64SerializerDeserializer.INSTANCE.deserialize(in);
-        long lsb = Integer64SerializerDeserializer.INSTANCE.deserialize(in);
-        // for each deserialization, a new object is created. maybe we should 
change this.
-        return new AUUID(msb, lsb);
+        return AUUID.readFrom(in);
     }
 
     @Override
     public void serialize(AUUID instance, DataOutput out) throws 
HyracksDataException {
-        try {
-            
Integer64SerializerDeserializer.INSTANCE.serialize(instance.getMostSignificantBits(),
 out);
-            
Integer64SerializerDeserializer.INSTANCE.serialize(instance.getLeastSignificantBits(),
 out);
-        } catch (IOException e) {
-            throw new HyracksDataException(e);
-        }
+        instance.writeTo(out);
     }
 
 }
diff --git 
a/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java 
b/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
index 48946de..1ac1b6f 100644
--- a/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
+++ b/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
@@ -19,46 +19,119 @@
 
 package org.apache.asterix.om.base;
 
-public class AMutableUUID extends AUUID {
-    private final long[] uuidBits;
-    private final byte[] randomBytes;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
-    public AMutableUUID(long msb, long lsb) {
-        super(msb, lsb);
-        randomBytes = new byte[16];
-        uuidBits = new long[2];
+import java.security.SecureRandom;
+
+public class AMutableUUID extends AUUID {
+
+    private static class Holder {
+        static final SecureRandom srnd = new SecureRandom();
+    }
+
+    public AMutableUUID() {
     }
 
     public void nextUUID() {
-        Holder.srnd.nextBytes(randomBytes);
-        uuidBitsFromBytes(uuidBits, randomBytes);
-        msb = uuidBits[0];
-        lsb = uuidBits[1];
+        Holder.srnd.nextBytes(uuidBytes);
     }
 
-    // Set the most significant bits and the least significant bits.
-    public void setValue(long msb, long lsb) {
-        this.msb = msb;
-        this.lsb = lsb;
+    public void parseUUIDString(String tokenImage) throws AlgebricksException {
+        if (tokenImage.length() != 36) {
+            throw new AlgebricksException("This is not a correct UUID value: " 
+ tokenImage);
+        }
+        byte [] hexBytes = new byte[36];
+        for (int i = 0; i < tokenImage.length(); i++) {
+            hexBytes[i] = (byte)tokenImage.charAt(i);
+        }
+        parseUUIDHexBytes(hexBytes, 0);
     }
 
-    // Since AUUID is a wrapper of java.util.uuid,
-    // we can use the same method that creates a UUID from a String.
-    public void fromStringToAMuatbleUUID(String value) {
-        String[] components = value.split("-");
-        if (components.length != 5)
-            throw new IllegalArgumentException("Invalid UUID string: " + 
value);
-        for (int i = 0; i < 5; i++)
-            components[i] = "0x" + components[i];
+    public void parseUUIDHexBytes(byte[] serString, int offset) throws 
AlgebricksException {
+        // First part - 8 bytes
+        decodeBytesFromHex(serString, offset, uuidBytes, 0, 8);
+        offset += 8;
 
-        msb = Long.decode(components[0]).longValue();
-        msb <<= 16;
-        msb |= Long.decode(components[1]).longValue();
-        msb <<= 16;
-        msb |= Long.decode(components[2]).longValue();
+        // Skip the hyphen part
+        offset += 1;
 
-        lsb = Long.decode(components[3]).longValue();
-        lsb <<= 48;
-        lsb |= Long.decode(components[4]).longValue();
+        // Second part - 4 bytes
+        decodeBytesFromHex(serString, offset, uuidBytes, 4, 4);
+        offset += 4;
+
+        // Skip the hyphen part
+        offset += 1;
+
+        // Third part - 4 bytes
+        decodeBytesFromHex(serString, offset, uuidBytes, 6, 4);
+        offset += 4;
+
+        // Skip the hyphen part
+        offset += 1;
+
+        // Fourth part - 4 bytes
+        decodeBytesFromHex(serString, offset, uuidBytes, 8, 4);
+        offset += 4;
+
+        // Skip the hyphen part
+        offset += 1;
+
+        // The last part - 12 bytes
+        decodeBytesFromHex(serString, offset, uuidBytes, 10, 12);
+    }
+
+    // Calculate a long value from a hex string.
+    private static void decodeBytesFromHex(byte[] hexArray, int 
hexArrayOffset, byte[] outputArray, int outputOffset, int length)
+            throws AlgebricksException {
+        for (int i = hexArrayOffset; i < hexArrayOffset + length; ) {
+            int hi = transformHexCharToInt(hexArray[i++]);
+            outputArray[outputOffset++] = (byte) (hi << 4 | 
transformHexCharToInt(hexArray[i++]));
+        }
+    }
+
+    // Interpret a character to the corresponding integer value.
+    private static int transformHexCharToInt(byte val) throws 
AlgebricksException {
+        switch (val) {
+            case '0':
+                return 0;
+            case '1':
+                return 1;
+            case '2':
+                return 2;
+            case '3':
+                return 3;
+            case '4':
+                return 4;
+            case '5':
+                return 5;
+            case '6':
+                return 6;
+            case '7':
+                return 7;
+            case '8':
+                return 8;
+            case '9':
+                return 9;
+            case 'a':
+            case 'A':
+                return 10;
+            case 'b':
+            case 'B':
+                return 11;
+            case 'c':
+            case 'C':
+                return 12;
+            case 'd':
+            case 'D':
+                return 13;
+            case 'e':
+            case 'E':
+                return 14;
+            case 'f':
+            case 'F':
+                return 15;
+            default:
+                throw new AlgebricksException("This is not a correct UUID 
value.");
+        }
     }
 }
diff --git a/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java 
b/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
index bb54988..f4af5f0 100644
--- a/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
+++ b/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
@@ -19,85 +19,38 @@
 
 package org.apache.asterix.om.base;
 
-import java.security.SecureRandom;
-import java.util.UUID;
-
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.visitors.IOMVisitor;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Arrays;
+
 public class AUUID implements IAObject {
 
-    protected static class Holder {
-        static final SecureRandom srnd = new SecureRandom();
-    }
+    protected final byte [] uuidBytes;
 
-    protected long msb;
-    protected long lsb;
+    protected static final char [] CHARS;
 
-    public AUUID(UUID uuid) {
-        msb = uuid.getMostSignificantBits();
-        lsb = uuid.getLeastSignificantBits();
-    }
-
-    public AUUID(long msb, long lsb) {
-        this.msb = msb;
-        this.lsb = lsb;
-    }
-
-    public long getMostSignificantBits() {
-        return msb;
-    }
-
-    public long getLeastSignificantBits() {
-        return lsb;
-    }
-
-    public static AUUID randomUUID() {
-        long[] bits = new long[2];
-        byte[] randomBytes = new byte[16];
-        Holder.srnd.nextBytes(randomBytes);
-        uuidBitsFromBytes(bits, randomBytes);
-        return new AUUID(bits[0], bits[1]);
-    }
-
-    public void generateNextRandomUUID() {
-        byte[] randomBytes = new byte[16];
-        Holder.srnd.nextBytes(randomBytes);
-        uuidBitsFromBytes(randomBytes);
-    }
-
-    protected void uuidBitsFromBytes(byte[] randomBytes) {
-        this.msb = 0;
-        this.lsb = 0;
-        randomBytes[6] &= 0x0f; /* clear version        */
-        randomBytes[6] |= 0x40; /* set to version 4     */
-        randomBytes[8] &= 0x3f; /* clear variant        */
-        randomBytes[8] |= 0x80; /* set to IETF variant  */
-        for (int i = 0; i < 8; ++i) {
-            this.msb = (this.msb << 8) | (randomBytes[i] & 0xff);
-        }
-        for (int i = 8; i < 16; ++i) {
-            this.lsb = (this.lsb << 8) | (randomBytes[i] & 0xff);
+    static {
+        CHARS = new char [16];
+        for (int i = 0; i < 16; i++) {
+            CHARS[i] = Character.forDigit(i, 16);
         }
     }
 
-    protected static void uuidBitsFromBytes(long[] bits, byte[] randomBytes) {
-        bits[0] = 0;
-        bits[1] = 0;
-        randomBytes[6] &= 0x0f; /* clear version        */
-        randomBytes[6] |= 0x40; /* set to version 4     */
-        randomBytes[8] &= 0x3f; /* clear variant        */
-        randomBytes[8] |= 0x80; /* set to IETF variant  */
-        for (int i = 0; i < 8; ++i) {
-            bits[0] = (bits[0] << 8) | (randomBytes[i] & 0xff);
-        }
-        for (int i = 8; i < 16; ++i) {
-            bits[1] = (bits[1] << 8) | (randomBytes[i] & 0xff);
-        }
+    protected AUUID() {
+        this(new byte[16]);
+    }
+
+    public AUUID(byte [] bytes) {
+        this.uuidBytes = bytes;
     }
 
     @Override
@@ -123,55 +76,56 @@
             return false;
         }
         AUUID oUUID = (AUUID) obj;
-        return oUUID.msb == this.msb && oUUID.lsb == this.lsb;
+        return Arrays.equals(oUUID.uuidBytes, this.uuidBytes);
     }
 
     @Override
     public int hash() {
-        long hilo = msb ^ lsb;
-        return ((int) (hilo >> 32)) ^ (int) hilo;
+        return Arrays.hashCode(uuidBytes);
     }
 
     @Override
     public String toString() {
-        return "AUUID: {" + toStringLiteralOnly(msb, lsb) + "}";
-
+        return "AUUID: {" + toStringLiteralOnly() + "}";
     }
 
     public String toStringLiteralOnly() {
-        return toStringLiteralOnly(msb, lsb);
+        return toStringLiteralOnly(uuidBytes, 0);
     }
 
-    public static String toStringLiteralOnly(long msbValue, long lsbValue) {
-        return digits(msbValue >> 32, 8) + "-" + digits(msbValue >> 16, 4) + 
"-" + digits(msbValue, 4) + "-"
-                + digits(lsbValue >> 48, 4) + "-" + digits(lsbValue, 12);
-
+    private static StringBuilder digits(byte b [], int offset, int count, 
StringBuilder result) {
+        for (int i = 0; i < count; i++) {
+            result.append(CHARS[(b[offset + i] >> 4) & 0xf]);
+            result.append(CHARS[b[offset + i] & 0xf]);
+        }
+        return result;
     }
 
-    // Since AUUID is a wrapper of java.util.uuid,
-    // we can use the same method that creates a UUID from a String.
-    public static AUUID fromString(String name) {
-        String[] components = name.split("-");
-        if (components.length != 5)
-            throw new IllegalArgumentException("Invalid UUID string: " + name);
-        for (int i = 0; i < 5; i++)
-            components[i] = "0x" + components[i];
-
-        long msb = Long.decode(components[0]).longValue();
-        msb <<= 16;
-        msb |= Long.decode(components[1]).longValue();
-        msb <<= 16;
-        msb |= Long.decode(components[2]).longValue();
-
-        long lsb = Long.decode(components[3]).longValue();
-        lsb <<= 48;
-        lsb |= Long.decode(components[4]).longValue();
-
-        return new AUUID(msb, lsb);
+    public static String toStringLiteralOnly(byte [] bytes, int offset) {
+        StringBuilder result = new StringBuilder(36);
+        digits(bytes, offset, 4, result).append('-');
+        digits(bytes, offset + 4, 2, result).append('-');
+        digits(bytes, offset + 6, 2, result).append('-');
+        digits(bytes, offset + 8, 2, result).append('-');
+        return digits(bytes, offset + 10, 6, result).toString();
     }
 
-    private static String digits(long val, int digits) {
-        long hi = 1L << (digits * 4);
-        return Long.toHexString(hi | (val & (hi - 1))).substring(1);
+    public void writeTo(DataOutput out) throws HyracksDataException {
+        try {
+            out.write(uuidBytes);
+        } catch (IOException e) {
+            throw new HyracksDataException(e);
+        }
     }
+
+    public static AUUID readFrom(DataInput in) throws HyracksDataException {
+        AUUID instance = new AUUID();
+        try {
+            in.readFully(instance.uuidBytes);
+        } catch (IOException e) {
+            throw new HyracksDataException(e);
+        }
+        return instance;
+    }
+
 }
diff --git 
a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
 
b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
index c7168c4..b5caf18 100644
--- 
a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
+++ 
b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
@@ -69,16 +69,15 @@
                     private ArrayBackedValueStorage outInput = new 
ArrayBackedValueStorage();
                     private ICopyEvaluator eval = 
args[0].createEvaluator(outInput);
                     private String errorMessage = "This can not be an instance 
of UUID";
-                    private AMutableUUID aUUID = new AMutableUUID(0, 0);
+                    private AMutableUUID uuid = new AMutableUUID();
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<AUUID> uuidSerde = 
AqlSerializerDeserializerProvider.INSTANCE
                             .getSerializerDeserializer(BuiltinType.AUUID);
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde = 
AqlSerializerDeserializerProvider.INSTANCE
                             .getSerializerDeserializer(BuiltinType.ANULL);
-                    private long msb = 0;
-                    private long lsb = 0;
-                    private long tmpLongValue = 0;
+
+
 
                     private final UTF8StringPointable utf8Ptr = new 
UTF8StringPointable();
 
@@ -90,51 +89,12 @@
                             byte[] serString = outInput.getByteArray();
                             if (serString[0] == 
ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
                                 utf8Ptr.set(serString, 1, outInput.getLength() 
- 1);
-                                msb = 0;
-                                lsb = 0;
-                                tmpLongValue = 0;
 
                                 // first byte: tag, next x bytes: length
                                 int offset = utf8Ptr.getCharStartOffset();
-                                // First part - 8 bytes
-                                msb = calculateLongFromHex(serString, offset, 
8);
-                                msb <<= 16;
-                                offset += 8;
 
-                                // Skip the hyphen part
-                                offset += 1;
-
-                                // Second part - 4 bytes
-                                tmpLongValue = calculateLongFromHex(serString, 
offset, 4);
-                                msb |= tmpLongValue;
-                                msb <<= 16;
-                                offset += 4;
-
-                                // Skip the hyphen part
-                                offset += 1;
-
-                                // Third part - 4 bytes
-                                tmpLongValue = calculateLongFromHex(serString, 
offset, 4);
-                                msb |= tmpLongValue;
-                                offset += 4;
-
-                                // Skip the hyphen part
-                                offset += 1;
-
-                                // Fourth part - 4 bytes
-                                lsb = calculateLongFromHex(serString, offset, 
4);
-                                lsb <<= 48;
-                                offset += 4;
-
-                                // Skip the hyphen part
-                                offset += 1;
-
-                                // The last part - 12 bytes
-                                tmpLongValue = calculateLongFromHex(serString, 
offset, 12);
-                                lsb |= tmpLongValue;
-
-                                aUUID.setValue(msb, lsb);
-                                uuidSerde.serialize(aUUID, out);
+                                uuid.parseUUIDHexBytes(serString, offset);
+                                uuidSerde.serialize(uuid, out);
 
                             } else if (serString[0] == 
ATypeTag.SERIALIZED_NULL_TYPE_TAG)
                                 nullSerde.serialize(ANull.NULL, out);
@@ -145,70 +105,6 @@
                         }
                     }
 
-                    // Calculate a long value from a hex string.
-                    private long calculateLongFromHex(byte[] hexArray, int 
offset, int length)
-                            throws AlgebricksException {
-                        int tmpIntVal = 0;
-                        long tmpLongVal = 0;
-                        for (int i = offset; i < offset + length; i++) {
-                            tmpIntVal = transformHexCharToInt(hexArray[i]);
-                            if (tmpIntVal != -1) {
-                                tmpLongVal = tmpLongVal * 16 + tmpIntVal;
-                            } else {
-                                throw new AlgebricksException("This is not a 
correct UUID value.");
-                            }
-                        }
-                        return tmpLongVal;
-                    }
-
-                    // Interpret a character to the corresponding integer 
value.
-                    private int transformHexCharToInt(byte val) throws 
AlgebricksException {
-                        switch (val) {
-                            case '0':
-                                return 0;
-                            case '1':
-                                return 1;
-                            case '2':
-                                return 2;
-                            case '3':
-                                return 3;
-                            case '4':
-                                return 4;
-                            case '5':
-                                return 5;
-                            case '6':
-                                return 6;
-                            case '7':
-                                return 7;
-                            case '8':
-                                return 8;
-                            case '9':
-                                return 9;
-                            case 'a':
-                            case 'A':
-                                return 10;
-                            case 'b':
-                            case 'B':
-                                return 11;
-                            case 'c':
-                            case 'C':
-                                return 12;
-                            case 'd':
-                            case 'D':
-                                return 13;
-                            case 'e':
-                            case 'E':
-                                return 14;
-                            case 'f':
-                            case 'F':
-                                return 15;
-                            case '-':
-                                // We need to skip this hyphen part.
-                                return -1;
-                            default:
-                                throw new AlgebricksException("This is not a 
correct UUID value.");
-                        }
-                    }
                 };
             }
         };
diff --git 
a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java
 
b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java
index 587581e..14b9904 100644
--- 
a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java
+++ 
b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java
@@ -58,7 +58,7 @@
             @Override
             public ICopyEvaluator createEvaluator(final IDataOutputProvider 
output) throws AlgebricksException {
                 return new ICopyEvaluator() {
-                    final AMutableUUID uuid = new AMutableUUID(0, 0);
+                    final AMutableUUID uuid = new AMutableUUID();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws 
AlgebricksException {

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9e90d42f6b62f80ad180dbd0c8c852db85b14173
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Michael D. Blow <[email protected]>

Reply via email to