From d7d313b93b85789f0b9dbb485e63dbe657ee8a88 Mon Sep 17 00:00:00 2001 From: Sagar Agarwal Date: Fri, 23 May 2025 12:45:27 +0530 Subject: [PATCH] chore: Support INTERVAL in CloudClientExecutor --- .../executor/spanner/CloudClientExecutor.java | 74 +++++++++++++++---- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java b/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java index 08cda1a8085..999c54a83e3 100644 --- a/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java +++ b/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java @@ -47,6 +47,7 @@ import com.google.cloud.spanner.InstanceConfigInfo; import com.google.cloud.spanner.InstanceId; import com.google.cloud.spanner.InstanceInfo; +import com.google.cloud.spanner.Interval; import com.google.cloud.spanner.Key; import com.google.cloud.spanner.KeyRange; import com.google.cloud.spanner.KeySet; @@ -2899,6 +2900,9 @@ private com.google.spanner.executor.v1.ValueList buildStruct(StructReader struct case DATE: value.setDateDaysValue(daysFromDate(struct.getDate(i))); break; + case INTERVAL: + value.setStringValue(struct.getInterval(i).toISO8601()); + break; case UUID: value.setStringValue(struct.getUuid(i).toString()); break; @@ -3048,43 +3052,62 @@ private com.google.spanner.executor.v1.ValueList buildStruct(StructReader struct com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.DATE).build()); } break; - case UUID: + case TIMESTAMP: { com.google.spanner.executor.v1.ValueList.Builder builder = com.google.spanner.executor.v1.ValueList.newBuilder(); - List values = struct.getUuidList(i); - for (UUID uuidValue : values) { + List values = struct.getTimestampList(i); + for (Timestamp timestampValue : values) { com.google.spanner.executor.v1.Value.Builder valueProto = com.google.spanner.executor.v1.Value.newBuilder(); - if (uuidValue == null) { + if (timestampValue == null) { builder.addValue(valueProto.setIsNull(true).build()); } else { - builder.addValue(valueProto.setStringValue(uuidValue.toString()).build()); + builder.addValue( + valueProto.setTimestampValue(timestampToProto(timestampValue)).build()); } } value.setArrayValue(builder.build()); value.setArrayType( - com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.UUID).build()); + com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.TIMESTAMP).build()); } break; - case TIMESTAMP: + case INTERVAL: { com.google.spanner.executor.v1.ValueList.Builder builder = com.google.spanner.executor.v1.ValueList.newBuilder(); - List values = struct.getTimestampList(i); - for (Timestamp timestampValue : values) { + List values = struct.getIntervalList(i); + for (Interval interval : values) { com.google.spanner.executor.v1.Value.Builder valueProto = com.google.spanner.executor.v1.Value.newBuilder(); - if (timestampValue == null) { + if (interval == null) { builder.addValue(valueProto.setIsNull(true).build()); } else { - builder.addValue( - valueProto.setTimestampValue(timestampToProto(timestampValue)).build()); + builder.addValue(valueProto.setStringValue(interval.toISO8601()).build()); } } value.setArrayValue(builder.build()); value.setArrayType( - com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.TIMESTAMP).build()); + com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.INTERVAL).build()); + } + break; + case UUID: + { + com.google.spanner.executor.v1.ValueList.Builder builder = + com.google.spanner.executor.v1.ValueList.newBuilder(); + List values = struct.getUuidList(i); + for (UUID uuidValue : values) { + com.google.spanner.executor.v1.Value.Builder valueProto = + com.google.spanner.executor.v1.Value.newBuilder(); + if (uuidValue == null) { + builder.addValue(valueProto.setIsNull(true).build()); + } else { + builder.addValue(valueProto.setStringValue(uuidValue.toString()).build()); + } + } + value.setArrayValue(builder.build()); + value.setArrayType( + com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.UUID).build()); } break; case NUMERIC: @@ -3340,6 +3363,9 @@ private static com.google.cloud.spanner.Value valueProtoToCloudValue( case DATE: return com.google.cloud.spanner.Value.date( value.hasIsNull() ? null : dateFromDays(value.getDateDaysValue())); + case INTERVAL: + return com.google.cloud.spanner.Value.interval( + value.hasIsNull() ? null : Interval.parseFromString(value.getStringValue())); case UUID: return com.google.cloud.spanner.Value.uuid( value.hasIsNull() ? null : UUID.fromString(value.getStringValue())); @@ -3467,6 +3493,20 @@ private static com.google.cloud.spanner.Value valueProtoToCloudValue( .collect(Collectors.toList()), CloudClientExecutor::dateFromDays)); } + case INTERVAL: + if (value.hasIsNull()) { + return com.google.cloud.spanner.Value.intervalArray(null); + } else { + return com.google.cloud.spanner.Value.intervalArray( + unmarshallValueList( + value.getArrayValue().getValueList().stream() + .map(com.google.spanner.executor.v1.Value::getIsNull) + .collect(Collectors.toList()), + value.getArrayValue().getValueList().stream() + .map(com.google.spanner.executor.v1.Value::getStringValue) + .collect(Collectors.toList()), + Interval::parseFromString)); + } case UUID: if (value.hasIsNull()) { return com.google.cloud.spanner.Value.uuidArray(null); @@ -3646,10 +3686,12 @@ private static com.google.cloud.spanner.Type typeProtoToCloudType( return com.google.cloud.spanner.Type.float64(); case DATE: return com.google.cloud.spanner.Type.date(); - case UUID: - return com.google.cloud.spanner.Type.uuid(); case TIMESTAMP: return com.google.cloud.spanner.Type.timestamp(); + case INTERVAL: + return com.google.cloud.spanner.Type.interval(); + case UUID: + return com.google.cloud.spanner.Type.uuid(); case NUMERIC: if (typeProto.getTypeAnnotation().equals(TypeAnnotationCode.PG_NUMERIC)) { return com.google.cloud.spanner.Type.pgNumeric(); @@ -3704,6 +3746,8 @@ private static com.google.spanner.v1.Type cloudTypeToTypeProto(@Nonnull Type clo return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.TIMESTAMP).build(); case DATE: return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.DATE).build(); + case INTERVAL: + return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.INTERVAL).build(); case UUID: return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.UUID).build(); case NUMERIC: