Skip to content

Commit af133e0

Browse files
author
Sagar Agarwal
committed
chore: Support INTERVAL in CloudClientExecutor
1 parent 9ac9e81 commit af133e0

File tree

1 file changed

+61
-17
lines changed

1 file changed

+61
-17
lines changed

google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java

Lines changed: 61 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.google.cloud.spanner.InstanceConfigInfo;
4848
import com.google.cloud.spanner.InstanceId;
4949
import com.google.cloud.spanner.InstanceInfo;
50+
import com.google.cloud.spanner.Interval;
5051
import com.google.cloud.spanner.Key;
5152
import com.google.cloud.spanner.KeyRange;
5253
import com.google.cloud.spanner.KeySet;
@@ -2899,6 +2900,9 @@ private com.google.spanner.executor.v1.ValueList buildStruct(StructReader struct
28992900
case DATE:
29002901
value.setDateDaysValue(daysFromDate(struct.getDate(i)));
29012902
break;
2903+
case INTERVAL:
2904+
value.setStringValue(struct.getInterval(i).toISO8601());
2905+
break;
29022906
case UUID:
29032907
value.setStringValue(struct.getUuid(i).toString());
29042908
break;
@@ -3048,43 +3052,62 @@ private com.google.spanner.executor.v1.ValueList buildStruct(StructReader struct
30483052
com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.DATE).build());
30493053
}
30503054
break;
3051-
case UUID:
3055+
case TIMESTAMP:
30523056
{
30533057
com.google.spanner.executor.v1.ValueList.Builder builder =
30543058
com.google.spanner.executor.v1.ValueList.newBuilder();
3055-
List<UUID> values = struct.getUuidList(i);
3056-
for (UUID uuidValue : values) {
3059+
List<Timestamp> values = struct.getTimestampList(i);
3060+
for (Timestamp timestampValue : values) {
30573061
com.google.spanner.executor.v1.Value.Builder valueProto =
30583062
com.google.spanner.executor.v1.Value.newBuilder();
3059-
if (uuidValue == null) {
3063+
if (timestampValue == null) {
30603064
builder.addValue(valueProto.setIsNull(true).build());
30613065
} else {
3062-
builder.addValue(valueProto.setStringValue(uuidValue.toString()).build());
3066+
builder.addValue(
3067+
valueProto.setTimestampValue(timestampToProto(timestampValue)).build());
30633068
}
30643069
}
30653070
value.setArrayValue(builder.build());
30663071
value.setArrayType(
3067-
com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.UUID).build());
3072+
com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.TIMESTAMP).build());
30683073
}
30693074
break;
3070-
case TIMESTAMP:
3075+
case INTERVAL:
30713076
{
30723077
com.google.spanner.executor.v1.ValueList.Builder builder =
30733078
com.google.spanner.executor.v1.ValueList.newBuilder();
3074-
List<Timestamp> values = struct.getTimestampList(i);
3075-
for (Timestamp timestampValue : values) {
3079+
List<Interval> values = struct.getIntervalList(i);
3080+
for (Interval interval : values) {
30763081
com.google.spanner.executor.v1.Value.Builder valueProto =
30773082
com.google.spanner.executor.v1.Value.newBuilder();
3078-
if (timestampValue == null) {
3083+
if (interval == null) {
30793084
builder.addValue(valueProto.setIsNull(true).build());
30803085
} else {
3081-
builder.addValue(
3082-
valueProto.setTimestampValue(timestampToProto(timestampValue)).build());
3086+
builder.addValue(valueProto.setStringValue(interval.toISO8601()).build());
30833087
}
30843088
}
30853089
value.setArrayValue(builder.build());
30863090
value.setArrayType(
3087-
com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.TIMESTAMP).build());
3091+
com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.INTERVAL).build());
3092+
}
3093+
break;
3094+
case UUID:
3095+
{
3096+
com.google.spanner.executor.v1.ValueList.Builder builder =
3097+
com.google.spanner.executor.v1.ValueList.newBuilder();
3098+
List<UUID> values = struct.getUuidList(i);
3099+
for (UUID uuidValue : values) {
3100+
com.google.spanner.executor.v1.Value.Builder valueProto =
3101+
com.google.spanner.executor.v1.Value.newBuilder();
3102+
if (uuidValue == null) {
3103+
builder.addValue(valueProto.setIsNull(true).build());
3104+
} else {
3105+
builder.addValue(valueProto.setStringValue(uuidValue.toString()).build());
3106+
}
3107+
}
3108+
value.setArrayValue(builder.build());
3109+
value.setArrayType(
3110+
com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.UUID).build());
30883111
}
30893112
break;
30903113
case NUMERIC:
@@ -3221,7 +3244,7 @@ private static com.google.cloud.spanner.KeyRange keyRangeProtoToCloudKeyRange(
32213244
return KeyRange.openClosed(start, end);
32223245
case OPEN_OPEN:
32233246
return KeyRange.openOpen(start, end);
3224-
// Unreachable.
3247+
// Unreachable.
32253248
default:
32263249
throw SpannerExceptionFactory.newSpannerException(
32273250
ErrorCode.INVALID_ARGUMENT, "Unrecognized key range type");
@@ -3275,7 +3298,7 @@ private static com.google.cloud.spanner.Key keyProtoToCloudKey(
32753298
case BYTES:
32763299
cloudKey.append(toByteArray(part.getBytesValue()));
32773300
break;
3278-
// Unreachable
3301+
// Unreachable
32793302
default:
32803303
throw SpannerExceptionFactory.newSpannerException(
32813304
ErrorCode.INVALID_ARGUMENT, "Unsupported key part type: " + type.getCode().name());
@@ -3340,6 +3363,9 @@ private static com.google.cloud.spanner.Value valueProtoToCloudValue(
33403363
case DATE:
33413364
return com.google.cloud.spanner.Value.date(
33423365
value.hasIsNull() ? null : dateFromDays(value.getDateDaysValue()));
3366+
case INTERVAL:
3367+
return com.google.cloud.spanner.Value.interval(
3368+
value.hasIsNull() ? null : Interval.parseFromString(value.getStringValue()));
33433369
case UUID:
33443370
return com.google.cloud.spanner.Value.uuid(
33453371
value.hasIsNull() ? null : UUID.fromString(value.getStringValue()));
@@ -3467,6 +3493,20 @@ private static com.google.cloud.spanner.Value valueProtoToCloudValue(
34673493
.collect(Collectors.toList()),
34683494
CloudClientExecutor::dateFromDays));
34693495
}
3496+
case INTERVAL:
3497+
if (value.hasIsNull()) {
3498+
return com.google.cloud.spanner.Value.intervalArray(null);
3499+
} else {
3500+
return com.google.cloud.spanner.Value.intervalArray(
3501+
unmarshallValueList(
3502+
value.getArrayValue().getValueList().stream()
3503+
.map(com.google.spanner.executor.v1.Value::getIsNull)
3504+
.collect(Collectors.toList()),
3505+
value.getArrayValue().getValueList().stream()
3506+
.map(com.google.spanner.executor.v1.Value::getStringValue)
3507+
.collect(Collectors.toList()),
3508+
Interval::parseFromString));
3509+
}
34703510
case UUID:
34713511
if (value.hasIsNull()) {
34723512
return com.google.cloud.spanner.Value.uuidArray(null);
@@ -3646,10 +3686,12 @@ private static com.google.cloud.spanner.Type typeProtoToCloudType(
36463686
return com.google.cloud.spanner.Type.float64();
36473687
case DATE:
36483688
return com.google.cloud.spanner.Type.date();
3649-
case UUID:
3650-
return com.google.cloud.spanner.Type.uuid();
36513689
case TIMESTAMP:
36523690
return com.google.cloud.spanner.Type.timestamp();
3691+
case INTERVAL:
3692+
return com.google.cloud.spanner.Type.interval();
3693+
case UUID:
3694+
return com.google.cloud.spanner.Type.uuid();
36533695
case NUMERIC:
36543696
if (typeProto.getTypeAnnotation().equals(TypeAnnotationCode.PG_NUMERIC)) {
36553697
return com.google.cloud.spanner.Type.pgNumeric();
@@ -3704,6 +3746,8 @@ private static com.google.spanner.v1.Type cloudTypeToTypeProto(@Nonnull Type clo
37043746
return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.TIMESTAMP).build();
37053747
case DATE:
37063748
return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.DATE).build();
3749+
case INTERVAL:
3750+
return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.INTERVAL).build();
37073751
case UUID:
37083752
return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.UUID).build();
37093753
case NUMERIC:

0 commit comments

Comments
 (0)