Skip to content

Commit b5a1c71

Browse files
committed
more Tests
1 parent 247b596 commit b5a1c71

File tree

4 files changed

+40
-4
lines changed

4 files changed

+40
-4
lines changed

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

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

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

+18-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
package com.apple.foundationdb.record.query.plan.cascades;
2222

2323
import com.apple.foundationdb.record.EvaluationContext;
24+
import com.apple.foundationdb.record.TupleFieldsProto;
2425
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
2526
import com.apple.foundationdb.record.query.plan.cascades.typing.TypeRepository;
2627
import com.apple.foundationdb.record.query.plan.cascades.typing.Typed;
@@ -40,6 +41,7 @@
4041
import java.util.Map;
4142
import java.util.Optional;
4243
import java.util.Random;
44+
import java.util.UUID;
4345
import java.util.stream.Collectors;
4446

4547
/**
@@ -64,6 +66,7 @@ class TypeRepositoryTest {
6466
private static final LiteralValue<Integer> INT_NOT_NULLABLE_2 = new LiteralValue<>(Type.primitiveType(Type.TypeCode.INT, false), 2);
6567
private static final LiteralValue<Float> FLOAT_1 = new LiteralValue<>(Type.primitiveType(Type.TypeCode.FLOAT), 1.0F);
6668
private static final LiteralValue<String> STRING_1 = new LiteralValue<>(Type.primitiveType(Type.TypeCode.STRING), "a");
69+
private static final LiteralValue<UUID> UUID_1 = new LiteralValue<>(Type.uuidType(false), UUID.fromString("eebee473-690b-48c1-beb0-07c3aca77768"));
6770

6871
private static Type generateRandomType() {
6972
return generateRandomTypeInternal(0);
@@ -82,6 +85,9 @@ private static int countTypes(@Nonnull final Type type) {
8285
if (type.isPrimitive()) {
8386
return 0;
8487
}
88+
if (type.isUuid()) {
89+
return 1;
90+
}
8591
if (type instanceof Type.Array) {
8692
if (type.isNullable()) {
8793
return 1 + countTypes(((Type.Array)type).getElementType());
@@ -104,7 +110,7 @@ private static Type.TypeCode generateRandomTypeCode(int depth) {
104110
List<Type.TypeCode> choices = new ArrayList<>();
105111
for (Type.TypeCode typeCode : Type.TypeCode.values()) {
106112
if (typeCode != Type.TypeCode.UNKNOWN && typeCode != Type.TypeCode.ANY && typeCode != Type.TypeCode.NULL) {
107-
if (typeCode.isPrimitive()) {
113+
if (typeCode.isPrimitive() || typeCode.equals(Type.TypeCode.UUID)) {
108114
choices.add(typeCode);
109115
} else if (depth < MAX_ALLOWED_DEPTH && (typeCode == Type.TypeCode.RECORD || typeCode == Type.TypeCode.ARRAY)) {
110116
choices.add(typeCode);
@@ -135,6 +141,8 @@ private static Type generateType(int depth, Type.TypeCode requestedTypeCode) {
135141
fields.add(Type.Record.Field.of(generateRandomTypeInternal(depth + 1), Optional.of("random" + ++counter), Optional.empty()));
136142
}
137143
return Type.Record.fromFields(fields);
144+
case UUID:
145+
return Type.uuidType(random.nextBoolean());
138146
case RELATION: // fallthrough
139147
case UNKNOWN: // fallthrough
140148
case ANY: // fallthrough
@@ -251,18 +259,19 @@ void createLightArrayConstructorValueWorks() {
251259

252260
@Test
253261
void createRecordTypeConstructorWorks() {
254-
final Typed value = new RecordConstructorValue.RecordFn().encapsulate(List.of(STRING_1, INT_2, FLOAT_1));
262+
final Typed value = new RecordConstructorValue.RecordFn().encapsulate(List.of(STRING_1, INT_2, FLOAT_1, UUID_1));
255263
Assertions.assertTrue(value instanceof RecordConstructorValue);
256264
final RecordConstructorValue recordConstructorValue = (RecordConstructorValue)value;
257265
final Type resultType = recordConstructorValue.getResultType();
258266
Assertions.assertEquals(Type.Record.fromFields(false, List.of(Type.Record.Field.of(STRING_1.getResultType(), Optional.empty()),
259267
Type.Record.Field.of(INT_2.getResultType(), Optional.empty()),
260-
Type.Record.Field.of(FLOAT_1.getResultType(), Optional.empty())
268+
Type.Record.Field.of(FLOAT_1.getResultType(), Optional.empty()),
269+
Type.Record.Field.of(UUID_1.getResultType(), Optional.empty())
261270
)), resultType);
262271
final Object result = recordConstructorValue.evalWithoutStore(EvaluationContext.forTypeRepository(TypeRepository.newBuilder().addTypeIfNeeded(recordConstructorValue.getResultType()).build()));
263272
Assertions.assertTrue(result instanceof DynamicMessage);
264273
final DynamicMessage resultMessage = (DynamicMessage)result;
265-
Assertions.assertEquals(3, resultMessage.getAllFields().size());
274+
Assertions.assertEquals(4, resultMessage.getAllFields().size());
266275
List<Object> fieldSorted = resultMessage.getAllFields().entrySet().stream()
267276
.map(kv -> Pair.of(kv.getKey().getIndex(), kv.getValue()))
268277
.sorted(Map.Entry.comparingByKey())
@@ -271,5 +280,10 @@ void createRecordTypeConstructorWorks() {
271280
Assertions.assertEquals("a", fieldSorted.get(0));
272281
Assertions.assertEquals(2, fieldSorted.get(1));
273282
Assertions.assertEquals(1.0F, fieldSorted.get(2));
283+
final var expectedUuid = UUID.fromString("eebee473-690b-48c1-beb0-07c3aca77768");
284+
Assertions.assertEquals(TupleFieldsProto.UUID.newBuilder()
285+
.setMostSignificantBits(expectedUuid.getMostSignificantBits())
286+
.setLeastSignificantBits(expectedUuid.getLeastSignificantBits())
287+
.build(), fieldSorted.get(3));
274288
}
275289
}

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

+14
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.apple.foundationdb.record.TestRecords3Proto;
2828
import com.apple.foundationdb.record.TestRecords4Proto;
2929
import com.apple.foundationdb.record.TestRecords4WrapperProto;
30+
import com.apple.foundationdb.record.TupleFieldsProto;
3031
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
3132
import com.apple.foundationdb.record.query.plan.cascades.typing.TypeRepository;
3233
import com.apple.foundationdb.record.query.plan.cascades.values.LiteralValue;
@@ -56,6 +57,7 @@
5657
import java.util.Objects;
5758
import java.util.Optional;
5859
import java.util.Random;
60+
import java.util.UUID;
5961
import java.util.concurrent.ThreadLocalRandom;
6062
import java.util.stream.Collectors;
6163
import java.util.stream.Stream;
@@ -125,6 +127,15 @@ public Stream<? extends Arguments> provideArguments(final ExtensionContext conte
125127
.setStartDate(random.nextLong())
126128
.setSchoolName("randomString" + random.nextInt()).build()
127129
).build()
130+
),
131+
Arguments.of(
132+
"TestRecords2Proto.MyUuidRecord", TestRecords2Proto.MyUuidRecord.newBuilder()
133+
.setRecNo(1L)
134+
.setUuidValue(TupleFieldsProto.UUID.newBuilder()
135+
.setMostSignificantBits(98452560)
136+
.setLeastSignificantBits(30900234)
137+
.build())
138+
.build()
128139
)
129140
);
130141
}
@@ -240,6 +251,9 @@ public Stream<? extends Arguments> provideArguments(final ExtensionContext conte
240251
Arguments.of("foo", Type.primitiveType(Type.TypeCode.STRING, false)),
241252
Arguments.of(ByteString.copyFrom("bar", Charset.defaultCharset().name()), Type.primitiveType(Type.TypeCode.BYTES, false)),
242253

254+
// UUID
255+
Arguments.of(UUID.fromString("eebee473-690b-48c1-beb0-07c3aca77768"), Type.uuidType(false)),
256+
243257
// Arrays
244258
Arguments.of(listOfNulls, new Type.Array(Type.any())),
245259
Arguments.of(listOfNullsAndNonNulls, new Type.Array(Type.primitiveType(Type.TypeCode.INT, true)), false),

fdb-record-layer-core/src/test/proto/test_records_2.proto

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ option java_package = "com.apple.foundationdb.record";
2525
option java_outer_classname = "TestRecords2Proto";
2626

2727
import "record_metadata_options.proto";
28+
import "tuple_fields.proto";
2829

2930
option (schema).split_long_records = true;
3031

@@ -33,6 +34,11 @@ message MyLongRecord {
3334
optional bytes bytes_value = 2;
3435
}
3536

37+
message MyUuidRecord {
38+
required int64 rec_no = 1 [(field).primary_key = true];
39+
optional UUID uuid_value = 2;
40+
}
41+
3642
message RecordTypeUnion {
3743
option (com.apple.foundationdb.record.record).usage = UNION;
3844
optional MyLongRecord _MyLongRecord = 1;

0 commit comments

Comments
 (0)