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]>