Skip to content

Commit 95daf66

Browse files
authored
Bring back full support for UUID (#3510)
This PR brings back the complete support for UUID as a primitive data type. The support was first brought in with PR:#3198, but was later partially rolled back in #3293. It also brings in UUID-relevant parts from patch: #3395, that was based on top 4.2.4.0, onto the main.
1 parent 72ccc88 commit 95daf66

File tree

29 files changed

+3003
-249
lines changed

29 files changed

+3003
-249
lines changed

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/typing/Type.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,8 @@ private static Type fromProtoType(@Nullable Descriptors.GenericDescriptor descri
434434
final var elementField = messageDescriptor.findFieldByName(NullableArrayTypeUtils.getRepeatedFieldName());
435435
final var elementTypeCode = TypeCode.fromProtobufType(elementField.getType());
436436
return fromProtoTypeToArray(descriptor, protoType, elementTypeCode, true);
437+
} else if (TupleFieldsProto.UUID.getDescriptor().equals(messageDescriptor)) {
438+
return Type.uuidType(isNullable);
437439
} else {
438440
return Record.fromFieldDescriptorsMap(isNullable, Record.toFieldDescriptorMap(messageDescriptor.getFields()));
439441
}
@@ -2475,7 +2477,8 @@ public boolean equals(final Object o) {
24752477
}
24762478
final var field = (Field)o;
24772479
return getFieldType().equals(field.getFieldType()) &&
2478-
getFieldNameOptional().equals(field.getFieldNameOptional());
2480+
getFieldNameOptional().equals(field.getFieldNameOptional()) &&
2481+
getFieldIndexOptional().equals(field.getFieldIndexOptional());
24792482
}
24802483

24812484
@Override

fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/cascades/TypeTest.java

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,15 @@ public Stream<? extends Arguments> provideArguments(final ExtensionContext conte
128128
.setStartDate(random.nextLong())
129129
.setSchoolName("randomString" + random.nextInt()).build()
130130
).build()
131+
),
132+
Arguments.of(
133+
"TestRecordsUuidProto.UuidRecord", TestRecordsUuidProto.UuidRecord.newBuilder()
134+
.setPkey(TupleFieldsProto.UUID.newBuilder()
135+
.setMostSignificantBits(98452560)
136+
.setLeastSignificantBits(30900234)
137+
.build())
138+
.build()
131139
)
132-
// This does not work currently owing to https://github.com/FoundationDB/fdb-record-layer/issues/3295
133-
// Arguments.of(
134-
// "TestRecordsUuidProto.UuidRecord", TestRecordsUuidProto.UuidRecord.newBuilder()
135-
// .setPkey(TupleFieldsProto.UUID.newBuilder()
136-
// .setMostSignificantBits(98452560)
137-
// .setLeastSignificantBits(30900234)
138-
// .build())
139-
// .build()
140-
// )
141140
);
142141
}
143142
}
@@ -308,28 +307,4 @@ void testAnyRecordSerialization() {
308307
Type.AnyRecord r1 = new Type.AnyRecord(false);
309308
Assertions.assertEquals(r1, Type.AnyRecord.fromProto(serializationContext, r1.toProto(serializationContext)));
310309
}
311-
312-
@Test
313-
void testUUIDInterpretedAsRecordType() {
314-
final TestRecordsUuidProto.UuidRecord uuidRecord = TestRecordsUuidProto.UuidRecord.newBuilder()
315-
.setName("testUuidRecord")
316-
.setPkey(TupleFieldsProto.UUID.newBuilder()
317-
.setMostSignificantBits(1)
318-
.setLeastSignificantBits(2))
319-
.build();
320-
final Type.Record recordType = Type.Record.fromDescriptor(uuidRecord.getDescriptorForType());
321-
final Map<String, Type.Record.Field> fieldsMaps = recordType.getFieldNameFieldMap();
322-
checkIsUuidRecordType(fieldsMaps, "pkey");
323-
checkIsUuidRecordType(fieldsMaps, "secondary");
324-
checkIsUuidRecordType(fieldsMaps, "unique");
325-
}
326-
327-
private static void checkIsUuidRecordType(@Nonnull Map<String, Type.Record.Field> fieldsMap, @Nonnull String fieldName) {
328-
Assertions.assertTrue(fieldsMap.containsKey(fieldName));
329-
Assertions.assertInstanceOf(Type.Record.class, fieldsMap.get(fieldName).getFieldType());
330-
final Type.Record uuidRecord = (Type.Record) fieldsMap.get(fieldName).getFieldType();
331-
Assertions.assertEquals(2, uuidRecord.getFields().size());
332-
Assertions.assertEquals(Type.TypeCode.LONG, uuidRecord.getFields().get(0).getFieldType().getTypeCode());
333-
Assertions.assertEquals(Type.TypeCode.LONG, uuidRecord.getFields().get(1).getFieldType().getTypeCode());
334-
}
335310
}

fdb-relational-api/src/main/java/com/apple/foundationdb/relational/api/RelationalArrayBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import javax.annotation.Nonnull;
2424
import java.sql.SQLException;
25+
import java.util.UUID;
2526

2627
/**
2728
* Builder for {@link RelationalArray}.
@@ -44,6 +45,8 @@ public interface RelationalArrayBuilder {
4445

4546
RelationalArrayBuilder addLong(long value) throws SQLException;
4647

48+
RelationalArrayBuilder addUuid(@Nonnull UUID value) throws SQLException;
49+
4750
RelationalArrayBuilder addObject(@Nonnull Object value) throws SQLException;
4851

4952
RelationalArrayBuilder addStruct(RelationalStruct struct) throws SQLException;

fdb-relational-api/src/main/java/com/apple/foundationdb/relational/api/RelationalStructBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import javax.annotation.Nonnull;
2424
import javax.annotation.Nullable;
2525
import java.sql.SQLException;
26+
import java.util.UUID;
2627

2728
/**
2829
* For implementation by {@link RelationalStruct} <a href="https://refactoring.guru/design-patterns/builder">Builder</a>.
@@ -50,6 +51,8 @@ public interface RelationalStructBuilder {
5051

5152
RelationalStructBuilder addString(String fieldName, @Nullable String s) throws SQLException;
5253

54+
RelationalStructBuilder addUuid(String fieldName, @Nullable UUID uuid) throws SQLException;
55+
5356
RelationalStructBuilder addObject(String fieldName, @Nullable Object obj) throws SQLException;
5457

5558
RelationalStructBuilder addStruct(String fieldName, @Nonnull RelationalStruct struct) throws SQLException;

fdb-relational-api/src/main/java/com/apple/foundationdb/relational/api/metadata/DataType.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.util.List;
3838
import java.util.Map;
3939
import java.util.Objects;
40+
import java.util.UUID;
4041
import java.util.function.Supplier;
4142
import java.util.stream.Collectors;
4243

@@ -200,6 +201,8 @@ public static DataType getDataTypeFromObject(@Nullable Object obj) {
200201
return Primitives.DOUBLE.type();
201202
} else if (obj instanceof String) {
202203
return Primitives.STRING.type();
204+
} else if (obj instanceof UUID) {
205+
return Primitives.UUID.type();
203206
} else if (obj instanceof RelationalStruct) {
204207
return ((RelationalStruct) obj).getMetaData().getRelationalDataType();
205208
} else if (obj instanceof RelationalArray) {

fdb-relational-core/src/main/antlr/RelationalParser.g4

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ columnType
138138
: primitiveType | customType=uid;
139139

140140
primitiveType
141-
: BOOLEAN | INTEGER | BIGINT | FLOAT | DOUBLE | STRING | BYTES;
141+
: BOOLEAN | INTEGER | BIGINT | FLOAT | DOUBLE | STRING | BYTES | UUID;
142142

143143
columnConstraint
144144
: nullNotnull #nullColumnConstraint
@@ -1354,7 +1354,7 @@ functionNameBase
13541354
| TIMESTAMPADD | TIMESTAMPDIFF | TIME_FORMAT | TIME_TO_SEC
13551355
| TOUCHES | TO_BASE64 | TO_DAYS | TO_SECONDS | UCASE
13561356
| UNCOMPRESS | UNCOMPRESSED_LENGTH | UNHEX | UNIX_TIMESTAMP
1357-
| UPDATEXML | UPPER | UUID | UUID_SHORT
1357+
| UPDATEXML | UPPER
13581358
| VALIDATE_PASSWORD_STRENGTH | VERSION | VISIBLE
13591359
| WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS | WEEK | WEEKDAY
13601360
| WEEKOFYEAR | WEIGHT_STRING | WITHIN | YEAR | YEARWEEK

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/api/EmbeddedRelationalArray.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.sql.SQLException;
3131
import java.util.ArrayList;
3232
import java.util.List;
33+
import java.util.UUID;
3334

3435
public interface EmbeddedRelationalArray extends RelationalArray {
3536

@@ -94,6 +95,11 @@ public Builder addBytes(@Nonnull byte[] value) throws SQLException {
9495
return addField(value, DataType.Primitives.BYTES.type());
9596
}
9697

98+
@Override
99+
public Builder addUuid(@Nonnull UUID uuid) throws SQLException {
100+
return addField(uuid, DataType.Primitives.UUID.type());
101+
}
102+
97103
@Override
98104
public Builder addObject(@Nonnull Object obj) throws SQLException {
99105
if (obj instanceof RelationalStruct) {

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/api/EmbeddedRelationalStruct.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ public Builder addString(String fieldName, @Nullable String s) {
8282
return addField(fieldName, DataType.Primitives.STRING.type(), s);
8383
}
8484

85+
@Override
86+
public Builder addUuid(String fieldName, @Nullable UUID uuid) {
87+
return addField(fieldName, DataType.Primitives.UUID.type(), uuid);
88+
}
89+
8590
@Override
8691
public RelationalStructBuilder addObject(String fieldName, @Nullable Object obj) throws SQLException {
8792
if (obj instanceof RelationalStruct) {

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/metadata/RecordLayerSchemaTemplate.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
package com.apple.foundationdb.relational.recordlayer.metadata;
2222

2323
import com.apple.foundationdb.annotation.API;
24-
2524
import com.apple.foundationdb.record.RecordMetaData;
2625
import com.apple.foundationdb.record.RecordMetaDataProto;
2726
import com.apple.foundationdb.record.metadata.Key;
2827
import com.apple.foundationdb.record.query.combinatorics.TopologicalSort;
28+
import com.apple.foundationdb.record.query.plan.cascades.typing.TypeRepository;
2929
import com.apple.foundationdb.relational.api.exceptions.ErrorCode;
3030
import com.apple.foundationdb.relational.api.exceptions.RelationalException;
3131
import com.apple.foundationdb.relational.api.metadata.DataType;
@@ -38,7 +38,6 @@
3838
import com.apple.foundationdb.relational.recordlayer.metadata.serde.RecordMetadataDeserializer;
3939
import com.apple.foundationdb.relational.recordlayer.metadata.serde.RecordMetadataSerializer;
4040
import com.apple.foundationdb.relational.util.Assert;
41-
4241
import com.google.common.annotations.VisibleForTesting;
4342
import com.google.common.base.Supplier;
4443
import com.google.common.base.Suppliers;
@@ -50,6 +49,7 @@
5049
import com.google.protobuf.Descriptors;
5150

5251
import javax.annotation.Nonnull;
52+
import java.util.ArrayList;
5353
import java.util.BitSet;
5454
import java.util.Collection;
5555
import java.util.Comparator;
@@ -189,10 +189,11 @@ private RecordMetaData buildRecordMetadata() {
189189
final var fileDescriptorProtoSerializer = new FileDescriptorSerializer();
190190
accept(fileDescriptorProtoSerializer);
191191
final Descriptors.FileDescriptor fileDescriptor;
192+
final var dependencies = new ArrayList<>(TypeRepository.DEPENDENCIES);
193+
dependencies.add(RecordMetaDataProto.getDescriptor());
192194
try {
193195
fileDescriptor = Descriptors.FileDescriptor.buildFrom(
194-
fileDescriptorProtoSerializer.getFileBuilder().build(),
195-
new Descriptors.FileDescriptor[]{RecordMetaDataProto.getDescriptor()});
196+
fileDescriptorProtoSerializer.getFileBuilder().build(), dependencies.toArray(new Descriptors.FileDescriptor[0]));
196197
} catch (Descriptors.DescriptorValidationException e) {
197198
throw new RelationalException(ErrorCode.SERIALIZATION_FAILURE, e).toUncheckedWrappedException();
198199
}

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/metadata/serde/FileDescriptorSerializer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
package com.apple.foundationdb.relational.recordlayer.metadata.serde;
2222

2323
import com.apple.foundationdb.annotation.API;
24-
2524
import com.apple.foundationdb.record.RecordMetaDataOptionsProto;
2625
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
2726
import com.apple.foundationdb.record.query.plan.cascades.typing.TypeRepository;
@@ -31,14 +30,15 @@
3130
import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerTable;
3231
import com.apple.foundationdb.relational.recordlayer.metadata.SkeletonVisitor;
3332
import com.apple.foundationdb.relational.util.Assert;
34-
3533
import com.google.protobuf.DescriptorProtos;
34+
import com.google.protobuf.Descriptors;
3635

3736
import javax.annotation.Nonnull;
3837
import java.util.LinkedHashSet;
3938
import java.util.Locale;
4039
import java.util.Map;
4140
import java.util.Set;
41+
import java.util.stream.Collectors;
4242

4343
@API(API.Status.EXPERIMENTAL)
4444
public class FileDescriptorSerializer extends SkeletonVisitor {
@@ -73,6 +73,7 @@ public FileDescriptorSerializer() {
7373

7474
public FileDescriptorSerializer(@Nonnull DescriptorProtos.FileDescriptorProto.Builder fileBuilder) {
7575
this.fileBuilder = fileBuilder;
76+
this.fileBuilder.addAllDependency(TypeRepository.DEPENDENCIES.stream().map(Descriptors.FileDescriptor::getFullName).collect(Collectors.toList()));
7677
this.unionDescriptorBuilder = DescriptorProtos.DescriptorProto.newBuilder().setName("RecordTypeUnion");
7778
final RecordMetaDataOptionsProto.RecordTypeOptions options = RecordMetaDataOptionsProto.RecordTypeOptions.newBuilder().setUsage(RecordMetaDataOptionsProto.RecordTypeOptions.Usage.UNION).build();
7879
unionDescriptorBuilder.getOptionsBuilder().setExtension(RecordMetaDataOptionsProto.record, options);

0 commit comments

Comments
 (0)