4747import com .google .cloud .spanner .InstanceConfigInfo ;
4848import com .google .cloud .spanner .InstanceId ;
4949import com .google .cloud .spanner .InstanceInfo ;
50+ import com .google .cloud .spanner .Interval ;
5051import com .google .cloud .spanner .Key ;
5152import com .google .cloud .spanner .KeyRange ;
5253import com .google .cloud .spanner .KeySet ;
@@ -1023,7 +1024,7 @@ private Status executeAction(
10231024 return executeFinishTxn (action .getFinish (), outcomeSender , executionContext );
10241025 } else if (action .hasMutation ()) {
10251026 return executeMutation (
1026- action .getMutation (), outcomeSender , executionContext , /* isWrite= */ false );
1027+ action .getMutation (), outcomeSender , executionContext , /*isWrite=*/ false );
10271028 } else if (action .hasRead ()) {
10281029 return executeRead (
10291030 useMultiplexedSession , action .getRead (), outcomeSender , executionContext );
@@ -1037,7 +1038,7 @@ private Status executeAction(
10371038 return executeCloudBatchDmlUpdates (action .getBatchDml (), outcomeSender , executionContext );
10381039 } else if (action .hasWrite ()) {
10391040 return executeMutation (
1040- action .getWrite ().getMutation (), outcomeSender , executionContext , /* isWrite= */ true );
1041+ action .getWrite ().getMutation (), outcomeSender , executionContext , /*isWrite=*/ true );
10411042 } else if (action .hasStartBatchTxn ()) {
10421043 if (dbPath == null ) {
10431044 throw SpannerExceptionFactory .newSpannerException (
@@ -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