17
17
package com .google .cloud .spanner .it ;
18
18
19
19
import static com .google .cloud .spanner .testing .EmulatorSpannerHelper .isUsingEmulator ;
20
- import static com .google .common .base .Strings .isNullOrEmpty ;
21
20
import static org .junit .Assert .assertEquals ;
22
21
import static org .junit .Assert .assertFalse ;
23
22
import static org .junit .Assert .assertTrue ;
30
29
import java .util .Arrays ;
31
30
import java .util .Collections ;
32
31
import java .util .List ;
32
+ import java .util .Objects ;
33
33
import java .util .concurrent .ExecutionException ;
34
34
import java .util .concurrent .TimeoutException ;
35
35
import org .junit .AfterClass ;
@@ -63,32 +63,30 @@ public static List<DialectTestParameter> data() {
63
63
new String [] {
64
64
"CREATE TABLE IntervalTable (\n "
65
65
+ " key STRING(MAX),\n "
66
- + " slo_days INT64 ,\n "
67
- + " update_time TIMESTAMP,\n "
68
- + " expiry_days INT64 AS (EXTRACT(DAY FROM make_interval(day => GREATEST(LEAST(slo_days, 365), 1))) ),\n "
69
- + " interval_array_len bigint AS (ARRAY_LENGTH(ARRAY<INTERVAL>[INTERVAL '1-2 3 4:5:6' YEAR TO SECOND]))\n "
70
- + ") PRIMARY KEY (key); "
66
+ + " create_time TIMESTAMP ,\n "
67
+ + " expiry_time TIMESTAMP,\n "
68
+ + " expiry_within_month bool AS (expiry_time - create_time < INTERVAL 30 DAY ),\n "
69
+ + " interval_array_len INT64 AS (ARRAY_LENGTH(ARRAY<INTERVAL>[INTERVAL '1-2 3 4:5:6' YEAR TO SECOND]))\n "
70
+ + ") PRIMARY KEY (key)"
71
71
};
72
72
73
73
private static final String [] POSTGRESQL_SCHEMA =
74
74
new String [] {
75
75
"CREATE TABLE IntervalTable (\n "
76
76
+ " key text primary key,\n "
77
- + " slo_days bigint ,\n "
78
- + " update_time timestamptz,\n "
79
- + " expiry_days bigint GENERATED ALWAYS AS (EXTRACT(DAY FROM make_interval(days =>GREATEST(LEAST(slo_days, 365), 1))) ) STORED,\n "
77
+ + " create_time timestamptz ,\n "
78
+ + " expiry_time timestamptz,\n "
79
+ + " expiry_within_month bool GENERATED ALWAYS AS (INTERVAL '1' DAY < INTERVAL '30' DAY ) STORED,\n "
80
80
+ " interval_array_len bigint GENERATED ALWAYS AS (ARRAY_LENGTH(ARRAY[INTERVAL '1-2 3 4:5:6'], 1)) STORED\n "
81
- + "); "
81
+ + ")"
82
82
};
83
83
84
84
private static DatabaseClient client ;
85
85
86
86
private static boolean isUsingCloudDevel () {
87
- String jobType = System .getenv ("JOB_TYPE" );
88
-
89
- // Assumes that the jobType contains the string "cloud-devel" to signal that
90
- // the environment is cloud-devel.
91
- return !isNullOrEmpty (jobType ) && jobType .contains ("cloud-devel" );
87
+ return Objects .equals (
88
+ System .getProperty ("spanner.gce.config.server_url" ),
89
+ "https://staging-wrenchworks.sandbox.googleapis.com" );
92
90
}
93
91
94
92
@ BeforeClass
@@ -131,7 +129,8 @@ private Timestamp write(Mutation m) {
131
129
}
132
130
133
131
private Mutation .WriteBuilder baseInsert () {
134
- return Mutation .newInsertOrUpdateBuilder ("T" ).set ("Key" ).to (lastKey = uniqueString ());
132
+ return Mutation .
133
+ newInsertOrUpdateBuilder ("IntervalTable" ).set ("Key" ).to (lastKey = uniqueString ());
135
134
}
136
135
137
136
private Struct readRow (String table , String key , String ... columns ) {
@@ -141,23 +140,26 @@ private Struct readRow(String table, String key, String... columns) {
141
140
}
142
141
143
142
private Struct readLastRow (String ... columns ) {
144
- return readRow ("T " , lastKey , columns );
143
+ return readRow ("IntervalTable " , lastKey , columns );
145
144
}
146
145
147
146
@ Test
148
147
public void writeToTableWithIntervalExpressions () {
149
148
write (
150
149
baseInsert ()
151
- .set ("slo_days " )
152
- .to (5 )
153
- .set ("update_time " )
154
- .to (Timestamp .ofTimeMicroseconds ( 12345678L ))
150
+ .set ("create_time " )
151
+ .to (Timestamp . parseTimestamp ( "2004-11-30T04:53:54Z" ) )
152
+ .set ("expiry_time " )
153
+ .to (Timestamp .parseTimestamp ( "2004-12-15T04:53:54Z" ))
155
154
.build ());
156
- Struct row = readLastRow ("expiryDays" , "interval_array_len" );
157
- assertFalse (row .isNull (0 ));
158
- assertEquals (5 , row .getLong (0 ));
159
- assertFalse (row .isNull (1 ));
160
- assertEquals (1 , row .getLong (1 ));
155
+ try (ResultSet resultSet =
156
+ client
157
+ .singleUse ()
158
+ .executeQuery (Statement .of ("SELECT expiry_within_month, interval_array_len FROM IntervalTable WHERE key='" +lastKey +"'" ))) {
159
+ assertTrue (resultSet .next ());
160
+ assertTrue (resultSet .getBoolean (0 ));
161
+ assertEquals (1 , resultSet .getLong (1 ));
162
+ }
161
163
}
162
164
163
165
@ Test
@@ -167,7 +169,39 @@ public void queryInterval() {
167
169
.singleUse ()
168
170
.executeQuery (Statement .of ("SELECT INTERVAL '1' DAY + INTERVAL '1' MONTH AS Col1" ))) {
169
171
assertTrue (resultSet .next ());
170
- assertTrue (resultSet .getInterval (0 ).equals (Interval .fromMonthsDaysMicros (1 , 1 , 0 )));
172
+ assertEquals (resultSet .getInterval (0 ), Interval .fromMonthsDaysMicros (1 , 1 , 0 ));
173
+ }
174
+ }
175
+
176
+ @ Test
177
+ public void queryWithIntervalParam () {
178
+ write (
179
+ baseInsert ()
180
+ .set ("create_time" )
181
+ .to (Timestamp .parseTimestamp ("2004-08-30T04:53:54Z" ))
182
+ .set ("expiry_time" )
183
+ .to (Timestamp .parseTimestamp ("2004-12-15T04:53:54Z" ))
184
+ .build ());
185
+
186
+ String query ;
187
+ if (dialect .dialect == Dialect .POSTGRESQL ) {
188
+ query =
189
+ "SELECT COUNT(*) FROM IntervalTable WHERE create_time < TIMESTAMPTZ '2004-11-30T10:23:54+0530' - $1" ;
190
+ } else {
191
+ query =
192
+ "SELECT COUNT(*) FROM IntervalTable WHERE create_time < TIMESTAMP('2004-11-30T10:23:54+0530') - @p1" ;
193
+ }
194
+
195
+ try (ResultSet resultSet =
196
+ client
197
+ .singleUse ()
198
+ .executeQuery (
199
+ Statement .newBuilder (query )
200
+ .bind ("p1" )
201
+ .to (Value .interval (Interval .ofDays (30 )))
202
+ .build ())) {
203
+ assertTrue (resultSet .next ());
204
+ assertEquals (resultSet .getLong (0 ), 1L );
171
205
}
172
206
}
173
207
@@ -203,12 +237,12 @@ public void queryIntervalArray() {
203
237
"SELECT ARRAY[CAST('P1Y2M3DT4H5M6.789123S' AS INTERVAL), null, CAST('P-1Y-2M-3DT-4H-5M-6.789123S' AS INTERVAL)] AS Col1" ;
204
238
try (ResultSet resultSet = client .singleUse ().executeQuery (Statement .of (query ))) {
205
239
assertTrue (resultSet .next ());
206
- assertTrue (
240
+ assertEquals (
207
241
Arrays .asList (
208
- Interval .parseFromString ("P1Y2M3DT4H5M6.789123S" ),
209
- null ,
210
- Interval .parseFromString ("P-1Y-2M-3DT-4H-5M-6.789123S" ))
211
- . equals ( resultSet .getIntervalList (0 ) ));
242
+ Interval .parseFromString ("P1Y2M3DT4H5M6.789123S" ),
243
+ null ,
244
+ Interval .parseFromString ("P-1Y-2M-3DT-4H-5M-6.789123S" )),
245
+ resultSet .getIntervalList (0 ));
212
246
}
213
247
}
214
248
}
0 commit comments