Skip to content

Commit dd1974d

Browse files
committed
uuid as primary key
1 parent 0587af6 commit dd1974d

File tree

8 files changed

+90
-28
lines changed

8 files changed

+90
-28
lines changed

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

+2-9
Original file line numberDiff line numberDiff line change
@@ -2949,20 +2949,13 @@ public ExplainTokens describe() {
29492949
return new ExplainTokens().addKeyword(getTypeCode().toString());
29502950
}
29512951

2952-
@Override
2953-
public void defineProtoType(final TypeRepository.Builder typeRepositoryBuilder) {
2954-
if (typeRepositoryBuilder.getTypeByName(MESSAGE_NAME).isEmpty()) {
2955-
typeRepositoryBuilder.addMessageType(TupleFieldsProto.UUID.getDescriptor().toProto());
2956-
typeRepositoryBuilder.registerTypeToTypeNameMapping(this, MESSAGE_NAME);
2957-
}
2958-
}
2959-
29602952
@Override
29612953
public void addProtoField(@Nonnull final TypeRepository.Builder typeRepositoryBuilder, @Nonnull final DescriptorProto.Builder descriptorBuilder, final int fieldNumber, @Nonnull final String fieldName, @Nonnull final Optional<String> typeNameOptional, @Nonnull final FieldDescriptorProto.Label label) {
29622954
FieldDescriptorProto.Builder builder = FieldDescriptorProto.newBuilder()
29632955
.setNumber(fieldNumber)
29642956
.setName(fieldName)
2965-
.setLabel(label);
2957+
.setLabel(label)
2958+
.setTypeName(TupleFieldsProto.UUID.getDescriptor().getFullName());
29662959
typeNameOptional.ifPresent(builder::setTypeName);
29672960
descriptorBuilder.addField(builder);
29682961
}

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

+15-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package com.apple.foundationdb.record.query.plan.cascades.typing;
2222

23+
import com.apple.foundationdb.record.TupleFieldsProto;
2324
import com.google.common.base.Preconditions;
2425
import com.google.common.base.Verify;
2526
import com.google.common.collect.BiMap;
@@ -52,6 +53,7 @@
5253
import java.util.Optional;
5354
import java.util.Set;
5455
import java.util.TreeSet;
56+
import java.util.stream.Collectors;
5557

5658
/**
5759
* A utility class that enables mapping of a structured {@link Type} into a dynamically-generated equivalent Protobuf message
@@ -82,6 +84,9 @@ public class TypeRepository {
8284
@Nonnull
8385
private final Map<Type, String> typeToNameMap;
8486

87+
@Nonnull
88+
public static List<FileDescriptor> DEPENDENCIES = List.of(TupleFieldsProto.getDescriptor());
89+
8590
@Nonnull
8691
public static TypeRepository empty() {
8792
FileDescriptorSet.Builder resultBuilder = FileDescriptorSet.newBuilder();
@@ -341,13 +346,17 @@ private static Map<String, FileDescriptor> init(@Nonnull final FileDescriptorSet
341346
List<String> dependencyList = fdProto.getDependencyList();
342347
List<FileDescriptor> resolvedFdList = new ArrayList<>();
343348
for (String depName : dependencyList) {
344-
if (!allFdProtoNames.contains(depName)) {
349+
final var dependencyMaybe = DEPENDENCIES.stream().filter(d -> d.getFullName().equals(depName)).findAny();
350+
if (dependencyMaybe.isPresent()) {
351+
resolvedFdList.add(dependencyMaybe.get());
352+
} else if (allFdProtoNames.contains(depName)) {
353+
FileDescriptor fd = resolvedFileDescMap.get(depName);
354+
if (fd != null) {
355+
resolvedFdList.add(fd);
356+
}
357+
} else {
345358
throw new IllegalArgumentException("cannot resolve import " + depName + " in " + fdProto.getName());
346359
}
347-
FileDescriptor fd = resolvedFileDescMap.get(depName);
348-
if (fd != null) {
349-
resolvedFdList.add(fd);
350-
}
351360
}
352361

353362
if (resolvedFdList.size() == dependencyList.size()) { // dependencies resolved
@@ -430,6 +439,7 @@ public static class Builder {
430439

431440
private Builder() {
432441
fileDescProtoBuilder = FileDescriptorProto.newBuilder();
442+
fileDescProtoBuilder.addAllDependency(DEPENDENCIES.stream().map(FileDescriptor::getFullName).collect(Collectors.toList()));
433443
fileDescSetBuilder = FileDescriptorSet.newBuilder();
434444
typeToNameMap = HashBiMap.create();
435445
}

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,9 @@ public static <M extends Message> Object transformMessage(@Nonnull final FDBReco
360360
} else {
361361
if (currentMessage != null) {
362362
final var currentFieldType = Verify.verifyNotNull(currentRecordType.getField(messageFieldDescriptor.getIndex())).getFieldType();
363-
final var fieldResult = NullableArrayTypeUtils.unwrapIfArray(getFieldOnMessage(currentMessage, messageFieldDescriptor), currentFieldType);
363+
var fieldResult = messageFieldDescriptor.getType().equals(Descriptors.FieldDescriptor.Type.MESSAGE) ?
364+
getFieldMessageOnMessage(currentMessage, messageFieldDescriptor) : getFieldOnMessage(currentMessage, messageFieldDescriptor);
365+
fieldResult = NullableArrayTypeUtils.unwrapIfArray(fieldResult, currentFieldType);
364366
final var coercedObject =
365367
coerceObject(promotionTrieForField, targetFieldType, targetDescriptorForField, currentFieldType, fieldResult);
366368
if (coercedObject != null) {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -442,8 +442,8 @@ public static boolean isPromotionNeeded(@Nonnull final Type inType, @Nonnull fin
442442
}
443443
return false;
444444
}
445-
SemanticException.check((inType.isPrimitive() || inType.isUuid() || inType.isArray()) ||
446-
(promoteToType.isPrimitive() || promoteToType.isUuid() || promoteToType.isArray()), SemanticException.ErrorCode.INCOMPATIBLE_TYPE);
445+
SemanticException.check((inType.isPrimitive() || inType.isEnum() || inType.isUuid()) &&
446+
(promoteToType.isPrimitive() || promoteToType.isEnum() || promoteToType.isUuid()), SemanticException.ErrorCode.INCOMPATIBLE_TYPE);
447447
return inType.getTypeCode() != promoteToType.getTypeCode();
448448
}
449449

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
package com.apple.foundationdb.relational.recordlayer;
2222

2323
import com.apple.foundationdb.annotation.API;
24-
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
24+
import com.apple.foundationdb.record.TupleFieldsProto;
2525
import com.apple.foundationdb.relational.api.exceptions.InvalidColumnReferenceException;
2626
import com.google.protobuf.Descriptors;
27-
import com.google.protobuf.DynamicMessage;
2827
import com.google.protobuf.Message;
28+
import com.google.protobuf.MessageOrBuilder;
2929

3030
import java.util.UUID;
3131

@@ -52,8 +52,8 @@ public Object getObject(int position) throws InvalidColumnReferenceException {
5252
final var field = message.getField(message.getDescriptorForType().getFields().get(position));
5353
if (fieldDescriptor.getType() == Descriptors.FieldDescriptor.Type.ENUM) {
5454
return ((Descriptors.EnumValueDescriptor) field).getName();
55-
} else if (fieldDescriptor.getType() == Descriptors.FieldDescriptor.Type.MESSAGE && fieldDescriptor.getMessageType().getName().equals(Type.Uuid.MESSAGE_NAME)) {
56-
final var dynamicMsg = (DynamicMessage) field;
55+
} else if (fieldDescriptor.getType() == Descriptors.FieldDescriptor.Type.MESSAGE && fieldDescriptor.getMessageType().equals(TupleFieldsProto.UUID.getDescriptor())) {
56+
final var dynamicMsg = (MessageOrBuilder) field;
5757
return new UUID((Long) dynamicMsg.getField(dynamicMsg.getDescriptorForType().findFieldByName("most_significant_bits")),
5858
(Long) dynamicMsg.getField(dynamicMsg.getDescriptorForType().findFieldByName("least_significant_bits")));
5959
}

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
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;
26+
import com.apple.foundationdb.record.TupleFieldsProto;
2727
import com.apple.foundationdb.record.metadata.Key;
2828
import com.apple.foundationdb.record.query.combinatorics.TopologicalSort;
2929
import com.apple.foundationdb.relational.api.exceptions.ErrorCode;
@@ -37,7 +37,6 @@
3737
import com.apple.foundationdb.relational.recordlayer.metadata.serde.RecordMetadataDeserializer;
3838
import com.apple.foundationdb.relational.recordlayer.metadata.serde.RecordMetadataSerializer;
3939
import com.apple.foundationdb.relational.util.Assert;
40-
4140
import com.google.common.annotations.VisibleForTesting;
4241
import com.google.common.base.Supplier;
4342
import com.google.common.base.Suppliers;
@@ -160,7 +159,7 @@ private RecordMetaData buildRecordMetadata() {
160159
try {
161160
fileDescriptor = Descriptors.FileDescriptor.buildFrom(
162161
fileDescriptorProtoSerializer.getFileBuilder().build(),
163-
new Descriptors.FileDescriptor[]{RecordMetaDataProto.getDescriptor()});
162+
new Descriptors.FileDescriptor[]{RecordMetaDataProto.getDescriptor(), TupleFieldsProto.getDescriptor()});
164163
} catch (Descriptors.DescriptorValidationException e) {
165164
throw new RelationalException(ErrorCode.SERIALIZATION_FAILURE, e).toUncheckedWrappedException();
166165
}

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

+3-2
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);

yaml-tests/src/test/resources/uuid.yamsql

+59-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ options:
2222
---
2323
schema_template:
2424
create table ta(a bigint, b uuid, primary key(a))
25-
# create table tb(a uuid, b bigint, primary key(a))
26-
# create table tc(a bigint, b uuid, primary key(a, b))
25+
create table tb(a uuid, b bigint, primary key(a))
26+
create table tc(a bigint, b uuid, c bigint, primary key(a, b))
2727
# create table td(a bigint, b uuid, c bigint, primary key(a))
2828
---
2929
setup:
@@ -36,6 +36,13 @@ setup:
3636
(5, 'a8708750-d70f-4800-8c3b-13700d5b369f'),
3737
(6, '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6')
3838
- query: INSERT INTO TA(A) VALUES (7), (8)
39+
- query: INSERT INTO TB (B, A)
40+
VALUES (1, '0920df1c-be81-4ec1-8a06-2180226f051d'),
41+
(2, '64120112-4e39-40c3-94b9-2cc88a52e8df'),
42+
(3, 'c35ba01f-f8fc-47d7-bb00-f077e8a75682'),
43+
(4, '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b'),
44+
(5, 'a8708750-d70f-4800-8c3b-13700d5b369f'),
45+
(6, '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6')
3946
---
4047
test_block:
4148
name: uuid-as-a-field-tests
@@ -134,4 +141,54 @@ test_block:
134141
{4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b'},
135142
{5, !uuid 'a8708750-d70f-4800-8c3b-13700d5b369f'},
136143
{6, !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6'}]
144+
---
145+
test_block:
146+
name: uuid-as-a-field-tests
147+
tests:
148+
-
149+
- query: select B, A from TB
150+
- unorderedResult: [{1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d'},
151+
{2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df'},
152+
{3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682'},
153+
{4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b'},
154+
{5, !uuid 'a8708750-d70f-4800-8c3b-13700d5b369f'},
155+
{6, !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6'}]
156+
-
157+
- query: select B, A from TB where a > !! !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6' !!
158+
- unorderedResult: [{3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682'},
159+
{5, !uuid 'a8708750-d70f-4800-8c3b-13700d5b369f'}]
160+
-
161+
- query: select B, A from TB where a < !! !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6' !!
162+
- unorderedResult: [{1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d'},
163+
{2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df'},
164+
{4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b'}]
165+
-
166+
- query: select B, A from TB where a >= !! !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6' !!
167+
- unorderedResult: [{3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682'},
168+
{5, !uuid 'a8708750-d70f-4800-8c3b-13700d5b369f'},
169+
{6, !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6'}]
170+
-
171+
- query: select B, A from TB where a <= !! !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6' !!
172+
- unorderedResult: [{1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d'},
173+
{2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df'},
174+
{4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b'},
175+
{6, !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6'}]
176+
-
177+
- query: select B, A from TB where a = !! !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6' !!
178+
- unorderedResult: [{6, !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6'}]
179+
-
180+
- query: select B, A from TB where a != !! !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6' !!
181+
- unorderedResult: [{1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d'},
182+
{2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df'},
183+
{3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682'},
184+
{4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b'},
185+
{5, !uuid 'a8708750-d70f-4800-8c3b-13700d5b369f'}]
186+
-
187+
- query: select B, A from TB where a is not null
188+
- unorderedResult: [{1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d'},
189+
{2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df'},
190+
{3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682'},
191+
{4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b'},
192+
{5, !uuid 'a8708750-d70f-4800-8c3b-13700d5b369f'},
193+
{6, !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6'}]
137194
...

0 commit comments

Comments
 (0)