Skip to content

Commit 421b5d4

Browse files
committed
Use MSB and LSB longs to represent UUID
1 parent e35ed7c commit 421b5d4

File tree

8 files changed

+77
-130
lines changed

8 files changed

+77
-130
lines changed

vector/src/main/java/org/apache/arrow/vector/UuidVector.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.apache.arrow.vector.complex.impl.UuidReaderImpl;
3030
import org.apache.arrow.vector.complex.reader.FieldReader;
3131
import org.apache.arrow.vector.extension.UuidType;
32-
import org.apache.arrow.vector.holders.ExtensionHolder;
3332
import org.apache.arrow.vector.holders.NullableUuidHolder;
3433
import org.apache.arrow.vector.holders.UuidHolder;
3534
import org.apache.arrow.vector.types.pojo.Field;
@@ -161,8 +160,9 @@ public void get(int index, UuidHolder holder) {
161160
holder.isSet = 0;
162161
} else {
163162
holder.isSet = 1;
164-
holder.buffer = getDataBuffer();
165-
holder.start = getStartOffset(index);
163+
final ByteBuffer bb = ByteBuffer.wrap(getUnderlyingVector().getObject(index));
164+
holder.mostSigBits = bb.getLong();
165+
holder.leastSigBits = bb.getLong();
166166
}
167167
}
168168

@@ -178,8 +178,9 @@ public void get(int index, NullableUuidHolder holder) {
178178
holder.isSet = 0;
179179
} else {
180180
holder.isSet = 1;
181-
holder.buffer = getDataBuffer();
182-
holder.start = getStartOffset(index);
181+
final ByteBuffer bb = ByteBuffer.wrap(getUnderlyingVector().getObject(index));
182+
holder.mostSigBits = bb.getLong();
183+
holder.leastSigBits = bb.getLong();
183184
}
184185
}
185186

@@ -214,7 +215,8 @@ public void set(int index, UUID value) {
214215
* @param holder the holder containing the UUID data
215216
*/
216217
public void set(int index, UuidHolder holder) {
217-
this.set(index, holder.buffer, holder.start);
218+
UUID uuid = new UUID(holder.mostSigBits, holder.leastSigBits);
219+
set(index, uuid);
218220
}
219221

220222
/**
@@ -227,7 +229,8 @@ public void set(int index, NullableUuidHolder holder) {
227229
if (holder.isSet == 0) {
228230
getUnderlyingVector().setNull(index);
229231
} else {
230-
this.set(index, holder.buffer, holder.start);
232+
UUID uuid = new UUID(holder.mostSigBits, holder.leastSigBits);
233+
set(index, uuid);
231234
}
232235
}
233236

@@ -281,7 +284,8 @@ public void setSafe(int index, NullableUuidHolder holder) {
281284
if (holder == null || holder.isSet == 0) {
282285
getUnderlyingVector().setNull(index);
283286
} else {
284-
this.setSafe(index, holder.buffer, holder.start);
287+
UUID uuid = new UUID(holder.mostSigBits, holder.leastSigBits);
288+
setSafe(index, uuid);
285289
}
286290
}
287291

@@ -292,7 +296,8 @@ public void setSafe(int index, NullableUuidHolder holder) {
292296
* @param holder the holder containing the UUID data
293297
*/
294298
public void setSafe(int index, UuidHolder holder) {
295-
this.setSafe(index, holder.buffer, holder.start);
299+
UUID uuid = new UUID(holder.mostSigBits, holder.leastSigBits);
300+
setSafe(index, uuid);
296301
}
297302

298303
/**

vector/src/main/java/org/apache/arrow/vector/complex/impl/NullableUuidHolderReaderImpl.java

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
*/
1717
package org.apache.arrow.vector.complex.impl;
1818

19+
import java.util.UUID;
1920
import org.apache.arrow.vector.holders.ExtensionHolder;
2021
import org.apache.arrow.vector.holders.NullableUuidHolder;
2122
import org.apache.arrow.vector.holders.UuidHolder;
2223
import org.apache.arrow.vector.types.Types;
23-
import org.apache.arrow.vector.util.UuidUtility;
2424

2525
/**
2626
* Reader implementation for reading UUID values from a {@link NullableUuidHolder}.
@@ -81,13 +81,13 @@ public boolean isSet() {
8181
public void read(ExtensionHolder h) {
8282
if (h instanceof NullableUuidHolder) {
8383
NullableUuidHolder nullableHolder = (NullableUuidHolder) h;
84-
nullableHolder.buffer = this.holder.buffer;
84+
nullableHolder.mostSigBits = this.holder.mostSigBits;
85+
nullableHolder.leastSigBits = this.holder.leastSigBits;
8586
nullableHolder.isSet = this.holder.isSet;
86-
nullableHolder.start = this.holder.start;
8787
} else if (h instanceof UuidHolder) {
8888
UuidHolder uuidHolder = (UuidHolder) h;
89-
uuidHolder.buffer = this.holder.buffer;
90-
uuidHolder.start = this.holder.start;
89+
uuidHolder.mostSigBits = this.holder.mostSigBits;
90+
uuidHolder.leastSigBits = this.holder.leastSigBits;
9191
} else {
9292
throw new IllegalArgumentException(
9393
"Unsupported holder type: "
@@ -103,22 +103,8 @@ public Object readObject() {
103103
if (!isSet()) {
104104
return null;
105105
}
106-
// Convert UUID bytes to Java UUID object
107-
try {
108-
return UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
109-
} catch (Exception e) {
110-
throw new RuntimeException(
111-
String.format(
112-
"Failed to read UUID from buffer. Invalid Arrow buffer state: "
113-
+ "capacity=%d, readableBytes=%d, readerIndex=%d, writerIndex=%d, refCnt=%d. "
114-
+ "The buffer must contain exactly 16 bytes of valid UUID data.",
115-
holder.buffer.capacity(),
116-
holder.buffer.readableBytes(),
117-
holder.buffer.readerIndex(),
118-
holder.buffer.writerIndex(),
119-
holder.buffer.refCnt()),
120-
e);
121-
}
106+
// Convert UUID longs to Java UUID object
107+
return new UUID(holder.mostSigBits, holder.leastSigBits);
122108
}
123109
}
124110

vector/src/main/java/org/apache/arrow/vector/holders/NullableUuidHolder.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,21 @@
1616
*/
1717
package org.apache.arrow.vector.holders;
1818

19-
import org.apache.arrow.memory.ArrowBuf;
20-
2119
/**
2220
* Value holder for nullable UUID values.
2321
*
2422
* <p>The {@code isSet} field controls nullability: when {@code isSet = 1}, the holder contains a
25-
* valid UUID in {@code buffer}; when {@code isSet = 0}, the holder represents a null value and
26-
* {@code buffer} should not be accessed.
23+
* valid UUID represented as two longs; when {@code isSet = 0}, the holder represents a null value
24+
* and the long fields should not be accessed.
2725
*
2826
* @see UuidHolder
2927
* @see org.apache.arrow.vector.UuidVector
3028
* @see org.apache.arrow.vector.extension.UuidType
3129
*/
3230
public class NullableUuidHolder extends ExtensionHolder {
33-
/** Buffer containing 16-byte UUID data. */
34-
public ArrowBuf buffer;
31+
/** The most significant 64 bits of the UUID. */
32+
public long mostSigBits;
3533

36-
/** Offset in the buffer where the UUID data starts. */
37-
public int start = 0;
34+
/** The least significant 64 bits of the UUID. */
35+
public long leastSigBits;
3836
}

vector/src/main/java/org/apache/arrow/vector/holders/UuidHolder.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,21 @@
1616
*/
1717
package org.apache.arrow.vector.holders;
1818

19-
import org.apache.arrow.memory.ArrowBuf;
20-
2119
/**
2220
* Value holder for non-nullable UUID values.
2321
*
24-
* <p>Contains a 16-byte UUID in {@code buffer} with {@code isSet} always 1.
22+
* <p>Contains a 16-byte UUID represented as two longs with {@code isSet} always 1.
2523
*
2624
* @see NullableUuidHolder
2725
* @see org.apache.arrow.vector.UuidVector
2826
* @see org.apache.arrow.vector.extension.UuidType
2927
*/
3028
public class UuidHolder extends ExtensionHolder {
31-
/** Buffer containing 16-byte UUID data. */
32-
public ArrowBuf buffer;
29+
/** The most significant 64 bits of the UUID. */
30+
public long mostSigBits;
3331

34-
/** Offset in the buffer where the UUID data starts. */
35-
public int start = 0;
32+
/** The least significant 64 bits of the UUID. */
33+
public long leastSigBits;
3634

3735
/** Constructs a UuidHolder with isSet = 1. */
3836
public UuidHolder() {

vector/src/test/java/org/apache/arrow/vector/TestListVector.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import org.apache.arrow.vector.types.pojo.Field;
5050
import org.apache.arrow.vector.types.pojo.FieldType;
5151
import org.apache.arrow.vector.util.TransferPair;
52-
import org.apache.arrow.vector.util.UuidUtility;
5352
import org.junit.jupiter.api.AfterEach;
5453
import org.junit.jupiter.api.BeforeEach;
5554
import org.junit.jupiter.api.Test;
@@ -1259,12 +1258,12 @@ public void testListVectorReaderForExtensionType() throws Exception {
12591258
FieldReader uuidReader = reader.reader();
12601259
UuidHolder holder = new UuidHolder();
12611260
uuidReader.read(holder);
1262-
UUID actualUuid = UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
1261+
UUID actualUuid = new UUID(holder.mostSigBits, holder.leastSigBits);
12631262
assertEquals(u1, actualUuid);
12641263
reader.next();
12651264
uuidReader = reader.reader();
12661265
uuidReader.read(holder);
1267-
actualUuid = UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
1266+
actualUuid = new UUID(holder.mostSigBits, holder.leastSigBits);
12681267
assertEquals(u2, actualUuid);
12691268
}
12701269
}
@@ -1300,12 +1299,12 @@ public void testCopyFromForExtensionType() throws Exception {
13001299
FieldReader uuidReader = reader.reader();
13011300
UuidHolder holder = new UuidHolder();
13021301
uuidReader.read(holder);
1303-
UUID actualUuid = UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
1302+
UUID actualUuid = new UUID(holder.mostSigBits, holder.leastSigBits);
13041303
assertEquals(u1, actualUuid);
13051304
reader.next();
13061305
uuidReader = reader.reader();
13071306
uuidReader.read(holder);
1308-
actualUuid = UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
1307+
actualUuid = new UUID(holder.mostSigBits, holder.leastSigBits);
13091308
assertEquals(u2, actualUuid);
13101309
}
13111310
}

vector/src/test/java/org/apache/arrow/vector/TestMapVector.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import org.apache.arrow.vector.types.pojo.FieldType;
5151
import org.apache.arrow.vector.util.JsonStringArrayList;
5252
import org.apache.arrow.vector.util.TransferPair;
53-
import org.apache.arrow.vector.util.UuidUtility;
5453
import org.junit.jupiter.api.AfterEach;
5554
import org.junit.jupiter.api.BeforeEach;
5655
import org.junit.jupiter.api.Test;
@@ -1304,12 +1303,12 @@ public void testMapVectorWithExtensionType() throws Exception {
13041303
FieldReader uuidReader = mapReader.value();
13051304
UuidHolder holder = new UuidHolder();
13061305
uuidReader.read(holder);
1307-
UUID actualUuid = UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
1306+
UUID actualUuid = new UUID(holder.mostSigBits, holder.leastSigBits);
13081307
assertEquals(u1, actualUuid);
13091308
mapReader.next();
13101309
uuidReader = mapReader.value();
13111310
uuidReader.read(holder);
1312-
actualUuid = UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
1311+
actualUuid = new UUID(holder.mostSigBits, holder.leastSigBits);
13131312
assertEquals(u2, actualUuid);
13141313
}
13151314
}
@@ -1349,12 +1348,12 @@ public void testCopyFromForExtensionType() throws Exception {
13491348
FieldReader uuidReader = mapReader.value();
13501349
UuidHolder holder = new UuidHolder();
13511350
uuidReader.read(holder);
1352-
UUID actualUuid = UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
1351+
UUID actualUuid = new UUID(holder.mostSigBits, holder.leastSigBits);
13531352
assertEquals(u1, actualUuid);
13541353
mapReader.next();
13551354
uuidReader = mapReader.value();
13561355
uuidReader.read(holder);
1357-
actualUuid = UuidUtility.uuidFromArrowBuf(holder.buffer, holder.start);
1356+
actualUuid = new UUID(holder.mostSigBits, holder.leastSigBits);
13581357
assertEquals(u2, actualUuid);
13591358
}
13601359
}

0 commit comments

Comments
 (0)